diff --git a/docs/(1).png b/docs/(1).png new file mode 100644 index 000000000..e69de29bb diff --git a/docs/(2).png b/docs/(2).png new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitattributes b/docs/.gitattributes new file mode 100644 index 000000000..99fb0ab34 --- /dev/null +++ b/docs/.gitattributes @@ -0,0 +1,2 @@ +backend/snapshots/* linguist-generated=true + diff --git a/docs/.gitbook.yaml b/docs/.gitbook.yaml new file mode 100644 index 000000000..16680a37a --- /dev/null +++ b/docs/.gitbook.yaml @@ -0,0 +1,3 @@ +structure: + readme: README.md + summary: SUMMARY.md diff --git a/docs/.gitbook/assets/browserstack-logo.svg b/docs/.gitbook/assets/browserstack-logo.svg new file mode 100644 index 000000000..195f64d2f --- /dev/null +++ b/docs/.gitbook/assets/browserstack-logo.svg @@ -0,0 +1,90 @@ + + + + +Browserstack-logo-white + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/.gitbook/assets/grafik b/docs/.gitbook/assets/grafik new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitbook/assets/grafik (1).png b/docs/.gitbook/assets/grafik (1).png new file mode 100644 index 000000000..8fabb8555 Binary files /dev/null and b/docs/.gitbook/assets/grafik (1).png differ diff --git a/docs/.gitbook/assets/grafik-1 b/docs/.gitbook/assets/grafik-1 new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitbook/assets/grafik-1 (1).png b/docs/.gitbook/assets/grafik-1 (1).png new file mode 100644 index 000000000..cc5dade55 Binary files /dev/null and b/docs/.gitbook/assets/grafik-1 (1).png differ diff --git a/docs/.gitbook/assets/grafik-1.png b/docs/.gitbook/assets/grafik-1.png new file mode 100644 index 000000000..cc5dade55 Binary files /dev/null and b/docs/.gitbook/assets/grafik-1.png differ diff --git a/docs/.gitbook/assets/grafik-4.png b/docs/.gitbook/assets/grafik-4.png new file mode 100644 index 000000000..dab3eef27 Binary files /dev/null and b/docs/.gitbook/assets/grafik-4.png differ diff --git a/docs/.gitbook/assets/grafik.png b/docs/.gitbook/assets/grafik.png new file mode 100644 index 000000000..8fabb8555 Binary files /dev/null and b/docs/.gitbook/assets/grafik.png differ diff --git a/docs/.gitbook/assets/graphql-playground b/docs/.gitbook/assets/graphql-playground new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitbook/assets/graphql-playground (1).png b/docs/.gitbook/assets/graphql-playground (1).png new file mode 100644 index 000000000..32396a577 Binary files /dev/null and b/docs/.gitbook/assets/graphql-playground (1).png differ diff --git a/docs/.gitbook/assets/graphql-playground.png b/docs/.gitbook/assets/graphql-playground.png new file mode 100644 index 000000000..32396a577 Binary files /dev/null and b/docs/.gitbook/assets/graphql-playground.png differ diff --git a/docs/.gitbook/assets/humanconnection b/docs/.gitbook/assets/humanconnection new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitbook/assets/humanconnection (1).png b/docs/.gitbook/assets/humanconnection (1).png new file mode 100644 index 000000000..f0576413f Binary files /dev/null and b/docs/.gitbook/assets/humanconnection (1).png differ diff --git a/docs/.gitbook/assets/humanconnection.png b/docs/.gitbook/assets/humanconnection.png new file mode 100644 index 000000000..f0576413f Binary files /dev/null and b/docs/.gitbook/assets/humanconnection.png differ diff --git a/docs/.gitbook/assets/lets_get_together.png b/docs/.gitbook/assets/lets_get_together.png new file mode 100644 index 000000000..07017e489 Binary files /dev/null and b/docs/.gitbook/assets/lets_get_together.png differ diff --git a/docs/.gitbook/assets/maintenance-page.png b/docs/.gitbook/assets/maintenance-page.png new file mode 100644 index 000000000..be07b0716 Binary files /dev/null and b/docs/.gitbook/assets/maintenance-page.png differ diff --git a/docs/.gitbook/assets/screenshot b/docs/.gitbook/assets/screenshot new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitbook/assets/screenshot (1).png b/docs/.gitbook/assets/screenshot (1).png new file mode 100644 index 000000000..b4ff4b2f9 Binary files /dev/null and b/docs/.gitbook/assets/screenshot (1).png differ diff --git a/docs/.gitbook/assets/screenshot-neo4j-download-center-current-releases.png b/docs/.gitbook/assets/screenshot-neo4j-download-center-current-releases.png new file mode 100644 index 000000000..8d9033864 Binary files /dev/null and b/docs/.gitbook/assets/screenshot-neo4j-download-center-current-releases.png differ diff --git a/docs/.gitbook/assets/screenshot-styleguide b/docs/.gitbook/assets/screenshot-styleguide new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.gitbook/assets/screenshot-styleguide (1).png b/docs/.gitbook/assets/screenshot-styleguide (1).png new file mode 100644 index 000000000..d8e009394 Binary files /dev/null and b/docs/.gitbook/assets/screenshot-styleguide (1).png differ diff --git a/docs/.gitbook/assets/screenshot-styleguide (2).png b/docs/.gitbook/assets/screenshot-styleguide (2).png new file mode 100644 index 000000000..d8e009394 Binary files /dev/null and b/docs/.gitbook/assets/screenshot-styleguide (2).png differ diff --git a/docs/.gitbook/assets/screenshot-styleguide.png b/docs/.gitbook/assets/screenshot-styleguide.png new file mode 100644 index 000000000..d8e009394 Binary files /dev/null and b/docs/.gitbook/assets/screenshot-styleguide.png differ diff --git a/docs/.gitbook/assets/screenshot.png b/docs/.gitbook/assets/screenshot.png new file mode 100644 index 000000000..b4ff4b2f9 Binary files /dev/null and b/docs/.gitbook/assets/screenshot.png differ diff --git a/docs/.gitbook/assets/storybook-output.png b/docs/.gitbook/assets/storybook-output.png new file mode 100644 index 000000000..2b157dd62 Binary files /dev/null and b/docs/.gitbook/assets/storybook-output.png differ diff --git a/docs/.github/ISSUE_TEMPLATE.md b/docs/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..2be4b51dd --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,13 @@ + + + + +## 💬 Issue + + + diff --git a/docs/.github/ISSUE_TEMPLATE/bug_report.md b/docs/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..bd02cfe22 --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,10 @@ +--- +name: 🐛 Bug report +about: Create a report to help us improve +labels: bug +title: 🐛 [Bug] +--- + + +## 🐛 Bugreport + diff --git a/docs/.github/ISSUE_TEMPLATE/devops_ticket.md b/docs/.github/ISSUE_TEMPLATE/devops_ticket.md new file mode 100644 index 000000000..981d0fdd6 --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/devops_ticket.md @@ -0,0 +1,10 @@ +--- +name: 💥 DevOps ticket +about: Help us manage our deployed Software. +labels: devops +title: 💥 [DevOps] +--- + + +## 💥 DevOps ticket + diff --git a/docs/.github/ISSUE_TEMPLATE/epic.md b/docs/.github/ISSUE_TEMPLATE/epic.md new file mode 100644 index 000000000..af511e6e2 --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/epic.md @@ -0,0 +1,13 @@ +--- +name: 🌟 Epic +about: Define a big development Step +labels: epic +title: 🌟 [EPIC] +--- + + + + + +## 🌟 EPIC + diff --git a/docs/.github/ISSUE_TEMPLATE/feature_request.md b/docs/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..f313740a5 --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,10 @@ +--- +name: 🚀 Feature request +about: Suggest an idea for this project +labels: feature +title: 🚀 [Feature] +--- + + +## 🚀 Feature + diff --git a/docs/.github/ISSUE_TEMPLATE/question.md b/docs/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 000000000..b57adcd06 --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,13 @@ +--- +name: 💬 Question +about: If you need help understanding our Software. +labels: question +title: 💬 [Question] +--- + + + + + +## 💬 Question + diff --git a/docs/.github/ISSUE_TEMPLATE/refactor_ticket.md b/docs/.github/ISSUE_TEMPLATE/refactor_ticket.md new file mode 100644 index 000000000..b75f7b5fc --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/refactor_ticket.md @@ -0,0 +1,10 @@ +--- +name: 🔧 Refactor ticket +about: Help us improve our code by refactoring it. +labels: refactor +title: 🔧 [Refactor] +--- + + +## 🔧 Refactor ticket + diff --git a/docs/.github/ISSUE_TEMPLATE/release.md b/docs/.github/ISSUE_TEMPLATE/release.md new file mode 100644 index 000000000..c9f4b787d --- /dev/null +++ b/docs/.github/ISSUE_TEMPLATE/release.md @@ -0,0 +1,13 @@ +--- +name: 🎂 Release +about: Define a Release +labels: release +title: 🎂 [RELEASE] +--- + + + + + +## 🎂 RELEASE + diff --git a/docs/.github/PULL_REQUEST_TEMPLATE.md b/docs/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..d40a2770a --- /dev/null +++ b/docs/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ + + +## 🍰 Pullrequest + + +### Issues + +- None + +### Todo + +- [X] None diff --git a/docs/.github/dependabot.yml b/docs/.github/dependabot.yml new file mode 100644 index 000000000..ac1dfa858 --- /dev/null +++ b/docs/.github/dependabot.yml @@ -0,0 +1,68 @@ +version: 2 +updates: +- package-ecosystem: "github-actions" + directory: "/" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" + +- package-ecosystem: npm + directory: "/" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" +- package-ecosystem: npm + directory: "/backend" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" +- package-ecosystem: npm + directory: "/webapp" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" + +- package-ecosystem: docker + directory: "/backend" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" +- package-ecosystem: docker + directory: "/webapp" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" +- package-ecosystem: docker + directory: "/neo4j" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" +- package-ecosystem: docker + directory: "/deployment/src/docker" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" diff --git a/docs/.github/file-filters.yml b/docs/.github/file-filters.yml new file mode 100644 index 000000000..8d2d93fac --- /dev/null +++ b/docs/.github/file-filters.yml @@ -0,0 +1,11 @@ +backend: &backend + - '.github/workflows/test-backend.yml' + - 'backend/**/*' + - 'neo4j/**/*' + +docker: &docker + - 'docker-compose.*' + +webapp: &webapp + - '.github/workflows/test-webapp.yml' + - 'webapp/**/*' diff --git a/docs/.github/workflows/cleanup-cache-at-pr-closing.yml b/docs/.github/workflows/cleanup-cache-at-pr-closing.yml new file mode 100644 index 000000000..284702e76 --- /dev/null +++ b/docs/.github/workflows/cleanup-cache-at-pr-closing.yml @@ -0,0 +1,42 @@ +############################################################################### +# A Github repo has max 10 GB of cache. +# https://github.blog/changelog/2021-11-23-github-actions-cache-size-is-now-increased-to-10gb-per-repository/ +# +# To avoid "cache thrashing" by their cache eviction policy it is recommended +# to apply a cache cleanup workflow at PR closing to dele cache leftovers of +# the current branch: +# https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#force-deleting-cache-entries +############################################################################### + +name: ocelot.social cache cleanup on pr closing + +on: + pull_request: + types: + - closed + +jobs: + clean-branch-cache: + name: Cleanup branch cache + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Cleanup + run: | + gh extension install actions/gh-actions-cache + REPO=${{ github.repository }} + BRANCH="refs/pull/${{ github.event.pull_request.number }}/merge" + echo "Fetching list of cache key" + cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH | cut -f 1 ) + set +e + echo "Deleting caches..." + for cacheKey in $cacheKeysForPR + do + gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm + done + echo "Done" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/docs/.github/workflows/gitbook-action.yml b/docs/.github/workflows/gitbook-action.yml new file mode 100644 index 000000000..82c23bd3b --- /dev/null +++ b/docs/.github/workflows/gitbook-action.yml @@ -0,0 +1,45 @@ +name: 'Gitbook-Action' + +on: + push: + branches: + - master + - 6689-setup-gitbook-action # just for testing, do remove afterwards + paths-ignore: + - 'gitbook-docs/**' # To Avoid Loop + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout action + uses: actions/checkout@v2 + + - name: Gitbook Action # https://github.com/ZanderZhao/gitbook-action/releases + uses: ZanderZhao/gitbook-action@master # -> or ZanderZhao/gitbook-action@v1.2.4, Just example, click above, use latest please + with: # or fork this repo and use YourName/gitbook-action@master + token: ${{ secrets.GITBOOK_ACTION_TOKEN }} # -> remember add this in settings/secrets as https://ZanderZhao.github.io/gitbook-action/ + # time_zone: Asia/Shanghai + # source_branch: master + source_branch: 6689-setup-gitbook-action + source_dir: "." + source_edit_time: true + publish_commit_message: ${{ github.event.head_commit.message }} + # publish_branch: master + publish_branch: docs-ocelot-social-gh-pages + publish_dir: docs + # Some not indicated are default values, eg: publish_repo + + # example2 + # - name: Gitbook Action + # uses: ZanderZhao/gitbook-action@master + # with: + # token: ${{ secrets.PERSONAL_TOKEN }} + # time_zone: Asia/Shanghai + # source_repo: GitbookIO/gitbook + # source_branch: master + # source_dir: docs + # publish_branch: master + # publish_dir: docs/official + # publish2_repo: gitbook-org/gitbook + # Some not indicated are default values, eg: publish_repo diff --git a/docs/.github/workflows/lint_pr.yml b/docs/.github/workflows/lint_pr.yml new file mode 100644 index 000000000..5a8bb662f --- /dev/null +++ b/docs/.github/workflows/lint_pr.yml @@ -0,0 +1,71 @@ +name: "ocelot.social lint pull request CI" + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + +jobs: + main: + name: Validate PR title + runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} + steps: + - uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + # Configure which types are allowed (newline delimited). + # Default: https://github.com/commitizen/conventional-commit-types + #types: | + # fix + # feat + # Configure which scopes are allowed (newline delimited). + scopes: | + backend + webapp + database + release + other + # Configure that a scope must always be provided. + requireScope: true + # Configure which scopes (newline delimited) are disallowed in PR + # titles. For instance by setting # the value below, `chore(release): + # ...` and `ci(e2e,release): ...` will be rejected. + #disallowScopes: | + # release + # Configure additional validation for the subject based on a regex. + # This example ensures the subject doesn't start with an uppercase character. + subjectPattern: ^(?![A-Z]).+$ + # If `subjectPattern` is configured, you can use this property to override + # the default error message that is shown when the pattern doesn't match. + # The variables `subject` and `title` can be used within the message. + subjectPatternError: | + The subject "{subject}" found in the pull request title "{title}" + didn't match the configured pattern. Please ensure that the subject + doesn't start with an uppercase character. + # If you use GitHub Enterprise, you can set this to the URL of your server + #githubBaseUrl: https://github.myorg.com/api/v3 + # If the PR contains one of these labels (newline delimited), the + # validation is skipped. + # If you want to rerun the validation when labels change, you might want + # to use the `labeled` and `unlabeled` event triggers in your workflow. + #ignoreLabels: | + # bot + # ignore-semantic-pull-request + # If you're using a format for the PR title that differs from the traditional Conventional + # Commits spec, you can use these options to customize the parsing of the type, scope and + # subject. The `headerPattern` should contain a regex where the capturing groups in parentheses + # correspond to the parts listed in `headerPatternCorrespondence`. + # See: https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-commits-parser#headerpattern + headerPattern: '^(\w*)(?:\(([\w$.\-*/ ]*)\))?: (.*)$' + headerPatternCorrespondence: type, scope, subject + # For work-in-progress PRs you can typically use draft pull requests + # from GitHub. However, private repositories on the free plan don't have + # this option and therefore this action allows you to opt-in to using the + # special "[WIP]" prefix to indicate this state. This will avoid the + # validation of the PR title and the pull request checks remain pending. + # Note that a second check will be reported if this is enabled. + wip: true diff --git a/docs/.github/workflows/publish.yml b/docs/.github/workflows/publish.yml new file mode 100644 index 000000000..e386b7efa --- /dev/null +++ b/docs/.github/workflows/publish.yml @@ -0,0 +1,317 @@ +name: publish + +on: + push: + branches: + - master + +jobs: + ############################################################################## + # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## + ############################################################################## + build_production_neo4j: + name: Docker Build Production - Neo4J + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: Neo4J | Build `community` image + run: | + docker build --target community \ + --tag "ocelotsocialnetwork/neo4j-community:latest" \ + --tag "ocelotsocialnetwork/neo4j-community:${VERSION}" \ + --tag "ocelotsocialnetwork/neo4j-community:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + neo4j/ + - name: Neo4J | Save docker image + run: docker save "ocelotsocialnetwork/neo4j-community" > /tmp/neo4j.tar + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: docker-neo4j-community + path: /tmp/neo4j.tar + + ############################################################################## + # JOB: DOCKER BUILD PRODUCTION BACKEND ####################################### + ############################################################################## + build_production_backend: + name: Docker Build Production - Backend + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: Backend | Build `production` image + run: | + docker build --target base \ + --tag "ocelotsocialnetwork/backend:latest-base" \ + --tag "ocelotsocialnetwork/backend:${VERSION}-base" \ + --tag "ocelotsocialnetwork/backend:${BUILD_VERSION}-base" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + backend/ + docker build --target code \ + --tag "ocelotsocialnetwork/backend:latest-code" \ + --tag "ocelotsocialnetwork/backend:${VERSION}-code" \ + --tag "ocelotsocialnetwork/backend:${BUILD_VERSION}-code" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + backend/ + docker build --target production \ + --tag "ocelotsocialnetwork/backend:latest" \ + --tag "ocelotsocialnetwork/backend:${VERSION}" \ + --tag "ocelotsocialnetwork/backend:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + backend/ + - name: Backend | Save docker image + run: docker save "ocelotsocialnetwork/backend" > /tmp/backend.tar + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: docker-backend-production + path: /tmp/backend.tar + + ############################################################################## + # JOB: DOCKER BUILD PRODUCTION WEBAPP ######################################## + ############################################################################## + build_production_webapp: + name: Docker Build Production - WebApp + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: Webapp | Build `production` image + run: | + docker build --target base \ + --tag "ocelotsocialnetwork/webapp:latest-base" \ + --tag "ocelotsocialnetwork/webapp:${VERSION}-base" \ + --tag "ocelotsocialnetwork/webapp:${BUILD_VERSION}-base" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + webapp/ + docker build --target code \ + --tag "ocelotsocialnetwork/webapp:latest-code" \ + --tag "ocelotsocialnetwork/webapp:${VERSION}-code" \ + --tag "ocelotsocialnetwork/webapp:${BUILD_VERSION}-code" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + webapp/ + docker build --target production \ + --tag "ocelotsocialnetwork/webapp:latest" \ + --tag "ocelotsocialnetwork/webapp:${VERSION}" \ + --tag "ocelotsocialnetwork/webapp:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + webapp/ + - name: Webapp | Save docker image + run: docker save "ocelotsocialnetwork/webapp" > /tmp/webapp.tar + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: docker-webapp-production + path: /tmp/webapp.tar + + ############################################################################## + # JOB: DOCKER BUILD PRODUCTION MAINTENANCE ################################### + ############################################################################## + build_production_maintenance: + name: Docker Build Production - Maintenance + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: Maintenance | Build `production` image + run: | + docker build --target base \ + --tag "ocelotsocialnetwork/maintenance:latest-base" \ + --tag "ocelotsocialnetwork/maintenance:${VERSION}-base" \ + --tag "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-base" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + -f webapp/Dockerfile.maintenance \ + webapp/ + docker build --target code \ + --tag "ocelotsocialnetwork/maintenance:latest-code" \ + --tag "ocelotsocialnetwork/maintenance:${VERSION}-code" \ + --tag "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-code" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + -f webapp/Dockerfile.maintenance \ + webapp/ + docker build --target production \ + --tag "ocelotsocialnetwork/maintenance:latest" \ + --tag "ocelotsocialnetwork/maintenance:${VERSION}" \ + --tag "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + -f webapp/Dockerfile.maintenance \ + webapp/ + - name: Maintenance | Save docker image + run: docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: docker-maintenance-production + path: /tmp/maintenance.tar + + ############################################################################## + # JOB: UPLOAD TO DOCKERHUB ################################################### + ############################################################################## + upload_to_dockerhub: + name: Upload to Dockerhub + runs-on: ubuntu-latest + needs: [build_production_neo4j,build_production_backend,build_production_webapp,build_production_maintenance] + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + steps: + - name: Download Docker Image (Neo4J) + uses: actions/download-artifact@v3 + with: + name: docker-neo4j-community + path: /tmp + - run: docker load < /tmp/neo4j.tar + - name: Download Docker Image (Backend) + uses: actions/download-artifact@v3 + with: + name: docker-backend-production + path: /tmp + - run: docker load < /tmp/backend.tar + - name: Download Docker Image (WebApp) + uses: actions/download-artifact@v3 + with: + name: docker-webapp-production + path: /tmp + - run: docker load < /tmp/webapp.tar + - name: Download Docker Image (Maintenance) + uses: actions/download-artifact@v3 + with: + name: docker-maintenance-production + path: /tmp + - run: docker load < /tmp/maintenance.tar + + - name: login to dockerhub + run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin + - name: Push images + run: | + docker push --all-tags ocelotsocialnetwork/neo4j-community + docker push --all-tags ocelotsocialnetwork/backend + docker push --all-tags ocelotsocialnetwork/webapp + docker push --all-tags ocelotsocialnetwork/maintenance + + ############################################################################## + # JOB: GITHUB TAG LATEST VERSION ############################################# + ############################################################################## + github_tag: + name: Tag latest version on Github + runs-on: ubuntu-latest + needs: [upload_to_dockerhub] + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Fetch full History for changelog + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: package-version-to-git-tag + build number + uses: pkgdeps/git-tag-action@v2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + github_repo: ${{ github.repository }} + version: ${{ env.BUILD_VERSION }} + git_commit_sha: ${{ github.sha }} + git_tag_prefix: "b" + - name: Generate changelog + run: | + yarn install + yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only + - name: package-version-to-git-release + continue-on-error: true # Will fail if tag exists + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.VERSION }} + release_name: ${{ env.VERSION }} + body_path: ./CHANGELOG.md + draft: false + prerelease: false + + build_trigger: + name: Trigger successful build + runs-on: ubuntu-latest + needs: [github_tag] + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Fetch full History for changelog + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + #- name: Repository Dispatch + # uses: peter-evans/repository-dispatch@v2 + # with: + # token: ${{ github.token }} + # event-type: trigger-ocelot-build-success + # repository: ${{ github.repository }} + # client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' + + - name: Repository Dispatch stage.ocelot.social + uses: peter-evans/repository-dispatch@v2 + with: + token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository + event-type: trigger-ocelot-build-success + repository: 'Ocelot-Social-Community/stage.ocelot.social' + client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' + + - name: Repository Dispatch stage.yunite.me + uses: peter-evans/repository-dispatch@v2 + with: + token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository + event-type: trigger-ocelot-build-success + repository: 'Yunite-Net/stage.yunite.me' + client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' \ No newline at end of file diff --git a/docs/.github/workflows/test-backend.yml b/docs/.github/workflows/test-backend.yml new file mode 100644 index 000000000..03e517826 --- /dev/null +++ b/docs/.github/workflows/test-backend.yml @@ -0,0 +1,140 @@ +name: ocelot.social backend test CI + + +on: push + +jobs: + files-changed: + name: Detect File Changes - Backend + runs-on: ubuntu-latest + outputs: + backend: ${{ steps.changes.outputs.backend }} + docker: ${{ steps.changes.outputs.docker }} + steps: + - uses: actions/checkout@v3.3.0 + + - name: Check for backend file changes + uses: dorny/paths-filter@v2.11.1 + id: changes + with: + token: ${{ github.token }} + filters: .github/file-filters.yml + list-files: shell + + build_test_neo4j: + name: Docker Build Test - Neo4J + if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true' + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Neo4J | Build 'community' image + run: | + docker build --target community -t "ocelotsocialnetwork/neo4j-community:test" neo4j/ + docker save "ocelotsocialnetwork/neo4j-community:test" > /tmp/neo4j.tar + + - name: Cache docker images + id: cache-neo4j + uses: actions/cache/save@v3.3.1 + with: + path: /tmp/neo4j.tar + key: ${{ github.run_id }}-backend-neo4j-cache + + build_test_backend: + name: Docker Build Test - Backend + if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true' + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: backend | Build 'test' image + run: | + docker build --target test -t "ocelotsocialnetwork/backend:test" backend/ + docker save "ocelotsocialnetwork/backend:test" > /tmp/backend.tar + + - name: Cache docker images + id: cache-backend + uses: actions/cache/save@v3.3.1 + with: + path: /tmp/backend.tar + key: ${{ github.run_id }}-backend-cache + + lint_backend: + name: Lint Backend + if: needs.files-changed.outputs.backend == 'true' + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: backend | Lint + run: cd backend && yarn && yarn run lint + + unit_test_backend: + name: Unit tests - Backend + if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true' + needs: [files-changed, build_test_neo4j, build_test_backend] + runs-on: ubuntu-latest + permissions: + checks: write + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Restore Neo4J cache + uses: actions/cache/restore@v3.3.1 + with: + path: /tmp/neo4j.tar + key: ${{ github.run_id }}-backend-neo4j-cache + fail-on-cache-miss: true + + - name: Restore Backend cache + uses: actions/cache/restore@v3.3.1 + with: + path: /tmp/backend.tar + key: ${{ github.run_id }}-backend-cache + fail-on-cache-miss: true + + - name: Load Docker Images + run: | + docker load < /tmp/neo4j.tar + docker load < /tmp/backend.tar + + - name: backend | copy env files + run: | + cp webapp/.env.template webapp/.env + cp backend/.env.template backend/.env + + - name: backend | docker-compose + run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps neo4j backend + + - name: backend | Initialize Database + run: docker-compose exec -T backend yarn db:migrate init + + - name: backend | Migrate Database Up + run: docker-compose exec -T backend yarn db:migrate up + + - name: backend | Unit test incl. coverage check + run: docker-compose exec -T backend yarn test + + cleanup: + name: Cleanup + if: ${{ needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true' }} + needs: [files-changed, unit_test_backend] + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Delete cache + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh extension install actions/gh-actions-cache + KEY="${{ github.run_id }}-backend-neo4j-cache" + gh actions-cache delete $KEY -R Ocelot-Social-Community/Ocelot-Social --confirm + KEY="${{ github.run_id }}-backend-cache" + gh actions-cache delete $KEY -R Ocelot-Social-Community/Ocelot-Social --confirm diff --git a/docs/.github/workflows/test-e2e.yml b/docs/.github/workflows/test-e2e.yml new file mode 100644 index 000000000..02d65ba9e --- /dev/null +++ b/docs/.github/workflows/test-e2e.yml @@ -0,0 +1,112 @@ +name: ocelot.social end-to-end test CI + +on: push + +jobs: + docker_preparation: + name: Fullstack test preparation + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Copy env files + run: | + cp webapp/.env.template webapp/.env + cp backend/.env.template backend/.env + + - name: Build docker images + run: | + mkdir /tmp/images + docker build --target community -t "ocelotsocialnetwork/neo4j-community:test" neo4j/ + docker save "ocelotsocialnetwork/neo4j-community:test" > /tmp/images/neo4j.tar + docker build --target test -t "ocelotsocialnetwork/backend:test" backend/ + docker save "ocelotsocialnetwork/backend:test" > /tmp/images/backend.tar + docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/ + docker save "ocelotsocialnetwork/webapp:test" > /tmp/images/webapp.tar + + - name: Install cypress requirements + run: | + wget --no-verbose -O /opt/cucumber-json-formatter "https://github.com/cucumber/json-formatter/releases/download/v19.0.0/cucumber-json-formatter-linux-386" + cd backend + yarn install + yarn build + cd .. + yarn install + + - name: Cache docker images + id: cache + uses: actions/cache/save@v3.3.1 + with: + path: | + /opt/cucumber-json-formatter + /home/runner/.cache/Cypress + /home/runner/work/Ocelot-Social/Ocelot-Social + /tmp/images/ + key: ${{ github.run_id }}-e2e-preparation-cache + + fullstack_tests: + name: Fullstack tests + if: success() + needs: docker_preparation + runs-on: ubuntu-latest + env: + jobs: 8 + strategy: + matrix: + # run copies of the current job in parallel + job: [1, 2, 3, 4, 5, 6, 7, 8] + steps: + - name: Restore cache + uses: actions/cache/restore@v3.3.1 + id: cache + with: + path: | + /opt/cucumber-json-formatter + /home/runner/.cache/Cypress + /home/runner/work/Ocelot-Social/Ocelot-Social + /tmp/images/ + key: ${{ github.run_id }}-e2e-preparation-cache + fail-on-cache-miss: true + + - name: Boot up test system | docker-compose + run: | + chmod +x /opt/cucumber-json-formatter + sudo ln -fs /opt/cucumber-json-formatter /usr/bin/cucumber-json-formatter + docker load < /tmp/images/neo4j.tar + docker load < /tmp/images/backend.tar + docker load < /tmp/images/webapp.tar + docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps webapp neo4j backend + sleep 90s + + - name: Full stack tests | run tests + id: e2e-tests + run: yarn run cypress:run --spec $(cypress/parallel-features.sh ${{ matrix.job }} ${{ env.jobs }} ) + + - name: Full stack tests | if tests failed, compile html report + if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }} + run: | + cd cypress/ + node create-cucumber-html-report.js + + - name: Full stack tests | if tests failed, upload report + id: e2e-report + if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }} + uses: actions/upload-artifact@v3 + with: + name: ocelot-e2e-test-report-pr${{ needs.docker_preparation.outputs.pr-number }} + path: /home/runner/work/Ocelot-Social/Ocelot-Social/cypress/reports/cucumber_html_report + + cleanup: + name: Cleanup + needs: [docker_preparation, fullstack_tests] + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Delete cache + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh extension install actions/gh-actions-cache + KEY="${{ github.run_id }}-e2e-preparation-cache" + gh actions-cache delete $KEY -R Ocelot-Social-Community/Ocelot-Social --confirm \ No newline at end of file diff --git a/docs/.github/workflows/test-webapp.yml b/docs/.github/workflows/test-webapp.yml new file mode 100644 index 000000000..2b1e144a5 --- /dev/null +++ b/docs/.github/workflows/test-webapp.yml @@ -0,0 +1,115 @@ +name: ocelot.social webapp test CI + + +on: push + +jobs: + files-changed: + name: Detect File Changes - Webapp + runs-on: ubuntu-latest + outputs: + docker: ${{ steps.changes.outputs.docker }} + webapp: ${{ steps.changes.outputs.webapp }} + steps: + - uses: actions/checkout@v3.3.0 + + - name: Check for frontend file changes + uses: dorny/paths-filter@v2.11.1 + id: changes + with: + token: ${{ github.token }} + filters: .github/file-filters.yml + list-files: shell + + prepare: + name: Prepare + if: needs.files-changed.outputs.webapp == 'true' + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Check translation files + run: | + scripts/translations/sort.sh + scripts/translations/missing-keys.sh + + build_test_webapp: + name: Docker Build Test - Webapp + if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true' + needs: [files-changed, prepare] + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Webapp | Build 'test' image + run: | + docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/ + docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar + + - name: Cache docker image + uses: actions/cache/save@v3.3.1 + with: + path: /tmp/webapp.tar + key: ${{ github.run_id }}-webapp-cache + + lint_webapp: + name: Lint Webapp + if: needs.files-changed.outputs.webapp == 'true' + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: webapp | Lint + run: cd webapp && yarn && yarn run lint + + unit_test_webapp: + name: Unit Tests - Webapp + if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true' + needs: [files-changed, build_test_webapp] + runs-on: ubuntu-latest + permissions: + checks: write + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Restore webapp cache + uses: actions/cache/restore@v3.3.1 + with: + path: /tmp/webapp.tar + key: ${{ github.run_id }}-webapp-cache + + - name: Load Docker Image + run: docker load < /tmp/webapp.tar + + - name: Copy env files + run: | + cp webapp/.env.template webapp/.env + cp backend/.env.template backend/.env + + - name: backend | docker-compose + run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps webapp + + - name: webapp | Unit tests incl. coverage check + run: docker-compose exec -T webapp yarn test + + cleanup: + name: Cleanup + if: ${{ needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true' }} + needs: [files-changed, unit_test_webapp] + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Delete cache + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh extension install actions/gh-actions-cache + KEY="${{ github.run_id }}-webapp-cache" + gh actions-cache delete $KEY -R Ocelot-Social-Community/Ocelot-Social --confirm + diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..928dae262 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,21 @@ +.env +.idea +*.iml +.DS_Store +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.yarn-integrity +.eslintcache +kubeconfig.yaml + +node_modules/ +cypress/videos +cypress/screenshots/ +cypress.env.json + +!.gitkeep +**/coverage + +release/ +*~ \ No newline at end of file diff --git a/docs/.gitmodules b/docs/.gitmodules new file mode 100644 index 000000000..b2aae2ea3 --- /dev/null +++ b/docs/.gitmodules @@ -0,0 +1,6 @@ +[submodule "styleguide"] + path = styleguide + url = https://github.com/Human-Connection/Nitro-Styleguide.git +[submodule "deployment/configurations/stage.ocelot.social"] + path = deployment/configurations/stage.ocelot.social + url = git@github.com:Ocelot-Social-Community/stage.ocelot.social.git diff --git a/docs/.nvmrc b/docs/.nvmrc new file mode 100644 index 000000000..cb77acbfe --- /dev/null +++ b/docs/.nvmrc @@ -0,0 +1 @@ +v19.4.0 \ No newline at end of file diff --git a/docs/.versionrc.json b/docs/.versionrc.json new file mode 100644 index 000000000..25c298f45 --- /dev/null +++ b/docs/.versionrc.json @@ -0,0 +1,7 @@ +{ + "bumpFiles": [ + "package.json", + "backend/package.json", + "webapp/package.json" + ] +} diff --git a/docs/.vscode/extensions.json b/docs/.vscode/extensions.json new file mode 100644 index 000000000..e2d92ff83 --- /dev/null +++ b/docs/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "octref.vetur", + "gruntfuggly.todo-tree", + ] +} \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 000000000..8950daedd --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,17193 @@ +### Changelog + +All notable changes to this project will be documented in this file. Dates are displayed in UTC. + +Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + +#### [3.0.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.0.0...3.0.1) + +- fix(webapp): try to fix avatars [`#6660`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6660) +- conditional url replacement [`5c1ab88`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5c1ab880127a5f4c1b457598fafd3ae9fe1a0d12) +- try to fix avatars [`6f43321`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/6f43321abad945602529b962e536546ab541cd70) +- lint fixes [`7e697d7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7e697d7f9ddce184911680485ceac9d6b510349f) + +### [3.0.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.7.0...3.0.0) + +> 7 August 2023 + +- chore(other): release v3.0.0 [`#6658`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6658) +- fix(webapp): add missing locales [`#6652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6652) +- fix(webapp): fix wrong labels in filter menu buttons [`#6656`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6656) +- refactor(webapp): refactor filter menu [`#6535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6535) +- fix(webapp): correct chat usertag profile link [`#6646`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6646) +- fix(webapp): fix create event typing issues [`#6643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6643) +- fix(webapp): mini chat: dynamic header buttons [`#6641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6641) +- fix(webapp): start search of user after three characters (chat new room, add group member) [`#6639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6639) +- refactor(webapp): updated/refactored ui of create post page [`#6559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6559) +- fix(webapp): fix code in editor component [`#6624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6624) +- fix(backend): security subscriptions [`#6621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6621) +- fix(webapp): change the background color of my messages to the same color as side menu [`#6620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6620) +- feat(webapp): change general search hint [`#6619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6619) +- feat(webapp): chat component + button open search [`#6618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6618) +- feat(webapp): change color red to green on cancel buttons of post and comments [`#6565`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6565) +- fix(webapp): groups highlighting [`#6608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6608) +- feat(webapp): chat link to chat page [`#6617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6617) +- fix(webapp): fix lastMessage to contain proper values [`#6615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6615) +- fix(backend): chat create message - only take 2000 chat message characters [`#6613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6613) +- feat(webapp): chat component can now show clickable urls [`#6614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6614) +- fix(webapp): highlight username functionality for chat [`#6609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6609) +- fix(webapp): fix chat behaviour [`#6611`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6611) +- feat(webapp): chat seen check style [`#6612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6612) +- feat(webapp): on open chat room page close or on change profile and click chat change small chat [`#6605`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6605) +- feat(webapp): change text for chat room search to `Filter chat rooms` [`#6601`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6601) +- fix(backend): convert indexId to string (neo4j number problem) [`#6603`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6603) +- fix(other): github cache in workflow [`#6604`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6604) +- feat(webapp): show last message and unread count in room list [`#6595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6595) +- refactor(other): cache docker images for backend webapp e2e testing [`#6585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6585) +- feat(backend): chat message added subscription [`#6586`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6586) +- refactor(backend): removed promise all from seed [`#6599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6599) +- feat(webapp): add headline to chat page [`#6563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6563) +- fix(other): set workflow not to fail while deleting cache [`#6594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6594) +- feat(backend): room count subscription [`#6584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6584) +- fix(backend): profile query fix [`#6587`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6587) +- feat(webapp): mark messages as seen [`#6567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6567) +- feat(webapp): changed usertag in chat messages to user-slug [`#6555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6555) +- feat(backend): more room properties [`#6564`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6564) +- refactor(backend): chat messages - order by indexId instead of createdAt [`#6562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6562) +- feat(webapp): chat language is reactive [`#6560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6560) +- feat(backend): unread rooms query [`#6566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6566) +- feat(webapp): chat last seen in webapp [`#6580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6580) +- feat(webapp): chat paginate rooms [`#6579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6579) +- refactor(other): use cached docker images in github e2e flow to decrease run time of e2e test job runs [`#6582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6582) +- fix(webapp): show room header images. [`#6581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6581) +- feat(backend): chat seed [`#6561`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6561) +- feat(webapp): chat message pagination [`#6549`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6549) +- feat(webapp): chat remove reply smileys [`#6553`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6553) +- feat(webapp): remove message actions for chat [`#6552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6552) +- feat(backend): more message props [`#6547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6547) +- refactor(backend): fix seed to not use promise all where easily refactored [`#6520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6520) +- refactor(other): add proper reporting to cypress tests [`#6540`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6540) +- refactor(other): cypress - migrate from cypress-file-upload to .selectFile() [`#6528`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6528) +- feat(webapp): change chat style and lang [`#6517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6517) +- feat(webapp): show events with locations on the map [`#6518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6518) +- feat(webapp): refine chat notification in header menu and chat button on user profile [`#6550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6550) +- refactor(other): disable cypress test retries [`#6527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6527) +- feat(webapp): event creation page -better placeholder texts for venue and city inputs [`#6525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6525) +- refactor(other): refine webapp github workflow conditions [`#6526`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6526) +- docs(other): update TODO-next-update.md for 2.7.0-470 [`#6532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6532) +- fix(backend): chat - do not allow to create room with self [`#6530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6530) +- feat(webapp): chat message capability [`#6524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6524) +- chore(backend): bump @faker-js/faker from 5.1.0 to 8.0.2 [`#6368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6368) +- chore(other): bump cypress from 12.14.0 to 12.17.0 [`#6509`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6509) +- feat(webapp): chat rooms [`#6519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6519) +- fix(other): fix branded build - rename files to js for the webapp [`#6516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6516) +- fix(backend): fix branded build (migration) [`#6508`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6508) +- fix(backend): fix branded build [`#6507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6507) +- feat(webapp): create a component chat scaffholding [`#6503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6503) +- fix(webapp): fix create post & notifications [`#6505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6505) +- feat(backend): typescript eslint backend [`#6478`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6478) +- fix(backend): subscriptions [`#6477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6477) +- fix(backend): seed reports [`#6472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6472) +- refactor(backend): remove activity pub [`#6470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6470) +- fix(webapp): change registration `terms and conditions`, `data privacy` links to use `page-params-link` [`#6441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6441) +- feat(backend): message properties [`#6471`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6471) +- feat(backend): room properties [`#6451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6451) +- fix(backend): create message mutation [`#6469`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6469) +- feat(backend): messages [`#6450`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6450) +- feat(backend): rooms [`#6444`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6444) +- fix(other): neo4j config map & node version [`#6464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6464) +- Bump @babel/core from 7.22.1 to 7.22.5 [`#6413`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6413) +- refactor(database): update neo4j to 4.4 [`#6306`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6306) +- Bump cypress from 12.13.0 to 12.14.0 [`#6414`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6414) +- Bump node from 20.2.0-alpine3.17 to 20.3.0-alpine3.17 in /backend [`#6409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6409) +- Bump node from 20.2.0-alpine3.17 to 20.3.0-alpine3.17 in /webapp [`#6408`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6408) +- fix(backend): typescript fix [`#6448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6448) +- refactor(backend): migrate completely to typescript [`#6434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6434) +- remove package cypress-file-upload from e2e testing [`73f6bc6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/73f6bc642194b0c73769d4e8d8e53645b6e80adf) +- fixed cypress [`5f545f3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5f545f3b8fc6927954e036b27ad2e123bcd36149) +- fix seed to not use promise all where easily refactored [`1b0f512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1b0f5124159033214f99bfbc4cebe9dfaa7dd76e) + +#### [2.7.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.6.0...2.7.0) + +> 14 June 2023 + +- chore(release): v2.7.0 [`#6440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6440) +- fix(webapp): fix event teaser date from start to end by new components [`#6385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6385) +- refactor(webapp): optimize create and update event form [`#6381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6381) +- feat(backend): show events not ended yet [`#6405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6405) +- feat(backend): migration to add postType property to existing posts [`#6396`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6396) +- feat(backend): seed events [`#6391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6391) +- feat(backend): seed posts as article [`#6227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6227) +- refactor(webapp): fix coverage [`#6361`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6361) +- test(other): migrate cypress to v12 [`#6008`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6008) +- refactor(backend): copy files in external script [`#6364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6364) +- feat(webapp): alternative solution for filter and order posts [`#6367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6367) +- refactor(webapp): changed color for event-ribbon. [`#6362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6362) +- fix(webapp): warnings in unit tests [`#6359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6359) +- Bump metascraper-title from 5.33.5 to 5.34.7 in /backend [`#6372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6372) +- Bump @babel/preset-env from 7.21.5 to 7.22.4 [`#6369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6369) +- fix(other): typescript fix regarding dist/build folder 2 [`#6366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6366) +- fix(backend): corrected path in branded images for backend build folder(former dist) [`#6365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6365) +- chore(other): upgrade node version in '.nvmrc' files to v20.2.0 [`#6331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6331) +- feat(backend): typescript [`#6321`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6321) +- fix(webapp): fix group list number to six [`#6319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6319) +- fix(webapp): fix notification menu comment hash [`#6335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6335) +- feat(other): 🍰 epic events – master [`#6199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6199) +- fix(other): fix avatar seeding [`#6260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6260) +- chore(other): set 'DEBUG=true' in backend '.env.template' to use GraphQL Playground [`#6333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6333) +- refactor(other): unused packages ocelot [`#6326`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6326) +- refactor(backend): unused packages backend [`#6325`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6325) +- docs(other): add description for script usage in deployment readme [`#6329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6329) +- fix(webapp): fix newsfeed layout [`#6154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6154) +- fix(webapp): adds white space after user handle in comment editor [`#6308`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6308) +- Bump validator from 13.0.0 to 13.9.0 in /backend [`#6076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6076) +- Bump metascraper-soundcloud from 5.34.2 to 5.34.4 in /backend [`#6312`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6312) +- Bump metascraper-audio from 5.33.5 to 5.34.4 in /backend [`#6287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6287) +- Bump node from 19.9.0-alpine3.17 to 20.2.0-alpine3.17 in /backend [`#6310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6310) +- docs(other): add missing todo in deployment readme 'TODO-next-update.md' [`#6324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6324) +- Bump node from 20.1.0-alpine3.17 to 20.2.0-alpine3.17 in /webapp [`#6309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6309) +- fix(backend): helmet fix [`#6318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6318) +- fix(backend): helmet + graphiql [`#6303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6303) +- Bump @babel/preset-env from 7.21.4 to 7.21.5 [`#6273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6273) +- Bump date-fns from 2.25.0 to 2.30.0 [`#6283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6283) +- Bump node from 19.9.0-alpine3.17 to 20.1.0-alpine3.17 in /webapp [`#6280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6280) +- Bump @babel/core from 7.21.4 to 7.21.8 [`#6284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6284) +- Bump helmet from 3.22.0 to 7.0.0 in /backend [`#6296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6296) +- fix(webapp): fix z layer of header elements [`#6279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6279) +- fix(webapp): properly render avatars in group settings [`#6289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6289) +- fix(backend): post type on notifications [`#6257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6257) +- fix(backend): recover missing commit [`#6262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6262) +- feat(backend): filter posts by post type [`#6255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6255) +- feat(backend): save location address [`#6240`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6240) +- feat(backend): add further event params [`#6231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6231) +- feat(backend): event parameters [`#6198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6198) +- feat(backend): create and update posts with labels [`#6197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6197) +- feat(backend): add article label to posts [`#6196`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6196) +- Cypress: update packaage info [`b38769b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/b38769b048e9cb9ca07862a61ea810f21b4ce82a) +- update cypress related packageges in package.json [`692ec2a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/692ec2a11555600647ec8d95b8296c9869948b02) +- fixed coverage reporting [`540cd40`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/540cd40e10ec0461ef17379cb93d914839f3a84f) + +#### [2.6.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.5.1...2.6.0) + +> 27 April 2023 + +- chore(release): v2.6.0 [`#6271`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6271) +- fix(other): docker-compose for rebranding deployment [`#6265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6265) +- feat(webapp): default categories of group for posts in group [`#6259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6259) +- refactor(webapp): make action radius select in group form a reusable component [`#6244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6244) +- fix(webapp): show avatar for group members [`#6258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6258) +- fix(webapp): fix search for 3 chars [`#6256`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6256) +- fix(backend): group posts cannot be pinned [`#6242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6242) +- Bump metascraper-soundcloud from 5.33.5 to 5.34.2 in /backend [`#6213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6213) +- refactor(other): refactor test workflows [`#6151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6151) +- fix(other): deployment fix typo, update stage.ocelot.social reference [`#6230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6230) +- fix(other): bump metascraper-url from 5.33.5 to 5.34.2 in /backend [`#6217`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6217) +- fix(other): workflow typo [`#6235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6235) +- feat(other): publish stage.yunite.me hook [`#6234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6234) +- fix(other): reduce kubernetes memory limits [`#6229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6229) +- fix(other): deployment for branded image with custom names [`#6228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6228) +- Bump node from 19.8.1-alpine3.17 to 19.9.0-alpine3.17 in /backend [`#6219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6219) +- Bump node from 19.8.1-alpine3.17 to 19.9.0-alpine3.17 in /webapp [`#6220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6220) +- feat(other): deployment pod resources [`#6132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6132) +- Bump @babel/core from 7.12.17 to 7.21.4 in /webapp [`#6215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6215) +- Bump jsonwebtoken from 8.5.1 to 9.0.0 in /webapp [`#6079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6079) +- Bump jest from 29.4.2 to 29.5.0 in /webapp [`#6094`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6094) +- Bump babel-jest from 29.4.2 to 29.5.0 in /webapp [`#6095`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6095) +- Bump neode from 0.4.8 to 0.4.9 in /backend [`#6075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6075) +- Bump node from 19.4.0-alpine3.17 to 19.8.1-alpine3.17 in /webapp [`#6155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6155) +- Bump node from 19.4.0-alpine3.17 to 19.8.1-alpine3.17 in /backend [`#6156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6156) +- Bump @babel/core from 7.9.0 to 7.21.4 [`#6200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6200) +- Bump @babel/preset-env from 7.12.7 to 7.21.4 [`#6204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6204) +- Bump expect from 25.3.0 to 29.5.0 [`#6098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6098) +- separate test workflows [`3533a36`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3533a36cdc811c0e1dae218fbc2184f7c4bc3951) +- get it working [`8df7d5d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8df7d5d265b0c5ba16f167a213631d765d2f985e) +- feat(webapp): group categories on posts [`3244f3f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3244f3f86d1e8c09e0fd49f43c49f0a3aa8b85ab) + +#### [2.5.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.5.0...2.5.1) + +> 23 March 2023 + +- chore(other): release v2.5.1 – fix filter menu width [`#6180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6180) +- feat(webapp): add tooltips to all menu icons [`#6185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6185) +- fix(webapp): popup filter max-width [`#6177`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6177) +- Add tooltip to header notifications menu [`28505a5`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/28505a5b181008ebcde6fa58b7a4a8459a492018) +- Add tooltip to header avatar menu [`4c0469f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4c0469f61a3c2fae23e50c6a5a2a91b63fac149a) +- Release v2.5.1 - fix filter menu width [`08def14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/08def14cafef7816d8e43f1896430400bda9635d) + +#### [2.5.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.4.0...2.5.0) + +> 21 March 2023 + +- chore(other): release v2.5.0 [`#6172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6172) +- fix(other): publish transmit github run number properly [`#6171`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6171) +- feat(other): deployment include GitHub run number on branded images [`#6170`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6170) +- fix(backend): new migration to create search indexes [`#6167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6167) +- fix(other): prevent exposing secrets in the github actions by not setting debug mode on cluster deploy [`#6168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6168) +- feat(other): echo current configuration when running scripts [`#6169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6169) +- refactor(other): build & deployment of branded images on stage.ocelot.social [`#6163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6163) +- fix(webapp): close popover notification menu [`#6166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6166) +- fix(webapp): small buttons in notifications menu [`#6162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6162) +- fix(webapp): revert pr `on newsfeed add bigger y-gap between posts #6121` [`#6164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6164) +- fix(webapp): join leave button for pending members [`#6152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6152) +- feat(backend): notifications for groups [`#6150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6150) +- feat(webapp): add hint text to create and edit a post of a group aside of the save and abort buttons [`#6114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6114) +- fix(other): use access token to trigger build on external repo [`#6145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6145) +- feat(webapp): set different icon and text on join leave button, when member is pending [`#6124`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6124) +- refactor(other): deployment upgrade to specific version, trigger build on stage [`#6143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6143) +- feat(webapp): show 2 GroupItem per row in GroupList [`#6135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6135) +- fix(backend): do not delete migrations on db reset [`#6136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6136) +- feat(other): deployment reseed [`#6129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6129) +- feat(other): deployment secrets [`#6120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6120) +- feat(webapp): refactor notification page [`#6116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6116) +- fix(webapp): fix ribbons position [`#6130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6130) +- fix(webapp): fix donation bar blink [`#6107`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6107) +- feat(webapp): change order of groups to new first [`#6122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6122) +- fix(webapp): error in user profil on the 'show x more' button [`#6093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6093) +- feat(webapp): filter button style change [`#6109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6109) +- refactor(other): deactivate video recording & only upload screenshots, if tests fail for e2e tests [`#6125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6125) +- fix(webapp): change icon color of active topics (categories) of post teaser [`#6112`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6112) +- docs(other): correct **/README.md [`#6059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6059) +- fix(webapp): fix `viewport``width=device-width` by removing it [`#6110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6110) +- feat(webapp): on newsfeed add bigger y-gap between posts [`#6121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6121) +- Bump peter-evans/repository-dispatch from 1 to 2 [`#6117`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6117) +- fix(webapp): fix gap news feed [`#6065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6065) +- feat(webapp): change shout icon `bullhorn` to `heart-o` [`#6115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6115) +- refactor(webapp): change invite code button and menu to copy invite link [`#6108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6108) +- feat(webapp): change group filter button text [`#6105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6105) +- feat(webapp): 🍰 allows mark all notifications as read [`#3922`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3922) +- fix(other): deploy branded - upload to dockerhub [`#6099`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6099) +- feat(webapp): remove user from group [`#6072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6072) +- chore(other): remove apple m1 docker overrides [`#6056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6056) +- refactor(other): ocelot publish workflows [`#6083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6083) +- fix(other): lint pr only on pullrequest [`#6088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6088) +- fix(other): dependabot do not rebase [`#6096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6096) +- feat(backend): filter posts in my groups [`#6091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6091) +- refactor(backend): withdraw mock of gql and replace with graphql-tag function [`#6022`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6022) +- docs(other): update readme.md [`#6090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6090) +- feat(webapp): adjust and create branding possibilities [`#6063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6063) +- fix(other): exclude dependabot from pr title linting [`#6085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6085) +- feat(webapp): change ``Benutzer`` to ``Nutzer`` [`#6027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6027) +- docs(webapp): change the used nvm version [`#6023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6023) +- feat(other): backup script [`#6051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6051) +- fix(backend): user or group has null as description [`#5996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5996) +- feat(other): script to set a cluster in maintenance mode [`#6042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6042) +- feat(other): fix dependabot [`#6035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6035) +- fix(other): fix maintenance page & maintenance build [`#6032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6032) +- refactor(webapp): upgrade jest and vue test util [`#5968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5968) +- refactor(other): deployment [`#5975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5975) +- fix(webapp): remove additional markers from map [`#6021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6021) +- feat(webapp): add align center to the user profile slug [`#6012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6012) +- chore(other): update github actions for node 16 [`#5971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5971) +- refactor(backend): update jest [`#5964`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5964) +- Revert "V2.3.0" [`#95`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/95) +- V2.3.0 [`#94`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/94) +- v2.3.0-281 [`#93`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/93) +- rebranding for yunite [`#26`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/26) +- feat(webapp): copy fonts from assets [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25) +- feat(webapp): copy fonts from assets [`#92`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/92) +- chore: 🍰 Release v2.2.0-267 – Fixes And Groups Page Etc. [`#19`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/19) +- fix: 🍰 Change Hasttag Menu Search Color To `#17b53f` [`#21`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/21) +- chore: 🍰 Release v2.2.0-267 [`#90`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/90) +- Docu Updates [`#86`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/86) +- chore: 🍰 Release v2.1.0-253 – Merge Groups Into master – Epic Groups [`#12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/12) +- chore: 🍰 Release v2.1.0-253 [`#87`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/87) +- chore: [WIP] 🍰 Release v2.0.0-250 – Groups – Configurable Header Menu Is Translatable Etc. [`#16`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/16) +- chore: 🍰 Release v2.0.0 – Groups Etc. – Extend Rebranding And Deployment [`#83`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/83) +- fix: 🍰 Fix Implementation Of Overwriting Locales [`#80`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/80) +- feat: 🍰 Merge Locales [`#77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/77) +- chore: 🍰 Groups Release v1.1.1-231 - Show New Features [`#14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/14) +- chore: 🍰 Release v1.1.1 – First Design Rebranding [`#10`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/10) +- chore: [WIP] 🍰 Refine Rebanding And Deployment [`#8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8) +- chore: 🍰 Fix Folder Name From `branding/assets/styles/import` To `branding/assets/styles/imports` [`#71`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/71) +- chore: 🍰 Release v1.1.1-228 – Refactor Rebranding [`#68`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/68) +- chore: 🍰 Release v1.1.0-205 [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6) +- chore: 🍰 Release v1.1.0-225 [`#66`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/66) +- chore: [WIP] 🍰 Refine Deployment Setup And Documentation [`#46`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/46) +- chore: [WIP] 🍰 Release v1.1.0 - Implement Categories Again [`#63`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/63) +- Update issue templates [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3) +- chore: 🍰 Release v1.0.9-199 [`#59`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/59) +- chore: 🍰 Implement `PRODUCTION_DB_CLEAN_ALLOW` for Staging Production Environments [`#56`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/56) +- chore: 🍰 Add Docker Compose Override For Apple M1 And Docu [`#57`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/57) +- Chore: 🍰 Fix `apiVersion: cert-manager.io/v1alpha2` To `*/v1` [`#53`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/53) +- chore: 🍰 Adjust `maintenance` Container Name In Deployment With Helm [`#50`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/50) +- chore: 🍰 Release New Build Version `v1.0.8-184` [`#51`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/51) +- chore: 🍰 Rename Neo4j Docker Image In General To `neo4j-community:*` [`#49`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/49) +- feat: 🍰 Release v1.0.8 – Configure Cookie Expire Time – second run [`#44`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/44) +- feat: 🍰 Configure Cookie Expire Time [`#43`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/43) +- docs: 🍰 Add Docs For Backups, Rollbacks, And Release v1.0.7-171 [`#40`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/40) +- chore: 🍰 Realease v1.0.6-170 [`#37`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/37) +- chore: 🍰 Refactor FAQ Link To Use Internal Page Which Was Implemented Before [`#36`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/36) +- chore: 🍰 Add Branding Templates For Terms And Conditions Etc. [`#32`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/32) +- feat: 🍰 Add Rebranded E-Mails For Sending Notifications [`#29`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/29) +- bug: 🍰 Fix Minor Errors And Clarify Docs [`#28`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/28) +- chore: 🍰 Implement New Internal Pages – Main Release v1.0.5 [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25) +- feat: [WIP] 🍰 Add Landing Page Etc. [`#22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/22) +- docs: 🍰 [WIP] Add Configure And Rebranding Readme.md [`#20`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/20) +- chore: [WIP] 🍰 New Deployment With 'base' And 'code' Docker Images [`#15`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/15) +- feat: [WIP] 🍰 Flexible Footer Links [`#17`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/17) +- 💥 Release v1.0.3 [`#12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/12) +- 🛠 [Refactor] Add README And LICENSE [`#11`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/11) +- chore: 🍰 Implement Use Of package.json 'Version' Etc. For Build And Refine Helm Chart [`#8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8) +- chore: 🍰 Replace Ocelot Logos 619x593 With 600x570 [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6) +- brand_as_default [`#4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4) +- limit_replicasets [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3) +- Deployment [`#2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2) +- moved example into stage.ocelot.social [`61b5112`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/61b5112b8b547a7491d644c7c4dbfead39b61d79) +- feat(backand): upgrade jest to 29.4 [`4390d72`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4390d72477fb941f69bc9bdc24ac7713ef06e827) +- pages tests nearly working [`4850e45`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4850e456fe5b7c158f23acc7f153576472604300) + +#### [2.4.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.3.0...2.4.0) + +> 10 February 2023 + +- chore(release): v2.4.0 [`#5961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5961) +- fix(webapp): post teaser width in mobile view [`#5958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5958) +- fix(webapp): navbar disappears when scrolling to top [`#5957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5957) +- fix(webapp): close mobile menu on all links [`#5956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5956) +- feat(webapp): mark active filters on the posts [`#5952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5952) +- refactor(webapp): refacchange postion add content button, refactor mobile filter menu [`#5943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5943) +- refactor(webapp): set legend to map [`#5950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5950) +- fix(webapp): small changes for deploy [`#5949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5949) +- feat(webapp): hide navbar by scroll, filter button for content [`#5926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5926) +- feat(webapp): map [`#5843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5843) +- refactor(webapp): upgrade node version to 19.4 [`#5910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5910) +- fix(webapp): texts for groups [`#5923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5923) +- fix(webapp): add category name in tooltip [`#5884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5884) +- refactor(webapp): 🍰 Refactor Social Media And `MySomethingList` [`#5138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5138) +- fix(backend): do not expose registered emails on registration [`#5909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5909) +- refactor(backend): node 19 with fixed image upload [`#5897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5897) +- refactor(webapp): nump docker version to `16.19.0` in webapp & maintenance [`#5842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5842) +- updated required packages for node19, fix fs-capacitator [`11087cb`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/11087cbaefde604668ac192b710666df09cb813c) +- fixed build error [`3889204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3889204f871df97b307401032900db7940913038) +- linting [`8bfe486`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8bfe486034badd55a8096982f81aba08207b9e83) + +#### [2.3.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.2.0...2.3.0) + +> 5 December 2022 + +- chore(release): v2.3.0 [`#5768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5768) +- feat(webapp): 🍰 Sort Categories By Name [`#5709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5709) +- fix(backend): sanitize group description [`#5707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5707) +- fix(webapp): clean up webapp unit tests [`#5711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5711) +- feat(webapp): 🍰 Search Users To Add To Group [`#5652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5652) +- feat(webapp): 🍰 Params For Category Filter [`#5699`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5699) +- fix(backend): 🍰 Misspelled Notification [`#5703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5703) +- test(other): jest coverage report in console [`#5637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5637) +- fix(webapp): centralize mobile hamburger menu [`#5674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5674) +- refactor(backend): 🍰 Move `db/graphql` Folder Content To `graphql` Folder [`#5661`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5661) +- feat(other): semantic pullrequest workflow [`#5634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5634) +- fix: Cannot Add Group Members as New Members to Group [`#5635`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5635) +- fix: My Groups Count Includes Pending Membership [`#5631`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5631) +- frontend: jest coverage [`f57e11d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f57e11dd021dbb156b33fbd5538cf5ca32df7334) +- reverted yarn lock [`a01aee8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a01aee89a92bbc9885e2895c577eb3c63042ba22) +- reverted all package updates [`a520089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a5200893f4508d45619447231b6789178a51daf7) + +#### [2.2.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.1.0...2.2.0) + +> 28 October 2022 + +- chore: 🍰 Release v2.2.0 [`#5610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5610) +- refactor: 🍰 Refactor Design Of Category Filter In Filter Menu [`#5597`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5597) +- feat: 🍰 Footer And Header Links Configurable To Have External Link Target [`#5590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5590) +- feat: 🍰 Header Menu To Component And Other Refinements [`#5546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5546) +- fix: 🍰 Comments On Posts In Groups In Webapp [`#5607`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5607) +- docs: 🍰 Add Live Demo To Main Readme [`#5600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5600) +- feat: Restrict Comments on Posts in Groups [`#5599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5599) +- fix: 🍰 Add Space In Register Box [`#5591`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5591) +- fix: 🍰 Update Group Avatar After Upload [`#5583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5583) +- feat: 🍰 Make Donation Progress Bar Color Configurable [`#5593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5593) +- fix: 🍰 Bug In Edit Slug Of Group [`#5596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5596) +- fix: 🍰 Fix Group Teaser [`#5584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5584) +- feat: 🍰 List All Groups [`#5582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5582) +- feat: 🍰 Header Logo Routing Update [`#5579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5579) +- add header menu to component, central variabl for screen width [`401f59a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/401f59ae8de5b1c27f0e26e1f71778d3257d2180) +- comment out LanguagesFilter, EmotionsFilter, fix tests, fix lint [`52dcd77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/52dcd772fa81e02a0d95e89a9fc8232e70a09d28) +- fix lint [`15561cb`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/15561cb94f8768e93846c25945c935ae83977553) + +#### [2.1.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.0.0...2.1.0) + +> 25 October 2022 + +- chore: 🍰 Release v2.1.0 [`#5574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5574) +- feat: 🍰 EPIC Groups [`#5132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5132) +- chore: 🍰 Remove Group Branchs `5059-epic-groups` Separate Auto-Deployment [`#5552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5552) +- fix: [WIP] 🍰 Long Words Are Being Wrapped Now [`#5559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5559) +- Remove groups separate auto-deployment [`c8d8168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c8d816887b2d49293d1b8ee2805d452fe10d907e) +- Release v2.1.0 [`dc085e9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/dc085e9e69b288fce6dd06e8d7eb05ef34bd9a7b) +- Add database migration to auto-deployment on publish [`ef06f1a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ef06f1a67d2654aaeb55d0434d3324a3ac37a380) + +### [2.0.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.1.1...2.0.0) + +> 23 October 2022 + +- feat: 🍰 Search For Groups [`#5543`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5543) +- feat: 🍰 Mobile Footer Menu To Header Menu [`#5524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5524) +- feat: 🍰 Implement `LOGO_HEADER_CLICK` As Configuration [`#5525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5525) +- refactor: 🍰 Category Filter In Filter Menu [`#5527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5527) +- feat: 🍰 Group Invitation [`#5512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5512) +- feat: 🍰 Implement Post In Group In Webapp [`#5468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5468) +- feat: :cake: Update Issue Templates [`#5508`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5508) +- refactor: 🍰 Disable Submit Button On group Update Changed Error [`#5489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5489) +- feat: 🍰 Seed Posts In Groups [`#5503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5503) +- feat: 🍰 Make Configurable Header Menu Translatable [`#5491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5491) +- feat: 🍰 Post In Groups [`#5380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5380) +- feat: 🍰 Refine Group Creation And Group Edit [`#5418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5418) +- feat: 🍰 Implement Content Menu On Group Profile [`#5419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5419) +- feat: 🍰 Group Members Management [`#5345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5345) +- feat: 🍰 Have My Groups In The User Menu And Configure Groups Button In Header [`#5411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5411) +- chore: 🍰 Implement Automatic Deployment For Groups Branch '5059-epic-groups' [`#5408`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5408) +- feat: 🍰 Group Profile Description Etc [`#5368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5368) +- feat: 🍰 Group Profile Members List Etc [`#5335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5335) +- feat: 🍰 Implement Group Profile – Visibility [`#5332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5332) +- feat: 🍰 My Groups Page [`#5148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5148) +- feat: 🍰 Hidden Groups Shall Not Be Visible For None Or Pending Members In Backend [`#5317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5317) +- feat: 🍰 Implement Group Profile [`#5197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5197) +- feat: 🍰 Implement `UpdateGroup` Resolver [`#5224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5224) +- feat: 🍰 Implement `JoinGroup`, `GroupMember`, `SwitchGroupMemberRole` Resolvers [`#5199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5199) +- chore: 🍰 Add Groups To Seeding [`#5185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5185) +- feat: 🍰 Implement Group GQL Model And CRUD Resolvers – First Step [`#5139`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5139) +- Refine design and functionality of group list and create, edit group [`7b11122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7b11122bea4868624dd1c1641219e71070412e20) +- improved code and tests as suggested by @tirokk, thanks for the great review! [`631f34a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/631f34a2e5224d68279337a92e7535794b670d70) +- implement and test post visibilty when leaving or changing the role in a group [`76bfe48`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/76bfe484768cf9b20b2dced865d5d3e3eb999235) + +#### [1.1.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.1.0...1.1.1) + +> 22 September 2022 + +- Chore: 🍰 Release v1.1.1 – Refactor Rebranding [`#5392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5392) +- chore: 🍰 Refactor Rebranding [`#5390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5390) +- feat: 🍰 Tooltips For Topics [`#5350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5350) +- feat: 🍰 Save Categories In Frontend [`#5284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5284) +- feat: 🍰 Add New Yunite Icons [`#5319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5319) +- chore: 🍰 Update Neode From v^0.4.7 To v^0.4.8 In Backend [`#5334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5334) +- fix: Category Filter Menu Client Only [`#5301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5301) +- feat: Save Category Settings [`#5261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5261) +- feat: Topics Menu [`#5248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5248) +- docs: 🍰 Document GraqhQL Playground [`#5253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5253) +- feat: Categories Filter Menu [`#5198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5198) +- fix: 🍰 Fix Test Description From `enter-nonce.vue` To `change-password` [`#5217`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5217) +- Bump cookie-universal-nuxt from 2.1.5 to 2.2.2 in /webapp [`#5218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5218) +- Bump prettier from 2.2.1 to 2.7.1 in /webapp [`#5170`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5170) +- Bump eslint-plugin-prettier from 3.1.2 to 3.4.1 in /backend [`#5211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5211) +- Bump slug from 4.0.2 to 6.0.0 in /backend [`#5193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5193) +- chore: 🍰 Fix typo in PULL_REQUEST_TEMPLATE.md file [`#5208`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5208) +- Bump slug from 5.1.0 to 6.0.0 [`#5191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5191) +- Bump vue-sweetalert-icons from 4.3.0 to 4.3.1 in /webapp [`#5174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5174) +- feat: 🍰 Change Error Message With `Authorised` To `Authorized` All Over The Place To Have American English [`#5206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5206) +- Bump cross-env from 7.0.2 to 7.0.3 in /webapp [`#5168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5168) +- chore: 🍰 Add `--logHeapUsage` To Jest Test Call [`#5182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5182) +- refactor: 🍰 Rename `UserGroup` To `UserRole` [`#5143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5143) +- add new yunite icons [`bb0d632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/bb0d6329e7e36ea03671318ea8dd128a6d5a5a7a) +- cleanup refactor rebranding [`5f5c0fa`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5f5c0faa1f28cd4df7681eba335ae5998b2d9cca) +- change color and scss in branding [`52070b8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/52070b8c570970bf48df561134bf67cb4111b640) + +#### [1.1.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.9...1.1.0) + +> 4 August 2022 + +- chore: 🍰 Release v1.1.0 - Implement Categories Again [`#5145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5145) +- feat: Make Categories Optional [`#5102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5102) +- Update issue templates [`#5101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5101) +- chore: 🍰 Betters Automatic Deployment To `stage.ocelot.social` On Push To `master` Branch [`#5097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5097) +- add optional categories to teaser and post [`bc95500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/bc955003f7c33aabe592bee782aca973b4f00cba) +- env vatiable for CATEGORIES_ACTIVE and switch for categories in contribution form [`e31f250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e31f250ea5e1949f4f08e72fe82622d41ecd85f1) +- fix some tests [`5393c2a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5393c2aeaaf070a637390c430d5f03057030ff52) + +#### [1.0.9](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.8...1.0.9) + +> 20 July 2022 + +- chore: 🍰 Release v1.0.9 [`#5095`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5095) +- chore: 🍰 Automatic Deployment To `stage.ocelot.social` On Push To `master` Branch [`#5080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5080) +- change footer version-link [`#5091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5091) +- docs: 🍰 Add Neo4j Docu For Important Commands [`#5090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5090) +- 5079 legends for search field [`#5088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5088) +- chore: 🍰 Change `image` Entries In Docker Compose Files And Fix Apple M1 Problem [`#5073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5073) +- chore: 🍰 Rename Neo4j Docker Image In General To `neo4j-community:*` [`#5078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5078) +- chore: 🍰 Fix `ocelotsocialnetwork/webapp:latest` And `ocelotsocialnetwork/backend:latest` On Start In Cluster [`#5076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5076) +- Add documentation for Apple M1 Docker Compose override files [`2f3f37c`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2f3f37c158cfc9b300540d3c8f016548b15a5277) +- Add documentation for Docker build analyzes [`fbbcc5b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fbbcc5bb854d53b5fa658b83d56d381a3cbc2b1a) +- Implement DigitalOcean Kubernetes deployment on publishing [`485e698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/485e6986b88a14db5ab75ed12bab5cdc73592ca6) + +#### [1.0.8](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.7...1.0.8) + +> 1 July 2022 + +- chore: 🍰 Release v1.0.8 [`#5058`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5058) +- chore: 🍰 Log E-Mail If Not Sending It [`#5038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5038) +- test: 🍰 Test And Refactor E-Mail Templates [`#4787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4787) +- fix: 🍰 Replace Hashtag In d.tube Url [`#4980`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4980) +- Fix location backend test [`#5034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5034) +- fix: 🍰 Add Expiration Date To Cookies Etc. [`#4882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4882) +- feat: 🍰 Refactor Social Media List With Slots [`#4773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4773) +- bug: 🍰 Replace Deleted Faker Package – Change To Import Again [`#4975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4975) +- bug: 🍰 Replace Deleted Faker Package [`#4973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4973) +- fix: 🍰 Change Tip Tap Editor Legend Hover To Click [`#4911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4911) +- fix: 🍰 Fix Embed iframe Width And Height CSS [`#4897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4897) +- Implement MySomethingList for social media, use list item slot [`d3cc49d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d3cc49d37ba260f9a285c078c57e673a32a76732) +- Split social media page and list component [`b740033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/b7400339aba22d5fb5506dc3b25f082d7f09edfc) +- Remove input addSocialMedia [`58464fd`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/58464fd53ef6aab52af1c2477c2615648ad889e3) + +#### [1.0.7](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.6...1.0.7) + +> 2 December 2021 + +- fix: 🍰 Fix Migration 'add donations node‘ And Release V1.0.7 [`#4821`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4821) +- Bump rosie from 2.0.1 to 2.1.0 [`#4520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4520) +- fix: 🍰 Renew JWT In Decode Test [`#4798`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4798) +- docs: 🍰 Refine Main README.md With Test Tech Stack And Video Link [`#4772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4772) +- docs: 🍰 Change README.md DB Commands For Docker [`#4765`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4765) +- Bump date-fns from 2.23.0 to 2.25.0 [`#4753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4753) +- Bump neo4j-driver from 4.0.2 to 4.3.4 [`#4729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4729) +- chore: 🍰 Update Neode To v0.4.7 [`#4751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4751) +- doc: 🍰 Update README.md Etc. [`#4733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4733) +- feat: 🍰 New CSS For Internal Pages [`#4741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4741) +- fix: 🍰 Change Notification E-Mails Settings Page Link [`#4742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4742) +- Refactor internal pages to new CSS [`acad80c`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/acad80c3c8262934dd2e38961c08c0fde769099a) +- Renew JWT in decode test [`46eb6b8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/46eb6b82ea802d4d6ca7294cd32d1fe16425bfea) +- Revert "Renew JWT in decode test" only for changing the Neode version [`a0d92b4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a0d92b4853d09d725c1fb7886cbfed2a00e1f05c) + +#### [1.0.6](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.5...1.0.6) + +> 4 October 2021 + +- chore: 🍰 Set 'sendNotification' Emails Init Admin [`#4690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4690) +- feat: 🍰 Send Notification E-Mail [`#4623`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4623) +- feat: 🍰 Implement Progress Bar Again [`#4357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4357) +- Bump nodemailer-html-to-text from 3.1.0 to 3.2.0 in /backend [`#4531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4531) +- Bump codecov from 3.7.1 to 3.8.2 [`#4401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4401) +- Centered the login-form [`#4660`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4660) +- Spelling Change [`#4654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4654) +- suggested solutions [`5699620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5699620c858925101f561f315034c57fae878964) +- Implement or move sort by date filter in filter menu [`16d8a42`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/16d8a42d9b4f90e8a1c22da0637f95adb25b4e8f) +- Translate order by [`245be52`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/245be52ac8d9e41998da10cf2d1a752bbefc0c0c) + +#### [1.0.5](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.4...1.0.5) + +> 12 August 2021 + +- chore: 💥 Release v1.0.5 [`#4629`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4629) +- feat: 🍰 Landing Page And Other Internal Pages [`#4599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4599) +- Bump eslint-plugin-prettier from 3.1.4 to 3.4.0 in /webapp [`#4577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4577) +- Bump vue-scrollto from 2.17.1 to 2.20.0 in /webapp [`#4592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4592) +- Bump date-fns from 2.22.1 to 2.23.0 [`#4596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4596) +- Bump metascraper-description from 5.11.6 to 5.23.1 in /backend [`#4593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4593) +- Bump slug from 2.1.1 to 5.1.0 [`#4525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4525) +- Bump metascraper-lang from 5.11.8 to 5.23.1 in /backend [`#4587`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4587) +- Bump eslint-plugin-promise from 4.2.1 to 4.3.1 in /backend [`#4591`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4591) +- fix: 🍰 Quick Fix For backend Tests [`#4565`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4565) +- Bump eslint-config-prettier from 6.10.1 to 6.15.0 in /backend [`#4583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4583) +- Bump subscriptions-transport-ws from 0.9.16 to 0.9.19 in /backend [`#4584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4584) +- Bump metascraper-youtube from 5.11.8 to 5.23.0 in /backend [`#4579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4579) +- Bump metascraper-publisher from 5.11.8 to 5.23.0 in /backend [`#4578`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4578) +- [Security] Bump node-notifier from 6.0.0 to 8.0.2 in /webapp [`#4299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4299) +- Bump @storybook/addon-a11y from 5.3.21 to 6.3.6 in /webapp [`#4570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4570) +- Bump metascraper-soundcloud from 5.11.8 to 5.23.0 in /backend [`#4576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4576) +- Bump cross-env from 7.0.2 to 7.0.3 in /backend [`#4522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4522) +- [Security] Bump browserslist from 4.9.1 to 4.16.6 in /backend [`#4444`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4444) +- 🍰 feat: Landing Page etc. [`#4555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4555) +- [Security] Bump browserslist from 4.14.7 to 4.16.6 [`#4440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4440) +- Bump auto-changelog from 2.2.1 to 2.3.0 [`#4515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4515) +- Bump @storybook/vue from 5.3.21 to 6.3.6 in /webapp [`#4571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4571) +- Bump @storybook/addon-actions from 5.3.18 to 5.3.21 in /webapp [`#4141`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4141) +- [Security] Bump ssri from 6.0.1 to 6.0.2 in /webapp [`#4390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4390) +- [Security] Bump y18n from 4.0.0 to 4.0.3 in /backend [`#4356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4356) +- Bump v-tooltip from 2.0.3 to 2.1.3 in /webapp [`#4308`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4308) +- Bump eslint-plugin-jest from 24.1.10 to 24.4.0 in /webapp [`#4564`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4564) +- Bump apollo-cache-inmemory from 1.6.5 to 1.6.6 in /webapp [`#4140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4140) +- [Security] Bump websocket-extensions from 0.1.3 to 0.1.4 in /webapp [`#3975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3975) +- Bump linkify-it from 2.2.0 to 3.0.2 in /webapp [`#4139`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4139) +- [Security] Bump yargs-parser from 18.1.1 to 18.1.3 in /backend [`#3962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3962) +- [Security] Bump y18n from 3.2.1 to 3.2.2 in /webapp [`#4317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4317) +- Bump vue-sweetalert-icons from 4.2.0 to 4.3.0 in /webapp [`#4142`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4142) +- Bump mustache from 4.0.1 to 4.2.0 in /backend [`#4310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4310) +- [Security] Bump elliptic from 6.5.3 to 6.5.4 in /webapp [`#4286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4286) +- [Security] Bump elliptic from 6.5.3 to 6.5.4 [`#4285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4285) +- Bump neode from 0.3.7 to 0.4.7 [`#4162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4162) +- Bump date-fns from 2.11.1 to 2.22.1 in /backend [`#4523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4523) +- Bump stack-utils from 2.0.1 to 2.0.3 in /webapp [`#4076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4076) +- Bump date-fns from 2.12.0 to 2.22.1 [`#4455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4455) +- Bump date-fns from 2.12.0 to 2.22.1 in /webapp [`#4537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4537) +- Bump cross-env from 7.0.2 to 7.0.3 [`#4032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4032) +- Bump graphql-request from 1.8.2 to 2.0.0 [`#3988`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3988) +- Bump cookie-universal-nuxt from 2.1.4 to 2.1.5 in /webapp [`#4561`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4561) +- Bump graphql from 14.6.0 to 14.7.0 in /webapp [`#4000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4000) +- Bump prettier from 2.2.0 to 2.3.2 in /backend [`#4530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4530) +- Bump merge-graphql-schemas from 1.7.7 to 1.7.8 in /backend [`#3959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3959) +- fix: 🍰 Fix Menu Legend Menu Bar Button Without Click Event [`#4556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4556) +- Bump eslint-plugin-promise from 4.2.1 to 4.3.1 in /webapp [`#4534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4534) +- feat: 🍰 Post Editor Legend [`#4492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4492) +- New Issue type EPIC [`#4536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4536) +- Upgrade to GitHub-native Dependabot [`#4399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4399) +- Remove superfluous package-lock.json [`c7e4e6d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c7e4e6d2b26d448b3d2787aff4a0bde32c24e919) +- Delete superfluous and always conflicting file package-lock.json [`9932796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9932796d233789c76b917de533ec2efc99f6aa4a) +- Refactor pageParams, second step [`e8a0a5d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e8a0a5d13c0610066c50c98d5e0d661ee8139217) + +#### [1.0.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.3...1.0.4) + +> 8 June 2021 + +- chore: 🍰 Release v1.0.4 [`#4475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4475) +- fixed wrong env variable [`#4474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4474) +- chore: [WIP] 🍰 New Deployment With 'base' And 'code' Docker Images [`#4452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4452) +- feat: 🍰 Flexible Footer Links [`#4468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4468) +- docs: 🍰 Correct 'Contribution.md' [`#4466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4466) +- docs: 🍰 Correct Discord Links And Divers [`#4461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4461) +- Implement flexible page footer links [`1bd4af6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1bd4af6fd3b5db167575910948a0a72461a1129a) +- Implement tests for flexible page footer links [`627a20f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/627a20f66a65450996a5fe3128fd37769fdfd629) +- Correct Discord links and divers [`0318910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0318910488e245c4a1d09181265de63d05a89cf1) + +#### [1.0.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.2...1.0.3) + +> 19 May 2021 + +- chore: 🍰 Release v1.0.3 [`#4435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4435) +- chore: 🍰 Refactor Logos [`#4433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4433) +- feat: 🍰 Show Password Component [`#4370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4370) +- chore: 🍰 Replace Ocelot Logos 619x593 With 600x570 [`#4428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4428) +- Coverage [`#4393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4393) +- correct_docker_tagging [`#4391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4391) +- 🍰 Get Cypress Tests Running Again [`#4338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4338) +- frontend + backend coverage tests [`#4367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4367) +- refactor: 🍰 Refactor E-Mail Templates [`#4350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4350) +- feat: 🍰 Remove More-Info Of Post [`#4316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4316) +- have cypress running locally - the tests still fail [`e3e0341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e3e03415e1bd9e0be88f33930a52e63d8af64ee1) +- have cypress running locally - the tests still fail [`0ec0574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0ec05743751cfef0cb86c17b87e9e4ef9a2c9e47) +- Refactor logos, first step [`ff6cc30`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ff6cc306aff6150a924f1a647387e498d050ea9f) + +#### [1.0.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.1...1.0.2) + +> 6 April 2021 + +- fix: Email Confirmation-Link When An Invite-Code Is Given [`#4336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4336) +- release v1.0.2 [`e583010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e5830101e4b449905fe2d0018627d75af62b2a20) +- slider jumps to enter-nonce when link contains invite-code, email and nonce and method is invite-code. Thanks @tirokk [`c80b3a2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c80b3a212835f76cfc2f11542345d6c3b226995b) +- fix enail confirmation link when an invite-code is given [`27f0de9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/27f0de9464685c8f960bde9d07986fdc5b20f8f9) + +#### [1.0.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.0...1.0.1) + +> 4 April 2021 + +- readme_update [`#4331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4331) +- jwt_expiretime [`#4330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4330) +- Clean env, docker & workflow [`#4337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4337) +- fix: 🍰 Fixing The Avatars unwanted Border [`#4320`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4320) +- Change background color of avatar image to white [`e48a99a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e48a99afe63e96cffafe16db7bf5ae35cfdebd7a) +- removed config warning [`f6c070a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f6c070a3cb36c5593123b27b4d1b6a5b7a10aba3) +- include env files in build process [`dfe6f67`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/dfe6f679b3bb0f440aee986d6d12925cccee9050) + +### [1.0.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.15...1.0.0) + +> 31 March 2021 + +- v1.0.0 [`#4321`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4321) +- fix: 🐛 Fix Wrong Truncation Of Hashtags In Admin List Via Adding 'truncateStr' [`#4314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4314) +- feat: 🍰Implement Registration Slider [`#4270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4270) +- feat: 🍰 Invite Button [`#4301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4301) +- fix: 🍰 Suggestion List Filter [`#4296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4296) +- fix: JWT Expires In 2 Years [`#4278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4278) +- Deployment [`#4263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4263) +- feat: 🍰 Redesign Registration Process Frontend [`#4168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4168) +- Delete unnecessary code [`3fa7e04`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3fa7e04d4895161db1f764ccad58e35188c9d065) +- basic invite button in frontend [`356f026`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/356f02622655a57561fcdecfcc8a735d23cac79f) +- setting up invite button [`e6dc3f4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e6dc3f42cedaf9953d737cf30cf7ed317b634be7) + +#### [0.6.15](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.14...0.6.15) + +> 1 March 2021 + +- feat: Count Post Teaser Views [`#4255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4255) +- feat: 🍰 Count Post Clicks [`#4248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4248) +- Correct version style [`#4218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4218) +- dashboard restructuring image [`#4266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4266) +- fix: 🐛 Adapted Editor List Styles [`#4239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4239) +- fix: Scrolling On Profile Page [`#4234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4234) +- release 0.6.15 [`ef4265d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ef4265d9387d94aa09db2b80461c2ec90b4623ae) +- count views of post teaser [`1c3f628`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1c3f628fb2e161400319b32da274952c1b57836e) +- tests fixed for clickedCount [`96066ea`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/96066eae02e659a00bce280f9f97a28ac1446ce0) + +#### [0.6.14](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.13...0.6.14) + +> 17 February 2021 + +- fix: Add Null Migration [`#4233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4233) +- release 0.6.14 [`394860c`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/394860c1d0d6ff23f6653b81288890a67720deab) +- add null mutation [`a7489a0`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a7489a044c4b4b556f6b26d555657478ebd6409b) +- fixed misspelling in changelog [`3ad6d73`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3ad6d738fd5d9ed25c0cccc6ae60ed5cc37540ba) + +#### [0.6.13](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.12...0.6.13) + +> 17 February 2021 + +- fix: css so follow button isn't blocked by adblock [`#4230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4230) +- fix: Query Available Roles As Admin [`#4225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4225) +- release 0.6.13 [`e2503d4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e2503d496606aa79b5ab59319f76466e04a79bd0) +- avoid introspection to get available roles as admin [`a5df793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a5df793c55ec8792066e61547ae287f7702675fd) +- css fix to trick adblock on follow button by @nila99 [`13931c9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/13931c90e7642da93de0e884afd1649de8181c6c) + +#### [0.6.12](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.11...0.6.12) + +> 15 February 2021 + +- Smtp secure option [`#4223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4223) +- chore: 🐛 Fix Migrations By Migrations Folder Having .gitkeep [`#4222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4222) +- SMTP_SECURE option [`8e2d8a7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8e2d8a77c3a825880deb4c668d647ee6503edc7f) +- New file .gitkeep in migrations [`814c1b8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/814c1b88aed2e6e353f2af2f277229629cc2e788) + +#### [0.6.11](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.10...0.6.11) + +> 15 February 2021 + +- chore: 🍰 Resolve WEBSOCKETS_URI .env Problem [`#4219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4219) +- chore: 🐛 'db:migrate up' By Moving Examples Outside Of Migrations Folder [`#4221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4221) +- fix: Location Tests In Backend [`#4220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4220) +- MAPBOX introduced district for US-Cities. So I used a German City instead [`7a31334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7a313344cbddaca7bcb073b01a549bfe2a5c3852) +- Resolve WEBSOCKETS_URI config problem [`ac27d6a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ac27d6ac9653046d98e559fe1532648d7ddfa92e) +- Fix 'db:migrate up' by moving examples outside of migrations folder [`063c730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/063c730e5fb3e3ea363deb5adebdbf69589ec7b4) + +#### [0.6.10](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.9...0.6.10) + +> 12 February 2021 + +- Use original images [`#4217`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4217) +- original images instead of broken whitelabled ones [`2303b92`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2303b92146d71d8ec12b6fa75a4a0c513db96594) + +#### [0.6.9](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.8...0.6.9) + +> 12 February 2021 + +- fix_webapp_production [`#4216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4216) +- Move Old Migrations From HC To Examples Folder To Avoid Conflicts [`#4215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4215) +- typo [`7d21196`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7d21196973282ce904db8776fbef8e0961dac6e5) +- fixed prodution stage of webapp container [`02d31d0`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/02d31d0a94aa73a5026d2d9c183c63d1a7e43b6c) +- moved old migrations from HC to examples folder to avoid conflicts with new migrations [`efec46d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/efec46d9d485ec439a25adcac6da105683a221ad) + +#### [0.6.8](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.7...0.6.8) + +> 11 February 2021 + +- refactor: 🍰 Remove Emojis From Post Page [`#4208`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4208) +- release 0.6.8 [`b947918`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/b94791873bb3c9524daff78fc9d0f7bdb385127d) +- Refinied design [`58728df`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/58728df97b3a21d34e9476f2be139add33c75b42) +- remove emojis from post page [`4097cc1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4097cc16f723dfd2af64c4adcfef978b1c81e07b) + +#### [0.6.7](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.6...0.6.7) + +> 10 February 2021 + +- Support newest docker [`#4210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4210) +- push all tags again, since docker is updated on github (...) [`c491fd6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c491fd692155b16822426372c58b5770daf2c0aa) + +#### [0.6.6](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.5...0.6.6) + +> 10 February 2021 + +- - add latest tag for neo4j [`#4209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4209) +- feat: 🍰 Switch User Role As Admin [`#4136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4136) +- feat: Image Cropping Is Optional [`#4199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4199) +- publish workflow [`#4195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4195) +- change user roles is working, test fails [`c528269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c528269cb2972e6ea937d31ba22d0e11168141f2) +- file upload: refactored [`650e83f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/650e83f4c250389477933a2e7d21d8245b0ce882) +- change user role: tests are working [`14dfe2a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/14dfe2ae2cd4a24c06c9229893b33586dfceae4f) + +#### [0.6.5](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.4...0.6.5) + +> 8 February 2021 + +- updated CHANGELOG.md [`9d9075f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d9075f2117b2eb4b607e7d59ab18c7e655c6ea7) + +#### [0.6.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.3...0.6.4) + +> 8 February 2021 + +- regenerated `CHANGELOG.md` [`ee688ec`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ee688ece24cf592b3989e83340701ca8772e876e) +- fetch full history [`5ecee4d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5ecee4d73a92d2e5c5ae971d79848ed27f65a72c) +- don't fail if tag exists (release) [`39c82fc`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/39c82fcb37d5c8e7e78a79288e1ef6280f8d0892) + +#### [0.6.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.0...0.6.3) + +> 8 February 2021 + +- Clean GitHub folder [`#4194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4194) +- Fix locations [`#4185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4185) +- feat: 🍰 Allow Only Supported Image File Formats [`#3928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3928) +- refactor: Disbale Emoji, Language And Catgeory Filter [`#4193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4193) +- refactor: Remove Catgeories From Post Teaser [`#4191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4191) +- - adjusted changelog to ocelot-social repo [`9603882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9603882edebf8967e05abfa94e4e1ebf452d4e24) +- - first steps towards docker image deployment & github autotagging [`5503216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5503216ad4a0230ac533042e4a69806590fc2a5a) +- - lots of additional tests [`0ba37aa`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0ba37aab18f537d722aede7b87fa0b8e79f80e66) + +#### [0.6.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.6.0...0.6.0) + +> 2 February 2021 + +- Backend Unit Tests via CI & Run tests in parallel [`#4186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4186) +- Fix cookie [`#4184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4184) +- bug: DB Reset At Start Of Statistics Test In Backend [`#4179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4179) +- docu_kubernetes [`#4153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4153) +- Refactor config [`#4133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4133) +- feat: 🍰 Search Results Page [`#4144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4144) +- Rework dockerfiles & docker-compose [`#4151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4151) +- [WIP] fix: 🍰 Issue #3504 umlaut encoding #3676 [`#4104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4104) +- feat: Auto Detect Language Of Posts [`#4148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4148) +- bug: hotfix for invite codes [`#4154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4154) +- refactor: Disable Categories [`#4134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4134) +- feat: Invite codes [`#4125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4125) +- Revert "Bump tiptap-extensions from 1.28.8 to 1.34.0 in /webapp" [`#4146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4146) +- chore: 🍰 Quick Fix Of Live Reload By Nuxt For Docker-Compose [`#4145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4145) +- Bump eslint-config-prettier from 6.10.1 to 6.15.0 in /webapp [`#3999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3999) +- Bump eslint-plugin-standard from 4.0.1 to 5.0.0 in /webapp [`#4074`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4074) +- Bump tiptap-extensions from 1.28.8 to 1.34.0 in /webapp [`#4115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4115) +- Bump sass-loader from 8.0.2 to 10.1.1 in /webapp [`#4126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4126) +- Bump faker from 4.1.0 to 5.1.0 in /webapp [`#4006`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4006) +- [Security] Bump node-notifier from 8.0.0 to 8.0.1 in /webapp [`#4093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4093) +- Bump slug from 2.1.1 to 4.0.2 in /backend [`#3996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3996) +- start_on_register [`#4121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4121) +- updates on some designs [`#4117`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4117) +- chore: 🍰 White-Labeling And Reminders Of New Deployment [`#4099`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4099) +- Mock Cookie In Auth.test.js [`#4119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4119) +- chore: 🍰 Database Initialisation Readme After First Deployment [`#4112`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4112) +- feat: 🍰 Create Default Admin User [`#4084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4084) +- docu_design [`#4102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4102) +- Name of Cookie Is Set in metadata.js [`#4091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4091) +- feat: 🔥 Displaying Social Media Favicons On Profile Page [`#4047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4047) +- chore: 🍰 New Digital Ocean Kubernetes Cluster [`#4050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4050) +- feat: Node Version Recommendation In backend/README.md [`#4083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4083) +- chore: 🍰 Replace node-sass with sass [`#4079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4079) +- Throw Error When No Cookie Can Be Set [`#4086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4086) +- Bump jest from 25.3.0 to 26.6.3 in /webapp [`#4037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4037) +- [Security] Bump ini from 1.3.5 to 1.3.8 [`#4065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4065) +- Bump uuid from 7.0.3 to 8.3.2 in /backend [`#4055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4055) +- Bump @babel/register from 7.9.0 to 7.12.10 [`#4058`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4058) +- [Security] Bump ini from 1.3.5 to 1.3.8 in /backend [`#4066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4066) +- [Security] Bump ini from 1.3.5 to 1.3.8 in /webapp [`#4067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4067) +- feat: 🍰 Rebranding And White-Labeling [`#3934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3934) +- [Feature] Show/Hide Password Icon - Issue # 2434 [`#3985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3985) +- Bump node from 12.19.0-alpine3.10 to 15.3.0-alpine3.10 in /webapp [`#4007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4007) +- Bump node from 12.19.0-alpine3.10 to 15.3.0-alpine3.10 in /backend [`#4008`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4008) +- Bump prettier from 2.0.4 to 2.2.1 in /webapp [`#4023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4023) +- Bump metascraper-audio from 5.11.8 to 5.14.26 in /backend [`#4024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4024) +- Bump metascraper-url from 5.11.8 to 5.14.26 in /backend [`#4025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4025) +- Bump @babel/preset-env from 7.9.0 to 7.12.7 [`#3986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3986) +- Bump metascraper-logo from 5.11.6 to 5.14.26 in /backend [`#4026`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4026) +- [Security] Bump node-fetch from 2.6.0 to 2.6.1 in /webapp [`#3997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3997) +- [Security] Bump apollo-server-express from 2.9.7 to 2.19.0 in /webapp [`#3976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3976) +- [Security] Bump elliptic from 6.4.1 to 6.5.3 [`#3949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3949) +- [Security] Bump markdown-to-jsx from 6.10.3 to 6.11.4 in /webapp [`#3974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3974) +- [Security] Bump elliptic from 6.4.1 to 6.5.3 in /webapp [`#3966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3966) +- Bump prettier from 2.0.4 to 2.2.0 in /backend [`#3957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3957) +- [Security] Bump dot-prop from 4.2.0 to 4.2.1 in /backend [`#3953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3953) +- [Security] Bump object-path from 0.11.4 to 0.11.5 in /backend [`#3954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3954) +- Bump migrate from 1.6.2 to 1.7.0 in /backend [`#3955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3955) +- Bump faker from `3b2fa4a` to `91dc8a3` [`#3952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3952) +- [Security] Bump jquery from 3.4.1 to 3.5.1 in /backend [`#3961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3961) +- [Security] Bump dot-prop from 4.2.0 to 4.2.1 in /webapp [`#3965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3965) +- Bump eslint-plugin-prettier from 3.1.2 to 3.1.4 in /webapp [`#3973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3973) +- [Security] Bump apollo-server from 2.11.0 to 2.14.2 in /backend [`#3983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3983) +- [Security] Bump node-fetch from 2.6.0 to 2.6.1 in /backend [`#3982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3982) +- Bump metascraper-author from 5.11.8 to 5.14.22 in /backend [`#3960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3960) +- Bump storybook-design-token from 0.7.2 to 0.8.1 in /webapp [`#3963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3963) +- [Security] Bump http-proxy from 1.17.0 to 1.18.1 in /webapp [`#3964`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3964) +- Bump @babel/core from 7.9.0 to 7.12.3 in /webapp [`#3970`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3970) +- Bump eslint-plugin-jest from 23.8.2 to 24.1.3 in /webapp [`#3971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3971) +- [Security] Bump codecov from 3.6.5 to 3.7.1 [`#3980`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3980) +- [Security] Bump standard-version from 7.1.0 to 8.0.1 [`#3981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3981) +- [Security] Bump apollo-server-express from 2.12.0 to 2.14.2 in /backend [`#3984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3984) +- fix: 🍰 New mapbox Token [`#3932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3932) +- chore: 🍰 Switch Neo4j To Community Edition [`#3936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3936) +- chore: 🍰 Set Up Travis Builds [`#3930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3930) +- feat: 🍰 Show Supported Image Formats Implemented [`#3925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3925) +- feat: Improve Data Export [`#3926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3926) +- chore: 🍰 v0.6.3 [`#3955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3955) +- feat: Export User Data Update [`#3954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3954) +- chore: Upgrade to v0.6.2 [`#3947`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3947) +- build: 🍰 Disable Codecov for last deploy [`#3946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3946) +- feat: Export User Data [`#3899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3899) +- build: 💥 Disable full stack tests, Fix deployment to develop, tryout [`#3937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3937) +- build: 💥 Disable full stack tests [`#3935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3935) +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- feat: Avoid new builds on base docker-compose.yml [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- snapshot changed / facebook link stays the same for testing purposes [`71f4e2b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/71f4e2bd6e8427de8ddab410ef0f8fc476309bf8) +- design data up to now [`72b8c22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/72b8c2263496ac640ce4cba60da2159092ad2ae0) +- Change maintenance svg [`11aabf0`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/11aabf0b16ad69fa9d3e84a1628775d357c24985) + +#### [v0.6.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.5.0...v0.6.0) + +> 27 March 2020 + +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- refactor: CategoriesFilter to not use ds-flex [`1ffde6b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1ffde6bf1034d1a1d9b7bca62fe66fe64527314c) +- chore: fix lint w/ new linting rules [`06985c2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/06985c2dbbc6699cc5c3dfd6e55cac8d28e9019b) +- chore: Fix lint w/ new linting rules [`cb0a3f5`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/cb0a3f5cdd5e7fe47f46ae08798628eecb28e9b5) + +#### [v0.5.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.4.2...v0.5.0) + +> 26 March 2020 + +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- Update prettier to v2 [`276ea79`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/276ea79e8ff2de2d02698b486671aee7cfda860e) +- Changes requested by @mattwr18 [`9c08db2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9c08db22dcd0ca1ad6e59be8fb0f287935b45537) +- search specs refactored [`46fca22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/46fca229ec35047eda9ac7809e7bc456785a6c70) + +#### [v0.4.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- DRY user.spec.js [`da16590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/da165906e2ed12baddd902b43064103ab3adfa06) +- test deleteuser as admin, moderator, another user and as I myself, fix lint [`3983612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3983612c56ac92473a192a318959e4c691a3e7b8) +- feature: test delete user as admin [`84c1547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/84c154798efac0cec4c13dfefae18a6a9542058a) + +#### [v0.4.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.4.0...v0.4.1) + +> 9 March 2020 + +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`5ef2b25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5ef2b25ee6a3402a2ebe2f3f55dd65a6e0a1111e) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`f209436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f209436147fbf9afacfbd6edb6135847e6c4faed) +- Lokalise: update of webapp/locales/fr.json [`28e2967`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/28e2967119f1b47752afc959a4c3ae741fdad0b0) + +#### [v0.4.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.3.1...v0.4.0) + +> 22 February 2020 + +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- Upgrade cypress, remove log out step [`0df4038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0df40386dd866c6b9ce540b966dfe00089507d31) +- use BaseCard in Comment component and refactor [`e7bf499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e7bf499d373ec9d5d46be20fd838fbc4dbecb273) +- Refactor GQL and tests, first approach [`f380915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f380915b2c679d42e5db136ea1d923cf00bbcf10) + +#### [v0.3.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.3.0...v0.3.1) + +> 10 February 2020 + +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- Get rid of different factory files [`fc36729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fc367297e3e054f09b7f8f31788ab68d87f6babf) +- Refactor factory for comments [`2fc71d7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2fc71d75a5d5eab9c3467e94e00257ef6dd7d8a0) +- Refactor user factory [`2a79c53`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2a79c53765b73f9b91691eb75f55cf8c9e48306e) + +#### [v0.3.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.2.2...v0.3.0) + +> 3 February 2020 + +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- Improve styling per @alina-beck review [`bcc1ab1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/bcc1ab167e8b1dfdac1ec0a05a0c14e8234bcabc) +- test(cypress): Cover "Pinned post" feature [`d49afc2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d49afc25cfa1c1f98ed04f78dd3ff826cd85ae25) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`d6b78e4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d6b78e4794ac60dee9d9fd3e3c9c53a95fcea152) + +#### [0.2.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.2.2...0.2.2) + +> 21 January 2020 + +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- Convert block/unblock to blacklist/whitelist [`c297b83`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c297b83f873edc61ddec370633b9b65896c56591) +- Rename blacklist/whitelist to mute/unmute [`ba3e9e1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ba3e9e1025bf432151c9bf1002045179b338ff7f) +- Generate changelog with auto-changelog [`02367f9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/02367f93e0ad635d5f43adf01695f85f06f4c0d2) + +#### [v0.2.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.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/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- chore(release): 0.2.2 [`7e26e56`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7e26e56654d391b0f910a59e28ce67fd1ec0b4a8) + +#### [0.2.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.2.1...0.2.1) + +> 20 January 2020 + +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`d0124bf`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d0124bf2b4b4a641c9af76d6d2f7b5aa075ade90) +- refactor and use base-button in SearchableInput [`fcbe612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fcbe6125f35c0dd23e2ba1ae63f539f5ef5990ea) +- manage button states and color schemes with mixin [`1b9249c`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1b9249c685e34eb2e94b31ee0ec22421c6aa6a73) + +#### [v0.2.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.2.0...v0.2.1) + +> 10 January 2020 + +#### [0.2.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.2.0...0.2.0) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- locales sorted. [`fa906ef`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fa906efb1f40dc5bd80c9678f33c7b607a320099) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) + +#### [v0.2.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.13...v0.2.0) + +> 19 December 2019 + +#### [0.1.13](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.13...0.1.13) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) +- fix lint: tests and lint ok [`d2a43ce`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d2a43cecd74ee3bec291109a85ddb6986315763b) + +#### [v0.1.13](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.12...v0.1.13) + +> 13 December 2019 + +#### [0.1.12](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.12...0.1.12) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Get rid of different factory files [`fc36729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fc367297e3e054f09b7f8f31788ab68d87f6babf) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- Refactor factory for comments [`2fc71d7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2fc71d75a5d5eab9c3467e94e00257ef6dd7d8a0) + +#### [v0.1.12](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.11...v0.1.12) + +> 10 December 2019 + +#### [0.1.11](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.11...0.1.11) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.11](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.10...v0.1.11) + +> 22 November 2019 + +#### [0.1.10](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.10...0.1.10) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- locales sorted. [`fa906ef`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fa906efb1f40dc5bd80c9678f33c7b607a320099) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.10](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.9...v0.1.10) + +> 13 November 2019 + +#### [0.1.9](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.9...0.1.9) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.9](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.8...v0.1.9) + +> 4 November 2019 + +#### [0.1.8](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.8...0.1.8) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.8](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.7...v0.1.8) + +> 24 October 2019 + +#### [0.1.7](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.7...0.1.7) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.7](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.6...v0.1.7) + +> 23 October 2019 + +#### [0.1.6](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.6...0.1.6) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.6](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.5...v0.1.6) + +> 22 October 2019 + +#### [0.1.5](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.5...0.1.5) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- 🍰 Fix - maintaining sorting after navigation [`#1872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1872) +- Add storybook stories for our university students [`#1906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1906) +- build(deps): bump nuxt from 2.10.1 to 2.10.2 in /webapp [`#1987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1987) +- build(deps-dev): bump @storybook/vue from 5.2.4 to 5.2.5 in /webapp [`#1981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1981) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.20.0 in /backend [`#1978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1978) +- build(deps): bump node from 12.12.0-alpine to 12.13.0-alpine in /webapp [`#1977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1977) +- build(deps-dev): bump date-fns from 2.5.0 to 2.5.1 [`#1962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1962) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#1961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1961) +- build(deps-dev): bump async-validator from 3.1.0 to 3.2.0 in /webapp [`#1920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1920) +- build(deps): bump @sentry/node from 5.7.0 to 5.7.1 in /backend [`#1914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1914) +- Hide new CommentForm while editing a comment [`#1973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1973) +- 🍰 Translate texts for pinning a post to German [`#1972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1972) +- Allow admins to pin a post [`#1840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1840) +- fix: Only one ellipse is displayed [`#1968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1968) +- Refactor reports resolver spec [`#1957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1957) +- Added createdAt date for follow and shout [`#1853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1853) +- build(deps-dev): bump @vue/cli-shared-utils from 3.12.0 to 4.0.4 in /webapp [`#1965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1965) +- build(deps): bump neo4j from 3.5.11-enterprise to 3.5.12-enterprise in /neo4j [`#1963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1963) +- build(deps-dev): bump cypress-file-upload from 3.3.4 to 3.4.0 [`#1960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1960) +- build(deps): bump date-fns from 2.5.0 to 2.5.1 in /backend [`#1959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1959) +- build(deps-dev): bump faker from `10bfb9f` to `9fd8d7d` [`#1958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1958) +- build(deps): bump tiptap-extensions from 1.28.3 to 1.28.4 in /webapp [`#1946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1946) +- build(deps): bump metascraper-soundcloud from 5.7.6 to 5.7.7 in /backend [`#1943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1943) +- fix: console warnings during frontend tests [`#1942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1942) +- Language will be saved in the database of the user during registration [`#1927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1927) +- Update to version 0.1.5 [`#1951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1951) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- locales sorted. [`fa906ef`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fa906efb1f40dc5bd80c9678f33c7b607a320099) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- Get rid of different factory files [`fc36729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fc367297e3e054f09b7f8f31788ab68d87f6babf) + +#### [v0.1.5](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.4...v0.1.5) + +> 17 October 2019 + +#### [0.1.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.4...0.1.4) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- 🍰 Fix - maintaining sorting after navigation [`#1872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1872) +- Add storybook stories for our university students [`#1906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1906) +- build(deps): bump nuxt from 2.10.1 to 2.10.2 in /webapp [`#1987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1987) +- build(deps-dev): bump @storybook/vue from 5.2.4 to 5.2.5 in /webapp [`#1981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1981) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.20.0 in /backend [`#1978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1978) +- build(deps): bump node from 12.12.0-alpine to 12.13.0-alpine in /webapp [`#1977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1977) +- build(deps-dev): bump date-fns from 2.5.0 to 2.5.1 [`#1962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1962) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#1961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1961) +- build(deps-dev): bump async-validator from 3.1.0 to 3.2.0 in /webapp [`#1920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1920) +- build(deps): bump @sentry/node from 5.7.0 to 5.7.1 in /backend [`#1914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1914) +- Hide new CommentForm while editing a comment [`#1973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1973) +- 🍰 Translate texts for pinning a post to German [`#1972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1972) +- Allow admins to pin a post [`#1840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1840) +- fix: Only one ellipse is displayed [`#1968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1968) +- Refactor reports resolver spec [`#1957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1957) +- Added createdAt date for follow and shout [`#1853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1853) +- build(deps-dev): bump @vue/cli-shared-utils from 3.12.0 to 4.0.4 in /webapp [`#1965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1965) +- build(deps): bump neo4j from 3.5.11-enterprise to 3.5.12-enterprise in /neo4j [`#1963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1963) +- build(deps-dev): bump cypress-file-upload from 3.3.4 to 3.4.0 [`#1960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1960) +- build(deps): bump date-fns from 2.5.0 to 2.5.1 in /backend [`#1959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1959) +- build(deps-dev): bump faker from `10bfb9f` to `9fd8d7d` [`#1958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1958) +- build(deps): bump tiptap-extensions from 1.28.3 to 1.28.4 in /webapp [`#1946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1946) +- build(deps): bump metascraper-soundcloud from 5.7.6 to 5.7.7 in /backend [`#1943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1943) +- fix: console warnings during frontend tests [`#1942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1942) +- Language will be saved in the database of the user during registration [`#1927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1927) +- Update to version 0.1.5 [`#1951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1951) +- build(deps-dev): bump dotenv from 8.1.0 to 8.2.0 [`#1917`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1917) +- Fix vue errors for Contribution form [`#1941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1941) +- Follow @alina-beck and @Tirokk PR suggestions [`#1940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1940) +- 🍰 Add Cypher statement for ordering [`#1926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1926) +- Improved comment truncation [`#1925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1925) +- fix: typo in German translation [`#1911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1911) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1923) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /webapp [`#1921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1921) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /backend [`#1915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1915) +- Maintain filename for cropped images [`#1935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1935) +- build(deps-dev): bump date-fns from 2.4.1 to 2.5.0 [`#1919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1919) +- build(deps-dev): bump nodemon from 1.19.3 to 1.19.4 in /backend [`#1916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1916) +- build(deps-dev): bump neode from 0.3.3 to 0.3.6 [`#1918`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1918) +- Highlight and expand linked comment [`#1903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1903) +- Add missing translations for Title placeholder [`#1910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1910) +- 🍰 Reporting with specific information [`#1797`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1797) +- build(deps): bump dotenv from 8.1.0 to 8.2.0 in /backend [`#1912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1912) +- Confirm privacy policy minimum age at registration [`#1907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1907) +- refactor: improve locale imports [`#1904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1904) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.3 to 5.2.4 in /webapp [`#1899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1899) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /webapp [`#1889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1889) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /backend [`#1888`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1888) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /webapp [`#1894`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1894) +- build(deps-dev): bump @storybook/vue from 5.2.3 to 5.2.4 in /webapp [`#1897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1897) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /backend [`#1895`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1895) +- build(deps): bump @nuxtjs/sentry from 3.0.0 to 3.0.1 in /webapp [`#1896`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1896) +- build(deps-dev): bump @storybook/addon-actions from 5.2.3 to 5.2.4 in /webapp [`#1898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1898) +- 🍰 Refactor Database for Reporting with specific information [`#1878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1878) +- build(deps): bump nuxt from 2.10.0 to 2.10.1 in /webapp [`#1890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1890) +- build(deps-dev): bump @babel/cli from 7.6.3 to 7.6.4 in /backend [`#1868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1868) +- build(deps): bump apollo-server from 2.9.5 to 2.9.6 in /backend [`#1864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1864) +- build(deps-dev): bump apollo-server-testing from 2.9.5 to 2.9.6 in /backend [`#1870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1870) +- build(deps-dev): bump @babel/core from 7.6.3 to 7.6.4 in /webapp [`#1867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1867) +- build(deps-dev): bump core-js from 2.6.9 to 2.6.10 in /webapp [`#1892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1892) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc14 to 4.0.0-rc15 in /webapp [`#1891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1891) +- build(deps): bump @sentry/node from 5.6.2 to 5.7.0 in /backend [`#1871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1871) +- build(deps-dev): bump @vue/cli-shared-utils from 3.11.0 to 3.12.0 in /webapp [`#1869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1869) +- build(deps): bump apollo-server-express from 2.9.5 to 2.9.6 in /backend [`#1866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1866) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.4 in /backend [`#1865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1865) +- 🍰 Implement basic image cropping solution [`#1666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1666) +- 1773 refactor rewards spec [`#1884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1884) +- fix: search for email case-insensitively [`#1863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1863) +- Fix translation error in login page [`#1885`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1885) +- fix: security vulnerability with yarn resolutions [`#1862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1862) +- Fix embeds settings page [`#1877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1877) +- update version to 0.1.4 [`#1860`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1860) +- Update profile posts apollo query [`#1805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1805) +- Add Hall of Fame to README [`#1859`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1859) +- Implement public registration [`#1814`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1814) +- Refactor embed settings page [`#1861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1861) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) +- fix lint: tests and lint ok [`d2a43ce`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d2a43cecd74ee3bec291109a85ddb6986315763b) + +#### [v0.1.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.3...v0.1.4) + +> 10 October 2019 + +#### [0.1.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.3...0.1.3) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- 🍰 Fix - maintaining sorting after navigation [`#1872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1872) +- Add storybook stories for our university students [`#1906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1906) +- build(deps): bump nuxt from 2.10.1 to 2.10.2 in /webapp [`#1987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1987) +- build(deps-dev): bump @storybook/vue from 5.2.4 to 5.2.5 in /webapp [`#1981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1981) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.20.0 in /backend [`#1978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1978) +- build(deps): bump node from 12.12.0-alpine to 12.13.0-alpine in /webapp [`#1977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1977) +- build(deps-dev): bump date-fns from 2.5.0 to 2.5.1 [`#1962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1962) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#1961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1961) +- build(deps-dev): bump async-validator from 3.1.0 to 3.2.0 in /webapp [`#1920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1920) +- build(deps): bump @sentry/node from 5.7.0 to 5.7.1 in /backend [`#1914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1914) +- Hide new CommentForm while editing a comment [`#1973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1973) +- 🍰 Translate texts for pinning a post to German [`#1972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1972) +- Allow admins to pin a post [`#1840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1840) +- fix: Only one ellipse is displayed [`#1968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1968) +- Refactor reports resolver spec [`#1957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1957) +- Added createdAt date for follow and shout [`#1853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1853) +- build(deps-dev): bump @vue/cli-shared-utils from 3.12.0 to 4.0.4 in /webapp [`#1965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1965) +- build(deps): bump neo4j from 3.5.11-enterprise to 3.5.12-enterprise in /neo4j [`#1963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1963) +- build(deps-dev): bump cypress-file-upload from 3.3.4 to 3.4.0 [`#1960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1960) +- build(deps): bump date-fns from 2.5.0 to 2.5.1 in /backend [`#1959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1959) +- build(deps-dev): bump faker from `10bfb9f` to `9fd8d7d` [`#1958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1958) +- build(deps): bump tiptap-extensions from 1.28.3 to 1.28.4 in /webapp [`#1946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1946) +- build(deps): bump metascraper-soundcloud from 5.7.6 to 5.7.7 in /backend [`#1943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1943) +- fix: console warnings during frontend tests [`#1942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1942) +- Language will be saved in the database of the user during registration [`#1927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1927) +- Update to version 0.1.5 [`#1951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1951) +- build(deps-dev): bump dotenv from 8.1.0 to 8.2.0 [`#1917`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1917) +- Fix vue errors for Contribution form [`#1941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1941) +- Follow @alina-beck and @Tirokk PR suggestions [`#1940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1940) +- 🍰 Add Cypher statement for ordering [`#1926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1926) +- Improved comment truncation [`#1925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1925) +- fix: typo in German translation [`#1911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1911) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1923) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /webapp [`#1921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1921) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /backend [`#1915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1915) +- Maintain filename for cropped images [`#1935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1935) +- build(deps-dev): bump date-fns from 2.4.1 to 2.5.0 [`#1919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1919) +- build(deps-dev): bump nodemon from 1.19.3 to 1.19.4 in /backend [`#1916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1916) +- build(deps-dev): bump neode from 0.3.3 to 0.3.6 [`#1918`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1918) +- Highlight and expand linked comment [`#1903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1903) +- Add missing translations for Title placeholder [`#1910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1910) +- 🍰 Reporting with specific information [`#1797`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1797) +- build(deps): bump dotenv from 8.1.0 to 8.2.0 in /backend [`#1912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1912) +- Confirm privacy policy minimum age at registration [`#1907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1907) +- refactor: improve locale imports [`#1904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1904) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.3 to 5.2.4 in /webapp [`#1899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1899) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /webapp [`#1889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1889) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /backend [`#1888`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1888) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /webapp [`#1894`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1894) +- build(deps-dev): bump @storybook/vue from 5.2.3 to 5.2.4 in /webapp [`#1897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1897) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /backend [`#1895`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1895) +- build(deps): bump @nuxtjs/sentry from 3.0.0 to 3.0.1 in /webapp [`#1896`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1896) +- build(deps-dev): bump @storybook/addon-actions from 5.2.3 to 5.2.4 in /webapp [`#1898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1898) +- 🍰 Refactor Database for Reporting with specific information [`#1878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1878) +- build(deps): bump nuxt from 2.10.0 to 2.10.1 in /webapp [`#1890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1890) +- build(deps-dev): bump @babel/cli from 7.6.3 to 7.6.4 in /backend [`#1868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1868) +- build(deps): bump apollo-server from 2.9.5 to 2.9.6 in /backend [`#1864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1864) +- build(deps-dev): bump apollo-server-testing from 2.9.5 to 2.9.6 in /backend [`#1870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1870) +- build(deps-dev): bump @babel/core from 7.6.3 to 7.6.4 in /webapp [`#1867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1867) +- build(deps-dev): bump core-js from 2.6.9 to 2.6.10 in /webapp [`#1892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1892) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc14 to 4.0.0-rc15 in /webapp [`#1891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1891) +- build(deps): bump @sentry/node from 5.6.2 to 5.7.0 in /backend [`#1871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1871) +- build(deps-dev): bump @vue/cli-shared-utils from 3.11.0 to 3.12.0 in /webapp [`#1869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1869) +- build(deps): bump apollo-server-express from 2.9.5 to 2.9.6 in /backend [`#1866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1866) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.4 in /backend [`#1865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1865) +- 🍰 Implement basic image cropping solution [`#1666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1666) +- 1773 refactor rewards spec [`#1884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1884) +- fix: search for email case-insensitively [`#1863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1863) +- Fix translation error in login page [`#1885`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1885) +- fix: security vulnerability with yarn resolutions [`#1862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1862) +- Fix embeds settings page [`#1877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1877) +- update version to 0.1.4 [`#1860`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1860) +- Update profile posts apollo query [`#1805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1805) +- Add Hall of Fame to README [`#1859`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1859) +- Implement public registration [`#1814`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1814) +- Refactor embed settings page [`#1861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1861) +- Save user setting to show embed code II [`#1852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1852) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.1 to 1.16.2 [`#1855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1855) +- build(deps): bump nodemailer from 6.3.0 to 6.3.1 in /backend [`#1854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1854) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /webapp [`#1849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1849) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.1 to 5.2.3 in /webapp [`#1836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1836) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.3 in /webapp [`#1848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1848) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /backend [`#1837`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1837) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1839) +- build(deps-dev): bump @babel/cli from 7.6.2 to 7.6.3 in /backend [`#1847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1847) +- build(deps-dev): bump @storybook/addon-actions from 5.2.1 to 5.2.3 in /webapp [`#1838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1838) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /backend [`#1846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1846) +- Title character increased from 64 to 100 [`#1850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1850) +- build(deps-dev): bump @babel/node from 7.6.2 to 7.6.3 in /backend [`#1843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1843) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /webapp [`#1835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1835) +- build(deps-dev): bump @storybook/vue from 5.2.1 to 5.2.3 in /webapp [`#1834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1834) +- build(deps-dev): bump cucumber from 6.0.1 to 6.0.2 in /backend [`#1833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1833) +- build(deps): bump tiptap-extensions from 1.28.0 to 1.28.3 in /webapp [`#1822`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1822) +- Fix typo in email template [`#1829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1829) +- build(deps-dev): bump apollo-server-testing from 2.9.4 to 2.9.5 in /backend [`#1823`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1823) +- build(deps-dev): bump cucumber from 5.1.0 to 6.0.1 in /backend [`#1827`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1827) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /backend [`#1826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1826) +- Display user email for administrators [`#1808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1808) +- build(deps): bump tiptap from 1.26.0 to 1.26.3 in /webapp [`#1821`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1821) +- build(deps): bump apollo-server from 2.9.4 to 2.9.5 in /backend [`#1825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1825) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /webapp [`#1824`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1824) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /webapp [`#1819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1819) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /backend [`#1818`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1818) +- build(deps): bump @hapi/joi from 16.1.5 to 16.1.7 in /backend [`#1817`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1817) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.0 to 1.16.1 [`#1816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1816) +- Update to 0.1.3 [`#1813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1813) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- remove package-lock.json [`3cf3c31`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3cf3c31808dc6ae59fb9c6ec33e9e178c5556438) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.2...v0.1.3) + +> 4 October 2019 + +#### [0.1.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.2...0.1.2) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- 🍰 Fix - maintaining sorting after navigation [`#1872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1872) +- Add storybook stories for our university students [`#1906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1906) +- build(deps): bump nuxt from 2.10.1 to 2.10.2 in /webapp [`#1987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1987) +- build(deps-dev): bump @storybook/vue from 5.2.4 to 5.2.5 in /webapp [`#1981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1981) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.20.0 in /backend [`#1978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1978) +- build(deps): bump node from 12.12.0-alpine to 12.13.0-alpine in /webapp [`#1977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1977) +- build(deps-dev): bump date-fns from 2.5.0 to 2.5.1 [`#1962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1962) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#1961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1961) +- build(deps-dev): bump async-validator from 3.1.0 to 3.2.0 in /webapp [`#1920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1920) +- build(deps): bump @sentry/node from 5.7.0 to 5.7.1 in /backend [`#1914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1914) +- Hide new CommentForm while editing a comment [`#1973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1973) +- 🍰 Translate texts for pinning a post to German [`#1972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1972) +- Allow admins to pin a post [`#1840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1840) +- fix: Only one ellipse is displayed [`#1968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1968) +- Refactor reports resolver spec [`#1957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1957) +- Added createdAt date for follow and shout [`#1853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1853) +- build(deps-dev): bump @vue/cli-shared-utils from 3.12.0 to 4.0.4 in /webapp [`#1965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1965) +- build(deps): bump neo4j from 3.5.11-enterprise to 3.5.12-enterprise in /neo4j [`#1963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1963) +- build(deps-dev): bump cypress-file-upload from 3.3.4 to 3.4.0 [`#1960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1960) +- build(deps): bump date-fns from 2.5.0 to 2.5.1 in /backend [`#1959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1959) +- build(deps-dev): bump faker from `10bfb9f` to `9fd8d7d` [`#1958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1958) +- build(deps): bump tiptap-extensions from 1.28.3 to 1.28.4 in /webapp [`#1946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1946) +- build(deps): bump metascraper-soundcloud from 5.7.6 to 5.7.7 in /backend [`#1943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1943) +- fix: console warnings during frontend tests [`#1942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1942) +- Language will be saved in the database of the user during registration [`#1927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1927) +- Update to version 0.1.5 [`#1951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1951) +- build(deps-dev): bump dotenv from 8.1.0 to 8.2.0 [`#1917`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1917) +- Fix vue errors for Contribution form [`#1941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1941) +- Follow @alina-beck and @Tirokk PR suggestions [`#1940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1940) +- 🍰 Add Cypher statement for ordering [`#1926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1926) +- Improved comment truncation [`#1925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1925) +- fix: typo in German translation [`#1911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1911) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1923) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /webapp [`#1921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1921) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /backend [`#1915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1915) +- Maintain filename for cropped images [`#1935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1935) +- build(deps-dev): bump date-fns from 2.4.1 to 2.5.0 [`#1919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1919) +- build(deps-dev): bump nodemon from 1.19.3 to 1.19.4 in /backend [`#1916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1916) +- build(deps-dev): bump neode from 0.3.3 to 0.3.6 [`#1918`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1918) +- Highlight and expand linked comment [`#1903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1903) +- Add missing translations for Title placeholder [`#1910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1910) +- 🍰 Reporting with specific information [`#1797`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1797) +- build(deps): bump dotenv from 8.1.0 to 8.2.0 in /backend [`#1912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1912) +- Confirm privacy policy minimum age at registration [`#1907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1907) +- refactor: improve locale imports [`#1904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1904) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.3 to 5.2.4 in /webapp [`#1899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1899) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /webapp [`#1889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1889) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /backend [`#1888`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1888) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /webapp [`#1894`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1894) +- build(deps-dev): bump @storybook/vue from 5.2.3 to 5.2.4 in /webapp [`#1897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1897) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /backend [`#1895`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1895) +- build(deps): bump @nuxtjs/sentry from 3.0.0 to 3.0.1 in /webapp [`#1896`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1896) +- build(deps-dev): bump @storybook/addon-actions from 5.2.3 to 5.2.4 in /webapp [`#1898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1898) +- 🍰 Refactor Database for Reporting with specific information [`#1878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1878) +- build(deps): bump nuxt from 2.10.0 to 2.10.1 in /webapp [`#1890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1890) +- build(deps-dev): bump @babel/cli from 7.6.3 to 7.6.4 in /backend [`#1868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1868) +- build(deps): bump apollo-server from 2.9.5 to 2.9.6 in /backend [`#1864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1864) +- build(deps-dev): bump apollo-server-testing from 2.9.5 to 2.9.6 in /backend [`#1870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1870) +- build(deps-dev): bump @babel/core from 7.6.3 to 7.6.4 in /webapp [`#1867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1867) +- build(deps-dev): bump core-js from 2.6.9 to 2.6.10 in /webapp [`#1892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1892) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc14 to 4.0.0-rc15 in /webapp [`#1891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1891) +- build(deps): bump @sentry/node from 5.6.2 to 5.7.0 in /backend [`#1871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1871) +- build(deps-dev): bump @vue/cli-shared-utils from 3.11.0 to 3.12.0 in /webapp [`#1869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1869) +- build(deps): bump apollo-server-express from 2.9.5 to 2.9.6 in /backend [`#1866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1866) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.4 in /backend [`#1865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1865) +- 🍰 Implement basic image cropping solution [`#1666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1666) +- 1773 refactor rewards spec [`#1884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1884) +- fix: search for email case-insensitively [`#1863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1863) +- Fix translation error in login page [`#1885`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1885) +- fix: security vulnerability with yarn resolutions [`#1862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1862) +- Fix embeds settings page [`#1877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1877) +- update version to 0.1.4 [`#1860`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1860) +- Update profile posts apollo query [`#1805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1805) +- Add Hall of Fame to README [`#1859`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1859) +- Implement public registration [`#1814`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1814) +- Refactor embed settings page [`#1861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1861) +- Save user setting to show embed code II [`#1852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1852) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.1 to 1.16.2 [`#1855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1855) +- build(deps): bump nodemailer from 6.3.0 to 6.3.1 in /backend [`#1854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1854) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /webapp [`#1849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1849) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.1 to 5.2.3 in /webapp [`#1836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1836) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.3 in /webapp [`#1848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1848) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /backend [`#1837`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1837) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1839) +- build(deps-dev): bump @babel/cli from 7.6.2 to 7.6.3 in /backend [`#1847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1847) +- build(deps-dev): bump @storybook/addon-actions from 5.2.1 to 5.2.3 in /webapp [`#1838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1838) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /backend [`#1846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1846) +- Title character increased from 64 to 100 [`#1850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1850) +- build(deps-dev): bump @babel/node from 7.6.2 to 7.6.3 in /backend [`#1843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1843) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /webapp [`#1835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1835) +- build(deps-dev): bump @storybook/vue from 5.2.1 to 5.2.3 in /webapp [`#1834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1834) +- build(deps-dev): bump cucumber from 6.0.1 to 6.0.2 in /backend [`#1833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1833) +- build(deps): bump tiptap-extensions from 1.28.0 to 1.28.3 in /webapp [`#1822`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1822) +- Fix typo in email template [`#1829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1829) +- build(deps-dev): bump apollo-server-testing from 2.9.4 to 2.9.5 in /backend [`#1823`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1823) +- build(deps-dev): bump cucumber from 5.1.0 to 6.0.1 in /backend [`#1827`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1827) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /backend [`#1826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1826) +- Display user email for administrators [`#1808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1808) +- build(deps): bump tiptap from 1.26.0 to 1.26.3 in /webapp [`#1821`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1821) +- build(deps): bump apollo-server from 2.9.4 to 2.9.5 in /backend [`#1825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1825) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /webapp [`#1824`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1824) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /webapp [`#1819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1819) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /backend [`#1818`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1818) +- build(deps): bump @hapi/joi from 16.1.5 to 16.1.7 in /backend [`#1817`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1817) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.0 to 1.16.1 [`#1816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1816) +- Update to 0.1.3 [`#1813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1813) +- Show that a Post/Comment has been edited [`#1807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1807) +- Max aspect ratio of 1:1 for Post index page [`#1796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1796) +- fixes#1305 lastActiveAt [`#1809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1809) +- Remove language toggle from email template [`#1798`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1798) +- build(deps): bump nuxt from 2.9.2 to 2.10.0 in /webapp [`#1804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1804) +- build(deps): bump cross-env from 6.0.2 to 6.0.3 in /backend [`#1801`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1801) +- fix invites count calculation for admin dashboard [`#1806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1806) +- build(deps-dev): bump cross-env from 6.0.2 to 6.0.3 [`#1800`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1800) +- build(deps): bump cross-env from 6.0.2 to 6.0.3 in /webapp [`#1803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1803) +- build(deps): bump @hapi/joi from 16.1.4 to 16.1.5 in /backend [`#1802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1802) +- Update neo4j to Enterprise edition [`#1787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1787) +- Update to 0.1.2 [`#1786`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1786) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- remove package-lock.json [`3cf3c31`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3cf3c31808dc6ae59fb9c6ec33e9e178c5556438) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### [v0.1.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.1...v0.1.2) + +> 2 October 2019 + +#### [0.1.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.1...0.1.1) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- 🍰 Fix - maintaining sorting after navigation [`#1872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1872) +- Add storybook stories for our university students [`#1906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1906) +- build(deps): bump nuxt from 2.10.1 to 2.10.2 in /webapp [`#1987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1987) +- build(deps-dev): bump @storybook/vue from 5.2.4 to 5.2.5 in /webapp [`#1981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1981) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.20.0 in /backend [`#1978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1978) +- build(deps): bump node from 12.12.0-alpine to 12.13.0-alpine in /webapp [`#1977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1977) +- build(deps-dev): bump date-fns from 2.5.0 to 2.5.1 [`#1962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1962) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#1961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1961) +- build(deps-dev): bump async-validator from 3.1.0 to 3.2.0 in /webapp [`#1920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1920) +- build(deps): bump @sentry/node from 5.7.0 to 5.7.1 in /backend [`#1914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1914) +- Hide new CommentForm while editing a comment [`#1973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1973) +- 🍰 Translate texts for pinning a post to German [`#1972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1972) +- Allow admins to pin a post [`#1840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1840) +- fix: Only one ellipse is displayed [`#1968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1968) +- Refactor reports resolver spec [`#1957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1957) +- Added createdAt date for follow and shout [`#1853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1853) +- build(deps-dev): bump @vue/cli-shared-utils from 3.12.0 to 4.0.4 in /webapp [`#1965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1965) +- build(deps): bump neo4j from 3.5.11-enterprise to 3.5.12-enterprise in /neo4j [`#1963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1963) +- build(deps-dev): bump cypress-file-upload from 3.3.4 to 3.4.0 [`#1960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1960) +- build(deps): bump date-fns from 2.5.0 to 2.5.1 in /backend [`#1959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1959) +- build(deps-dev): bump faker from `10bfb9f` to `9fd8d7d` [`#1958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1958) +- build(deps): bump tiptap-extensions from 1.28.3 to 1.28.4 in /webapp [`#1946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1946) +- build(deps): bump metascraper-soundcloud from 5.7.6 to 5.7.7 in /backend [`#1943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1943) +- fix: console warnings during frontend tests [`#1942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1942) +- Language will be saved in the database of the user during registration [`#1927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1927) +- Update to version 0.1.5 [`#1951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1951) +- build(deps-dev): bump dotenv from 8.1.0 to 8.2.0 [`#1917`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1917) +- Fix vue errors for Contribution form [`#1941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1941) +- Follow @alina-beck and @Tirokk PR suggestions [`#1940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1940) +- 🍰 Add Cypher statement for ordering [`#1926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1926) +- Improved comment truncation [`#1925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1925) +- fix: typo in German translation [`#1911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1911) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1923) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /webapp [`#1921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1921) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /backend [`#1915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1915) +- Maintain filename for cropped images [`#1935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1935) +- build(deps-dev): bump date-fns from 2.4.1 to 2.5.0 [`#1919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1919) +- build(deps-dev): bump nodemon from 1.19.3 to 1.19.4 in /backend [`#1916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1916) +- build(deps-dev): bump neode from 0.3.3 to 0.3.6 [`#1918`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1918) +- Highlight and expand linked comment [`#1903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1903) +- Add missing translations for Title placeholder [`#1910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1910) +- 🍰 Reporting with specific information [`#1797`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1797) +- build(deps): bump dotenv from 8.1.0 to 8.2.0 in /backend [`#1912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1912) +- Confirm privacy policy minimum age at registration [`#1907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1907) +- refactor: improve locale imports [`#1904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1904) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.3 to 5.2.4 in /webapp [`#1899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1899) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /webapp [`#1889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1889) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /backend [`#1888`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1888) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /webapp [`#1894`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1894) +- build(deps-dev): bump @storybook/vue from 5.2.3 to 5.2.4 in /webapp [`#1897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1897) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /backend [`#1895`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1895) +- build(deps): bump @nuxtjs/sentry from 3.0.0 to 3.0.1 in /webapp [`#1896`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1896) +- build(deps-dev): bump @storybook/addon-actions from 5.2.3 to 5.2.4 in /webapp [`#1898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1898) +- 🍰 Refactor Database for Reporting with specific information [`#1878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1878) +- build(deps): bump nuxt from 2.10.0 to 2.10.1 in /webapp [`#1890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1890) +- build(deps-dev): bump @babel/cli from 7.6.3 to 7.6.4 in /backend [`#1868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1868) +- build(deps): bump apollo-server from 2.9.5 to 2.9.6 in /backend [`#1864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1864) +- build(deps-dev): bump apollo-server-testing from 2.9.5 to 2.9.6 in /backend [`#1870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1870) +- build(deps-dev): bump @babel/core from 7.6.3 to 7.6.4 in /webapp [`#1867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1867) +- build(deps-dev): bump core-js from 2.6.9 to 2.6.10 in /webapp [`#1892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1892) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc14 to 4.0.0-rc15 in /webapp [`#1891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1891) +- build(deps): bump @sentry/node from 5.6.2 to 5.7.0 in /backend [`#1871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1871) +- build(deps-dev): bump @vue/cli-shared-utils from 3.11.0 to 3.12.0 in /webapp [`#1869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1869) +- build(deps): bump apollo-server-express from 2.9.5 to 2.9.6 in /backend [`#1866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1866) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.4 in /backend [`#1865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1865) +- 🍰 Implement basic image cropping solution [`#1666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1666) +- 1773 refactor rewards spec [`#1884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1884) +- fix: search for email case-insensitively [`#1863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1863) +- Fix translation error in login page [`#1885`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1885) +- fix: security vulnerability with yarn resolutions [`#1862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1862) +- Fix embeds settings page [`#1877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1877) +- update version to 0.1.4 [`#1860`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1860) +- Update profile posts apollo query [`#1805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1805) +- Add Hall of Fame to README [`#1859`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1859) +- Implement public registration [`#1814`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1814) +- Refactor embed settings page [`#1861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1861) +- Save user setting to show embed code II [`#1852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1852) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.1 to 1.16.2 [`#1855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1855) +- build(deps): bump nodemailer from 6.3.0 to 6.3.1 in /backend [`#1854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1854) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /webapp [`#1849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1849) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.1 to 5.2.3 in /webapp [`#1836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1836) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.3 in /webapp [`#1848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1848) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /backend [`#1837`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1837) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1839) +- build(deps-dev): bump @babel/cli from 7.6.2 to 7.6.3 in /backend [`#1847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1847) +- build(deps-dev): bump @storybook/addon-actions from 5.2.1 to 5.2.3 in /webapp [`#1838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1838) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /backend [`#1846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1846) +- Title character increased from 64 to 100 [`#1850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1850) +- build(deps-dev): bump @babel/node from 7.6.2 to 7.6.3 in /backend [`#1843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1843) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /webapp [`#1835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1835) +- build(deps-dev): bump @storybook/vue from 5.2.1 to 5.2.3 in /webapp [`#1834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1834) +- build(deps-dev): bump cucumber from 6.0.1 to 6.0.2 in /backend [`#1833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1833) +- build(deps): bump tiptap-extensions from 1.28.0 to 1.28.3 in /webapp [`#1822`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1822) +- Fix typo in email template [`#1829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1829) +- build(deps-dev): bump apollo-server-testing from 2.9.4 to 2.9.5 in /backend [`#1823`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1823) +- build(deps-dev): bump cucumber from 5.1.0 to 6.0.1 in /backend [`#1827`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1827) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /backend [`#1826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1826) +- Display user email for administrators [`#1808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1808) +- build(deps): bump tiptap from 1.26.0 to 1.26.3 in /webapp [`#1821`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1821) +- build(deps): bump apollo-server from 2.9.4 to 2.9.5 in /backend [`#1825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1825) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /webapp [`#1824`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1824) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /webapp [`#1819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1819) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /backend [`#1818`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1818) +- build(deps): bump @hapi/joi from 16.1.5 to 16.1.7 in /backend [`#1817`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1817) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.0 to 1.16.1 [`#1816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1816) +- Update to 0.1.3 [`#1813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1813) +- Show that a Post/Comment has been edited [`#1807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1807) +- Max aspect ratio of 1:1 for Post index page [`#1796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1796) +- fixes#1305 lastActiveAt [`#1809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1809) +- Remove language toggle from email template [`#1798`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1798) +- build(deps): bump nuxt from 2.9.2 to 2.10.0 in /webapp [`#1804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1804) +- build(deps): bump cross-env from 6.0.2 to 6.0.3 in /backend [`#1801`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1801) +- fix invites count calculation for admin dashboard [`#1806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1806) +- build(deps-dev): bump cross-env from 6.0.2 to 6.0.3 [`#1800`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1800) +- build(deps): bump cross-env from 6.0.2 to 6.0.3 in /webapp [`#1803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1803) +- build(deps): bump @hapi/joi from 16.1.4 to 16.1.5 in /backend [`#1802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1802) +- Update neo4j to Enterprise edition [`#1787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1787) +- Update to 0.1.2 [`#1786`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1786) +- 407 change your email address [`#1711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1711) +- build(deps): bump cross-env from 6.0.0 to 6.0.2 in /backend [`#1794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1794) +- build(deps-dev): bump cross-env from 6.0.0 to 6.0.2 [`#1793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1793) +- Update Post query for blockedByUsers [`#1788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1788) +- build(deps): bump metascraper-description from 5.7.5 to 5.7.6 in /backend [`#1792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1792) +- build(deps): bump cross-env from 6.0.0 to 6.0.2 in /webapp [`#1791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1791) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc13.1 to 4.0.0-rc14 in /webapp [`#1790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1790) +- Bump metascraper-audio from 5.7.5 to 5.7.6 in /backend [`#1779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1779) +- fix the bug with scrolling post comments into view [`#1701`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1701) +- Bump metascraper-publisher from 5.7.4 to 5.7.6 in /backend [`#1778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1778) +- Bump eslint from 6.4.0 to 6.5.1 in /backend [`#1780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1780) +- Bump metascraper-url from 5.7.5 to 5.7.6 in /backend [`#1782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1782) +- Bump metascraper-logo from 5.7.5 to 5.7.6 in /backend [`#1783`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1783) +- Bump graphql-middleware from 3.0.5 to 4.0.1 in /backend [`#1781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1781) +- Bump metascraper-youtube from 5.7.5 to 5.7.6 in /backend [`#1777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1777) +- Bump @babel/preset-env from 7.6.0 to 7.6.2 in /backend [`#1776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1776) +- Bump metascraper-soundcloud from 5.7.4 to 5.7.6 in /backend [`#1775`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1775) +- Bump metascraper-author from 5.7.4 to 5.7.6 in /backend [`#1774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1774) +- Bump eslint-loader from 3.0.1 to 3.0.2 in /webapp [`#1760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1760) +- Bump tiptap from 1.25.0 to 1.26.0 in /webapp [`#1765`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1765) +- Bump metascraper-lang from 5.7.4 to 5.7.6 in /backend [`#1766`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1766) +- Bump date-fns from 2.4.0 to 2.4.1 in /webapp [`#1768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1768) +- Bump metascraper-date from 5.7.4 to 5.7.6 in /backend [`#1771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1771) +- fix: Github's security vulnerability warning [`#1751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1751) +- 🍰 Notifications self update and refactoring [`#1658`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1658) +- Bump @babel/node from 7.6.1 to 7.6.2 in /backend [`#1725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1725) +- fix email middleware transport config [`#1757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1757) +- Bump nodemon from 1.19.2 to 1.19.3 in /backend [`#1758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1758) +- Bump metascraper-title from 5.7.5 to 5.7.6 in /backend [`#1759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1759) +- Bump metascraper-image from 5.7.5 to 5.7.6 in /backend [`#1761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1761) +- Bump apollo-server from 2.9.3 to 2.9.4 in /backend [`#1762`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1762) +- Bump metascraper-video from 5.7.5 to 5.7.6 in /backend [`#1764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1764) +- Bump graphql-middleware-sentry from 3.2.0 to 3.2.1 in /backend [`#1767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1767) +- Bump date-fns from 2.3.0 to 2.4.1 in /backend [`#1769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1769) +- Bump tiptap-extensions from 1.27.0 to 1.28.0 in /webapp [`#1770`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1770) +- Fix failing test [`#1772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1772) +- docs: moves storybook into webapp/README.md [`#1755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1755) +- 1273 fix post page nav suggestions [`#1756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1756) +- Bump @babel/core from 7.6.0 to 7.6.2 in /backend [`#1728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1728) +- [WIP]1706 refactor shout spec [`#1712`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1712) +- Bump cypress-file-upload from 3.3.3 to 3.3.4 [`#1671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1671) +- Bump @hapi/joi from 16.1.2 to 16.1.4 in /backend [`#1673`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1673) +- Bump metascraper-description from 5.7.4 to 5.7.5 in /backend [`#1700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1700) +- Bump @babel/cli from 7.6.0 to 7.6.2 in /backend [`#1713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1713) +- Bump apollo-server-testing from 2.9.3 to 2.9.4 in /backend [`#1717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1717) +- Bump date-fns from 2.2.1 to 2.4.0 in /webapp [`#1752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1752) +- Bump graphql from 14.5.7 to 14.5.8 in /webapp [`#1729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1729) +- Bump mustache from 3.0.3 to 3.1.0 in /backend [`#1655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1655) +- 🍰 Try to fix VSCode format works against ESLint [`#1749`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1749) +- Configure docker to work with storybook [`#1688`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1688) +- update neo4j docker-compose config [`#1750`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1750) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) +- fix lint: tests and lint ok [`d2a43ce`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d2a43cecd74ee3bec291109a85ddb6986315763b) + +#### [v0.1.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.1.0...v0.1.1) + +> 27 September 2019 + +#### [0.1.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.1.0...0.1.0) + +> 23 September 2020 + +- fix: 🍰 Sign Up Page On Safari [`#3882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3882) +- build: Add semantic PR config [`#3884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3884) +- feat: 🍰 Admin - Remove User Profile [`#3140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3140) +- fix: 🍰 Comment Counters Are Now Equal [`#3769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3769) +- feat: 🍰 Redesign Data Privacy Warning Box [`#3780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3780) +- fix: 🍰 Checkboxes Not Missing Anymore On Delete User Account Page [`#3506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3506) +- feat: 🍰 Increase Margin Of Header And Ruler For Better Legibility [`#3774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3774) +- chore: 💬 Rename stale.yml to stale-disabled.yml [`#3662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3662) +- build(deps): [security] bump apollo-server-core from 2.12.0 to 2.15.0 in /backend [`#3650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3650) +- fix: Corrected Code-of-Conduct Mail Link [`#3609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3609) +- feat: 🍰 Hero image height on post page is now set without having to wait for… [`#3583`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3583) +- feat: 🍰 Alphabetically sorting tags using compute functions on index and more… [`#3589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3589) +- fix: Fixed webapp unit test command. [`#3584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3584) +- chore: Upgrade to v0.6.1 [`#3525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3525) +- feat: FollowerList [1741] [`#3293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3334) +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3262) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3301) +- feat: Search for Hashtags [`#3297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3297) +- build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3300) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3299) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.14 to 5.3.17 in /webapp [`#3283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3283) +- build(deps-dev): bump cross-env from 6.0.3 to 7.0.2 [`#3294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3294) +- build(deps-dev): bump @storybook/vue from 5.3.14 to 5.3.17 in /webapp [`#3285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3285) +- build(deps): bump graphql-shield from 7.0.14 to 7.2.0 in /backend [`#3288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3288) +- build(deps): bump nuxt from 2.11.0 to 2.12.0 in /webapp [`#3291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3291) +- build(deps): bump cookie-universal-nuxt from 2.1.2 to 2.1.3 in /webapp [`#3289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3289) +- feat: Specs For Searches [`#3199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3199) +- chore(ci): Follow cypress docs to cache libraries [`#3292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3292) +- build(deps-dev): bump cypress from 4.1.0 to 4.2.0 [`#3287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3287) +- build(deps): [security] bump acorn from 5.7.3 to 5.7.4 in /webapp [`#3268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3268) +- feat: Introduce graphql image type [`#3043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3043) +- build(deps-dev): bump @storybook/addon-actions from 5.3.14 to 5.3.17 in /webapp [`#3284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3284) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /webapp [`#3281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3281) +- chore: Dockerfile/Travis node versions match [`#3267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3267) +- build(deps): bump date-fns from 2.10.0 to 2.11.0 in /backend [`#3278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3278) +- build(deps): bump @hapi/joi from 17.1.0 to 17.1.1 in /backend [`#3277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3277) +- build(deps): bump neo4j-driver from 4.0.1 to 4.0.2 in /backend [`#3276`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3276) +- build(deps-dev): bump neo4j-driver from 4.0.1 to 4.0.2 [`#3275`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3275) +- refactor: deprecated slot syntax [2117] [`#3258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3258) +- build(deps-dev): bump @storybook/addon-notes from 5.3.14 to 5.3.17 in /webapp [`#3282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3282) +- build(deps): bump mustache from 4.0.0 to 4.0.1 in /backend [`#3280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3280) +- build(deps): bump @sentry/node from 5.14.1 to 5.14.2 in /backend [`#3274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3274) +- build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3273) +- build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3270) +- build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3269) +- build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3265) +- build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3264) +- build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3263) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3249) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /webapp [`#3215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3215) +- build(deps-dev): bump fuse.js from 3.4.6 to 3.6.1 in /webapp [`#3239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3239) +- build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3237) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3228) +- chore: Update to version 0.4.2 [`#3261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3261) +- build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3260) +- build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/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/Ocelot-Social-Community/Ocelot-Social/pull/3251) +- build(deps): bump nodemailer from 6.4.4 to 6.4.5 in /backend [`#3254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3254) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.31 to 1.0.0-beta.32 in /webapp [`#3248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3248) +- build(deps-dev): bump async-validator from 3.2.3 to 3.2.4 in /webapp [`#3255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3255) +- build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /backend [`#3253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3253) +- feature: Delete_user_as_admin_through_API_only [`#3063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3063) +- feat: zero bell to all notifications page [2823] [`#3219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3219) +- fix: layout shift [2607] [`#3218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3218) +- feat: Documentation for locales script [`#3242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3242) +- build(deps): bump metascraper-audio from 5.11.1 to 5.11.6 in /backend [`#3235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3235) +- build(deps): bump metascraper-video from 5.11.1 to 5.11.6 in /backend [`#3247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3247) +- build(deps): bump metascraper-soundcloud from 5.11.5 to 5.11.6 in /backend [`#3246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3246) +- build(deps): bump metascraper-lang from 5.11.1 to 5.11.6 in /backend [`#3234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3234) +- build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3233) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3245) +- build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3244) +- chore: Update to v0.4.1 [`#3243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3243) +- build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3226) +- build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3238) +- build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3236) +- build(deps): bump metascraper-image from 5.11.1 to 5.11.6 in /backend [`#3224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3224) +- build(deps): bump uuid from 7.0.1 to 7.0.2 in /backend [`#3214`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3214) +- build(deps-dev): bump cypress from 4.0.2 to 4.1.0 [`#3190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3190) +- build(deps): bump cross-env from 7.0.1 to 7.0.2 in /webapp [`#3230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3230) +- build(deps): bump vue-infinite-loading from 2.4.4 to 2.4.5 in /webapp [`#3227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3227) +- build(deps): bump metascraper-youtube from 5.11.1 to 5.11.6 in /backend [`#3225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3225) +- build(deps): bump metascraper-url from 5.11.1 to 5.11.6 in /backend [`#3223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3223) +- build(deps): bump metascraper-author from 5.11.1 to 5.11.6 in /backend [`#3222`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3222) +- build(deps): bump metascraper-logo from 5.11.1 to 5.11.6 in /backend [`#3221`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3221) +- build(deps): bump metascraper from 5.11.4 to 5.11.6 in /backend [`#3220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3220) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.13 to 5.3.14 in /webapp [`#3167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3167) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /backend [`#3213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3213) +- build(deps): bump metascraper-soundcloud from 5.11.4 to 5.11.5 in /backend [`#3189`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3189) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 in /backend [`#3211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3211) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 [`#3210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3210) +- build(deps-dev): bump @babel/core from 7.8.6 to 7.8.7 in /webapp [`#3216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3216) +- build(deps-dev): bump @babel/node from 7.8.4 to 7.8.7 in /backend [`#3212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3212) +- build(deps-dev): bump @babel/preset-env from 7.8.6 to 7.8.7 [`#3209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3209) +- perf(neo4j): Improve currentUser read performance [`#3207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3207) +- build(deps-dev): bump apollo-server-testing from 2.10.1 to 2.11.0 in /backend [`#3205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3205) +- build(deps): bump apollo-server from 2.10.1 to 2.11.0 in /backend [`#3201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3201) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /webapp [`#3206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3206) +- build(deps): bump apollo-server-express from 2.10.1 to 2.11.0 in /backend [`#3202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3202) +- build(deps): bump graphql-redis-subscriptions from 2.1.2 to 2.2.1 in /backend [`#3203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3203) +- build(deps): bump cross-env from 7.0.0 to 7.0.1 in /backend [`#3204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3204) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 [`#3175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3175) +- feat: Russian Translations Update By Ewald Arnold [`#3198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3198) +- feat: Translations update [`#3111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3111) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /backend [`#3172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3172) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 [`#3173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3173) +- fix: Update user.updatedAt when password is reset [`#3197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3197) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 in /backend [`#3174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3174) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /webapp [`#3183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3183) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /backend [`#3191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3191) +- build(deps): bump wait-on from 4.0.0 to 4.0.1 in /backend [`#3176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3176) +- build(deps-dev): bump @babel/register from 7.8.3 to 7.8.6 [`#3179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3179) +- build(deps-dev): bump @babel/preset-env from 7.8.4 to 7.8.6 in /backend [`#3181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3181) +- build(deps-dev): bump @babel/core from 7.8.4 to 7.8.6 in /webapp [`#3182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3182) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.2 to 4.2.3 in /webapp [`#3184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3184) +- build(deps): bump @sentry/node from 5.12.4 to 5.13.1 in /backend [`#3192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3192) +- build(deps): bump nodemailer from 6.4.3 to 6.4.4 in /backend [`#3193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3193) +- build(deps-dev): bump eslint-plugin-jest from 23.8.0 to 23.8.1 in /webapp [`#3195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3195) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /backend [`#3159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3159) +- build(deps-dev): bump @storybook/vue from 5.3.13 to 5.3.14 in /webapp [`#3165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3165) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /webapp [`#3168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3168) +- build(deps-dev): bump @storybook/addon-actions from 5.3.13 to 5.3.14 in /webapp [`#3166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3166) +- build(deps-dev): bump date-fns from 2.9.0 to 2.10.0 [`#3160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3160) +- build(deps-dev): bump @storybook/addon-notes from 5.3.13 to 5.3.14 in /webapp [`#3164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3164) +- build(deps): bump date-fns from 2.9.0 to 2.10.0 in /webapp [`#3163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3163) +- build(deps-dev): bump babel-eslint from 10.0.3 to 10.1.0 in /backend [`#3162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3162) +- build(deps): bump uuid from 7.0.0 to 7.0.1 in /backend [`#3161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3161) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /backend [`#3044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3044) +- build(deps): bump metascraper-url from 5.10.7 to 5.11.1 in /backend [`#3147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3147) +- chore(build): Fix uuid deprecations [`#3156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3156) +- build(deps): bump graphql-shield from 7.0.13 to 7.0.14 in /backend [`#3153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3153) +- build(deps): bump metascraper-title from 5.10.7 to 5.11.1 in /backend [`#3148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3148) +- build(deps): bump helmet from 3.21.2 to 3.21.3 in /backend [`#3154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3154) +- build(deps): bump uuid from 3.4.0 to 7.0.0 in /backend [`#3155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3155) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /webapp [`#3150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3150) +- fix(webapp): remove ribbon z-index [`#3152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3152) +- build(deps): bump metascraper-description from 5.11.0 to 5.11.1 in /backend [`#3149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3149) +- build(deps-dev): bump eslint-plugin-jest from 23.7.0 to 23.8.0 in /backend [`#3146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3146) +- build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3145) +- build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3144) +- build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3143) +- feat: the point -no political use - added [`#3138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3138) +- build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3071) +- build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3136) +- build(deps): bump metascraper-soundcloud from 5.10.7 to 5.11.4 in /backend [`#3137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3137) +- chore: Update to v0.4.0 [`#3132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3132) +- build(deps): bump metascraper-logo from 5.10.7 to 5.11.1 in /backend [`#3126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3126) +- chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3121) +- build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3127) +- build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3128) +- build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3125) +- fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3115) +- docs(setup): Fix links in tests [`#3120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3120) +- feat: 🍰 Expose sensitive report type to moderators only [`#3075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3075) +- refactor: migrate card component [`#2870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2870) +- build(deps): bump metascraper-youtube from 5.10.7 to 5.11.1 in /backend [`#3114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3114) +- fix(cypress): Upgrade cypress, remove log out step [`#3119`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3119) +- build(deps): bump metascraper-date from 5.10.7 to 5.11.1 in /backend [`#3069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3069) +- build(deps): bump metascraper-author from 5.10.7 to 5.11.1 in /backend [`#3070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3070) +- build(deps): bump xregexp from 4.2.4 to 4.3.0 in /webapp [`#3047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3047) +- build(deps): bump metascraper-publisher from 5.10.7 to 5.11.1 in /backend [`#3068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3068) +- build(deps): bump @sentry/node from 5.12.3 to 5.12.4 in /backend [`#3113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3113) +- feat: German Translations Update By Andreas Plank [`#3109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3109) +- fix(frontend): Remove Hover Menu from User Teaser [`#3093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3093) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /webapp [`#3030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3030) +- fix(frontend): Post page won't crash on anonymous user [`#2981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2981) +- chore(cypress): Remove debug statements [`#3110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3110) +- build(deps): bump metascraper-audio from 5.10.7 to 5.11.1 in /backend [`#3066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3066) +- build(deps): bump @nuxtjs/sentry from 3.2.3 to 3.2.4 in /webapp [`#3081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3081) +- build(deps-dev): bump apollo-server-testing from 2.10.0 to 2.10.1 in /backend [`#3078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3078) +- fix(subscriptions): Don't publish undefined [`#3101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3101) +- build(deps): [security] bump yarn from 1.17.3 to 1.22.0 in /webapp [`#3077`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3077) +- feat: Normalize locales/json files [`#3003`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3003) +- 🍰feat: Delete teaser image [`#2585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2585) +- fix: swap lat and lng [`#2589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2589) +- fix(frontend): avatar image covers full circle [`#3102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3102) +- fix(jwt): Whitelist encoded JWT attributes [`#3090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3090) +- test: Write cypress tests for ImageUploader [`#3056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3056) +- build(deps-dev): bump eslint-plugin-vue from 6.1.2 to 6.2.1 in /webapp [`#3092`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3092) +- build: Fix intermittent failing tests [`#3087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3087) +- fix(nuxt-env): Configuration issue with websockets [`#3089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3089) +- build(deps-dev): bump eslint-plugin-jest from 23.6.0 to 23.7.0 in /backend [`#3029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3029) +- build(deps): bump cookie-universal-nuxt from 2.1.1 to 2.1.2 in /webapp [`#3073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3073) +- build(deps): bump @nuxtjs/sentry from 3.2.2 to 3.2.3 in /webapp [`#3072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3072) +- build(deps): bump metascraper-image from 5.10.7 to 5.11.1 in /backend [`#3067`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3067) +- build(deps-dev): bump vue-loader from 15.8.3 to 15.9.0 in /webapp [`#3060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3060) +- build(deps-dev): bump @storybook/addon-actions from 5.3.12 to 5.3.13 in /webapp [`#3049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3049) +- refactor(cypress): Speed up builds, avoid login through UI [`#3042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3042) +- feat: 🍰 Set up Vue-Apollo Subscriptions [`#1705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1705) +- fix: Update devops_ticket.md [`#3053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3053) +- build(deps-dev): bump @storybook/addon-notes from 5.3.12 to 5.3.13 in /webapp [`#3048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3048) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.12 to 5.3.13 in /webapp [`#3050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3050) +- build(deps): Node v13 compatbility [`#3041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3041) +- build(deps): bump request from 2.88.0 to 2.88.2 in /backend [`#3045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3045) +- build(deps-dev): bump @storybook/vue from 5.3.12 to 5.3.13 in /webapp [`#3046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3046) +- feat(deployment): Add helm charts for deploy [`#1613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1613) +- build(deps-dev): bump vue-svg-loader from 0.15.0 to 0.16.0 in /webapp [`#3039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3039) +- fix: Increase body parser limit [`#3037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3037) +- chore: Update to v0.3.1 [`#3035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3035) +- fix: Display unblock feature only for blocking user [`#3034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3034) +- refactor(factories): Refactor test factories with rosie.js [`#2921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2921) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.2 to 4.2.2 in /webapp [`#3031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3031) +- build(deps): bump graphql-shield from 7.0.10 to 7.0.11 in /backend [`#3028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3028) +- build(deps-dev): bump codecov from 3.6.4 to 3.6.5 [`#3027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3027) +- chore: Add DevOps issue template [`#2999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2999) +- fix: Error pages can be translated [`#2826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2826) +- build(deps-dev): bump apollo-server-testing from 2.9.16 to 2.10.0 in /backend [`#3020`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3020) +- build(deps): bump apollo-server from 2.9.16 to 2.10.0 in /backend [`#3019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3019) +- build(deps): bump graphql-tag from 2.10.2 to 2.10.3 in /backend [`#3011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3011) +- build(deps): bump graphql-shield from 7.0.9 to 7.0.10 in /backend [`#3010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3010) +- build(deps-dev): bump @storybook/addon-actions from 5.3.10 to 5.3.12 in /webapp [`#2998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2998) +- build(deps-dev): bump @storybook/addon-notes from 5.3.10 to 5.3.12 in /webapp [`#2997`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2997) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.10 to 5.3.12 in /webapp [`#2996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2996) +- build(deps): bump metascraper-author from 5.10.6 to 5.10.7 in /backend [`#2994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2994) +- build(deps): bump metascraper-title from 5.10.6 to 5.10.7 in /backend [`#2978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2978) +- build(deps-dev): bump @storybook/vue from 5.3.10 to 5.3.12 in /webapp [`#2995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2995) +- build(deps): bump metascraper-audio from 5.10.6 to 5.10.7 in /backend [`#2993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2993) +- build(deps): bump graphql-tag from 2.10.1 to 2.10.2 in /backend [`#2992`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2992) +- build(deps): bump metascraper-url from 5.10.6 to 5.10.7 in /backend [`#2991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2991) +- build(deps): bump @sentry/node from 5.12.0 to 5.12.3 in /backend [`#2990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2990) +- build(deps-dev): bump @storybook/addon-notes from 5.3.9 to 5.3.10 in /webapp [`#2951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2951) +- build(deps): bump metascraper from 5.10.6 to 5.11.0 in /backend [`#2976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2976) +- build(deps): bump metascraper-logo from 5.10.6 to 5.10.7 in /backend [`#2975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2975) +- chore: Add issue template for Refactoring tickets [`#2983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2983) +- build(deps): bump @nuxtjs/sentry from 3.1.0 to 3.2.2 in /webapp [`#2974`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2974) +- build(deps): bump metascraper-video from 5.10.6 to 5.10.7 in /backend [`#2952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2952) +- build(deps): bump metascraper-lang from 5.10.6 to 5.10.7 in /backend [`#2950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2950) +- build(deps): bump metascraper-description from 5.10.6 to 5.11.0 in /backend [`#2948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2948) +- build(deps): bump @sentry/node from 5.11.2 to 5.12.0 in /backend [`#2977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2977) +- build(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 in /webapp [`#2959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2959) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.9 to 5.3.10 in /webapp [`#2956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2956) +- build(deps-dev): bump eslint-plugin-import from 2.20.0 to 2.20.1 in /webapp [`#2949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2949) +- build(deps): bump metascraper-soundcloud from 5.10.6 to 5.10.7 in /backend [`#2945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2945) +- build(deps): bump metascraper-date from 5.10.6 to 5.10.7 in /backend [`#2944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2944) +- build(deps-dev): bump codecov from 3.6.2 to 3.6.4 [`#2943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2943) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2953`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2953) +- build(deps): bump metascraper-publisher in /backend [`#2954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2954) +- build(deps-dev): bump eslint-plugin-import in /backend [`#2955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2955) +- build(deps): bump metascraper-youtube from 5.10.6 to 5.10.7 in /backend [`#2957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2957) +- build(deps): bump metascraper-image from 5.10.6 to 5.10.7 in /backend [`#2960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2960) +- build(deps-dev): bump @storybook/vue from 5.3.9 to 5.3.10 in /webapp [`#2961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2961) +- build(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5 in /webapp [`#2962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2962) +- fix: Update mute/unmute icon to unused icon [`#2973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2973) +- fix: Remove github release script breaking build [`#2971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2971) +- Use original createdAt for merged users/emails [`#2969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2969) +- Fix typo [`#2966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2966) +- chore: Update to v0.3.0 [`#2941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2941) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2939) +- feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2608) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2938) +- fix: deploy script with new naming convention [`#2930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2930) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /backend [`#2940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2940) +- build(deps-dev): bump @babel/cli from 7.8.3 to 7.8.4 in /backend [`#2934`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2934) +- build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 [`#2935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2935) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 in /webapp [`#2932`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2932) +- build(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 in /webapp [`#2937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2937) +- build(deps-dev): bump @babel/node from 7.8.3 to 7.8.4 in /backend [`#2936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2936) +- build(deps-dev): bump @babel/preset-env from 7.8.3 to 7.8.4 [`#2933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2933) +- feat: Blocked users cannot comment on posts [`#2714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2714) +- build(deps): bump @sentry/node from 5.11.1 to 5.11.2 in /backend [`#2927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2927) +- build(deps): bump cookie-universal-nuxt from 2.1.0 to 2.1.1 in /webapp [`#2925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2925) +- build(deps): bump @nuxtjs/sentry from 3.0.1 to 3.1.0 in /webapp [`#2928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2928) +- docs(CONTRIBUTING): Add open-source bounty program [`#2899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2899) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /webapp [`#2926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2926) +- build(deps): bump graphql-shield from 7.0.8 to 7.0.9 in /backend [`#2924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2924) +- build(deps-dev): bump eslint-config-prettier from 6.9.0 to 6.10.0 in /backend [`#2923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2923) +- feat(editor): Underline markup for posts+comments [`#2898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2898) +- fix(backend): Add migration for muted relationship [`#2919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2919) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.8 to 5.3.9 in /webapp [`#2914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2914) +- fix(webapp): 🐛 Adjust Avatar Sizes and 'z-index' [`#2871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2871) +- build(deps-dev): bump @storybook/vue from 5.3.8 to 5.3.9 in /webapp [`#2913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2913) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /backend [`#2907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2907) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /webapp [`#2905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2905) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /backend [`#2911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2911) +- build(deps-dev): bump @storybook/addon-notes from 5.3.8 to 5.3.9 in /webapp [`#2910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2910) +- build(deps): bump slug from 2.1.0 to 2.1.1 in /backend [`#2906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2906) +- build(deps): bump cross-env from 6.0.3 to 7.0.0 in /webapp [`#2916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2916) +- build(deps): bump graphql from 14.5.8 to 14.6.0 in /backend [`#2909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2909) +- build(deps-dev): bump storybook-design-token from 0.5.0 to 0.5.1 in /webapp [`#2915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2915) +- build(deps): bump validator from 12.1.0 to 12.2.0 in /webapp [`#2912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2912) +- build(deps-dev): bump @storybook/addon-actions from 5.3.8 to 5.3.9 in /webapp [`#2908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2908) +- build(deps-dev): bump slug from 2.1.0 to 2.1.1 [`#2904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2904) +- build(deps): bump graphql-shield from 7.0.7 to 7.0.8 in /backend [`#2903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2903) +- build(deps-dev): bump cypress from 3.8.2 to 3.8.3 [`#2902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2902) +- build(deps): bump metascraper-logo from 5.10.5 to 5.10.6 in /backend [`#2893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2893) +- build(deps): bump metascraper-video from 5.10.5 to 5.10.6 in /backend [`#2892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2892) +- build(deps): bump metascraper-image from 5.10.5 to 5.10.6 in /backend [`#2891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2891) +- build(deps): bump metascraper-publisher from 5.10.5 to 5.10.6 in /backend [`#2890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2890) +- build(deps-dev): bump codecov from 3.6.1 to 3.6.2 [`#2889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2889) +- feat(db): Setup neo4j data migrations [`#2828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2828) +- build(deps): bump metascraper from 5.10.5 to 5.10.6 in /backend [`#2877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2877) +- build(deps): bump metascraper-url from 5.10.5 to 5.10.6 in /backend [`#2879`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2879) +- build(deps): bump metascraper-lang from 5.10.5 to 5.10.6 in /backend [`#2882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2882) +- build(deps): bump metascraper-audio from 5.10.5 to 5.10.6 in /backend [`#2883`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2883) +- build(deps): bump metascraper-date from 5.10.5 to 5.10.6 in /backend [`#2878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2878) +- build(deps): bump metascraper-title from 5.10.5 to 5.10.6 in /backend [`#2880`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2880) +- build(deps): bump metascraper-youtube from 5.10.5 to 5.10.6 in /backend [`#2881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2881) +- build(deps): bump metascraper-author from 5.10.5 to 5.10.6 in /backend [`#2876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2876) +- build(deps): bump metascraper-description from 5.10.5 to 5.10.6 in /backend [`#2875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2875) +- build(deps): bump metascraper-soundcloud from 5.10.5 to 5.10.6 in /backend [`#2874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2874) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /webapp [`#2868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2868) +- build(deps-dev): bump @storybook/vue from 5.3.7 to 5.3.8 in /webapp [`#2867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2867) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /webapp [`#2869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2869) +- build(deps-dev): bump @storybook/addon-actions from 5.3.7 to 5.3.8 in /webapp [`#2865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2865) +- build(deps-dev): bump babel-jest from 24.9.0 to 25.1.0 in /backend [`#2863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2863) +- build(deps-dev): bump expect from 24.9.0 to 25.1.0 [`#2861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2861) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.7 to 5.3.8 in /webapp [`#2866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2866) +- build(deps-dev): bump @storybook/addon-notes from 5.3.7 to 5.3.8 in /webapp [`#2864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2864) +- build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2862) +- docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2825) +- refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2700) +- feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2686) +- removed obsolete German keys [`#2845`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2845) +- build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2852) +- build(deps-dev): bump @storybook/vue from 5.3.6 to 5.3.7 in /webapp [`#2857`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2857) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2858`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2858) +- build(deps): bump metascraper-image from 5.10.3 to 5.10.5 in /backend [`#2849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2849) +- build(deps): bump wait-on from 3.3.0 to 4.0.0 in /backend [`#2848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2848) +- build(deps): bump v-tooltip from 2.0.2 to 2.0.3 in /webapp [`#2856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2856) +- build(deps-dev): bump @storybook/addon-notes from 5.3.6 to 5.3.7 in /webapp [`#2855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2855) +- build(deps): bump sanitize-html from 1.20.1 to 1.21.1 in /backend [`#2854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2854) +- build(deps): bump metascraper-video from 5.10.3 to 5.10.5 in /backend [`#2853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2853) +- build(deps): bump metascraper-date from 5.10.3 to 5.10.5 in /backend [`#2851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2851) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.31 in /webapp [`#2850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2850) +- build(deps): bump metascraper-logo from 5.10.3 to 5.10.5 in /backend [`#2847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2847) +- build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2846) +- Release 0.2.2 [`#2844`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2844) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2842) +- build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2835) +- build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2836) +- build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2840) +- build(deps): bump metascraper-author from 5.10.3 to 5.10.5 in /backend [`#2838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2838) +- build(deps): bump metascraper-url from 5.10.3 to 5.10.5 in /backend [`#2832`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2832) +- build(deps): bump metascraper-lang from 5.10.3 to 5.10.5 in /backend [`#2831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2831) +- refactor(modules): Various import fixes [`#2802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2802) +- build(deps): bump metascraper-description from 5.10.3 to 5.10.5 in /backend [`#2839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2839) +- build(deps-dev): bump @storybook/addon-notes from 5.3.5 to 5.3.6 in /webapp [`#2834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2834) +- build(deps): bump metascraper-youtube from 5.10.3 to 5.10.5 in /backend [`#2833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2833) +- build(deps): bump metascraper from 5.10.3 to 5.10.5 in /backend [`#2830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2830) +- build(deps): bump metascraper-soundcloud from 5.10.3 to 5.10.5 in /backend [`#2829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2829) +- fix(translations): Remove duplicate and mistranslated item from code of conduct [`#2725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2725) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.3 to 5.3.6 in /webapp [`#2820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2820) +- build(deps): bump metascraper from 5.10.2 to 5.10.3 in /backend [`#2808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2808) +- build(deps-dev): bump @storybook/vue from 5.3.3 to 5.3.6 in /webapp [`#2819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2819) +- build(deps): bump faker from `9fd8d7d` to `3b2fa4a` in /backend [`#2803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2803) +- build(deps-dev): bump faker from `9fd8d7d` to `3b2fa4a` [`#2804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2804) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`#2809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2809) +- build(deps): bump uuid from 3.3.3 to 3.4.0 in /backend [`#2810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2810) +- build(deps): bump metascraper-image from 5.9.5 to 5.10.3 in /backend [`#2811`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2811) +- build(deps-dev): bump node-sass from 4.13.0 to 4.13.1 in /webapp [`#2812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2812) +- build(deps): bump metascraper-audio from 5.9.5 to 5.10.3 in /backend [`#2813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2813) +- build(deps): bump metascraper-soundcloud in /backend [`#2815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2815) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`#2816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2816) +- build(deps-dev): bump @storybook/addon-actions from 5.3.3 to 5.3.5 in /webapp [`#2807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2807) +- build(deps): bump metascraper-description from 5.9.5 to 5.10.3 in /backend [`#2806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2806) +- build(deps): bump mustache from 3.2.1 to 4.0.0 in /backend [`#2805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2805) +- 🍰 feat(webapp): Display deployed version in footer [`#2728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2728) +- fix: cypress breaks locally in login step [`#2776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2776) +- build(deps-dev): bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2378`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2378) +- build(deps): bump metascraper-youtube from 5.9.5 to 5.10.3 in /backend [`#2794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2794) +- build(deps): bump metascraper-video from 5.9.5 to 5.10.3 in /backend [`#2795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2795) +- build(deps): bump metascraper-logo from 5.9.5 to 5.10.3 in /backend [`#2796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2796) +- refactor(styleguide): improve emotion buttons and header responsiveness [`#2582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2582) +- build(deps): bump metascraper-url from 5.9.5 to 5.10.3 in /backend [`#2793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2793) +- build(deps): bump metascraper-author from 5.9.5 to 5.10.3 in /backend [`#2789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2789) +- build(deps): bump metascraper-lang from 5.9.5 to 5.10.3 in /backend [`#2790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2790) +- build(deps): bump metascraper-publisher from 5.9.5 to 5.10.3 in /backend [`#2792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2792) +- build(deps): bump metascraper-title from 5.9.5 to 5.10.3 in /backend [`#2791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2791) +- build(deps): bump @sentry/node from 5.11.0 to 5.11.1 in /backend [`#2788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2788) +- build(deps): bump metascraper-date from 5.9.5 to 5.10.3 in /backend [`#2787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2787) +- build(deps-dev): bump @babel/node from 7.8.0 to 7.8.3 in /backend [`#2754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2754) +- refactor(styleguide): migrate and redesign buttons [`#2562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2562) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 in /backend [`#2760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2760) +- build(deps-dev): bump @storybook/addon-actions from 5.3.2 to 5.3.3 in /webapp [`#2782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2782) +- build(deps-dev): bump sass-loader from 8.0.0 to 8.0.2 in /webapp [`#2781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2781) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.8.0 to 7.8.3 in /webapp [`#2780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2780) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.2 to 5.3.3 in /webapp [`#2779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2779) +- build(deps): bump metascraper from 5.9.5 to 5.10.2 in /backend [`#2778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2778) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.3 in /webapp [`#2767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2767) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.8.0 to 7.8.3 in /backend [`#2757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2757) +- build(deps-dev): bump @storybook/vue from 5.3.1 to 5.3.3 in /webapp [`#2772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2772) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 [`#2758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2758) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /webapp [`#2748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2748) +- build(deps-dev): bump @storybook/addon-notes from 5.3.1 to 5.3.3 in /webapp [`#2771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2771) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.3 in /webapp [`#2769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2769) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 [`#2764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2764) +- build(deps-dev): bump @babel/preset-env from 7.8.2 to 7.8.3 in /backend [`#2755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2755) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /webapp [`#2768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2768) +- build(deps-dev): bump @babel/cli from 7.8.0 to 7.8.3 in /backend [`#2763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2763) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.19.0 to 2.0.1 [`#2761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2761) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.8 to 5.3.2 in /webapp [`#2759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2759) +- build(deps-dev): bump @babel/core from 7.8.0 to 7.8.3 [`#2756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2756) +- build(deps-dev): bump @babel/register from 7.8.0 to 7.8.3 in /backend [`#2753`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2753) +- build(deps): [security] bump serialize-javascript from 2.1.0 to 2.1.2 in /webapp [`#2752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2752) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 in /backend [`#2743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2743) +- build(deps-dev): bump @storybook/addon-actions from 5.2.8 to 5.3.2 in /webapp [`#2751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2751) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 in /backend [`#2735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2735) +- build(deps-dev): bump @babel/plugin-syntax-dynamic-import from 7.7.4 to 7.8.0 in /webapp [`#2746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2746) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 in /backend [`#2739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2739) +- build(deps-dev): bump @babel/cli from 7.7.7 to 7.8.0 in /backend [`#2744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2744) +- Issues marked as bounty never become stale [`#2726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2726) +- build(deps-dev): bump css-loader from 3.4.1 to 3.4.2 in /webapp [`#2747`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2747) +- build(deps-dev): bump @storybook/addon-notes from 5.2.8 to 5.3.1 in /webapp [`#2742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2742) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.7.4 to 7.8.0 in /backend [`#2741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2741) +- build(deps-dev): bump eslint-plugin-import from 2.19.1 to 2.20.0 in /backend [`#2737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2737) +- build(deps-dev): bump @babel/preset-env from 7.7.7 to 7.8.2 [`#2732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2732) +- build(deps): bump @nuxtjs/axios from 5.9.2 to 5.9.3 in /webapp [`#2740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2740) +- build(deps-dev): bump @storybook/vue from 5.2.8 to 5.3.1 in /webapp [`#2738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2738) +- build(deps-dev): bump cypress from 3.8.1 to 3.8.2 [`#2734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2734) +- build(deps-dev): bump @babel/node from 7.7.7 to 7.8.0 in /backend [`#2733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2733) +- build(deps-dev): bump eslint-plugin-jest from 23.3.0 to 23.6.0 in /backend [`#2731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2731) +- build(deps-dev): bump @babel/core from 7.7.7 to 7.8.0 [`#2730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2730) +- build(deps-dev): bump @babel/register from 7.7.7 to 7.8.0 [`#2729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2729) +- build(deps): bump nuxt from 2.10.2 to 2.11.0 in /webapp [`#2552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2552) +- Update yarn.lock after dependabot update [`#2724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2724) +- build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2657) +- Update to version 0.2.1 [`#2722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2722) +- 🍰 Search For Users [`#2262`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2262) +- Use node LTS in production [`#2713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2713) +- build(deps): bump apollo-server from 2.9.15 to 2.9.16 in /backend [`#2718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2718) +- build(deps): bump neo4j-graphql-js from 2.11.4 to 2.11.5 in /backend [`#2715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2715) +- build(deps-dev): bump apollo-server-testing from 2.9.15 to 2.9.16 in /backend [`#2720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2720) +- build(deps): bump @hapi/joi from 17.0.0 to 17.0.2 in /backend [`#2719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2719) +- build(deps): bump apollo-server-express from 2.9.15 to 2.9.16 in /backend [`#2717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2717) +- build(deps): bump metascraper-url from 5.8.13 to 5.9.5 in /backend [`#2716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2716) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /backend [`#2706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2706) +- build(deps): bump metascraper-lang from 5.8.13 to 5.9.5 in /backend [`#2703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2703) +- build(deps): bump date-fns from 2.8.1 to 2.9.0 in /webapp [`#2711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2711) +- build(deps): bump metascraper-logo from 5.8.13 to 5.9.5 in /backend [`#2697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2697) +- build(deps): bump metascraper-title from 5.8.13 to 5.9.5 in /backend [`#2694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2694) +- build(deps): bump metascraper-description from 5.8.15 to 5.9.5 in /backend [`#2690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2690) +- build(deps): bump node from 13.5.0-alpine to 13.6.0-alpine in /webapp [`#2708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2708) +- build(deps): bump @sentry/node from 5.10.2 to 5.11.0 in /backend [`#2709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2709) +- build(deps): bump metascraper-audio from 5.8.13 to 5.9.5 in /backend [`#2707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2707) +- build(deps): bump metascraper-image from 5.9.4 to 5.9.5 in /backend [`#2705`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2705) +- build(deps): bump metascraper-youtube from 5.8.13 to 5.9.5 in /backend [`#2704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2704) +- build(deps-dev): bump date-fns from 2.8.1 to 2.9.0 [`#2702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2702) +- build(deps): bump metascraper-soundcloud from 5.9.0 to 5.9.5 in /backend [`#2693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2693) +- build(deps): bump metascraper-date from 5.8.13 to 5.9.5 in /backend [`#2698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2698) +- build(deps): bump neo4j-graphql-js from 2.11.3 to 2.11.4 in /backend [`#2696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2696) +- build(deps): bump metascraper-video from 5.8.13 to 5.9.5 in /backend [`#2695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2695) +- build(deps): bump metascraper-publisher from 5.8.13 to 5.9.5 in /backend [`#2692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2692) +- build(deps): bump metascraper-author from 5.8.13 to 5.9.5 in /backend [`#2691`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2691) +- build(deps): bump metascraper from 5.9.4 to 5.9.5 in /backend [`#2689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2689) +- Changes Text For SignUp [`#2678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2678) +- Update de.json [`#2655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2655) +- build(deps): bump neode from 0.3.6 to 0.3.7 in /backend [`#2682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2682) +- Update neo4j-driver [`#2546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2546) +- build(deps): bump merge-graphql-schemas from 1.7.5 to 1.7.6 in /backend [`#2681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2681) +- build(deps): bump neo4j-graphql-js from 2.11.2 to 2.11.3 in /backend [`#2680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2680) +- build(deps-dev): bump neode from 0.3.6 to 0.3.7 [`#2679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2679) +- Parse xss before extracting mentions/hashtags [`#2674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2674) +- build(deps): bump metascraper-logo from 5.8.12 to 5.8.13 in /backend [`#2672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2672) +- build(deps): bump metascraper from 5.9.0 to 5.9.4 in /backend [`#2668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2668) +- build(deps-dev): bump eslint-plugin-jest from 23.2.0 to 23.3.0 in /webapp [`#2671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2671) +- build(deps-dev): bump css-loader from 3.4.0 to 3.4.1 in /webapp [`#2669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2669) +- build(deps): bump metascraper-image from 5.8.13 to 5.9.4 in /backend [`#2670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2670) +- build(deps-dev): bump apollo-server-testing from 2.9.14 to 2.9.15 in /backend [`#2667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2667) +- build(deps): bump neo4j-graphql-js from 2.11.0 to 2.11.2 in /backend [`#2666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2666) +- build(deps): bump metascraper-title from 5.8.12 to 5.8.13 in /backend [`#2665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2665) +- build(deps): bump @hapi/joi from 16.1.8 to 17.0.0 in /backend [`#2664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2664) +- build(deps-dev): bump cypress-file-upload from 3.5.1 to 3.5.3 [`#2663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2663) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.3.0 in /backend [`#2662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2662) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /webapp [`#2632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2632) +- build(deps-dev): bump slug from 2.0.0 to 2.1.0 [`#2647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2647) +- build(deps): bump merge-graphql-schemas from 1.7.3 to 1.7.5 in /backend [`#2648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2648) +- build(deps): bump metascraper-url from 5.8.12 to 5.8.13 in /backend [`#2637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2637) +- build(deps): bump metascraper-publisher from 5.8.12 to 5.8.13 in /backend [`#2636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2636) +- build(deps-dev): bump eslint-plugin-jest from 23.1.1 to 23.2.0 in /webapp [`#2642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2642) +- build(deps): bump graphql-shield from 7.0.5 to 7.0.7 in /backend [`#2649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2649) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /backend [`#2650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2650) +- build(deps-dev): bump eslint-config-prettier from 6.7.0 to 6.9.0 in /backend [`#2651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2651) +- build(deps): bump slug from 2.0.0 to 2.1.0 in /backend [`#2652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2652) +- build(deps): bump metascraper from 5.8.12 to 5.9.0 in /backend [`#2654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2654) +- build(deps): bump metascraper-description from 5.8.12 to 5.8.15 in /backend [`#2653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2653) +- build(deps): bump metascraper-author from 5.8.12 to 5.8.13 in /backend [`#2616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2616) +- build(deps): bump metascraper-lang from 5.8.12 to 5.8.13 in /backend [`#2618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2618) +- build(deps): bump apollo-server from 2.9.13 to 2.9.15 in /backend [`#2634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2634) +- build(deps): bump metascraper-soundcloud from 5.8.15 to 5.9.0 in /backend [`#2638`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2638) +- build(deps): bump metascraper-video from 5.8.12 to 5.8.13 in /backend [`#2639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2639) +- build(deps): bump mustache from 3.2.0 to 3.2.1 in /backend [`#2640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2640) +- build(deps): bump slug from 1.1.0 to 2.0.0 in /backend [`#2641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2641) +- build(deps-dev): bump @vue/cli-shared-utils from 4.1.1 to 4.1.2 in /webapp [`#2643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2643) +- build(deps-dev): bump eslint-plugin-vue from 6.1.1 to 6.1.2 in /webapp [`#2644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2644) +- build(deps-dev): bump eslint-plugin-node from 10.0.0 to 11.0.0 in /webapp [`#2645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2645) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /webapp [`#2579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2579) +- build(deps): bump metascraper-soundcloud from 5.8.12 to 5.8.15 in /backend [`#2630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2630) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /webapp [`#2617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2617) +- build(deps): bump metascraper-date from 5.8.12 to 5.8.13 in /backend [`#2615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2615) +- build(deps): bump metascraper-image from 5.8.12 to 5.8.13 in /backend [`#2614`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2614) +- build(deps): bump metascraper-youtube from 5.8.12 to 5.8.13 in /backend [`#2612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2612) +- build(deps): bump metascraper-audio from 5.8.12 to 5.8.13 in /backend [`#2610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2610) +- 🍰 Added Language Tag For Posts [`#2627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2627) +- build(deps-dev): bump cypress-plugin-retries from 1.5.0 to 1.5.2 [`#2609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2609) +- build(deps-dev): bump eslint from 6.7.2 to 6.8.0 in /backend [`#2613`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2613) +- remove accidently created ru.json in wrong place [`#2606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2606) +- build(deps): bump neo4j from 3.5.13-enterprise to 3.5.14-enterprise in /neo4j [`#2620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2620) +- Fixes 2603 [`#2619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2619) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /webapp [`#2581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2581) +- build(deps-dev): bump slug from 1.1.0 to 2.0.0 [`#2621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2621) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /webapp [`#2624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2624) +- build(deps): [security] bump handlebars from 4.1.2 to 4.5.3 in /backend [`#2625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2625) +- build(deps-dev): bump cypress from 3.8.0 to 3.8.1 [`#2626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2626) +- build(deps-dev): bump eslint-plugin-vue from 6.0.1 to 6.1.1 in /webapp [`#2633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2633) +- build(deps-dev): bump @babel/register from 7.7.4 to 7.7.7 [`#2571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2571) +- build(deps): bump neo4j-graphql-js from 2.10.2 to 2.11.0 in /backend [`#2600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2600) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 in /backend [`#2590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2590) +- build(deps): bump metascraper-url from 5.8.7 to 5.8.12 in /backend [`#2599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2599) +- build(deps): bump metascraper-lang from 5.8.10 to 5.8.12 in /backend [`#2598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2598) +- build(deps): bump metascraper-audio from 5.8.10 to 5.8.12 in /backend [`#2596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2596) +- build(deps): bump node from 13.4.0-alpine to 13.5.0-alpine in /webapp [`#2595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2595) +- build(deps-dev): bump storybook-design-token from 0.4.1 to 0.5.0 in /webapp [`#2594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2594) +- build(deps): bump graphql-shield from 7.0.4 to 7.0.5 in /backend [`#2593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2593) +- build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2592) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2568) +- Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2588) +- Update to version 0.2.0 [`#2584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2584) +- build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2556) +- build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2569) +- build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2576) +- Lokalise: Translations update [`#2563`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2563) +- build(deps-dev): bump style-resources-loader from 1.3.2 to 1.3.3 in /webapp [`#2580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2580) +- build(deps): bump node from 13.3.0-alpine to 13.4.0-alpine in /webapp [`#2577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2577) +- build(deps): bump metascraper-title from 5.8.10 to 5.8.12 in /backend [`#2575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2575) +- build(deps-dev): bump apollo-server-testing from 2.9.13 to 2.9.14 in /backend [`#2574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2574) +- build(deps): bump mustache from 3.1.0 to 3.2.0 in /backend [`#2572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2572) +- Blur Images [`#2351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2351) +- build(deps-dev): bump @babel/node from 7.7.4 to 7.7.7 in /backend [`#2570`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2570) +- build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 [`#2567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2567) +- build(deps): bump metascraper-description from 5.8.10 to 5.8.12 in /backend [`#2566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2566) +- Add back layout changes/update db_manipulation [`#2544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2544) +- build(deps): bump metascraper-soundcloud from 5.8.10 to 5.8.12 in /backend [`#2560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2560) +- build(deps): bump metascraper-author from 5.8.7 to 5.8.12 in /backend [`#2559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2559) +- build(deps): bump metascraper from 5.8.9 to 5.8.12 in /backend [`#2558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2558) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.12 in /backend [`#2547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2547) +- build(deps): bump metascraper-video from 5.8.10 to 5.8.12 in /backend [`#2557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2557) +- build(deps): bump metascraper-date from 5.8.7 to 5.8.12 in /backend [`#2555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2555) +- build(deps): bump metascraper-logo from 5.8.10 to 5.8.12 in /backend [`#2554`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2554) +- build(deps): bump apollo-server-express from 2.9.13 to 2.9.14 in /backend [`#2551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2551) +- build(deps-dev): bump css-loader from 3.3.2 to 3.4.0 in /webapp [`#2550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2550) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.18.0 to 1.19.0 [`#2548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2548) +- Lokalise: Translations update [`#2545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2545) +- build(deps): bump metascraper-youtube from 5.8.9 to 5.8.10 in /backend [`#2522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2522) +- build(deps): bump metascraper-title from 5.8.7 to 5.8.10 in /backend [`#2525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2525) +- build(deps): bump metascraper-lang from 5.8.9 to 5.8.10 in /backend [`#2531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2531) +- build(deps): bump tiptap-extensions from 1.28.5 to 1.28.6 in /webapp [`#2535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2535) +- Fix maintenance service/LocaleSwitch import [`#2542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2542) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /webapp [`#2523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2523) +- build(deps): bump stack-utils from 1.0.2 to 2.0.1 in /webapp [`#2521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2521) +- build(deps): bump metascraper-soundcloud from 5.8.9 to 5.8.10 in /backend [`#2520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2520) +- Update neode [`#2539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2539) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /webapp [`#2519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2519) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /webapp [`#2527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2527) +- build(deps): bump neo4j-graphql-js from 2.10.1 to 2.10.2 in /backend [`#2530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2530) +- build(deps): bump metascraper-image from 5.8.7 to 5.8.10 in /backend [`#2532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2532) +- build(deps): bump apollo-cache-inmemory from 1.6.3 to 1.6.5 in /backend [`#2534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2534) +- build(deps): bump metascraper-video from 5.8.9 to 5.8.10 in /backend [`#2536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2536) +- build(deps): bump tiptap from 1.26.5 to 1.26.6 in /webapp [`#2537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2537) +- build(deps-dev): bump vue-loader from 15.7.2 to 15.8.3 in /webapp [`#2538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2538) +- Refactor: content menu [`#2512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2512) +- build(deps): bump metascraper-audio from 5.8.7 to 5.8.10 in /backend [`#2524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2524) +- build(deps): bump metascraper-description from 5.8.7 to 5.8.10 in /backend [`#2518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2518) +- build(deps-dev): bump eslint-plugin-prettier from 3.1.1 to 3.1.2 in /backend [`#2517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2517) +- build(deps): bump apollo-client from 2.6.4 to 2.6.8 in /backend [`#2516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2516) +- build(deps): bump metascraper-logo from 5.8.7 to 5.8.10 in /backend [`#2515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2515) +- Fix duplicate fragment `user` issue [`#2511`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2511) +- fix: editor not visible in server-side-rendering [`#2513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2513) +- Update it.json [`#2507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2507) +- Fix: User.name is not non-nullable [`#2510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2510) +- Update to version 0.1.13 [`#2506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2506) +- Update de.json [`#2492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2492) +- Fix broken scroll behaviour on index and profile page [`#2487`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2487) +- Lokalise: Translations update [`#2503`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2503) +- build(deps): bump node from 13.1.0-alpine to 13.3.0-alpine in /webapp [`#2454`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2454) +- Lokalise: Translations update [`#2485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2485) +- build(deps-dev): bump css-loader from 3.3.0 to 3.3.2 in /webapp [`#2505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2505) +- build(deps-dev): bump cypress from 3.7.0 to 3.8.0 [`#2504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2504) +- Favor transaction functions [`#2433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2433) +- build(deps): bump nodemailer from 6.4.1 to 6.4.2 in /backend [`#2500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2500) +- Update en.json [`#2491`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2491) +- Update es.json [`#2493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2493) +- Update fr.json [`#2494`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2494) +- Update it.json [`#2496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2496) +- build(deps-dev): bump nodemon from 2.0.1 to 2.0.2 in /backend [`#2499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2499) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc18 to 4.0.0-rc19 in /webapp [`#2498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2498) +- build(deps): bump neo4j-graphql-js from 2.10.0 to 2.10.1 in /backend [`#2497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2497) +- Fix docker manifest on Travis CI [`#2488`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2488) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 [`#2453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2453) +- build(deps-dev): bump cypress-file-upload from 3.5.0 to 3.5.1 [`#2489`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2489) +- build(deps): bump cookie-universal-nuxt from 2.0.19 to 2.1.0 in /webapp [`#2490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2490) +- Update to version 0.1.12 [`#2483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2483) +- Show the comments again [`#2482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2482) +- Improve notification query performance by reducing db calls [`#2470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2470) +- Fix `Cannot read 'Post' of undefined` [`#2481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2481) +- Hope to fix our deployment with explicit call of `bash` [`#2480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2480) +- Revert layout changes image aspect ratio [`#2467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2467) +- Quick fix for null pointer error in User.vue [`#2472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2472) +- Checkbox 'no comercial + no political account' add to creat user account [`#2416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2416) +- Remove data-test attriubutes in non-dev env [`#2421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2421) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 [`#2452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2452) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /backend [`#2455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2455) +- build(deps-dev): bump @babel/cli from 7.7.4 to 7.7.5 in /backend [`#2458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2458) +- build(deps): bump @sentry/node from 5.10.1 to 5.10.2 in /backend [`#2473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2473) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /backend [`#2474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2474) +- build(deps-dev): bump css-loader from 3.2.1 to 3.3.0 in /webapp [`#2475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2475) +- build(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 in /webapp [`#2477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2477) +- Fix #2237, Comments 4 times as long before "show more" [`#2443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2443) +- Get rid of inconsistency with neode setup [`#2404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2404) +- Bump styleguide to version 0.5.22 [`#2468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2468) +- build(deps): bump nodemailer from 6.4.0 to 6.4.1 in /backend [`#2456`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2456) +- build(deps-dev): bump eslint-loader from 3.0.2 to 3.0.3 in /webapp [`#2459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2459) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /backend [`#2460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2460) +- build(deps-dev): bump @babel/core from 7.7.4 to 7.7.5 in /webapp [`#2461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2461) +- build(deps-dev): bump @babel/preset-env from 7.7.4 to 7.7.6 in /webapp [`#2463`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2463) +- build(deps-dev): bump async-validator from 3.2.2 to 3.2.3 in /webapp [`#2464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2464) +- build(deps): bump styleguide from `808b3c5` to `7ef8340` [`#2465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2465) +- Paginate moderations page without losing filtering [`#2466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2466) +- Update it.json [`#2451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2451) +- build(deps): bump metascraper from 5.8.8 to 5.8.9 in /backend [`#2304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2304) +- build(deps): bump metascraper-video from 5.8.7 to 5.8.9 in /backend [`#2303`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2303) +- build(deps): bump neo4j-graphql-js from 2.9.3 to 2.10.0 in /backend [`#2440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2440) +- Hide Donations Bar [`#2422`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2422) +- build(deps): bump @sentry/node from 5.10.0 to 5.10.1 in /backend [`#2436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2436) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.17.0 to 1.18.0 [`#2437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2437) +- build(deps-dev): bump apollo-server-testing from 2.9.12 to 2.9.13 in /backend [`#2439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2439) +- build(deps): bump apollo-server from 2.9.12 to 2.9.13 in /backend [`#2441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2441) +- Eliminate database calls for reports query [`#2435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2435) +- Use babel-loader with vue-svg-loader [`#2430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2430) +- Remove disable from reports.disable Query [`#2432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2432) +- 2253 fix scroll layout issue [`#2317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2317) +- Update test description [`#2424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2424) +- Update yarn.lock after pulling in latest changes [`#2419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2419) +- Update privacy path [`#2417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2417) +- Add browserstack logo to attributions [`#2431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2431) +- build(deps): bump @sentry/node from 5.9.0 to 5.10.0 in /backend [`#2428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2428) +- build(deps): bump nodemailer from 6.3.1 to 6.4.0 in /backend [`#2427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2427) +- List and protocol moderation [`#1954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1954) +- fix: Re-enable webfinger feature [`#2335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2335) +- Close neo4j driver sessions [`#2402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2402) +- feat: swap user name<=>handle for discriminability [`#2385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2385) +- build(deps-dev): bump @storybook/vue from 5.2.6 to 5.2.8 in /webapp [`#2397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2397) +- build(deps-dev): bump @storybook/addon-actions from 5.2.6 to 5.2.8 in /webapp [`#2398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2398) +- Fix German translation of "Shouts" [`#2400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2400) +- build(deps): bump tiptap-extensions from 1.28.4 to 1.28.5 in /webapp [`#2407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2407) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.7 to 5.2.8 in /webapp [`#2406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2406) +- build(deps-dev): bump css-loader from 3.2.0 to 3.2.1 in /webapp [`#2405`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2405) +- build(deps-dev): bump @storybook/addon-notes from 5.2.6 to 5.2.8 in /webapp [`#2399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2399) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /webapp [`#2393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2393) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.5 to 4.1.1 in /webapp [`#2374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2374) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /webapp [`#2392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2392) +- Terms of use extended with dot - no commercial use [`#2316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2316) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.2 to 1.17.0 [`#2389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2389) +- Lokalise: Translations update [`#2380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2380) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.6 to 5.2.7 in /webapp [`#2391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2391) +- build(deps-dev): bump eslint-plugin-jest from 23.0.5 to 23.1.1 in /backend [`#2390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2390) +- build(deps-dev): bump eslint from 6.7.1 to 6.7.2 in /backend [`#2388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2388) +- build(deps-dev): bump @vue/server-test-utils from 1.0.0-beta.29 to 1.0.0-beta.30 in /webapp [`#2379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2379) +- build(deps): bump neo4j from 3.5.12-enterprise to 3.5.13-enterprise in /neo4j [`#2377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2377) +- build(deps-dev): bump @babel/cli from 7.7.0 to 7.7.4 in /backend [`#2366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2366) +- build(deps-dev): bump cypress-plugin-retries from 1.4.0 to 1.5.0 [`#2360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2360) +- No public registration in development so that backend test pass [`#2382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2382) +- Don't remove sub-addresses in emails [`#2375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2375) +- refactor: Remove obsolete code about invitation codes [`#2333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2333) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc17 to 4.0.0-rc18 in /webapp [`#2373`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2373) +- build(deps): bump graphql-shield from 7.0.2 to 7.0.4 in /backend [`#2372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2372) +- build(deps-dev): bump cypress from 3.6.1 to 3.7.0 [`#2371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2371) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /backend [`#2359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2359) +- build(deps): bump apollo-server from 2.9.11 to 2.9.12 in /backend [`#2357`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2357) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /webapp [`#2369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2369) +- build(deps): bump @hapi/joi from 16.1.7 to 16.1.8 in /backend [`#2368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2368) +- build(deps-dev): bump eslint-plugin-jest from 23.0.4 to 23.0.5 in /backend [`#2365`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2365) +- build(deps-dev): bump @babel/plugin-proposal-throw-expressions from 7.2.0 to 7.7.4 in /backend [`#2339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2339) +- refactor: Close session in isAuthor permission [`#2334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2334) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /webapp [`#2323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2323) +- 1967 component tests content view [`#2169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2169) +- If an admin searches for a user by email, don't crash if no user can be found [`#2295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2295) +- Migrate styleguide icons [`#2288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2288) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /backend [`#2358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2358) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /backend [`#2341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2341) +- build(deps-dev): bump @babel/core from 7.7.2 to 7.7.4 in /webapp [`#2340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2340) +- build(deps): bump date-fns from 2.7.0 to 2.8.1 in /backend [`#2322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2322) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /webapp [`#2319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2319) +- Update to version 0.1.11 with bug fixes [`#2354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2354) +- Fix updating post by adding/changing image bug submits form [`#2350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2350) +- Add shoutedBy_some to _PostFilter [`#2353`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2353) +- build(deps-dev): bump date-fns from 2.8.0 to 2.8.1 [`#2342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2342) +- build(deps-dev): bump @babel/node from 7.7.0 to 7.7.4 in /backend [`#2343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2343) +- build(deps): bump validator from 12.0.0 to 12.1.0 in /backend [`#2345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2345) +- build(deps-dev): bump @babel/preset-env from 7.7.1 to 7.7.4 in /webapp [`#2346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2346) +- build(deps-dev): bump eslint from 6.6.0 to 6.7.1 in /webapp [`#2347`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2347) +- build(deps-dev): bump nodemon from 1.19.4 to 2.0.1 in /backend [`#2348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2348) +- Update to version 0.1.11 [`#2324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2324) +- Add LegacyEmbeds component to fix bug [`#2328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2328) +- Fix incorrect link to development environment [`#2309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2309) +- 2329 normalize emails in login form [`#2330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2330) +- Lokalise: Translations update [`#2327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2327) +- Changed translation must change test :( [`#2310`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2310) +- build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2318) +- build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2314) +- build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2302) +- build(deps): bump metascraper-lang from 5.8.7 to 5.8.9 in /backend [`#2301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2301) +- build(deps): bump metascraper-soundcloud from 5.8.7 to 5.8.9 in /backend [`#2298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2298) +- build(deps): bump metascraper-youtube from 5.8.7 to 5.8.9 in /backend [`#2297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2297) +- build(deps-dev): bump date-fns from 2.7.0 to 2.8.0 [`#2296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2296) +- build(deps): bump apollo-server from 2.9.9 to 2.9.11 in /backend [`#2311`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2311) +- Fix Typo Of Issue 2230 [`#2293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2293) +- [Systems-Development-and-Frameworks] Clickable hashtags [`#2076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2076) +- build(deps): bump neo4j-graphql-js from 2.9.0 to 2.9.3 in /backend [`#2283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2283) +- build(deps-dev): bump eslint-plugin-jest from 23.0.3 to 23.0.4 in /backend [`#2285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2285) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.7.0 in /backend [`#2286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2286) +- Lokalise: Translations update [`#2277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2277) +- build(deps-dev): bump @vue/eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#2266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2266) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /backend [`#2281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2281) +- build(deps): bump apollo-server from 2.9.7 to 2.9.9 in /backend [`#2280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2280) +- build(deps-dev): bump apollo-server-testing from 2.9.7 to 2.9.9 in /backend [`#2279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2279) +- build(deps): bump @sentry/node from 5.8.0 to 5.9.0 in /backend [`#2278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2278) +- 🍰 2119-Fix Contribution consistent form input validation [`#2160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2160) +- build(deps): bump cookie-universal-nuxt from 2.0.18 to 2.0.19 in /webapp [`#2265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2265) +- build(deps): bump metascraper modules [`#2257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2257) +- build: configure stale bot [`#2273`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2273) +- Explicitly define our schema, improve performance [`#2243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2243) +- build(deps): [security] bump https-proxy-agent from 2.2.1 to 2.2.4 [`#2274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2274) +- build: record and publish all cypress test results [`#2251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2251) +- Add Emacs Backup Files To Gitignore (*~) [`#2261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2261) +- build(deps-dev): bump eslint-config-prettier from 6.5.0 to 6.6.0 in /webapp [`#2267`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2267) +- 2187 language does not change on edit [`#2200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2200) +- 1747 show shouts [`#2101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2101) +- build(deps): bump node from 13.0.1-alpine to 13.1.0-alpine in /webapp [`#2180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2180) +- Fix #2042 Back Link To Login Page [`#2078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2078) +- 2119 create post consistent form input validation improvements [`#2163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2163) +- Helper script to install all packages [`#2250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2250) +- refactor: remove redundant port configuration [`#2247`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2247) +- build(deps-dev): bump eslint-config-standard from 12.0.0 to 14.1.0 in /webapp [`#2246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2246) +- build(deps-dev): bump cucumber from 6.0.3 to 6.0.5 in /backend [`#2236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2236) +- build: less verbose output on build server [`#2249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2249) +- Fix infinite scrolling out of control [`#2248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2248) +- 2106-unblock a user in the user settings [`#2110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2110) +- Fix 1936 [`#2241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2241) +- fix(editor): Fix hashtags not working after embeded content [`#2242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2242) +- build(deps-dev): bump prettier from 1.18.2 to 1.19.1 in /webapp [`#2185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2185) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.4 in /webapp [`#2245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2245) +- build(deps): remove deprecated debug flags [`#2219`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2219) +- build(deps-dev): bump eslint-plugin-vue from 6.0.0 to 6.0.1 in /webapp [`#2235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2235) +- build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2205) +- Add locale to undefined to null [`#2233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2233) +- Update to version 0.1.10 [`#2231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2231) +- Update contribution guidelines [`#2127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2127) +- fix: return `null` for missig translations [`#2218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2218) +- Add donation status and button [`#2194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2194) +- Added Empty Definitions For Missing Getters And Mutations [`#2197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2197) +- build(deps): bump @sentry/node from 5.7.1 to 5.8.0 in /backend [`#2209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2209) +- build(deps-dev): bump eslint-plugin-jest from 23.0.2 to 23.0.3 in /backend [`#2206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2206) +- build(deps-dev): bump vue-svg-loader from 0.14.0 to 0.15.0 in /webapp [`#2204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2204) +- build(deps-dev): bump async-validator from 3.2.1 to 3.2.2 in /webapp [`#2203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2203) +- Update deployment names in deploy script [`#2216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2216) +- Fix: Delete Block Button in MainPage PostCards [`#2193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2193) +- Update doctl to use default context [`#2199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2199) +- console.error in Hashtag.spec.js #2161 [`#2201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2201) +- build(deps-dev): bump @storybook/addon-actions from 5.2.5 to 5.2.6 in /webapp [`#2186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2186) +- build(deps-dev): bump style-resources-loader from 1.2.1 to 1.3.2 in /webapp [`#2188`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2188) +- build(deps-dev): bump @storybook/vue from 5.2.5 to 5.2.6 in /webapp [`#2183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2183) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.5 to 5.2.6 in /webapp [`#2176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2176) +- build(deps-dev): bump cypress from 3.6.0 to 3.6.1 [`#2173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2173) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /webapp [`#2164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2164) +- Update docs for deploying new server, env variables [`#2191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2191) +- Remove unintended comma [`#2192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2192) +- added Russian to locales [`#2111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2111) +- Add notifications page with All Notifications [`#1975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1975) +- 1931 - after successful login the saved language of the user is set [`#2073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2073) +- build(deps-dev): bump cypress-file-upload from 3.4.0 to 3.5.0 [`#2167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2167) +- build(deps): bump date-fns from 2.6.0 to 2.7.0 in /backend [`#2166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2166) +- build(deps-dev): bump date-fns from 2.6.0 to 2.7.0 [`#2165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2165) +- build(deps-dev): bump eslint-plugin-vue from 5.2.3 to 6.0.0 in /webapp [`#2156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2156) +- build(deps): bump merge-graphql-schemas from 1.7.2 to 1.7.3 in /backend [`#2155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2155) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.2 in /backend [`#2154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2154) +- Add missing portuguese translation [`#1909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1909) +- Migrate design tokens [`#2159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2159) +- build(deps-dev): bump @babel/core from 7.7.0 to 7.7.2 in /webapp [`#2158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2158) +- build(deps-dev): bump vue-svg-loader from 0.12.0 to 0.14.0 in /webapp [`#2157`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2157) +- Remove graphql-requests [`#2151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2151) +- close all open sessions [`#2148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2148) +- Implement refresh posts, fix duplicate posts bug [`#2126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2126) +- Fix: Email is Case-Sensitive [`#2118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2118) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /backend [`#2135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2135) +- build(deps): bump graphql-shield from 7.0.1 to 7.0.2 in /backend [`#2136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2136) +- build(deps-dev): bump @babel/node from 7.6.3 to 7.7.0 in /backend [`#2134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2134) +- build(deps-dev): bump @babel/core from 7.6.4 to 7.7.0 in /webapp [`#2132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2132) +- build(deps-dev): bump @babel/preset-env from 7.6.3 to 7.7.1 in /webapp [`#2133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2133) +- build(deps-dev): bump @babel/register from 7.6.2 to 7.7.0 in /backend [`#2131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2131) +- build(deps): bump graphql-middleware from 4.0.1 to 4.0.2 in /backend [`#2130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2130) +- build(deps-dev): bump @babel/cli from 7.6.4 to 7.7.0 in /backend [`#2129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2129) +- 1851 tags clickable [`#2091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2091) +- build(deps): bump graphql-shield from 7.0.0 to 7.0.1 in /backend [`#2123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2123) +- build(deps): bump merge-graphql-schemas from 1.7.0 to 1.7.2 in /backend [`#2121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2121) +- build(deps-dev): bump vue-loader from 15.7.1 to 15.7.2 in /webapp [`#2122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2122) +- build(deps-dev): bump async-validator from 3.2.0 to 3.2.1 in /webapp [`#2120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2120) +- 🍰 Add migration plan and frontend code guidelines to our docs [`#2075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2075) +- Update feature template [`#2116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2116) +- Update to version 0.1.9 [`#2114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2114) +- Refactor and tidy up crop image implementation [`#1956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1956) +- 🍰 First Implementation Of Filtering Posts By Language [`#2059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2059) +- build(deps-dev): bump cypress from 3.5.0 to 3.6.0 [`#2105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2105) +- Fix: Poll Interval [`#2108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2108) +- build(deps-dev): bump cypress-plugin-retries from 1.3.0 to 1.4.0 [`#2104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2104) +- build(deps): bump metascraper-title from 5.7.14 to 5.7.17 in /backend [`#2082`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2082) +- build(deps): bump metascraper-publisher from 5.7.14 to 5.7.17 in /backend [`#2098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2098) +- build(deps): bump metascraper-description from 5.7.14 to 5.7.17 in /backend [`#2096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2096) +- build(deps): bump metascraper-audio from 5.7.14 to 5.7.17 in /backend [`#2097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2097) +- build(deps): bump metascraper-url from 5.7.14 to 5.7.17 in /backend [`#2086`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2086) +- build(deps): bump metascraper-image from 5.7.6 to 5.7.17 in /backend [`#2090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2090) +- deleted posts no longer displayed in user profile [`#2093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2093) +- Send only one notification for mention and comment [`#2062`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2062) +- build(deps): bump metascraper-date from 5.7.14 to 5.7.17 in /backend [`#2089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2089) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc16 to 4.0.0-rc17 in /webapp [`#2088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2088) +- build(deps): bump metascraper-lang from 5.7.14 to 5.7.17 in /backend [`#2087`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2087) +- build(deps): bump metascraper-video from 5.7.14 to 5.7.17 in /backend [`#2084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2084) +- build(deps): bump metascraper-soundcloud from 5.7.14 to 5.7.17 in /backend [`#2081`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2081) +- build(deps-dev): bump auto-changelog from 1.16.1 to 1.16.2 [`#2085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2085) +- build(deps): bump metascraper-logo from 5.7.14 to 5.7.17 in /backend [`#2083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2083) +- build(deps): bump metascraper-youtube from 5.7.14 to 5.7.17 in /backend [`#2080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2080) +- build(deps): bump metascraper-author from 5.7.14 to 5.7.17 in /backend [`#2079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2079) +- build(deps): bump date-fns from 2.5.0 to 2.6.0 in /webapp [`#2007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2007) +- build(deps-dev): bump eslint from 6.5.1 to 6.6.0 in /backend [`#2071`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2071) +- build(deps): bump node from 12.13.0-alpine to 13.0.1-alpine in /webapp [`#2019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2019) +- [FIX # 2058] Typo Fixed. Password -> Passwort [`#2060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2060) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /backend [`#2064`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2064) +- build(deps): bump date-fns from 2.5.1 to 2.6.0 in /backend [`#2010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2010) +- build(deps-dev): bump apollo-server-testing from 2.9.6 to 2.9.7 in /backend [`#1984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1984) +- build(deps): bump metascraper-date from 5.7.6 to 5.7.14 in /backend [`#2070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2070) +- build(deps): bump metascraper-video from 5.7.6 to 5.7.14 in /backend [`#2072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2072) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.2 in /backend [`#2069`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2069) +- build(deps): bump metascraper-audio from 5.7.6 to 5.7.14 in /backend [`#2068`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2068) +- build(deps-dev): bump eslint-plugin-jest from 23.0.0 to 23.0.2 in /webapp [`#2066`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2066) +- build(deps-dev): bump cucumber from 6.0.2 to 6.0.3 in /backend [`#2065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2065) +- build(deps): bump metascraper-logo from 5.7.6 to 5.7.14 in /backend [`#2039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2039) +- build(deps): bump metascraper-url from 5.7.6 to 5.7.14 in /backend [`#2053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2053) +- build(deps): bump metascraper-youtube from 5.7.6 to 5.7.14 in /backend [`#2054`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2054) +- build(deps): bump neo4j-graphql-js from 2.7.2 to 2.8.0 in /backend [`#2036`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2036) +- build(deps): bump metascraper-soundcloud from 5.7.7 to 5.7.14 in /backend [`#2052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2052) +- build(deps): bump metascraper-author from 5.7.6 to 5.7.14 in /backend [`#2055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2055) +- build(deps-dev): bump eslint-plugin-jest from 22.20.0 to 23.0.0 in /webapp [`#2051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2051) +- build(deps): bump metascraper-title from 5.7.6 to 5.7.14 in /backend [`#2050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2050) +- build(deps-dev): bump eslint-config-prettier from 6.4.0 to 6.5.0 in /webapp [`#2049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2049) +- build(deps): bump metascraper-description from 5.7.6 to 5.7.14 in /backend [`#2038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2038) +- build(deps-dev): bump node-sass from 4.12.0 to 4.13.0 in /webapp [`#2037`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2037) +- build(deps): bump metascraper-publisher from 5.7.6 to 5.7.14 in /backend [`#2033`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2033) +- build(deps): bump apollo-server from 2.9.6 to 2.9.7 in /backend [`#2004`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2004) +- fix #1993 [`#2043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2043) +- Update to version 0.1.8 [`#2032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2032) +- build(deps): bump graphql-shield from 6.1.0 to 7.0.0 in /backend [`#2035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2035) +- build(deps): bump metascraper-lang from 5.7.6 to 5.7.14 in /backend [`#2034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2034) +- change Changes & History to Changes [`#2030`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2030) +- chnage Änderungen & Verlauf zu Änderungen [`#2029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2029) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc15 to 4.0.0-rc16 in /webapp [`#1990`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1990) +- add FAQ _blank-href in Footer [`#2028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2028) +- fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2025) +- 🍰 New terms and conditions version 0.0.3 [`#2027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2027) +- Remove duplicate pinned post record [`#2023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2023) +- build(deps-dev): bump cypress from 3.4.1 to 3.5.0 [`#2018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2018) +- docs: add missing SUMMARY entry for online backups [`#2024`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2024) +- build(deps): bump @nuxtjs/axios from 5.6.0 to 5.8.0 in /webapp [`#2021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2021) +- Locale save by change local switch [`#1991`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1991) +- build(deps-dev): bump @storybook/addon-actions from 5.2.4 to 5.2.5 in /webapp [`#1983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1983) +- Hide shout count on user profile unless my profile [`#2016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2016) +- new terms and conditions [`#2017`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2017) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1989) +- build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2002) +- Update to version 0.1.7 [`#2015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2015) +- Update fetchMore functionality on profile page [`#2012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2012) +- build(deps-dev): bump date-fns from 2.5.1 to 2.6.0 [`#2001`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2001) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#2000`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2000) +- build(deps): bump helmet from 3.21.1 to 3.21.2 in /backend [`#1986`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1986) +- build(deps-dev): bump eslint-plugin-jest from 22.19.0 to 22.20.0 in /webapp [`#1985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1985) +- build(deps): bump apollo-server-express from 2.9.6 to 2.9.7 in /backend [`#1982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1982) +- 1997 fix performance issue with pinned post [`#1998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1998) +- Update to version 0.1.6 [`#1996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1996) +- 🍰 Fix - maintaining sorting after navigation [`#1872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1872) +- Add storybook stories for our university students [`#1906`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1906) +- build(deps): bump nuxt from 2.10.1 to 2.10.2 in /webapp [`#1987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1987) +- build(deps-dev): bump @storybook/vue from 5.2.4 to 5.2.5 in /webapp [`#1981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1981) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.20.0 in /backend [`#1978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1978) +- build(deps): bump node from 12.12.0-alpine to 12.13.0-alpine in /webapp [`#1977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1977) +- build(deps-dev): bump date-fns from 2.5.0 to 2.5.1 [`#1962`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1962) +- build(deps): bump faker from `10bfb9f` to `9fd8d7d` in /backend [`#1961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1961) +- build(deps-dev): bump async-validator from 3.1.0 to 3.2.0 in /webapp [`#1920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1920) +- build(deps): bump @sentry/node from 5.7.0 to 5.7.1 in /backend [`#1914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1914) +- Hide new CommentForm while editing a comment [`#1973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1973) +- 🍰 Translate texts for pinning a post to German [`#1972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1972) +- Allow admins to pin a post [`#1840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1840) +- fix: Only one ellipse is displayed [`#1968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1968) +- Refactor reports resolver spec [`#1957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1957) +- Added createdAt date for follow and shout [`#1853`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1853) +- build(deps-dev): bump @vue/cli-shared-utils from 3.12.0 to 4.0.4 in /webapp [`#1965`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1965) +- build(deps): bump neo4j from 3.5.11-enterprise to 3.5.12-enterprise in /neo4j [`#1963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1963) +- build(deps-dev): bump cypress-file-upload from 3.3.4 to 3.4.0 [`#1960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1960) +- build(deps): bump date-fns from 2.5.0 to 2.5.1 in /backend [`#1959`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1959) +- build(deps-dev): bump faker from `10bfb9f` to `9fd8d7d` [`#1958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1958) +- build(deps): bump tiptap-extensions from 1.28.3 to 1.28.4 in /webapp [`#1946`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1946) +- build(deps): bump metascraper-soundcloud from 5.7.6 to 5.7.7 in /backend [`#1943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1943) +- fix: console warnings during frontend tests [`#1942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1942) +- Language will be saved in the database of the user during registration [`#1927`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1927) +- Update to version 0.1.5 [`#1951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1951) +- build(deps-dev): bump dotenv from 8.1.0 to 8.2.0 [`#1917`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1917) +- Fix vue errors for Contribution form [`#1941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1941) +- Follow @alina-beck and @Tirokk PR suggestions [`#1940`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1940) +- 🍰 Add Cypher statement for ordering [`#1926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1926) +- Improved comment truncation [`#1925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1925) +- fix: typo in German translation [`#1911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1911) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1923) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /webapp [`#1921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1921) +- build(deps): bump date-fns from 2.4.1 to 2.5.0 in /backend [`#1915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1915) +- Maintain filename for cropped images [`#1935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1935) +- build(deps-dev): bump date-fns from 2.4.1 to 2.5.0 [`#1919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1919) +- build(deps-dev): bump nodemon from 1.19.3 to 1.19.4 in /backend [`#1916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1916) +- build(deps-dev): bump neode from 0.3.3 to 0.3.6 [`#1918`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1918) +- Highlight and expand linked comment [`#1903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1903) +- Add missing translations for Title placeholder [`#1910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1910) +- 🍰 Reporting with specific information [`#1797`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1797) +- build(deps): bump dotenv from 8.1.0 to 8.2.0 in /backend [`#1912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1912) +- Confirm privacy policy minimum age at registration [`#1907`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1907) +- refactor: improve locale imports [`#1904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1904) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.3 to 5.2.4 in /webapp [`#1899`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1899) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /webapp [`#1889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1889) +- build(deps-dev): bump eslint-plugin-jest from 22.17.0 to 22.19.0 in /backend [`#1888`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1888) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /webapp [`#1894`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1894) +- build(deps-dev): bump @storybook/vue from 5.2.3 to 5.2.4 in /webapp [`#1897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1897) +- build(deps): bump node from 12.11.1-alpine to 12.12.0-alpine in /backend [`#1895`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1895) +- build(deps): bump @nuxtjs/sentry from 3.0.0 to 3.0.1 in /webapp [`#1896`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1896) +- build(deps-dev): bump @storybook/addon-actions from 5.2.3 to 5.2.4 in /webapp [`#1898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1898) +- 🍰 Refactor Database for Reporting with specific information [`#1878`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1878) +- build(deps): bump nuxt from 2.10.0 to 2.10.1 in /webapp [`#1890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1890) +- build(deps-dev): bump @babel/cli from 7.6.3 to 7.6.4 in /backend [`#1868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1868) +- build(deps): bump apollo-server from 2.9.5 to 2.9.6 in /backend [`#1864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1864) +- build(deps-dev): bump apollo-server-testing from 2.9.5 to 2.9.6 in /backend [`#1870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1870) +- build(deps-dev): bump @babel/core from 7.6.3 to 7.6.4 in /webapp [`#1867`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1867) +- build(deps-dev): bump core-js from 2.6.9 to 2.6.10 in /webapp [`#1892`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1892) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc14 to 4.0.0-rc15 in /webapp [`#1891`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1891) +- build(deps): bump @sentry/node from 5.6.2 to 5.7.0 in /backend [`#1871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1871) +- build(deps-dev): bump @vue/cli-shared-utils from 3.11.0 to 3.12.0 in /webapp [`#1869`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1869) +- build(deps): bump apollo-server-express from 2.9.5 to 2.9.6 in /backend [`#1866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1866) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.4 in /backend [`#1865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1865) +- 🍰 Implement basic image cropping solution [`#1666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1666) +- 1773 refactor rewards spec [`#1884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1884) +- fix: search for email case-insensitively [`#1863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1863) +- Fix translation error in login page [`#1885`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1885) +- fix: security vulnerability with yarn resolutions [`#1862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1862) +- Fix embeds settings page [`#1877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1877) +- update version to 0.1.4 [`#1860`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1860) +- Update profile posts apollo query [`#1805`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1805) +- Add Hall of Fame to README [`#1859`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1859) +- Implement public registration [`#1814`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1814) +- Refactor embed settings page [`#1861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1861) +- Save user setting to show embed code II [`#1852`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1852) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.1 to 1.16.2 [`#1855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1855) +- build(deps): bump nodemailer from 6.3.0 to 6.3.1 in /backend [`#1854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1854) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /webapp [`#1849`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1849) +- build(deps-dev): bump @storybook/addon-a11y from 5.2.1 to 5.2.3 in /webapp [`#1836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1836) +- build(deps-dev): bump @babel/core from 7.6.2 to 7.6.3 in /webapp [`#1848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1848) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /backend [`#1837`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1837) +- build(deps): bump styleguide from `808b3c5` to `d46fc15` [`#1839`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1839) +- build(deps-dev): bump @babel/cli from 7.6.2 to 7.6.3 in /backend [`#1847`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1847) +- build(deps-dev): bump @storybook/addon-actions from 5.2.1 to 5.2.3 in /webapp [`#1838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1838) +- build(deps-dev): bump @babel/preset-env from 7.6.2 to 7.6.3 in /backend [`#1846`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1846) +- Title character increased from 64 to 100 [`#1850`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1850) +- build(deps-dev): bump @babel/node from 7.6.2 to 7.6.3 in /backend [`#1843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1843) +- build(deps): bump node from 12.11.0-alpine to 12.11.1-alpine in /webapp [`#1835`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1835) +- build(deps-dev): bump @storybook/vue from 5.2.1 to 5.2.3 in /webapp [`#1834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1834) +- build(deps-dev): bump cucumber from 6.0.1 to 6.0.2 in /backend [`#1833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1833) +- build(deps): bump tiptap-extensions from 1.28.0 to 1.28.3 in /webapp [`#1822`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1822) +- Fix typo in email template [`#1829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1829) +- build(deps-dev): bump apollo-server-testing from 2.9.4 to 2.9.5 in /backend [`#1823`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1823) +- build(deps-dev): bump cucumber from 5.1.0 to 6.0.1 in /backend [`#1827`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1827) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /backend [`#1826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1826) +- Display user email for administrators [`#1808`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1808) +- build(deps): bump tiptap from 1.26.0 to 1.26.3 in /webapp [`#1821`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1821) +- build(deps): bump apollo-server from 2.9.4 to 2.9.5 in /backend [`#1825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1825) +- build(deps): bump node from 12.10.0-alpine to 12.11.0-alpine in /webapp [`#1824`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1824) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /webapp [`#1819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1819) +- build(deps-dev): bump eslint-config-prettier from 6.3.0 to 6.4.0 in /backend [`#1818`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1818) +- build(deps): bump @hapi/joi from 16.1.5 to 16.1.7 in /backend [`#1817`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1817) +- build(deps-dev): bump cypress-cucumber-preprocessor from 1.16.0 to 1.16.1 [`#1816`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1816) +- Update to 0.1.3 [`#1813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1813) +- Show that a Post/Comment has been edited [`#1807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1807) +- Max aspect ratio of 1:1 for Post index page [`#1796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1796) +- fixes#1305 lastActiveAt [`#1809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1809) +- Remove language toggle from email template [`#1798`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1798) +- build(deps): bump nuxt from 2.9.2 to 2.10.0 in /webapp [`#1804`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1804) +- build(deps): bump cross-env from 6.0.2 to 6.0.3 in /backend [`#1801`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1801) +- fix invites count calculation for admin dashboard [`#1806`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1806) +- build(deps-dev): bump cross-env from 6.0.2 to 6.0.3 [`#1800`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1800) +- build(deps): bump cross-env from 6.0.2 to 6.0.3 in /webapp [`#1803`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1803) +- build(deps): bump @hapi/joi from 16.1.4 to 16.1.5 in /backend [`#1802`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1802) +- Update neo4j to Enterprise edition [`#1787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1787) +- Update to 0.1.2 [`#1786`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1786) +- 407 change your email address [`#1711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1711) +- build(deps): bump cross-env from 6.0.0 to 6.0.2 in /backend [`#1794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1794) +- build(deps-dev): bump cross-env from 6.0.0 to 6.0.2 [`#1793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1793) +- Update Post query for blockedByUsers [`#1788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1788) +- build(deps): bump metascraper-description from 5.7.5 to 5.7.6 in /backend [`#1792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1792) +- build(deps): bump cross-env from 6.0.0 to 6.0.2 in /webapp [`#1791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1791) +- build(deps): bump @nuxtjs/apollo from 4.0.0-rc13.1 to 4.0.0-rc14 in /webapp [`#1790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1790) +- Bump metascraper-audio from 5.7.5 to 5.7.6 in /backend [`#1779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1779) +- fix the bug with scrolling post comments into view [`#1701`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1701) +- Bump metascraper-publisher from 5.7.4 to 5.7.6 in /backend [`#1778`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1778) +- Bump eslint from 6.4.0 to 6.5.1 in /backend [`#1780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1780) +- Bump metascraper-url from 5.7.5 to 5.7.6 in /backend [`#1782`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1782) +- Bump metascraper-logo from 5.7.5 to 5.7.6 in /backend [`#1783`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1783) +- Bump graphql-middleware from 3.0.5 to 4.0.1 in /backend [`#1781`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1781) +- Bump metascraper-youtube from 5.7.5 to 5.7.6 in /backend [`#1777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1777) +- Bump @babel/preset-env from 7.6.0 to 7.6.2 in /backend [`#1776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1776) +- Bump metascraper-soundcloud from 5.7.4 to 5.7.6 in /backend [`#1775`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1775) +- Bump metascraper-author from 5.7.4 to 5.7.6 in /backend [`#1774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1774) +- Bump eslint-loader from 3.0.1 to 3.0.2 in /webapp [`#1760`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1760) +- Bump tiptap from 1.25.0 to 1.26.0 in /webapp [`#1765`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1765) +- Bump metascraper-lang from 5.7.4 to 5.7.6 in /backend [`#1766`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1766) +- Bump date-fns from 2.4.0 to 2.4.1 in /webapp [`#1768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1768) +- Bump metascraper-date from 5.7.4 to 5.7.6 in /backend [`#1771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1771) +- fix: Github's security vulnerability warning [`#1751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1751) +- 🍰 Notifications self update and refactoring [`#1658`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1658) +- Bump @babel/node from 7.6.1 to 7.6.2 in /backend [`#1725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1725) +- fix email middleware transport config [`#1757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1757) +- Bump nodemon from 1.19.2 to 1.19.3 in /backend [`#1758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1758) +- Bump metascraper-title from 5.7.5 to 5.7.6 in /backend [`#1759`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1759) +- Bump metascraper-image from 5.7.5 to 5.7.6 in /backend [`#1761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1761) +- Bump apollo-server from 2.9.3 to 2.9.4 in /backend [`#1762`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1762) +- Bump metascraper-video from 5.7.5 to 5.7.6 in /backend [`#1764`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1764) +- Bump graphql-middleware-sentry from 3.2.0 to 3.2.1 in /backend [`#1767`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1767) +- Bump date-fns from 2.3.0 to 2.4.1 in /backend [`#1769`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1769) +- Bump tiptap-extensions from 1.27.0 to 1.28.0 in /webapp [`#1770`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1770) +- Fix failing test [`#1772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1772) +- docs: moves storybook into webapp/README.md [`#1755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1755) +- 1273 fix post page nav suggestions [`#1756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1756) +- Bump @babel/core from 7.6.0 to 7.6.2 in /backend [`#1728`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1728) +- [WIP]1706 refactor shout spec [`#1712`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1712) +- Bump cypress-file-upload from 3.3.3 to 3.3.4 [`#1671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1671) +- Bump @hapi/joi from 16.1.2 to 16.1.4 in /backend [`#1673`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1673) +- Bump metascraper-description from 5.7.4 to 5.7.5 in /backend [`#1700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1700) +- Bump @babel/cli from 7.6.0 to 7.6.2 in /backend [`#1713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1713) +- Bump apollo-server-testing from 2.9.3 to 2.9.4 in /backend [`#1717`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1717) +- Bump date-fns from 2.2.1 to 2.4.0 in /webapp [`#1752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1752) +- Bump graphql from 14.5.7 to 14.5.8 in /webapp [`#1729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1729) +- Bump mustache from 3.0.3 to 3.1.0 in /backend [`#1655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1655) +- 🍰 Try to fix VSCode format works against ESLint [`#1749`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1749) +- Configure docker to work with storybook [`#1688`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1688) +- update neo4j docker-compose config [`#1750`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1750) +- Update to 0.1.1 [`#1734`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1734) +- Bump neo4j from 3.5.9 to 3.5.11 in /neo4j [`#1739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1739) +- Bump graphql from 14.5.7 to 14.5.8 in /backend [`#1738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1738) +- Bump metascraper-youtube from 5.7.4 to 5.7.5 in /backend [`#1737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1737) +- Fix bug UpdateComment, Fix styling on Comment [`#1719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1719) +- Update maintenance page email to support@... [`#1732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1732) +- Bump @babel/register from 7.6.0 to 7.6.2 in /backend [`#1730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1730) +- Bump eslint-loader from 3.0.0 to 3.0.1 in /webapp [`#1727`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1727) +- Bump apollo-server-express from 2.9.3 to 2.9.4 in /backend [`#1726`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1726) +- Bump metascraper-title from 5.7.4 to 5.7.5 in /backend [`#1715`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1715) +- Bump graphql from 14.5.6 to 14.5.7 in /webapp [`#1676`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1676) +- Add Comment story, add spacing above user info [`#1685`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1685) +- Bump date-fns from 2.2.1 to 2.3.0 in /backend [`#1714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1714) +- Bump metascraper-logo from 5.7.4 to 5.7.5 in /backend [`#1698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1698) +- Bump @babel/preset-env from 7.6.0 to 7.6.2 in /webapp [`#1694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1694) +- Bump graphql from 14.5.6 to 14.5.7 in /backend [`#1675`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1675) +- Remove repetitive labels from emote button [`#1702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1702) +- Bump metascraper-video from 5.7.4 to 5.7.5 in /backend [`#1697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1697) +- Bump @babel/core from 7.6.0 to 7.6.2 in /webapp [`#1696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1696) +- Bump metascraper-image from 5.7.4 to 5.7.5 in /backend [`#1695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1695) +- Bump metascraper-audio from 5.7.4 to 5.7.5 in /backend [`#1693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1693) +- Bump metascraper-url from 5.7.4 to 5.7.5 in /backend [`#1692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1692) +- Remove sleep icon from comments list [`#1689`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1689) +- Bugfix create user page - missing submit buttons [`#1690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1690) +- Fix create account page has no logo, localisation [`#1681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1681) +- Fix intermittent backend specs [`#1679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1679) +- Improve comments output [`#1678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1678) +- Bump codecov from 3.6.0 to 3.6.1 [`#1670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1670) +- Bump helmet from 3.21.0 to 3.21.1 in /backend [`#1672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1672) +- Bump cookie-universal-nuxt from 2.0.17 to 2.0.18 in /webapp [`#1674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1674) +- Fix intermittent failing test [`#1677`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1677) +- Change your own slug [`#1651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1651) +- Make Human Connection a Progressive Web App [`#1668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1668) +- Remove contentExcerpt from comments [`#1667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1667) +- Fix bug where short comments scrub links [`#1649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1649) +- 1612 refactor moderator spec [`#1620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1620) +- Bump codecov from 3.5.0 to 3.6.0 [`#1652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1652) +- Bump @nuxtjs/apollo from 4.0.0-rc13 to 4.0.0-rc13.1 in /webapp [`#1653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1653) +- Bump @hapi/joi from 16.1.1 to 16.1.2 in /backend [`#1654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1654) +- Remove follow type enum [`#1660`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1660) +- Point the changelog to Github [`#1646`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1646) +- Provider list approval hard cut [`#1647`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1647) +- Improve follow/ufollow mutation [`#1596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1596) +- Fix styling issue in comments list [`#1648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1648) +- Bump eslint-plugin-prettier from 3.1.0 to 3.1.1 in /webapp [`#1643`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1643) +- Bump eslint-plugin-prettier from 3.1.0 to 3.1.1 in /backend [`#1642`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1642) +- Configure emails [`#1599`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1599) +- Fix #1639 - No limits for post length [`#1641`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1641) +- Exclude broken maintenance-worker docker image [`#1635`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1635) +- 1486 make slug more usable [`#1640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1640) +- Bump metascraper-author from 5.6.6 to 5.7.4 in /backend [`#1610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1610) +- Bump @hapi/joi from 16.0.1 to 16.1.1 in /backend [`#1622`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1622) +- Bump @storybook/addon-actions from 5.2.0 to 5.2.1 in /webapp [`#1625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1625) +- Update de.json [`#1636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1636) +- Bump cross-env from 5.2.1 to 6.0.0 [`#1621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1621) +- Bump @storybook/vue from 5.2.0 to 5.2.1 in /webapp [`#1624`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1624) +- Fix disappearing embeds on comments [`#1618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1618) +- Fix bug where about must not be empty string [`#1630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1630) +- links_to_imprint_and_privacy_policy_changed_to_human-connection.org [`#1615`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1615) +- Bump @storybook/addon-a11y from 5.2.0 to 5.2.1 in /webapp [`#1627`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1627) +- Bump cross-env from 5.2.1 to 6.0.0 in /backend [`#1623`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1623) +- fix(subscriptions): Don't publish undefined [`#3088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/3088) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2411) [`#2777`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2777) +- refactor(modules): Various import fixes [`#2773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2773) [`#2774`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2774) +- feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1831) +- fix #2229 [`#2229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2229) +- fixes #2659 [`#2659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2659) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2329) +- Fix #2294 [`#2294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2294) +- Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Fix #2042 Back Link To Login Page [`#2042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/2042) +- Merge pull request #2043 from Human-Connection/fix-1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- fix #1993 [`#1993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1993) +- Fix #1631 [`#1631`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1631) +- Fix #1650 [`#1650`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1650) +- Merge pull request #1641 from Human-Connection/1639_no_limits_for_post_length [`#1639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1639) +- Fix #1639 [`#1639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1639) +- Add slug to User component, fix #1486 [`#1486`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1486) +- sorting locations files yarn run locales --fix [`3343e14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3343e1435f320e1d403e16f5d4563aa11cae49a9) +- tests user.spec.js tests once clean once broken always alternating [`9d5c192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d5c192869ec0b088fa071d827b27cf6ca442b78) +- test check test WIP [`a4be3f7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a4be3f7adfc36ba7517a0f5399606b1f3d3dccfe) + +#### v0.1.0 + +> 18 September 2019 + +- Bump cross-env from 5.2.1 to 6.0.0 in /webapp [`#1626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1626) +- Don't create accounts for unverified users [`#1619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1619) +- Bump metascraper-title from 5.7.0 to 5.7.4 in /backend [`#1611`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1611) +- Resend registration mail if user has not yet registered [`#1617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1617) +- Bump graphql from 14.5.4 to 14.5.6 in /backend [`#1609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1609) +- Bump eslint from 6.3.0 to 6.4.0 in /backend [`#1608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1608) +- Bump @nuxtjs/apollo from 4.0.0-rc12 to 4.0.0-rc13 in /webapp [`#1607`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1607) +- Bump metascraper-publisher from 5.6.6 to 5.7.4 in /backend [`#1606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1606) +- Bump date-fns from 2.1.0 to 2.2.1 in /backend [`#1605`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1605) +- Bump metascraper-audio from 5.6.6 to 5.7.4 in /backend [`#1604`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1604) +- Add CodeTriage helpers badge [`#1603`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1603) +- 🍰 Make hashtag links URL safe [`#1571`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1571) +- Relase without any artifacts [`#1601`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1601) +- Bump metascraper-image from 5.6.6 to 5.7.4 in /backend [`#1582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1582) +- Bump @storybook/addon-a11y from 5.1.11 to 5.2.0 in /webapp [`#1587`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1587) +- Bump styleguide from `793556a` to `808b3c5` [`#1574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1574) +- Bump metascraper-soundcloud from 5.6.7 to 5.7.4 in /backend [`#1578`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1578) +- Bump metascraper-video from 5.6.6 to 5.7.4 in /backend [`#1580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1580) +- Bump metascraper-date from 5.7.0 to 5.7.4 in /backend [`#1584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1584) +- Bump metascraper-lang from 5.6.6 to 5.7.4 in /backend [`#1585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1585) +- Bump @storybook/addon-actions from 5.1.11 to 5.2.0 in /webapp [`#1589`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1589) +- Bump graphql from 14.5.4 to 14.5.6 in /webapp [`#1590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1590) +- Fix docker image tags [`#1600`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1600) +- Remove deleted/disabled/createdAt from Comment mutations [`#1595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1595) +- Fix bug where Post.createdAt is sometimes null [`#1572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1572) +- Fix missing images on staging [`#1594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1594) +- 🍰 Missing translations [`#1593`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1593) +- Fix deployment script for docker images [`#1592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1592) +- Bump @hapi/joi from 15.1.1 to 16.0.1 in /backend [`#1591`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1591) +- Bump @nuxtjs/dotenv from 1.4.0 to 1.4.1 in /webapp [`#1588`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1588) +- Bump @storybook/vue from 5.1.11 to 5.2.0 in /webapp [`#1586`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1586) +- Bump metascraper-description from 5.6.6 to 5.7.4 in /backend [`#1581`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1581) +- Bump metascraper-logo from 5.6.6 to 5.7.4 in /backend [`#1579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1579) +- Bump metascraper-youtube from 5.6.7 to 5.7.4 in /backend [`#1577`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1577) +- Bump metascraper-url from 5.6.6 to 5.7.4 in /backend [`#1576`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1576) +- Bump date-fns from 2.1.0 to 2.2.1 in /webapp [`#1564`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1564) +- Bump metascraper-date from 5.6.6 to 5.7.0 in /backend [`#1562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1562) +- Bump metascraper-title from 5.6.6 to 5.7.0 in /backend [`#1561`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1561) +- Fix import to add createdAt and updatedAt for comments [`#1573`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1573) +- Use automatic Github releases as a CHANGELOG [`#1560`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1560) +- Add styleguide as submodule [`#1559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1559) +- Push all docker images at VERSION to dockerhub [`#1558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1558) +- II Add Date to Terms and Conditions #1535 [`#1556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1556) +- 🍰 [Helper] Message for backend tests failed by missing constraints [`#1553`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1553) +- Various changes to build pipeline [`#1543`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1543) +- Fix navbar styling [`#1557`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1557) +- 🍰 Fixes a create and update comment problem in the comments list [`#1537`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1537) +- Fix show less link not working reliably [`#1548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1548) +- Bump cypress-plugin-retries from 1.2.2 to 1.3.0 [`#1551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1551) +- fix(header-alignment): Fix logo and locale position. [`#1283`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1283) +- Better maintenance page [`#1517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1517) +- Test filter by followed by [`#1542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1542) +- [WIP] 🍰 Update follower count on follow/unfollow [`#1533`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1533) +- Remove nodemon, use `nuxt` cli tools [`#1516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1516) +- Bump eslint-config-prettier from 6.2.0 to 6.3.0 in /webapp [`#1546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1546) +- Bump eslint-config-prettier from 6.2.0 to 6.3.0 in /backend [`#1545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1545) +- Refactor email middleware [`#1512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1512) +- Bugfix: `about me` not saved on signup [`#1513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1513) +- Filter posts by emotions [`#1490`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1490) +- Bump neode from 0.3.2 to 0.3.3 in /backend [`#1531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1531) +- Bump apollo-link-http from 1.5.15 to 1.5.16 in /backend [`#1528`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1528) +- Bump @babel/cli from 7.5.5 to 7.6.0 in /backend [`#1526`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1526) +- Bump @babel/preset-env from 7.5.5 to 7.6.0 in /backend [`#1523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1523) +- Bump @babel/node from 7.5.5 to 7.6.1 in /backend [`#1522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1522) +- Remove obsolete code [`#1540`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1540) +- Bump @human-connection/styleguide from 0.5.19 to 0.5.21 in /webapp [`#1541`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1541) +- Bump @babel/preset-env from 7.5.5 to 7.6.0 in /webapp [`#1532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1532) +- Bump @babel/core from 7.5.5 to 7.6.0 in /backend [`#1530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1530) +- Bump vue-jest from 3.0.4 to 3.0.5 in /webapp [`#1529`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1529) +- Bump date-fns from 2.0.1 to 2.1.0 in /webapp [`#1527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1527) +- Bump @babel/core from 7.5.5 to 7.6.0 in /webapp [`#1525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1525) +- Bump graphql-shield from 6.0.6 to 6.1.0 in /backend [`#1524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1524) +- Bump @babel/register from 7.5.5 to 7.6.0 in /backend [`#1520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1520) +- Bump neode from 0.3.2 to 0.3.3 [`#1521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1521) +- Bump apollo-link-context from 1.0.18 to 1.0.19 in /backend [`#1519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1519) +- Bump date-fns from 2.0.1 to 2.1.0 in /backend [`#1518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1518) +- [WIP] Sorting dropdown is aligned with post cards [`#1539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1539) +- Avatar should be centered on profile page [`#1514`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1514) +- Fix test by setting value of the mocked hashtag [`#1536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1536) +- Add console log for erros geolocation [`#1534`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1534) +- Fix #1505 remove html [`#1508`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1508) +- 1506 Anonymize deleted user also for moderators [`#1510`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1510) +- Refactor registration.spec.js [`#1507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1507) +- Implement better statistics resolver [`#1493`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1493) +- Fix leftover of #1479 [`#1504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1504) +- Fix preview image craziness [`#1509`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1509) +- 1487 fix admin page [`#1492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1492) +- Bump neo4j from 3.5.8 to 3.5.9 in /neo4j [`#1497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1497) +- Bump node from 12.9-alpine to 12.10.0-alpine in /backend [`#1498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1498) +- Bump node from 12.9-alpine to 12.10.0-alpine in /webapp [`#1499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1499) +- Bump eslint-plugin-jest from 22.16.0 to 22.17.0 in /backend [`#1495`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1495) +- Bump eslint-plugin-jest from 22.16.0 to 22.17.0 in /webapp [`#1496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1496) +- Fix #1394 [`#1479`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1479) +- Update maintenace worker image [`#1484`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1484) +- Bump eslint-plugin-node from 9.2.0 to 10.0.0 in /webapp [`#1481`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1481) +- Bump helmet from 3.20.1 to 3.21.0 in /backend [`#1482`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1482) +- Bump eslint-plugin-node from 9.2.0 to 10.0.0 in /backend [`#1483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1483) +- Update export syntax, update maintenance worker/neo4j config [`#1473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1473) +- 1393 fix show less bugginess [`#1476`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1476) +- Remove a lot of unused code, reduce graphql schema [`#1480`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1480) +- Remove slow sorting options [`#1478`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1478) +- If TAC version is missing, return `null` [`#1477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1477) +- Bump metascraper-soundcloud from 5.6.6 to 5.6.7 in /backend [`#1446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1446) +- Bump metascraper-youtube from 5.6.6 to 5.6.7 in /backend [`#1447`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1447) +- Cursor fixes [`#1474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1474) +- Check if user has agreed to the current terms and conditions [`#1334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1334) +- Fix related posts section in 'More Info' [`#1475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1475) +- 🍰 Correct the import of tags from the Alpha and refactor editor hashtags [`#1399`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1399) +- Bump eslint-config-prettier from 6.1.0 to 6.2.0 in /webapp [`#1461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1461) +- Bump nodemon from 1.19.1 to 1.19.2 in /webapp [`#1458`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1458) +- Bump nodemon from 1.19.1 to 1.19.2 in /backend [`#1459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1459) +- Bump eslint-config-prettier from 6.1.0 to 6.2.0 in /backend [`#1460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1460) +- Encode the bearer token instead of hard-coding it [`#1464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1464) +- Bump cross-env from 5.2.0 to 5.2.1 in /webapp [`#1444`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1444) +- Bump apollo-server-testing from 2.9.1 to 2.9.3 in /backend [`#1448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1448) +- Bump cross-env from 5.2.0 to 5.2.1 in /backend [`#1450`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1450) +- Bump cross-env from 5.2.0 to 5.2.1 [`#1442`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1442) +- 1414 Implement soft delete [`#1440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1440) +- Use hyphens to separate words properly [`#1452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1452) +- Disable scrolling behind popover [`#1453`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1453) +- Limit suggestions list to 15, add component tests [`#1451`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1451) +- Bump apollo-server from 2.9.1 to 2.9.3 in /backend [`#1445`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1445) +- Bump eslint from 6.2.2 to 6.3.0 in /backend [`#1443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1443) +- Move Neo4j configuration in configmap [`#1439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1439) +- Bump neo4j-driver from 1.7.5 to 1.7.6 in /backend [`#1433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1433) +- Bump eslint-plugin-node from 9.1.0 to 9.2.0 in /backend [`#1430`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1430) +- 1414 Bugfix: Delete notifications if connected post, comment or user is deleted [`#1426`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1426) +- Bump graphql from 14.5.3 to 14.5.4 in /backend [`#1428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1428) +- Bump neo4j-driver from 1.7.5 to 1.7.6 [`#1429`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1429) +- Bump eslint-plugin-node from 9.1.0 to 9.2.0 in /webapp [`#1431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1431) +- Check there are ids in the badIds array [`#1397`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1397) +- Fix database import, pagination and counters on user profile page [`#1351`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1351) +- Bump eslint-plugin-jest from 22.15.2 to 22.16.0 in /backend [`#1432`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1432) +- Bump sass-loader from 7.3.1 to 8.0.0 in /webapp [`#1434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1434) +- Bump eslint-plugin-jest from 22.15.2 to 22.16.0 in /webapp [`#1435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1435) +- Bump vue-izitoast from 1.2.0 to 1.2.1 in /webapp [`#1436`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1436) +- Bump graphql from 14.5.3 to 14.5.4 in /webapp [`#1437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1437) +- Bump cypress-cucumber-preprocessor from 1.15.1 to 1.16.0 [`#1417`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1417) +- Bump nuxt-dropzone from 1.0.3 to 1.0.4 in /webapp [`#1423`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1423) +- Bump apollo-server from 2.9.0 to 2.9.1 in /backend [`#1424`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1424) +- Bump helmet from 3.20.0 to 3.20.1 in /backend [`#1416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1416) +- Bump nuxt from 2.9.1 to 2.9.2 in /webapp [`#1421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1421) +- Bump eslint-config-standard from 14.0.1 to 14.1.0 in /backend [`#1420`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1420) +- Bump neo4j-graphql-js from 2.7.1 to 2.7.2 in /backend [`#1419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1419) +- Bump apollo-server-testing from 2.9.0 to 2.9.1 in /backend [`#1418`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1418) +- Fix Editor Bugs [`#1406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1406) +- Bump eslint from 6.2.1 to 6.2.2 in /backend [`#1388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1388) +- Update the apollo cache [`#1400`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1400) +- Increase nginx client max body size, split size legacy migration [`#1407`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1407) +- Bump cypress-cucumber-preprocessor from 1.15.0 to 1.15.1 [`#1410`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1410) +- Simplify cypress testing on docker [`#1411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1411) +- [Security] Bump mixin-deep from 1.3.1 to 1.3.2 [`#1409`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1409) +- [Security] Bump mixin-deep from 1.3.1 to 1.3.2 in /webapp [`#1408`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1408) +- Update to use <client-only> instead of <no-ssr> [`#1398`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1398) +- 🍰 1062 notification about comment on post [`#1270`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1270) +- Bump graphql from 14.5.0 to 14.5.3 in /backend [`#1385`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1385) +- Bump date-fns from 2.0.0 to 2.0.1 in /webapp [`#1381`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1381) +- Add memory limits to neo4j deployment [`#1392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1392) +- Bump @nuxtjs/apollo from 4.0.0-rc11 to 4.0.0-rc12 in /webapp [`#1404`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1404) +- Bump graphql-shield from 6.0.5 to 6.0.6 in /backend [`#1403`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1403) +- Bump cypress-cucumber-preprocessor from 1.14.1 to 1.15.0 [`#1402`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1402) +- Bump babel-eslint from 10.0.2 to 10.0.3 in /backend [`#1389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1389) +- Bump eslint-loader from 2.2.1 to 3.0.0 in /webapp [`#1386`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1386) +- Bump apollo-server from 2.8.2 to 2.9.0 in /backend [`#1384`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1384) +- Bump date-fns from 2.0.0 to 2.0.1 in /backend [`#1382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1382) +- [Security] Bump eslint-utils from 1.3.1 to 1.4.2 in /webapp [`#1401`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1401) +- Fix infinite-loading infinitely loading [`#1376`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1376) +- Bump apollo-server-testing from 2.8.2 to 2.9.0 in /backend [`#1387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1387) +- Bump babel-eslint from 10.0.2 to 10.0.3 in /webapp [`#1383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1383) +- Bump apollo-server-express from 2.8.2 to 2.9.0 in /backend [`#1380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1380) +- Bump graphql from 14.5.0 to 14.5.3 in /webapp [`#1379`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1379) +- Simplify docker entrypoint of neo4j image [`#1377`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1377) +- Fix flickering create-button [`#1375`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1375) +- Fix "cannot read property id of null" in staging [`#1371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1371) +- 🍰 454 Lokalise unlocalised texts and fixes texts [`#1372`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1372) +- Fix UpdatePost resolver/validations [`#1368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1368) +- Use ES6 syntax to avoid repetition [`#1370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1370) +- Bump eslint-config-standard from 14.0.0 to 14.0.1 in /backend [`#1356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1356) +- Bump graphql from 14.4.2 to 14.5.0 in /webapp [`#1358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1358) +- Update vue-izitoast after they released v1.2.0! [`#1366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1366) +- Bump cypress-cucumber-preprocessor from 1.14.0 to 1.14.1 [`#1354`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1354) +- Implement visual feedback if filter is active [`#1338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1338) +- Update transitive dependencies [`#1348`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1348) +- Fix post count always showing 0 [`#1350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1350) +- Fix expiration dates of JWT and cookie [`#1349`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1349) +- Bump cypress-cucumber-preprocessor from 1.13.1 to 1.14.0 [`#1340`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1340) +- Bump eslint-plugin-jest from 22.15.1 to 22.15.2 in /webapp [`#1343`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1343) +- Update backend/yarn.lock` [`#1346`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1346) +- Bump node from 12.8-alpine to 12.9-alpine in /backend [`#1344`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1344) +- Bump node from 12.8-alpine to 12.9-alpine in /webapp [`#1345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1345) +- Bump @vue/cli-shared-utils from 3.10.0 to 3.11.0 in /webapp [`#1342`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1342) +- Bump eslint-plugin-jest from 22.15.1 to 22.15.2 in /backend [`#1341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1341) +- Visual feedback if filters lead to 0 results [`#1339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1339) +- Bump nuxt from 2.8.1 to 2.9.1 in /webapp [`#1321`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1321) +- Bump tiptap-extensions from 1.26.2 to 1.27.0 in /webapp [`#1323`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1323) +- Bump tiptap from 1.24.2 to 1.25.0 in /webapp [`#1327`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1327) +- Validate that a post cannot be created without categories/too many categories [`#1268`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1268) +- Bump date-fns from 2.0.0-beta.5 to 2.0.0 in /backend [`#1320`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1320) +- Bump @nuxtjs/axios from 5.5.4 to 5.6.0 in /webapp [`#1329`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1329) +- Bump nuxt-dropzone from 1.0.2 to 1.0.3 in /webapp [`#1330`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1330) +- Bump apollo-server-testing from 2.8.1 to 2.8.2 in /backend [`#1328`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1328) +- Fix vue warnings for MasonryGrid/MasonGridItem [`#1336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1336) +- Bump graphql-shield from 6.0.4 to 6.0.5 in /backend [`#1319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1319) +- Bump sass-loader from 7.2.0 to 7.3.1 in /webapp [`#1318`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1318) +- Bump @sentry/node from 5.6.1 to 5.6.2 in /backend [`#1326`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1326) +- Bump apollo-server from 2.8.1 to 2.8.2 in /backend [`#1322`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1322) +- Bump date-fns from 2.0.0-beta.5 to 2.0.0 in /webapp [`#1325`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1325) +- Bump eslint from 6.2.0 to 6.2.1 in /backend [`#1324`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1324) +- Bump @nuxtjs/apollo from 4.0.0-rc9 to 4.0.0-rc11 in /webapp [`#1309`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1309) +- Fix #1308 [`#1314`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1314) +- Fix #1315 [`#1316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1316) +- Add masonry layout grid [`#1256`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1256) +- 272 add error reporting [`#1281`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1281) +- Bump eslint-config-standard from 13.0.1 to 14.0.0 in /backend [`#1298`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1298) +- Bump uuid from 3.3.2 to 3.3.3 in /backend [`#1302`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1302) +- Configure dbms.security.procedures [`#1295`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1295) +- 🍰 Send out notifications on CreateComment [`#1018`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1018) +- Bump neode from 0.3.1 to 0.3.2 in /backend [`#1297`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1297) +- Bump eslint-config-prettier from 6.0.0 to 6.1.0 in /webapp [`#1299`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1299) +- Bump eslint-config-prettier from 6.0.0 to 6.1.0 in /backend [`#1304`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1304) +- Bump eslint-plugin-standard from 4.0.0 to 4.0.1 in /webapp [`#1301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1301) +- Bump eslint-plugin-standard from 4.0.0 to 4.0.1 in /backend [`#1300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1300) +- Bump neode from 0.3.1 to 0.3.2 [`#1296`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1296) +- Bump babel-jest from 24.8.0 to 24.9.0 in /backend [`#1284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1284) +- Bump dotenv from 8.0.0 to 8.1.0 [`#1285`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1285) +- Bump jest from 24.8.0 to 24.9.0 in /webapp [`#1287`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1287) +- Bump eslint from 6.1.0 to 6.2.0 in /backend [`#1288`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1288) +- Downgrade @nuxtjs/apollo [`#1294`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1294) +- Bump neo4j-graphql-js from 2.7.0 to 2.7.1 in /backend [`#1289`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1289) +- Bump date-fns from 2.0.0-beta.4 to 2.0.0-beta.5 in /backend [`#1286`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1286) +- Bump date-fns from 2.0.0-beta.4 to 2.0.0-beta.5 in /webapp [`#1290`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1290) +- Bump dotenv from 8.0.0 to 8.1.0 in /backend [`#1291`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1291) +- Bump babel-jest from 24.8.0 to 24.9.0 in /webapp [`#1292`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1292) +- Bump jest from 24.8.0 to 24.9.0 in /backend [`#1293`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1293) +- Get rid of property warnings [`#1282`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1282) +- Refactor graphql queries [`#1280`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1280) +- Fix hashtag db import [`#1278`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1278) +- Fix `Cannot read property countUser of null` [`#1277`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1277) +- Bump @hapi/joi from 15.1.0 to 15.1.1 in /backend [`#1279`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1279) +- Fix user mention menu on production data [`#1271`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1271) +- Bump @human-connection/styleguide from 0.5.18 to 0.5.19 in /webapp [`#1274`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1274) +- 845 load more [`#1176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1176) +- Bump @human-connection/styleguide from 0.5.17 to 0.5.18 in /webapp [`#1269`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1269) +- Bump graphql-middleware from 3.0.3 to 3.0.5 in /backend [`#1265`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1265) +- Bump tiptap-extensions from 1.26.1 to 1.26.2 in /webapp [`#1258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1258) +- Bump vue-izitoast from `c246fd7` to `ba6b03e` in /webapp [`#1260`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1260) +- Bump neo4j-graphql-js from 2.6.3 to 2.7.0 in /backend [`#1257`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1257) +- Bump tiptap from 1.24.1 to 1.24.2 in /webapp [`#1259`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1259) +- 🍰 Registration confirmation of terms of use added II [`#1224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1224) +- Localise categories [`#1261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1261) +- 🍰 1054 blocked users [`#1209`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1209) +- 🍰 454 Lokalise / translate all unlocalised Texts / Translations / Languages [`#1244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1244) +- Bump @storybook/vue from 5.1.10 to 5.1.11 in /webapp [`#1251`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1251) +- Bump @storybook/addon-a11y from 5.1.10 to 5.1.11 in /webapp [`#1250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1250) +- Maintain consistent naming/punctuation conventions [`#1255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1255) +- Bump eslint-plugin-jest from 22.15.0 to 22.15.1 in /webapp [`#1253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1253) +- I had enough of `--ignore-engines` [`#1232`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1232) +- Bump @storybook/addon-actions from 5.1.10 to 5.1.11 in /webapp [`#1249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1249) +- Bump eslint-plugin-jest from 22.15.0 to 22.15.1 in /backend [`#1248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1248) +- Bump apollo-cache-inmemory from 1.6.2 to 1.6.3 in /backend [`#1234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1234) +- Bump apollo-cache-inmemory from 1.6.2 to 1.6.3 in /webapp [`#1237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1237) +- Bump cypress-cucumber-preprocessor from 1.13.0 to 1.13.1 [`#1235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1235) +- Bump sass-loader from 7.1.0 to 7.2.0 in /webapp [`#1238`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1238) +- Bump apollo-client from 2.6.3 to 2.6.4 in /backend [`#1236`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1236) +- Bump apollo-client from 2.6.3 to 2.6.4 in /webapp [`#1239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1239) +- 🍰 [Bugfix] Fix filter menu and refactor default layout [`#1233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1233) +- Bump vue-sweetalert-icons from 4.1.0 to 4.2.0 in /webapp [`#1225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1225) +- Bump node from 12.7-alpine to 12.8-alpine in /webapp [`#1227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1227) +- Bump node from 12.7-alpine to 12.8-alpine in /backend [`#1228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1228) +- Move filter by followers functionality to filter dropdown [`#1169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1169) +- Remove obsolete "MOCKS" [`#1223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1223) +- Emotions on posts [`#1133`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1133) +- Bump vue-sweetalert-icons from 4.0.0 to 4.1.0 in /webapp [`#1212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1212) +- Bump eslint-plugin-jest from 22.14.1 to 22.15.0 in /webapp [`#1215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1215) +- Fix expired discord link [`#1220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1220) +- Bump tiptap-extensions from 1.26.0 to 1.26.1 in /webapp [`#1210`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1210) +- Stub sweetalert-icon in tests which use [`#1217`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1217) +- Add data-mention-id to seeds mentions [`#1218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1218) +- Bump @nuxtjs/style-resources from 0.1.2 to 1.0.0 in /webapp [`#1213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1213) +- Bump eslint-plugin-jest from 22.14.1 to 22.15.0 in /backend [`#1211`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1211) +- Fix depreciation warnings [`#1171`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1171) +- Add static page for data privacy [`#1174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1174) +- Bump date-fns from 2.0.0-beta.3 to 2.0.0-beta.4 in /webapp [`#1194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1194) +- Bump date-fns from 2.0.0-beta.3 to 2.0.0-beta.4 in /backend [`#1195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1195) +- Bump vue-sweetalert-icons from 3.2.0 to 3.2.1 in /webapp [`#791`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/791) +- Bump @nuxtjs/dotenv from 1.3.0 to 1.4.0 in /webapp [`#1196`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1196) +- Bump neode from 0.3.0 to 0.3.1 in /backend [`#1193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1193) +- Storybook [`#952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/952) +- Bump vuex-i18n from 1.13.0 to 1.13.1 in /webapp [`#1192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1192) +- Bump neode from 0.3.0 to 0.3.1 [`#1191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1191) +- Fix terms and conditions template, english and german [`#1185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1185) +- edit layout default for guests [`#1175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1175) +- add page code-of-conduct, english and german [`#1190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1190) +- changes and history template, english, german [`#1184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1184) +- Bump metascraper-lang from 5.6.3 to 5.6.5 in /backend [`#1182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1182) +- Bump @vue/cli-shared-utils from 3.9.0 to 3.10.0 in /webapp [`#1181`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1181) +- Bump metascraper-author from 5.6.3 to 5.6.5 in /backend [`#1180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1180) +- Bump @nuxtjs/apollo from 4.0.0-rc9 to 4.0.0-rc10 in /webapp [`#1179`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1179) +- Bump metascraper-title from 5.6.3 to 5.6.5 in /backend [`#1178`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1178) +- Bump metascraper-image from 5.6.3 to 5.6.5 in /backend [`#1177`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1177) +- Bump neode from 0.2.16 to 0.3.0 in /backend [`#1152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1152) +- seed first and then reset [`#1170`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1170) +- Bump metascraper-video from 5.6.3 to 5.6.5 in /backend [`#1159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1159) +- Bump tiptap from 1.21.0 to 1.24.0 in /webapp [`#1147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1147) +- Bump metascraper-date from 5.6.3 to 5.6.5 in /backend [`#1160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1160) +- Bump metascraper-publisher from 5.6.3 to 5.6.5 in /backend [`#1163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1163) +- Bump tippy.js from 4.3.4 to 4.3.5 in /webapp [`#1161`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1161) +- Bump cypress-file-upload from 3.3.2 to 3.3.3 [`#1158`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1158) +- Bump metascraper-description from 5.6.3 to 5.6.5 in /backend [`#1162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1162) +- Bump metascraper-soundcloud from 5.6.3 to 5.6.5 in /backend [`#1164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1164) +- Bump metascraper-url from 5.6.3 to 5.6.5 in /backend [`#1165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1165) +- Bump metascraper-audio from 5.6.3 to 5.6.5 in /backend [`#1166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1166) +- Bump metascraper-logo from 5.6.3 to 5.6.5 in /backend [`#1167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1167) +- Bump eslint-config-standard from 12.0.0 to 13.0.1 in /backend [`#1032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1032) +- Bump neo4j-driver from 1.7.4 to 1.7.5 in /backend [`#677`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/677) +- Bump @nuxtjs/apollo from 4.0.0-rc4.2 to 4.0.0-rc5 in /webapp [`#632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/632) +- Bump neo4j from 3.5.5 to 3.5.8 in /neo4j [`#1117`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1117) +- Bump cypress from 3.4.0 to 3.4.1 [`#1135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1135) +- Update metascraper-youtube [`#1156`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1156) +- Bump neode from 0.2.18 to 0.3.0 [`#1145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1145) +- Bump apollo-server from 2.8.0 to 2.8.1 in /backend [`#1149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1149) +- Bump apollo-server-testing from 2.8.0 to 2.8.1 in /backend [`#1146`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1146) +- Bump eslint-plugin-jest from 22.14.0 to 22.14.1 in /backend [`#1148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1148) +- Bump eslint-plugin-jest from 22.14.0 to 22.14.1 in /webapp [`#1150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1150) +- Bump merge-graphql-schemas from 1.6.1 to 1.7.0 in /backend [`#1151`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1151) +- Bump apollo-server-express from 2.8.0 to 2.8.1 in /backend [`#1154`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1154) +- Use a link's username, open separate window on click [`#1155`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1155) +- Refactor social media backend [`#1139`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1139) +- HcContributionForm submit is disabled by default [`#977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/977) +- HcContributionForm submit is disabled by default [`#977`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/977) +- 375 sorting (II) [`#1063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1063) +- Fix console.errors during `yarn run test` [`#1141`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1141) +- Bump vuex-i18n from 1.11.0 to 1.13.0 in /webapp [`#1144`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1144) +- Bump apollo-server-testing from 2.7.2 to 2.8.0 in /backend [`#1136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1136) +- Bump apollo-server from 2.7.2 to 2.8.0 in /backend [`#1137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1137) +- Bump graphql-middleware from 3.0.2 to 3.0.3 in /backend [`#1138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1138) +- 🍰 Refine social media [`#1053`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1053) +- Bump apollo-server from 2.7.0 to 2.7.2 in /backend [`#1128`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1128) +- Bump apollo-server-testing from 2.7.0 to 2.7.2 in /backend [`#1127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1127) +- Add details to contribution form [`#936`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/936) +- Maintenance service to support maintenance mode [`#956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/956) +- Gitignore ssh directory [`#1132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1132) +- Bump cookie-universal-nuxt from 2.0.16 to 2.0.17 in /webapp [`#1131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1131) +- Bump eslint-plugin-jest from 22.13.6 to 22.14.0 in /backend [`#1130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1130) +- Bump eslint-plugin-jest from 22.13.6 to 22.14.0 in /webapp [`#1129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1129) +- Bump apollo-server-express from 2.7.0 to 2.7.2 in /backend [`#1126`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1126) +- Bump node from 12.6-alpine to 12.7-alpine in /backend [`#1118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1118) +- Bump node from 12.6-alpine to 12.7-alpine in /webapp [`#1116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1116) +- Give more space to neo4j-data [`#1115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1115) +- Bump metascraper-video from 4.10.2 to 5.6.3 in /backend [`#1114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1114) +- Bump helmet from 3.19.0 to 3.20.0 in /backend [`#1113`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1113) +- Bump metascraper-image from 4.10.2 to 5.6.3 in /backend [`#1102`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1102) +- Bump date-fns from 2.0.0-beta.2 to 2.0.0-beta.3 in /webapp [`#1111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1111) +- Bump date-fns from 2.0.0-beta.1 to 2.0.0-beta.3 in /backend [`#1106`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1106) +- Bump cypress-cucumber-preprocessor from 1.12.0 to 1.13.0 [`#1108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1108) +- Bump metascraper-title from 4.10.2 to 5.6.3 in /backend [`#1105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1105) +- Bump metascraper-author from 4.10.2 to 5.6.3 in /backend [`#1103`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1103) +- Bump metascraper-lang from 4.10.2 to 5.6.3 in /backend [`#1101`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1101) +- Bump eslint-plugin-jest from 22.13.0 to 22.13.6 in /backend [`#1100`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1100) +- Bump metascraper-publisher from 4.10.2 to 5.6.3 in /backend [`#1104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1104) +- Bump metascraper-date from 4.10.2 to 5.6.3 in /backend [`#1099`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1099) +- Bump @vue/eslint-config-prettier from 4.0.1 to 5.0.0 in /webapp [`#1098`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1098) +- Bump eslint-plugin-jest from 22.11.1 to 22.13.6 in /webapp [`#1097`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1097) +- Bump eslint from 6.0.1 to 6.1.0 in /backend [`#1091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1091) +- Bump @babel/cli from 7.5.0 to 7.5.5 in /backend [`#1089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1089) +- Bump eslint-plugin-import from 2.18.0 to 2.18.2 in /backend [`#1094`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1094) +- Editor embeds merge in nitro embed [`#960`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/960) +- Bump @babel/core from 7.5.4 to 7.5.5 in /backend [`#1095`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1095) +- Bump eslint-plugin-import from 2.18.0 to 2.18.2 in /webapp [`#1093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1093) +- Bump eslint-plugin-jest from 22.11.1 to 22.13.0 in /backend [`#1085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1085) +- Bump neode from 0.2.16 to 0.2.18 [`#1084`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1084) +- Bump merge-graphql-schemas from 1.5.8 to 1.6.1 in /backend [`#1083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1083) +- Bump @babel/preset-env from 7.5.4 to 7.5.5 in /backend [`#1073`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1073) +- Bump @babel/preset-env from 7.5.4 to 7.5.5 in /webapp [`#1075`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1075) +- Bump graphql-shield from 6.0.3 to 6.0.4 in /backend [`#1061`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1061) +- Bump apollo-server from 2.6.9 to 2.7.0 in /backend [`#1058`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1058) +- Bump @babel/node from 7.5.0 to 7.5.5 in /backend [`#1074`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1074) +- Created imprint page, added English translations [`#1080`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1080) +- Bump helmet from 3.18.0 to 3.19.0 in /backend [`#1072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1072) +- Bump @babel/register from 7.4.4 to 7.5.5 in /backend [`#1070`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1070) +- Bump @babel/core from 7.5.4 to 7.5.5 in /webapp [`#1076`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1076) +- Bump eslint-plugin-jest from 22.9.0 to 22.11.1 in /backend [`#1078`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1078) +- Bump eslint-plugin-jest from 22.9.0 to 22.11.1 in /webapp [`#1079`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1079) +- Bump eslint-plugin-jest from 22.8.0 to 22.9.0 in /backend [`#1060`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1060) +- Bump eslint-plugin-jest from 22.8.0 to 22.9.0 in /webapp [`#1057`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1057) +- Bump apollo-server-testing from 2.6.9 to 2.7.0 in /backend [`#1056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1056) +- Bump cypress-file-upload from 3.3.1 to 3.3.2 [`#1055`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1055) +- Update comment [`#788`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/788) +- Refactoring: Split User and Email [`#1044`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1044) +- Move secrets into secrets kubernetes template [`#1049`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1049) +- Bump eslint-plugin-jest from 22.7.2 to 22.8.0 in /webapp [`#1050`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1050) +- Bump eslint-plugin-jest from 22.7.2 to 22.8.0 in /backend [`#1052`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1052) +- Remove graphql-yoga [`#1040`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1040) +- Implement paginating user view for admins [`#1019`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1019) +- Filter posts by category [`#969`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/969) +- Fix #822 by updating the counts of the user [`#1041`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1041) +- Fix regression of data import [`#1042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1042) +- Silence codecov [`#1043`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1043) +- Bump cypress-file-upload from 3.2.1 to 3.3.1 [`#1046`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1046) +- Bump linkify-it from 2.1.0 to 2.2.0 in /webapp [`#1047`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1047) +- Bump nodemailer from 6.2.1 to 6.3.0 in /backend [`#1045`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1045) +- Sledgehammer the file permission problem on docker [`#1048`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1048) +- Bugfix: Signup email was missing email query param [`#1039`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1039) +- polish language on current status [`#968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/968) +- Refactor CreateComment resolver [`#1038`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1038) +- Refactor reward/unreward Badges in backend [`#1016`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1016) +- Bump apollo-server from 2.6.8 to 2.6.9 in /backend [`#1034`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1034) +- Bump apollo-server-testing from 2.6.8 to 2.6.9 in /backend [`#1029`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1029) +- Bump cypress-file-upload from 3.2.0 to 3.2.1 [`#1031`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1031) +- Bump wait-on from 3.2.0 to 3.3.0 in /backend [`#1028`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1028) +- [Security] Bump lodash from 4.17.11 to 4.17.14 in /webapp [`#1023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1023) +- Bump lodash from 4.17.13 to 4.17.14 in /backend [`#1027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1027) +- 🍰 2019/kw27/data_import_emotions [`#944`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/944) +- [Security] Bump lodash.template from 4.4.0 to 4.5.0 in /webapp [`#1022`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1022) +- [Security] Bump lodash.mergewith from 4.6.1 to 4.6.2 in /backend [`#1021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1021) +- Signup new users as admin [`#994`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/994) +- Bump @babel/preset-env from 7.5.2 to 7.5.4 in /backend [`#1009`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1009) +- Bump @babel/preset-env from 7.4.5 to 7.5.4 in /webapp [`#1013`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1013) +- Follow up of #958 [`#1007`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1007) +- Bump apollo-server from 2.6.6 to 2.6.8 in /backend [`#1014`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1014) +- Bump cypress from 3.3.2 to 3.4.0 [`#1008`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1008) +- Bump @babel/core from 7.5.0 to 7.5.4 in /backend [`#1012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1012) +- Bump @babel/core from 7.5.0 to 7.5.4 in /webapp [`#1010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1010) +- Bump apollo-server-testing from 2.6.7 to 2.6.8 in /backend [`#1011`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1011) +- Bump lodash from 4.17.11 to 4.17.13 in /backend [`#1015`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1015) +- footer created imprint and all language ok [`#999`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/999) +- 🐛 [Bug] full ads width use with small devices [`#958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/958) +- large images are set to maximum height [`#976`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/976) +- User role not nullable [`#993`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/993) +- Tags in the Text of a Contribution like Mentions [`#848`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/848) +- Neo4j uses a different name for its env vars [`#989`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/989) +- Update docs [`#995`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/995) +- Bump graphql-shield from 6.0.2 to 6.0.3 in /backend [`#998`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/998) +- Bump @babel/core from 7.4.5 to 7.5.0 in /backend [`#988`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/988) +- Bump @babel/preset-env from 7.4.5 to 7.5.2 in /backend [`#996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/996) +- Bump node from 12.5-alpine to 12.6-alpine in /backend [`#987`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/987) +- Bump node from 12.5-alpine to 12.6-alpine in /webapp [`#985`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/985) +- Bump @babel/preset-env from 7.4.5 to 7.5.0 in /backend [`#984`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/984) +- Bump eslint-plugin-jest from 22.7.1 to 22.7.2 in /webapp [`#983`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/983) +- Bump @babel/node from 7.4.5 to 7.5.0 in /backend [`#982`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/982) +- Bump eslint-plugin-jest from 22.7.1 to 22.7.2 in /backend [`#981`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/981) +- Bump @babel/core from 7.4.5 to 7.5.0 in /webapp [`#980`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/980) +- Bump @babel/cli from 7.4.4 to 7.5.0 in /backend [`#979`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/979) +- Bump eslint-loader from 2.2.0 to 2.2.1 in /webapp [`#978`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/978) +- Remove request for image in UpdatePost mutation from UI [`#966`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/966) +- Bump graphql from 14.4.0 to 14.4.2 in /backend [`#973`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/973) +- Bump graphql from 14.4.0 to 14.4.2 in /webapp [`#972`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/972) +- Bump @vue/cli-shared-utils from 3.8.0 to 3.9.0 in /webapp [`#971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/971) +- Bump eslint-loader from 2.1.2 to 2.2.0 in /webapp [`#970`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/970) +- 943 bring user mutation under control [`#945`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/945) +- long links and content is wrapped [`#963`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/963) +- Remove unused query as cleanup [`#951`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/951) +- 🐛 [Bug] : long comments can be folded up and down [`#864`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/864) +- the one-time reporting of a user, post or comment [`#908`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/908) +- Add basic styling for comment list [`#955`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/955) +- Refactor code to extract query to it's own file [`#954`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/954) +- Bump metascraper-soundcloud from 4.8.5 to 5.5.3 [`#76`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/76) +- Bump apollo-server from 2.3.1 to 2.6.7 [`#75`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/75) +- Bump metascraper-url from 4.8.5 to 5.5.0 [`#73`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/73) +- Bump metascraper-video from 4.8.5 to 5.5.0 [`#72`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/72) +- Bump metascraper-audio from 4.8.5 to 5.5.0 [`#71`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/71) +- Bump metascraper-logo from 4.8.5 to 5.5.0 [`#69`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/69) +- Bump metascraper-clearbit-logo from 4.8.5 to 5.3.0 [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25) +- Bump metascraper-description from 4.8.5 to 5.5.0 [`#67`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/67) +- Bump metascraper from 4.8.5 to 4.10.3 [`#17`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/17) +- Bump got from 9.5.0 to 9.6.0 [`#7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/7) +- Bump graphql-shield from 5.6.2 to 6.0.2 in /backend [`#948`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/948) +- Post with categories [`#919`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/919) +- 907 mobile responsive menu navbar [`#933`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/933) +- region and place is no longer created twice. [`#905`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/905) +- Bump node from 12.4-alpine to 12.5-alpine in /backend [`#941`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/941) +- Bump node from 12.4-alpine to 12.5-alpine in /webapp [`#942`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/942) +- Bump cypress-file-upload from 3.1.4 to 3.2.0 [`#937`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/937) +- Patch cypher injection vulnerability [`#935`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/935) +- Add teaser image to contribution form [`#787`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/787) +- Bump date-fns from 2.0.0-beta.1 to 2.0.0-beta.2 in /backend [`#930`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/930) +- Bump date-fns from 2.0.0-alpha.37 to 2.0.0-beta.2 in /webapp [`#928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/928) +- Bump apollo-server from 2.6.6 to 2.6.7 in /backend [`#924`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/924) +- Bump cypress from 3.3.1 to 3.3.2 [`#929`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/929) +- Bump date-fns from 2.0.0-alpha.37 to 2.0.0-beta.1 in /webapp [`#925`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/925) +- Bump graphql from 14.3.1 to 14.4.0 in /webapp [`#923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/923) +- Bump eslint-config-prettier from 5.0.0 to 6.0.0 in /backend [`#909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/909) +- Bump date-fns from 2.0.0-alpha.37 to 2.0.0-beta.1 in /backend [`#922`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/922) +- Bump graphql from 14.3.1 to 14.4.0 in /backend [`#921`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/921) +- Bump apollo-server-testing from 2.6.6 to 2.6.7 in /backend [`#920`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/920) +- Bump apollo-server from 2.6.4 to 2.6.6 in /backend [`#910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/910) +- Bump eslint-config-prettier from 5.0.0 to 6.0.0 in /webapp [`#911`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/911) +- Bump apollo-server-testing from 2.6.4 to 2.6.6 in /backend [`#912`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/912) +- Bump eslint-plugin-promise from 4.1.1 to 4.2.1 in /webapp [`#913`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/913) +- Bump eslint-plugin-promise from 4.1.1 to 4.2.1 in /backend [`#914`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/914) +- Bump date-fns from 2.0.0-alpha.36 to 2.0.0-alpha.37 in /backend [`#915`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/915) +- Bump date-fns from 2.0.0-alpha.36 to 2.0.0-alpha.37 in /webapp [`#916`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/916) +- Bump eslint from 5.16.0 to 6.0.1 in /backend [`#917`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/917) +- Page size of 12 entries on / page [`#881`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/881) +- Refactor CreateComments functionality [`#901`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/901) +- Use upstream neo4j-graphql-js [`#882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/882) +- Write tests for UpdatePost, refactor tests [`#898`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/898) +- Bump eslint-plugin-import from 2.17.3 to 2.18.0 in /backend [`#902`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/902) +- Bump eslint-plugin-vue from 5.2.2 to 5.2.3 in /webapp [`#903`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/903) +- Bump eslint-plugin-import from 2.17.3 to 2.18.0 in /webapp [`#904`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/904) +- Bump date-fns from 2.0.0-alpha.34 to 2.0.0-alpha.36 in /backend [`#877`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/877) +- Bump date-fns from 2.0.0-alpha.35 to 2.0.0-alpha.36 in /webapp [`#888`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/888) +- Bump eslint-plugin-jest from 22.7.0 to 22.7.1 in /backend [`#890`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/890) +- Bump eslint-plugin-jest from 22.7.0 to 22.7.1 in /webapp [`#889`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/889) +- Deploy development mailserver [`#893`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/893) +- Fix failing build due to lorempixel.com being down [`#885`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/885) +- 🍰 2019/kw25/improve_import_accuracy [`#863`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/863) +- Add enableDeletionValue to unlock deletion [`#868`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/868) +- 🍰 2019/kw24/fix_imported_img_urls [`#829`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/829) +- 801 reset password [`#834`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/834) +- Bump eslint-plugin-jest from 22.6.4 to 22.7.0 in /webapp [`#871`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/871) +- Bump apollo-server from 2.6.3 to 2.6.4 in /backend [`#873`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/873) +- Bump graphql-shield from 5.6.1 to 5.7.1 in /backend [`#876`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/876) +- Bump date-fns from 2.0.0-alpha.34 to 2.0.0-alpha.35 in /backend [`#870`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/870) +- Bump date-fns from 2.0.0-alpha.34 to 2.0.0-alpha.35 in /webapp [`#872`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/872) +- Bump apollo-server-testing from 2.6.3 to 2.6.4 in /backend [`#874`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/874) +- Bump eslint-plugin-jest from 22.6.4 to 22.7.0 in /backend [`#875`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/875) +- Bump graphql-shield from 5.3.8 to 5.6.1 in /backend [`#866`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/866) +- Bump graphql-yoga from 1.17.4 to 1.18.0 in /backend [`#865`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/865) +- Set up editor placeholder to use Vuex [`#836`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/836) +- Bump babel-eslint from 10.0.1 to 10.0.2 in /backend [`#851`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/851) +- Bump babel-eslint from 10.0.1 to 10.0.2 in /webapp [`#854`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/854) +- Bump apollo-client from 2.6.2 to 2.6.3 in /webapp [`#861`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/861) +- Bump apollo-client from 2.6.2 to 2.6.3 in /backend [`#862`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/862) +- When you call up a post you can scroll to the comments [`#855`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/855) +- Fix a text description for the filter bubble [`#856`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/856) +- [Bug] Untranslated Texts in Post Page #764 [`#786`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/786) +- Bump apollo-link-http from 1.5.14 to 1.5.15 in /backend [`#843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/843) +- Bump eslint-config-prettier from 4.3.0 to 5.0.0 in /backend [`#842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/842) +- Bump apollo-link-context from 1.0.17 to 1.0.18 in /backend [`#841`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/841) +- Bump eslint-config-prettier from 4.3.0 to 5.0.0 in /webapp [`#838`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/838) +- Bump date-fns from 2.0.0-alpha.33 to 2.0.0-alpha.34 in /backend [`#840`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/840) +- Bump date-fns from 2.0.0-alpha.33 to 2.0.0-alpha.34 in /webapp [`#837`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/837) +- Add placeholder for new contributions [`#833`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/833) +- Turn off $root listeners in beforeDestroy [`#831`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/831) +- Bump tiptap from 1.20.1 to 1.21.0 in /webapp [`#720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/720) +- 2019/kw24/import_images_improvements [`#830`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/830) +- Authorisation problem when disabling a post [`#763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/763) +- Create Posts with a specified language, or fallback [`#795`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/795) +- Delete my User Account functionality [`#740`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/740) +- Whitelist queries/mutations, fix tests [`#823`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/823) +- Bump date-fns from 2.0.0-alpha.31 to 2.0.0-alpha.33 in /backend [`#825`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/825) +- Follow up on #820 [`#828`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/828) +- Bump cypress-file-upload from 3.1.3 to 3.1.4 [`#826`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/826) +- Bump date-fns from 2.0.0-alpha.32 to 2.0.0-alpha.33 in /webapp [`#827`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/827) +- Bump cypress-cucumber-preprocessor from 1.11.2 to 1.12.0 [`#813`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/813) +- Bump apollo-server-testing from 2.6.2 to 2.6.3 in /backend [`#819`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/819) +- Bump apollo-server from 2.6.2 to 2.6.3 in /backend [`#818`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/818) +- Bump date-fns from 2.0.0-alpha.31 to 2.0.0-alpha.32 in /backend [`#817`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/817) +- Bump date-fns from 2.0.0-alpha.31 to 2.0.0-alpha.32 in /webapp [`#815`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/815) +- Bump cypress-file-upload from 3.1.2 to 3.1.3 [`#812`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/812) +- Implement prefix of image urls with a filter [`#821`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/821) +- Revert changes to cypress record [`#824`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/824) +- Fix #800 [`#809`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/809) +- Fix #799 [`#810`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/810) +- Fix #470 [`#807`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/807) +- Bump tiptap-extensions from 1.22.1 to 1.22.2 in /webapp [`#798`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/798) +- Bump graphql-shield from 5.3.7 to 5.3.8 in /backend [`#797`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/797) +- 402 userprofil tab click function [`#754`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/754) +- Bump prettier from 1.17.1 to 1.18.2 in /backend [`#789`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/789) +- Bump graphql-shield from 5.3.6 to 5.3.7 in /backend [`#796`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/796) +- Bump prettier from 1.18.0 to 1.18.2 in /webapp [`#794`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/794) +- Bump tiptap-extensions from 1.21.0 to 1.22.1 in /webapp [`#793`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/793) +- Bump cookie-universal-nuxt from 2.0.14 to 2.0.16 in /webapp [`#792`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/792) +- Bump tippy.js from 4.3.3 to 4.3.4 in /webapp [`#790`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/790) +- Bump apollo-cache-inmemory from 1.6.1 to 1.6.2 in /backend [`#771`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/771) +- Translate network tab on the left profile page [`#780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/780) +- Replace dependency `ms` completely [`#783`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/783) +- Bump apollo-client from 2.6.1 to 2.6.2 in /webapp [`#772`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/772) +- Bump apollo-client from 2.6.1 to 2.6.2 in /backend [`#768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/768) +- Bump apollo-server-testing from 2.6.1 to 2.6.2 in /backend [`#773`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/773) +- Bump prettier from 1.17.1 to 1.18.0 in /webapp [`#766`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/766) +- Bump date-fns from 2.0.0-alpha.29 to 2.0.0-alpha.31 in /webapp [`#770`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/770) +- Bump apollo-server from 2.6.1 to 2.6.2 in /backend [`#776`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/776) +- Bump date-fns from 2.0.0-alpha.29 to 2.0.0-alpha.31 in /backend [`#775`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/775) +- Refactor filter bubble [`#762`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/762) +- Disable the location.reloads [`#761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/761) +- Hover effect user image upload [`#732`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/732) +- Bump tippy.js from 4.3.2 to 4.3.3 in /webapp [`#742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/742) +- Bump @nuxtjs/axios from 5.5.3 to 5.5.4 in /webapp [`#756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/756) +- Bump date-fns from 2.0.0-alpha.27 to 2.0.0-alpha.29 in /webapp [`#757`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/757) +- Bump date-fns from 2.0.0-alpha.27 to 2.0.0-alpha.29 in /backend [`#758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/758) +- 269 filter by followed users [`#699`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/699) +- Bump tiptap-extensions from 1.20.2 to 1.21.0 in /webapp [`#746`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/746) +- Bump apollo-cache-inmemory from 1.6.0 to 1.6.1 in /backend [`#741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/741) +- 269 filter by followed users backend part [`#730`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/730) +- 206 setup neo4j db constraints on startup [`#739`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/739) +- Fix deployment - wrong docker image name [`#751`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/751) +- 402 userprofile shouted tab 2 [`#752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/752) +- Bump graphql-shield from 5.3.5 to 5.3.6 in /backend [`#743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/743) +- Bump apollo-client from 2.6.0 to 2.6.1 in /webapp [`#744`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/744) +- Bump apollo-client from 2.5.1 to 2.6.1 in /backend [`#745`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/745) +- Bump nuxt from 2.8.0 to 2.8.1 in /webapp [`#748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/748) +- Bump node from 12.3.1-alpine to 12.4-alpine in /webapp [`#749`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/749) +- Bump node from 12.3.1-alpine to 12.4-alpine in /backend [`#750`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/750) +- Add date relative date on comments [`#731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/731) +- DISABLED_MIDDLEWARES only set outside production [`#735`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/735) +- 🍰 release contribution again [`#736`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/736) +- Bump tippy.js from 4.3.1 to 4.3.2 in /webapp [`#733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/733) +- 🍰 2019/kw22/refactor_backend_structure [`#724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/724) +- Bump tiptap-extensions from 1.20.1 to 1.20.2 in /webapp [`#721`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/721) +- User can not anymore delete Comments of others [`#729`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/729) +- Don't remove middlewares in production [`#725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/725) +- Delete Comment [`#609`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/609) +- Bump apollo-server from 2.5.1 to 2.6.1 in /backend [`#718`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/718) +- Deploy maintenance worker to dockerhub automatically with smaller split size [`#714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/714) +- Bump apollo-server-testing from 2.5.1 to 2.6.1 in /backend [`#719`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/719) +- Fix upload large file sizes bug [`#698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/698) +- Bump node from 10-alpine to 12.3.1-alpine in /webapp [`#712`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/712) +- Bump prettier from 1.14.3 to 1.17.1 in /webapp [`#663`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/663) +- 🍰 2019/kw22/alpha_data_import_status_schema_split [`#703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/703) +- Bump nuxt from 2.7.1 to 2.8.0 in /webapp [`#711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/711) +- Upgrade @nuxt/axios [`#707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/707) +- Bump apollo-server-testing from 2.5.0 to 2.5.1 in /backend [`#708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/708) +- 🍰 Fix update incompatibility [`#701`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/701) +- Bump fuse.js from 3.4.4 to 3.4.5 in /webapp [`#704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/704) +- 🍰 Avoid deletion of entire namespace by accident [`#702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/702) +- Add logo as default avatar background image [`#706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/706) +- Bump @nuxtjs/axios from 5.5.2 to 5.5.3 in /webapp [`#710`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/710) +- Bump apollo-server from 2.5.0 to 2.5.1 in /backend [`#709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/709) +- Bump node from 10-alpine to 12.3.1-alpine in /backend [`#713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/713) +- Bump prettier from 1.14.3 to 1.17.1 in /backend [`#664`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/664) +- Fix user avatar jumping on upload [`#700`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/700) +- Fix placeholder text not translating bug [`#695`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/695) +- 🍰 2019/kw22/alpha_data_import [`#697`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/697) +- Fix duplicate tags by using the name as the id [`#662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/662) +- Run coverage only if requested [`#696`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/696) +- 🍰 2019/kw22/alpha_data_export [`#694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/694) +- 689 fix broken image urls after upload [`#693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/693) +- Fix edit field render bug(CommentForm) [`#690`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/690) +- Bump eslint-plugin-import from 2.17.2 to 2.17.3 in /backend [`#676`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/676) +- Bump neo4j-driver from 1.7.4 to 1.7.5 [`#675`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/675) +- Bump @vue/cli-shared-utils from 3.7.0 to 3.8.0 in /webapp [`#679`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/679) +- Use our own fork to workaround #600 for now [`#684`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/684) +- Bump express from 4.17.0 to 4.17.1 in /backend [`#674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/674) +- More descriptive minikube setup instructions [`#585`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/585) +- User profile image uploads [`#605`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/605) +- Image upload backend implementation [`#636`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/636) +- Bump nodemon from 1.19.0 to 1.19.1 in /backend [`#678`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/678) +- Bump nodemon from 1.19.0 to 1.19.1 in /webapp [`#680`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/680) +- Bump @nuxtjs/axios from 5.5.1 to 5.5.2 in /webapp [`#681`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/681) +- Bump express from 4.17.0 to 4.17.1 in /webapp [`#682`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/682) +- Bump eslint-plugin-import from 2.17.2 to 2.17.3 in /webapp [`#683`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/683) +- Bump graphql from 14.3.0 to 14.3.1 in /webapp [`#670`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/670) +- Bump eslint-plugin-jest from 22.5.1 to 22.6.4 in /webapp [`#671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/671) +- [Security] Bump tar from 2.2.1 to 2.2.2 in /webapp [`#673`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/673) +- Bump eslint-plugin-node from 9.0.1 to 9.1.0 in /webapp [`#669`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/669) +- Bump @nuxtjs/axios from 5.5.0 to 5.5.1 in /webapp [`#668`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/668) +- Bump cypress from 3.3.0 to 3.3.1 [`#667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/667) +- Bump graphql from 14.3.0 to 14.3.1 in /backend [`#666`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/666) +- Bump eslint-plugin-node from 9.0.1 to 9.1.0 in /backend [`#665`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/665) +- Bump tiptap-extensions from 1.19.10 to 1.20.1 in /webapp [`#661`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/661) +- Bump @babel/preset-env from 7.4.4 to 7.4.5 in /webapp [`#655`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/655) +- Bump @babel/core from 7.4.4 to 7.4.5 in /webapp [`#653`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/653) +- Bump apollo-client from 2.5.1 to 2.6.0 in /webapp [`#654`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/654) +- Bump tiptap from 1.19.8 to 1.20.1 in /webapp [`#660`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/660) +- Bump @nuxtjs/axios from 5.4.1 to 5.5.0 in /webapp [`#659`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/659) +- Bump cypress-plugin-retries from 1.2.1 to 1.2.2 [`#658`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/658) +- Bump @babel/preset-env from 7.4.4 to 7.4.5 in /backend [`#649`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/649) +- Bump @babel/node from 7.2.2 to 7.4.5 in /backend [`#648`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/648) +- Bump @babel/core from 7.4.4 to 7.4.5 in /backend [`#646`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/646) +- Bump apollo-cache-inmemory from 1.5.1 to 1.6.0 in /backend [`#645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/645) +- Bump eslint-plugin-jest from 22.5.1 to 22.6.4 in /backend [`#657`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/657) +- 🍰 2019/kw20/fix_lint_rules_and_vscode [`#625`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/625) +- Bump tiptap-extensions from 1.19.8 to 1.19.10 in /webapp [`#640`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/640) +- Bump neo4j-graphql-js from 2.6.0 to 2.6.1 in /backend [`#639`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/639) +- Change ds-avatar size to x-large [`#644`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/644) +- 🍰 2019/kw20/fix_post_card_design [`#622`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/622) +- 🍰 2019/kw21/github_templates_update [`#633`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/633) +- Bump tiptap from 1.19.3 to 1.19.8 in /webapp [`#637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/637) +- Bump tiptap-extensions from 1.19.4 to 1.19.8 in /webapp [`#630`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/630) +- Bump cypress from 3.2.0 to 3.3.0 [`#629`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/629) +- Bump cypress-cucumber-preprocessor from 1.11.0 to 1.11.2 [`#628`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/628) +- Fix wrong screenshot in kubernetes docs [`#616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/616) +- Refactor to use <img> instead of <hc-image> component for images [`#626`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/626) +- Bump node-fetch from 2.5.0 to 2.6.0 in /backend [`#617`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/617) +- Bump express from 4.16.4 to 4.17.0 in /backend [`#618`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/618) +- Bump express from 4.16.4 to 4.17.0 in /webapp [`#619`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/619) +- Bump eslint-config-prettier from 4.2.0 to 4.3.0 in /webapp [`#620`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/620) +- Bump @nuxtjs/apollo from 4.0.0-rc4.1 to 4.0.0-rc4.2 in /webapp [`#621`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/621) +- Bump tiptap-extensions from 1.19.2 to 1.19.4 in /webapp [`#610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/610) +- Bump tiptap from 1.19.2 to 1.19.3 in /webapp [`#611`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/611) +- Bump neo4j-graphql-js from 2.4.2 to 2.6.0 in /backend [`#524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/524) +- Update CONTRIBUTING.md with codereview notes [`#612`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/612) +- Bump nuxt from 2.6.3 to 2.7.1 in /webapp [`#607`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/607) +- Bump codecov from 3.4.0 to 3.5.0 [`#606`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/606) +- Docs 354 kubernetes cron job for backups [`#573`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/573) +- Docs update https configuration [`#608`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/608) +- Bump tiptap from 1.19.0 to 1.19.2 in /webapp [`#602`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/602) +- Bump cypress-plugin-retries from 1.2.0 to 1.2.1 [`#603`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/603) +- Bump tiptap-extensions from 1.19.1 to 1.19.2 in /webapp [`#601`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/601) +- Bump @nuxtjs/apollo from 4.0.0-rc4 to 4.0.0-rc4.1 in /webapp [`#604`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/604) +- Bump eslint-plugin-prettier from 3.0.1 to 3.1.0 in /webapp [`#598`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/598) +- Refactoring validation middleware [`#596`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/596) +- Revert logout.vue [`#594`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/594) +- Bump tiptap-extensions from 1.17.0 to 1.19.1 in /webapp [`#597`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/597) +- Bump tiptap from 1.17.0 to 1.19.0 in /webapp [`#592`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/592) +- Bump apollo-server-testing from 2.4.8 to 2.5.0 in /backend [`#567`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/567) +- Bump graphql from 14.2.1 to 14.3.0 in /backend [`#566`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/566) +- Delete posts [`#595`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/595) +- Write component tests for CommentForm.vue [`#556`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/556) +- Update ds-avatar size to use small [`#587`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/587) +- 2019/kw15/change password strength [`#551`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/551) +- 296 image component [`#499`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/499) +- Bump @human-connection/styleguide from 0.5.15 to 0.5.17 in /webapp [`#564`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/564) +- Bump codecov from 3.3.0 to 3.4.0 [`#580`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/580) +- Bump tippy.js from 4.3.0 to 4.3.1 in /webapp [`#579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/579) +- Revert tiptap upgrade [`#575`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/575) +- 2019/kw15/user can change its username to emptystring [`#478`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/478) +- Delete SocialMedia [`#535`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/535) +- 2019/kw19/codecov [`#574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/574) +- 2019/kw19/codecov [`#569`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/569) +- Bump graphql from 14.2.1 to 14.3.0 in /webapp [`#565`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/565) +- Bump apollo-server from 2.4.8 to 2.5.0 in /backend [`#568`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/568) +- Prevent `argument list too long` error [`#562`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/562) +- Performant import of production data [`#529`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/529) +- Bump jest from 24.7.1 to 24.8.0 in /backend [`#544`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/544) +- Bump eslint-plugin-node from 8.0.1 to 9.0.1 in /backend [`#543`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/543) +- Bump babel-jest from 24.7.1 to 24.8.0 in /backend [`#547`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/547) +- Bump jest from 24.7.1 to 24.8.0 in /webapp [`#550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/550) +- Bump dotenv from 7.0.0 to 8.0.0 in /backend [`#540`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/540) +- Bump tiptap-extensions from 1.17.0 to 1.18.1 in /webapp [`#559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/559) +- [WIP] Rerun moderation/report tests on failure [`#512`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/512) +- Add authorship to comments at creation [`#536`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/536) +- Bump node-fetch from 2.4.1 to 2.5.0 in /backend [`#530`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/530) +- Bump dotenv from 7.0.0 to 8.0.0 [`#538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/538) +- Bump tiptap from 1.17.0 to 1.18.0 in /webapp [`#558`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/558) +- Bump node-sass from 4.11.0 to 4.12.0 in /webapp [`#515`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/515) +- Bump helmet from 3.16.0 to 3.18.0 in /backend [`#546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/546) +- Bump neo4j-driver from 1.7.3 to 1.7.4 [`#548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/548) +- Add test coverage [`#504`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/504) +- [WIP] 451 lokalise unlocalised texts [`#452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/452) +- Bump neo4j from 3.5.4 to 3.5.5 in /neo4j [`#523`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/523) +- Bump nodemon from 1.18.11 to 1.19.0 in /webapp [`#531`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/531) +- Bump nodemon from 1.18.11 to 1.19.0 in /backend [`#532`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/532) +- Bump graphql-shield from 5.3.4 to 5.3.5 in /backend [`#539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/539) +- Bump neo4j-driver from 1.7.3 to 1.7.4 in /backend [`#545`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/545) +- Bump babel-jest from 24.7.1 to 24.8.0 in /webapp [`#549`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/549) +- Unexpose irrelevant port 8080 [`#526`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/526) +- Bump sanitize-html from 1.20.0 to 1.20.1 in /backend [`#507`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/507) +- Bump tiptap-extensions from 1.16.2 to 1.17.0 in /webapp [`#527`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/527) +- Bump @babel/preset-env from 7.4.3 to 7.4.4 in /webapp [`#513`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/513) +- Bump tiptap from 1.16.2 to 1.17.0 in /webapp [`#528`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/528) +- Bump nuxt from 2.6.2 to 2.6.3 in /webapp [`#505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/505) +- Bump @vue/cli-shared-utils from 3.6.0 to 3.7.0 in /webapp [`#514`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/514) +- Bump node-fetch from 2.3.0 to 2.4.1 in /backend [`#521`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/521) +- Bump @babel/cli from 7.4.3 to 7.4.4 in /backend [`#518`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/518) +- Bump eslint-config-prettier from 4.1.0 to 4.2.0 in /webapp [`#506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/506) +- Bump @babel/core from 7.4.3 to 7.4.4 in /backend [`#516`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/516) +- Bump @babel/register from 7.4.0 to 7.4.4 in /backend [`#522`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/522) +- Bump eslint-plugin-jest from 22.5.0 to 22.5.1 in /backend [`#508`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/508) +- Add Comment Form [`#475`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/475) +- Fix? flaky cypress by waiting for <no-ssr> content [`#484`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/484) +- Bump @babel/core from 7.4.3 to 7.4.4 in /webapp [`#517`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/517) +- Bump v-tooltip from 2.0.1 to 2.0.2 in /webapp [`#519`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/519) +- Bump @babel/preset-env from 7.4.3 to 7.4.4 in /backend [`#520`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/520) +- Refactor maintenance-worker docker image [`#485`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/485) +- Bump eslint-plugin-jest from 22.4.1 to 22.5.0 in /backend [`#500`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/500) +- Bump tippy.js from 4.2.1 to 4.3.0 in /webapp [`#501`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/501) +- Bump tiptap-extensions from 1.15.0 to 1.16.2 in /webapp [`#496`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/496) +- [Security] Bump jquery from 3.3.1 to 3.4.0 in /backend [`#498`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/498) +- Add documentation for neo4j backups in kubernetes [`#492`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/492) +- Bump tiptap from 1.15.0 to 1.16.2 in /webapp [`#497`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/497) +- Bump graphql-shield from 5.3.3 to 5.3.4 in /backend [`#486`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/486) +- [WIP] Frontend implementation for notifications [`#439`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/439) +- [WIP] Generate a link for @-Mentionings [`#462`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/462) +- Bump eslint-plugin-import from 2.17.1 to 2.17.2 in /backend [`#476`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/476) +- Docs improve installation instructions [`#464`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/464) +- Try to fix flaky "ReportContent.feature" [`#477`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/477) +- refactor follow, unfollow, shout, unshout to custom mutations, but don't add date-time to relation yet [`#449`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/449) +- Bump nuxt from 2.6.1 to 2.6.2 in /webapp [`#472`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/472) +- Bump tiptap-extensions from 1.14.0 to 1.15.0 in /webapp [`#473`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/473) +- Disable cypress test recordings [`#471`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/471) +- Bump v-tooltip from 2.0.0 to 2.0.1 in /webapp [`#467`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/467) +- Bump @vue/cli-shared-utils from 3.5.1 to 3.6.0 in /webapp [`#468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/468) +- Bump graphql-shield from 5.3.2 to 5.3.3 in /backend [`#465`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/465) +- Bump eslint-plugin-import from 2.16.0 to 2.17.1 in /backend [`#466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/466) +- List socialMedia links [`#237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/237) +- Add instruction to configure local cypress config [`#460`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/460) +- Don't expose private RSA key [`#406`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/406) +- Fix emojis, remove duplicate link [`#459`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/459) +- Fix links to documentation [`#455`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/455) +- 342 merge documentation [`#387`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/387) +- 2019/kw15/design_differences_post [`#440`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/440) +- Bump v-tooltip from 2.0.0-rc.33 to 2.0.0 in /webapp [`#450`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/450) +- Bump neo4j from 3.5.3 to 3.5.4 in /backend/neo4j [`#448`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/448) +- Bump nuxt from 2.4.5 to 2.6.1 in /webapp [`#416`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/416) +- Bump @babel/cli from 7.2.3 to 7.4.3 in /backend [`#366`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/366) +- Bump neo4j from 3.5.0 to 3.5.3 in /backend/neo4j [`#196`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/196) +- 2019/kw15/hide_all_unfuctional_content [`#434`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/434) +- Mark a notification in the backend as read [`#445`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/445) +- Bump nodemon from 1.18.10 to 1.18.11 in /webapp [`#442`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/442) +- Disabling activityPub middleware again [`#444`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/444) +- Bump graphql-shield from 5.3.1 to 5.3.2 in /backend [`#446`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/446) +- 2019/kw15/new_post_button_position [`#438`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/438) +- 2019/kw15/Access_Settings_from_Profile_as_Owner [`#443`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/443) +- 2019/kw15/disabled_post_fix_disabled_border_z-index [`#437`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/437) +- Bump nodemon from 1.18.10 to 1.18.11 in /backend [`#441`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/441) +- 2019/kw15/post_make_menu_sticky [`#435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/435) +- Bump cheerio from 1.0.0-rc.2 to 1.0.0-rc.3 in /backend [`#431`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/431) +- Fixes #361 [`#362`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/362) +- Use github emojis if possible [`#396`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/396) +- Bump @babel/core from 7.4.0 to 7.4.3 in /webapp [`#368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/368) +- Bump jest from 24.7.0 to 24.7.1 in /webapp [`#390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/390) +- 350 query current users notifications [`#415`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/415) +- Bump babel-jest from 24.5.0 to 24.7.1 in /backend [`#388`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/388) +- Bump @babel/core from 7.4.0 to 7.4.3 in /backend [`#363`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/363) +- Bump babel-jest from 24.6.0 to 24.7.1 in /webapp [`#391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/391) +- Fix flaky cucumbers [`#383`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/383) +- Bump jest from 24.7.0 to 24.7.1 in /backend [`#389`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/389) +- Setup kubectl so it never expires [`#380`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/380) +- Bump @babel/preset-env from 7.4.2 to 7.4.3 in /backend [`#367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/367) +- Bump jest from 24.6.0 to 24.7.0 in /backend [`#364`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/364) +- Bump @babel/preset-env from 7.4.2 to 7.4.3 in /webapp [`#369`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/369) +- Bump jest from 24.6.0 to 24.7.0 in /webapp [`#371`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/371) +- 2019/kw14/GitHub issue pullrequest templates [`#360`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/360) +- Bump jest from 24.5.0 to 24.6.0 in /webapp [`#355`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/355) +- Bump babel-jest from 24.5.0 to 24.6.0 in /webapp [`#356`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/356) +- Bump jest from 24.5.0 to 24.6.0 in /backend [`#358`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/358) +- Bump eslint-plugin-promise from 4.0.1 to 4.1.1 in /backend [`#359`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/359) +- 2019/kw14/fixed_windows_build_docu_fixed_server_start_text [`#339`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/339) +- Bump slug from 1.0.0 to 1.1.0 in /backend [`#336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/336) +- Bump graphql from 14.2.0 to 14.2.1 in /webapp [`#333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/333) +- Bump graphql from 14.2.0 to 14.2.1 in /backend [`#334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/334) +- Bump eslint from 5.15.3 to 5.16.0 in /webapp [`#332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/332) +- Bump eslint from 5.15.3 to 5.16.0 in /backend [`#335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/335) +- Added PRIVATE_KEY_PASSPHRASE to needed env vars [`#244`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/244) +- Bump graphql from 14.1.1 to 14.2.0 in /webapp [`#301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/301) +- Bump graphql from 14.1.1 to 14.2.0 in /backend [`#300`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/300) +- Reduce Travis CI build log [`#320`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/320) +- 240 persistent links [`#248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/248) +- Another fix of activity pub implementation [`#249`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/249) +- Network Concept added [`#30`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/30) +- Order all resources by createdAt descending (as default) [`#239`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/239) +- Apparently this change got overlooked [`#246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/246) +- Trigger rollout with a change to spec.template [`#245`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/245) +- Should fix #234 + refactor domain to hostname [`#243`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/243) +- [User profile] Change password [`#233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/233) +- Bump @babel/core from 7.3.4 to 7.4.0 in /backend [`#194`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/194) +- Bump helmet from 3.15.1 to 3.16.0 in /backend [`#198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/198) +- Bump @vue/cli-shared-utils from 3.4.1 to 3.5.1 in /webapp [`#190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/190) +- Bump @babel/core from 7.3.4 to 7.4.0 in /webapp [`#195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/195) +- Bump vue-svg-loader from 0.11.0 to 0.12.0 in /webapp [`#200`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/200) +- Bump supertest from 4.0.0 to 4.0.2 in /backend [`#192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/192) +- Bump graphql-shield from 5.3.0 to 5.3.1 in /backend [`#197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/197) +- Bump @babel/preset-env from 7.3.4 to 7.4.2 in /webapp [`#228`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/228) +- 204 tests for rewarding badges [`#223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/223) +- Bump @babel/preset-env from 7.3.4 to 7.4.2 in /backend [`#227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/227) +- Bump eslint from 5.15.1 to 5.15.3 in /backend [`#191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/191) +- Bump eslint-config-prettier from 3.6.0 to 4.1.0 in /webapp [`#229`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/229) +- Bump apollo-link-http from 1.5.13 to 1.5.14 in /backend [`#224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/224) +- Bump eslint-plugin-jest from 22.3.2 to 22.4.1 in /backend [`#225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/225) +- Bump @babel/register from 7.0.0 to 7.4.0 in /backend [`#226`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/226) +- Bump eslint from 5.15.1 to 5.15.3 in /webapp [`#231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/231) +- Install kubectl and deploy automatically [`#202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/202) +- [WIP] Rollout deployment [`#186`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/186) +- Monorepo [`#184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/184) +- Bundle all activityPub in middleware [`#254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/254) +- [WIP] Activitypub Service integrated into Backend [`#212`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/212) +- Bump jsonwebtoken from 8.5.0 to 8.5.1 [`#253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/253) +- Bump jsonwebtoken from 8.5.0 to 8.5.1 [`#266`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/266) +- Bump Nitro-Backend from `158ac36` to `fd8cc3f` [`#177`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/177) +- Bump Nitro-Styleguide from `baf3134` to `3f7a00b` [`#178`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/178) +- Bump Nitro-Web from `0fae7a2` to `0c2a228` [`#180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/180) +- 37 full text search top bar [`#264`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/264) +- Deploy all the things [`#12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/12) +- Disable posts [`#208`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/208) +- Obfuscate user name and use a neutral replacement [`#246`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/246) +- [WIP] Disabled users are unauthenticated [`#242`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/242) +- Bump Nitro-Backend from `fd02679` to `158ac36` [`#176`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/176) +- Bump dotenv from 6.2.0 to 7.0.0 [`#241`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/241) +- Bump Nitro-Backend from `0dce83b` to `fd02679` [`#175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/175) +- Bump Nitro-Web from `a05b438` to `0fae7a2` [`#174`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/174) +- Bump jest from 24.1.0 to 24.5.0 [`#254`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/254) +- Bump babel-jest from 24.3.1 to 24.5.0 [`#255`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/255) +- Obfuscate disabled comments and posts by default [`#230`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/230) +- Bump jest from 24.3.1 to 24.4.0 [`#227`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/227) +- Bump supertest from 3.4.2 to 4.0.0 [`#225`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/225) +- Remove cypress from package.json [`#258`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/258) +- Bump eslint-plugin-jest from 22.3.0 to 22.3.2 [`#232`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/232) +- Bump babel-jest from 24.3.1 to 24.5.0 [`#231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/231) +- Change password in the backend [`#223`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/223) +- Add unauthenticated test to follow and shout [`#235`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/235) +- Bump Nitro-Styleguide from `e77754c` to `baf3134` [`#173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/173) +- Bump Nitro-Web from `4aa640a` to `a05b438` [`#172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/172) +- Bump Nitro-Backend from `28a37c2` to `0dce83b` [`#171`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/171) +- Update local-backend.md [`#27`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/27) +- Fix styleguide issues [`#253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/253) +- [WIP] 37 full text search top bar [`#152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/152) +- Update ReportModal to work with back end [`#233`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/233) +- Bump date-fns from 2.0.0-alpha.26 to 2.0.0-alpha.27 [`#112`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/112) +- Bump Nitro-Styleguide from `562fddb` to `e77754c` [`#170`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/170) +- Lokalise: Translations update [`#250`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/250) +- Update translations [`#240`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/240) +- Bump Nitro-Backend from `2d24fc9` to `28a37c2` [`#168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/168) +- Bump Nitro-Styleguide from `ce69fe5` to `ce20d5b` [`#166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/166) +- [WIP] Killing the past [`#164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/164) +- Get rid of resource type [`#213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/213) +- x [`#165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/165) +- [WIP] Remove portal [`#237`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/237) +- Bump vue-jest from 3.0.3 to 3.0.4 [`#220`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/220) +- Fix follow and shout status [`#201`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/201) +- Fix follow and shout status [`#213`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/213) +- Bump jest from 24.1.0 to 24.3.1 [`#215`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/215) +- Bump babel-jest from 24.1.0 to 24.3.1 [`#216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/216) +- Update .gitmodules [`#163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/163) +- Show all repos build stats [`#147`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/147) +- Bump Nitro-Backend from `2813de4` to `2d24fc9` [`#162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/162) +- Disable posts [`#207`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/207) +- Bump apollo-link-http from 1.5.11 to 1.5.12 [`#208`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/208) +- Bump Nitro-Web from `d857252` to `d848929` [`#159`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/159) +- Bump Nitro-Backend from `c5c62d2` to `2813de4` [`#160`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/160) +- Bump eslint from 5.15.0 to 5.15.1 [`#206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/206) +- Fix current build [`#203`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/203) +- Show disabled or deleted posts for moderators [`#192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/192) +- Bump eslint from 5.14.1 to 5.15.0 [`#202`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/202) +- [WIP] Write API test badge creation [`#195`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/195) +- Add to .gitignore `.DS_Store` [`#196`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/196) +- Add styleguide dev mode [`#197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/197) +- 194 stop decoding jwt on frontend [`#199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/199) +- Implement currentUser query [`#187`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/187) +- Extract Styleguide [`#182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/182) +- Bump eslint from 5.13.0 to 5.14.1 [`#165`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/165) +- Editor [`#153`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/153) +- [WIP] Editor [`#136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/136) +- Improved documentation for remote deployment [`#11`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/11) +- Fix wrong secret references [`#9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/9) +- Fix staging urls [`#10`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/10) +- Fix Digital Ocean Documentation [`#8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8) +- [WIP] Use factories in cucumber features [`#190`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/190) +- Added IntersectionObserver polyfill and fixed linting on login [`#192`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/192) +- [WIP] Start unit testing report feature [`#171`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/171) +- Refactor seeds and tests [`#164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/164) +- Added instruction for Docker install for Backend and little corrections [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25) +- Bump eslint from 5.14.0 to 5.14.1 [`#187`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/187) +- Bump Nitro-Backend from `13c6743` to `c5c62d2` [`#138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/138) +- Bump Nitro-Web from `9ba2200` to `d857252` [`#140`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/140) +- Bump API from `02dcc22` to `8f0edaf` [`#137`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/137) +- Bump WebApp from `e153eb6` to `d4917da` [`#134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/134) +- Bump @babel/core from 7.2.2 to 7.3.3 [`#184`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/184) +- Bump date-fns from 2.0.0-alpha.26 to 2.0.0-alpha.27 [`#132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/132) +- Bump eslint-plugin-vue from 5.1.0 to 5.2.1 [`#180`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/180) +- Bump eslint from 5.13.0 to 5.14.0 [`#185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/185) +- Update .travis.yml [`#183`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/183) +- Upgrade to Nuxt 2.4 [`#175`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/175) +- Upgrade dependencies [`#173`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/173) +- Certmanager [`#7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/7) +- Upgrade dependencies [`#149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/149) +- Bump Nitro-Backend from `8b8caae` to `13c6743` [`#131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/131) +- Bump Nitro-Web from `70aca85` to `9ba2200` [`#130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/130) +- Bump WebApp from `fa26d7c` to `e153eb6` [`#118`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/118) +- Add db migration worker deployment [`#4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4) +- Set titles for some tabs correctly and fixed wrong quotation marks (macOS encod… [`#23`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/23) +- Refactoring db migration worker [`#145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/145) +- Create CODE_OF_CONDUCT.md [`#139`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/139) +- Add instructions to get Neo4j Desktop to work [`#17`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/17) +- Fix certain configuration for Digital Ocean [`#5`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5) +- fix mobile friendliness for post [`#145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/145) +- Don't copy private SSH key into docker image [`#138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/138) +- Follow up on data import [`#127`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/127) +- Create CODE_OF_CONDUCT.md [`#149`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/149) +- Update APOC plugin version [`#21`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/21) +- Move troubleshoots to end; add install links for docker and minikube [`#131`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/131) +- Add instructions to expose/access the services [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3) +- Fix jwt quotes [`#150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/150) +- Add instructions to docs, fix kubectl commands [`#2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2) +- Update to the latest changes on the backend [`#18`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/18) +- Report Content [`#107`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/107) +- Report content [`#99`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/99) +- Provide documentation for `db-migration-worker` [`#16`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/16) +- Import remote mongodb in neo4j [`#115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/115) +- Add screenshot file for forking nitro-backend [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6) +- 106 authorization [`#109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/109) +- Comming Soon and Empty States [`#141`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/141) +- Change path of the file "edit-this-documentation.md" [`#14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/14) +- Upgrade styleguide [`#134`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/134) +- New file describes how to edit this documentation [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3) +- Change Summary [`#2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2) +- Add instructions for forking (or cloning) repo [`#1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1) +- Add a new section for how to change the documentation [`#10`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/10) +- Add a new section for how to change the documentation [`#9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/9) +- Locations & About Me [`#16`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/16) +- Locations & About Me [`#9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/9) +- Language menu [`#130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/130) +- fix #41 jwt strategy [`#104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/104) +- Multistage build docker [`#115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/115) +- Improve dropdown [`#129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/129) +- Don't run tests in /dist folder [`#108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/108) +- i18n pluralization [`#111`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/111) +- Add instructions for forking (or cloning) repo [`#7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/7) +- Lokalise: Translations update [`#123`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/123) +- Update README.md [`#100`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/100) +- FIX #49 capture error in readable format with try and catch [`#93`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/93) +- Login: Friendly error message if email is incorrect [`#88`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/88) +- Bump @babel/node from 7.2.0 to 7.2.2 [`#79`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/79) +- Bump @vue/test-utils from 1.0.0-beta.27 to 1.0.0-beta.28 [`#109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/109) +- Bump eslint-plugin-prettier from 3.0.0 to 3.0.1 [`#110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/110) +- added login credentials [`#2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2) +- Change db scripts to run nodemon instead of node [`#92`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/92) +- Bump eslint from 5.10.0 to 5.11.0 [`#103`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/103) +- Refactor login method and setup unit tests [`#100`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/100) +- [ImgBot] Optimize images [`#104`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/104) +- Integrate i18n [`#99`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/99) +- Update README.md [`#89`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/89) +- Fix 'audience must be a string or array' [`#84`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/84) +- Bump sanitize-html from 1.19.3 to 1.20.0 [`#82`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/82) +- added icons to usermenu [`#96`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/96) +- Bump apollo-link-http from 1.5.8 to 1.5.9 [`#81`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/81) +- Bump nodemon from 1.18.8 to 1.18.9 [`#78`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/78) +- Bump nodemon from 1.18.8 to 1.18.9 [`#94`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/94) +- Typo fixes [`#1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1) +- Bump apollo-server from 2.2.6 to 2.3.1 [`#75`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/75) +- Bump apollo-link-http from 1.5.7 to 1.5.8 [`#74`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/74) +- Add travis build status to README [`#91`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/91) +- Use build stage `builder` for backend [`#92`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/92) +- Add docker push script deployment [`#90`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/90) +- Reduce image size with multistage builds [`#72`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/72) +- Build application for production without nodemon [`#70`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/70) +- Use deployment script for docker images [`#77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/77) +- CI Improvements [`#59`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/59) +- Admin tags and categories [`#79`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/79) +- Admin tags and categories [`#62`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/62) +- Bump vue-jest from 3.0.1 to 3.0.2 [`#89`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/89) +- Docker ignore scripts folder, bash compatibility [`#66`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/66) +- Bump eslint from 5.9.0 to 5.10.0 [`#63`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/63) +- Bump date-fns from 2.0.0-alpha.25 to 2.0.0-alpha.26 [`#71`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/71) +- Bump slug from 0.9.2 to 0.9.3 [`#67`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/67) +- Bump eslint from 5.9.0 to 5.10.0 [`#82`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/82) +- Bump date-fns from 2.0.0-alpha.25 to 2.0.0-alpha.26 [`#88`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/88) +- Remove end-to-end tests [`#79`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/79) +- Bump @vue/test-utils from 1.0.0-beta.26 to 1.0.0-beta.27 [`#81`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/81) +- Bump nodemon from 1.18.7 to 1.18.8 [`#85`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/85) +- Bump nodemon from 1.18.7 to 1.18.8 [`#69`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/69) +- Bump graphql-shield from 4.1.1 to 4.1.2 [`#68`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/68) +- Run full stack tests in the repo [`#86`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/86) +- Add build status to README.md [`#76`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/76) +- Several updates on travis yml [`#84`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/84) +- Full stack tests with submodules and cypress [`#73`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/73) +- Setup integration testing with MochaJS [`#21`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/21) +- Bump node-sass from 4.10.0 to 4.11.0 [`#83`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/83) +- Split development config from production config [`#76`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/76) +- Fix refresh bug [`#80`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/80) +- No need to call xip.io anymore [`#78`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/78) +- Remove xip.io hack [`#61`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/61) +- Bind name to name instead of model [`#77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/77) +- Replace concurrently with npm-run-all [`#60`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/60) +- [WIP] Pin dependencies [`#58`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/58) +- Upgraded Styleguide [`#75`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/75) +- Bump neo4j-graphql-js from 2.0.0 to 2.0.1 [`#57`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/57) +- Bump neo4j from 3.4 to 3.5.0 [`#26`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/26) +- Tagged deployments [`#42`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/42) +- Bump neo4j-graphql-js from 1.0.5 to 2.0.0 [`#51`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/51) +- Add a missing discord link [`#56`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/56) +- Use the right db seed name [`#54`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/54) +- Bump sanitize-html from 1.19.2 to 1.19.3 [`#53`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/53) +- Copy+paste deployment configuration from backend [`#68`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/68) +- Preparation for integration testing [`#13`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/13) +- Bump dotenv from 6.1.0 to 6.2.0 [`#52`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/52) +- Bump sanitize-html from 1.19.1 to 1.19.2 [`#47`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/47) +- Run seeds and eslint on Travis CI [`#40`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/40) +- Bump eslint-plugin-vue from 4.7.1 to 5.0.0 [`#69`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/69) +- Add troubleshoot to kubernetes README [`#43`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/43) +- Add unseeder [`#15`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/15) +- adapt docs to styleguide integration [`#64`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/64) +- Integrate styleguide with hot reload [`#55`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/55) +- uppgraded packages [`#38`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/38) +- [ImgBot] Optimize images [`#62`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/62) +- Travis ci build [`#22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/22) +- updated packages for security and higher digits :) [`#61`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/61) +- Fix proxy reload issue [`#22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/22) +- updated kubernetes documentation - use humanconnection/nitro-backend [`#23`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/23) +- Fixed Badges Seeder and URL Fix Middleware [`#24`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/24) +- Update Seed Command in README.md [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25) +- Proxy API Requests [`#21`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/21) +- Add travis configuration [`#20`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/20) +- adjust user relation after changing the author relation in the backend [`#19`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/19) +- Seed the database with authentication [`#18`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/18) +- Fix container build with styleguide [`#18`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/18) +- Fix vuep package source [`#17`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/17) +- Update Babel & babel-node [`#20`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/20) +- Add Issue template and modify README [`#14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/14) +- Test and build server setup [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6) +- Kompose [`#12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/12) +- Delete .gitignored file .env [`#13`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/13) +- Add volumes to use docker for development [`#11`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/11) +- Expose neo4j-browser ports [`#10`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/10) +- Use xip.io trick for server/client side rendering [`#9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/9) +- Docker [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3) +- Update schema.graphql [`#8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8) +- Bump API from `da96078` to `4437261` [`#53`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/53) +- Custom Dockerfile to install apoc plugin in neo4j [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6) +- Add Installation with Docker [`#5`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5) +- Add README instructions to configure .env [`#1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/1) +- Replace fake email domain with example.org [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3) +- Add submodules to auto-update those by dependabot [`#24`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/24) +- Delete docker-compose.yml [`#23`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/23) +- Create .gitignore [`#22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/22) +- Update README.md [`#13`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/13) +- Fix #1616 [`#1616`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1616) +- Fix #1555 [`#1555`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1555) +- Merge pull request #1508 from Human-Connection/1505_remove_html_in_moderation_view [`#1505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1505) +- Fix #1506 [`#1506`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1506) +- Fix #1505 remove html [`#1505`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1505) +- Merge pull request #1479 from Human-Connection/1394-proper_pagination_implementation [`#1394`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1394) +- Fix #1394 [`#1394`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1394) +- Refactor seeds - no need for a factories server! [`#1427`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1427) +- Notifications query filters for deleted resources [`#1414`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1414) +- Fix #1333 [`#1333`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1333) +- Merge pull request #1314 from Human-Connection/1308-fix_broken_graphql_query [`#1308`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1308) +- Merge pull request #1316 from Human-Connection/1315-fix_unique_constraint_bug_when_merging_a_new_hashtag [`#1315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1315) +- Fix #1315 [`#1315`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1315) +- Fix #1308 [`#1308`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1308) +- Massive refactoring [`#1231`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/1231) +- Merge pull request #1041 from Human-Connection/822_fix_load_more_button [`#822`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/822) +- Fix #822 by updating the counts of the user [`#822`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/822) +- Implement prefix of image urls with a filter [`#820`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/820) +- Merge pull request #809 from Human-Connection/800_fix_broken_image_urls [`#800`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/800) +- Merge pull request #810 from Human-Connection/799_fix_badge_urls [`#799`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/799) +- Fix #799 [`#799`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/799) +- Merge pull request #807 from Human-Connection/470_re_enable_cypress_and_fix_builds_on_forks [`#470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/470) +- Fix #800 [`#800`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/800) +- Fix #470 [`#470`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/470) +- make post sticky - fixes https://github.com/Human-Connection/Human-Connection/issues/385 [`#385`](https://github.com/Human-Connection/Human-Connection/issues/385) +- hide all unfunctional content - fixes https://github.com/Human-Connection/Human-Connection/issues/429 [`#429`](https://github.com/Human-Connection/Human-Connection/issues/429) +- Merge pull request #362 from Human-Connection/quick-fix [`#361`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/361) +- Fixes #361 [`#361`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/361) +- Merge pull request #243 from Human-Connection/234-fix [`#234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/234) +- Should fix #234 + refactor domain to hostname [`#234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/234) +- Add unauthenticated test to follow and shout [`#234`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/234) +- Fix #106 [`#106`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/106) +- Merge pull request #104 from DakshMiglani/master [`#41`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/41) +- Merge pull request #93 from Gerald1614/500_error_on_login [`#49`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/49) +- Update schema.graphql [`#7`](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/7) +- Fix resolve function returns undefind [`657a5ac`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/657a5ac1f59861a205ddfc21bc72ff3801c8fad0) +- Change strategy, only build docker image [`d6b7374`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d6b7374ddbf497bdb5cbc935b88ae085c38b3237) +- Copy package.json from webapp/ [`f3a9996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f3a9996962e5dd8b2e365a032c1a5766fe666103) diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html new file mode 100644 index 000000000..d6d279e0f --- /dev/null +++ b/docs/CODE_OF_CONDUCT.html @@ -0,0 +1,565 @@ + + + + + + + Code of conduct · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ +
+ + + + + + + + +
+
+ +
+
+ +
+ +

Contributor Covenant Code of Conduct

+

Our Pledge

+

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

+

Our Standards

+

Examples of behavior that contributes to creating a positive environment include:

+
    +
  • Using welcoming and inclusive language
  • +
  • Being respectful of differing viewpoints and experiences
  • +
  • Gracefully accepting constructive criticism
  • +
  • Focusing on what is best for the community
  • +
  • Showing empathy towards other community members
  • +
+

Examples of unacceptable behavior by participants include:

+
    +
  • The use of sexualized language or imagery and unwelcome sexual attention or advances
  • +
  • Trolling, insulting/derogatory comments, and personal or political attacks
  • +
  • Public or private harassment
  • +
  • Publishing others' private information, such as a physical or electronic address, without explicit permission
  • +
  • Other conduct which could reasonably be considered inappropriate in a professional setting
  • +
+

Our Responsibilities

+

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

+

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

+

Scope

+

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

+

Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at devops@ocelot.social. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

+

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

+

Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at http://contributor-covenant.org/version/1/4

+ + +
+ +
+
+
+ +

results matching ""

+
    + +
    +
    + +

    No results matching ""

    + +
    +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/CONTRIBUTING.html b/docs/CONTRIBUTING.html new file mode 100644 index 000000000..560bb55ba --- /dev/null +++ b/docs/CONTRIBUTING.html @@ -0,0 +1,709 @@ + + + + + + + Contributing · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    + +
    + +
    + + + + + + + + +
    +
    + +
    +
    + +
    + +

    CONTRIBUTING

    +

    Thank you so much for thinking of contributing to the ocelot.social project! It's awesome you're here, we really appreciate it. :-)

    +

    Getting Set Up

    +

    Instructions for how to install all the necessary software and some code guidelines can be found in our main Readme or in our documentation.

    +

    To get you started we recommend that you join forces with a regular contributor. Please join our Discord instance to chat with developers or just get in touch directly on an issue on either Github or Zenhub:

    +

    We also can have pair programming sessions for you! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions.

    +

    Development Flow

    +

    We operate in two week sprints that are planned, estimated and prioritised on Zenhub. All issues are also linked to and synced with Github. Look for the good first issue label if you're not sure where to start!

    +

    We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use Discord for real-time communication.

    +

    This is how we solve bugs and implement features, step by step:

    +
      +
    1. We find an issue we want to work on, usually during the sprint planning but as an open source contributor this can happen at any time.
    2. +
    3. We communicate with the team to see if the issue is still available. (When you comment on an issue but don't get an answer there within 1-2 days try to mention @Ocelot-Social-Community/core-team to make sure we check in.)
    4. +
    5. We make sure we understand the issue in detail – what problem is it solving and how should it be implemented?
    6. +
    7. We assign ourselves to the issue and move it to In Progress on Zenhub.
    8. +
    9. We start working on it in a new branch and open a pull request prefixed with [WIP] (work in progress) to which we regularly push our changes.
    10. +
    11. When questions come up we clarify them with the team (directly in the issue on Github).
    12. +
    13. When we are happy with our work and our PR is passing all tests we remove the [WIP] from the PR description and ask for reviews (if you're not sure who to ask there is @Ocelot-Social-Community/core-team which pings all core developers).
    14. +
    15. We then incorporate the suggestions from the reviews into our work and once it has been approved it can be merged into master!
    16. +
    +

    Every pull request needs to:

    +
      +
    • fix an issue (if there is something you want to work on but there is no issue for it, create one first and discuss it with the team)
    • +
    • include tests for the code that is added or changed
    • +
    • pass all tests (linter, backend, webapp, code coverage, end-to-end)
    • +
    • be approved by at least 1 developer who is not the owner of the PR (when more than 10 files were changed it needs 2 approvals)
    • +
    +

    Contribution Flow For Open Source Contributors

    +

    See contributing in main README.md

    +

    The Team

    +

    There are many volunteers all around the world helping us build this network and without their contributions we wouldn't be where we are today. Big thank you to all of you!

    +

    You can talk to our core team on Discord. And on Github you will mostly run into our core developers:

    +
      +
    • Ulf (@ulfgebhardt)
    • +
    • Moriz (@Mogge)
    • +
    • Wolle (@Tirokk)
    • +
    • Alex (@ogerly)
    • +
    + +

    Meetings and Pair Programming Sessions

    +

    Times below refer to German Time – that's CET (GMT+1) in winter and CEST (GMT+2) in summer – because most ocelot.social Community core team members are living in Germany.

    +

    Daily standup

    +
      +
    • every Monday–Thursday 11:30 am (german time see above 👆🏼)
    • +
    • in our Discord Office Cube
    • +
    • all contributors welcome!
    • +
    • everybody shares what they are working on and asks for help if they are blocked
    • +
    + +

    Philosophy

    +

    We practice collective code ownership rather than strong code ownership, which means that:

    +
      +
    • developers can make contributions to other people's PRs (after checking in with them)
    • +
    • we avoid blocking because someone else isn't working, so we sometimes take over PRs from other developers
    • +
    • everyone should always push their code to branches so others can see it
    • +
    +

    We believe in open source contributions as a learning experience – everyone is welcome to join our team of volunteers and to contribute to the project, no matter their background or level of experience. To support your learning experience we founded the charity association busFaktor() e.V..

    +

    We use pair programming sessions as a tool for knowledge sharing. We can learn a lot from each other and only by sharing what we know and overcoming challenges together can we grow as a team and truly own this project collectively.

    +

    As a volunteer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you!

    + +

    Programming

    +

    Localization

    +

    Quotation Marks

    +

    The following characters are different from the programming quotation mark:

    +

    " or \"

    +

    Please copy and paste the following quotes for the languages:

    + +

    Docker – More Closely

    +

    Apple M1 Platform

    +

    *Attention: For using Docker commands in Apple M1 environments!*

    +

    Environment Variable For Apple M1 Platform

    +

    If you encounter trouble building the docker containers on an Apple M1 chip you can try to explicitly define the target platform docker builds and pulls images for:

    +
    # set env variable for your shell
    +$ export DOCKER_DEFAULT_PLATFORM=linux/amd64
    +
    +

    Or alternatively use a YAML docker compose overwrite file with platform: linux/amd64.

    +

    Analyzing Docker Builds

    +

    To analyze a Docker build, there is a wonderful tool called dive. Please sponsor if you're using it!

    +

    The dive build command is exactly the right one to fulfill what we are looking for. +We can use it just like the docker build command and get an analysis afterwards.

    +

    So, in our main folder, we use it in the following way:

    +
    # in main folder
    +$ dive build --target <layer-name> -t "ocelotsocialnetwork/<app-name>:local-<layer-name>" --build-arg BBUILD_DATE="<build-date>" --build-arg BBUILD_VERSION="<build-version>" --build-arg BBUILD_COMMIT="<build-commit>" <app-folder-name-or-dot>/
    +
    +

    The build arguments are optional.

    +

    For the specific applications, we use them as follows.

    +

    Backend

    +
    Production For Backend
    +
    # in main folder
    +$ dive build --target production -t "ocelotsocialnetwork/backend:local-production" backend/
    +
    +
    Development For Backend
    +
    # in main folder
    +$ dive build --target development -t "ocelotsocialnetwork/backend:local-development" backend/
    +
    +

    Webapp

    +
    Production For Webapp
    +
    # in main folder
    +$ dive build --target production -t "ocelotsocialnetwork/webapp:local-production" webapp/
    +
    +
    Development For Webapp
    +
    # in main folder
    +$ dive build --target development -t "ocelotsocialnetwork/webapp:local-development" webapp/
    +
    + + +
    + +
    +
    +
    + +

    results matching ""

    +
      + +
      +
      + +

      No results matching ""

      + +
      +
      +
      + +
      +
      + +
      + + + + + + + + + + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/DOCKER_MORE_CLOSELY.html b/docs/DOCKER_MORE_CLOSELY.html new file mode 100644 index 000000000..6f93a22a9 --- /dev/null +++ b/docs/DOCKER_MORE_CLOSELY.html @@ -0,0 +1,530 @@ + + + + + + + Docker More Closely · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + + + + + + + + +
      + +
      + +
      + + + + + + + + +
      +
      + +
      +
      + +
      + +

      Docker More Closely

      + + +
      + +
      +
      +
      + +

      results matching ""

      +
        + +
        +
        + +

        No results matching ""

        + +
        +
        +
        + +
        +
        + +
        + + + + + + + + + + +
        + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/LICENSE.html b/docs/LICENSE.html new file mode 100644 index 000000000..568cc95c3 --- /dev/null +++ b/docs/LICENSE.html @@ -0,0 +1,535 @@ + + + + + + + License · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + +
        + +
        + +
        + + + + + + + + +
        +
        + +
        +
        + +
        + +

        LICENSE

        +

        MIT License

        +

        Copyright (c) 2018-2021 Ocelot.Social Community

        +

        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

        +

        The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

        +

        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

        + + +
        + +
        +
        +
        + +

        results matching ""

        +
          + +
          +
          + +

          No results matching ""

          + +
          +
          +
          + +
          +
          + +
          + + + + + + + + + + +
          + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/babel.config.json b/docs/babel.config.json new file mode 100644 index 000000000..2d91b3635 --- /dev/null +++ b/docs/babel.config.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "10" + } + } + ] + ] +} diff --git a/docs/backend/.codecov.yml b/docs/backend/.codecov.yml new file mode 100644 index 000000000..97bec0084 --- /dev/null +++ b/docs/backend/.codecov.yml @@ -0,0 +1,2 @@ +coverage: + range: "60...100" diff --git a/docs/backend/.dockerignore b/docs/backend/.dockerignore new file mode 100644 index 000000000..a0883bf4d --- /dev/null +++ b/docs/backend/.dockerignore @@ -0,0 +1,21 @@ +.vscode/ +.nyc_output/ +.github/ +.travis.yml +.graphqlconfig +.env + +Dockerfile +docker-compose*.yml + +./*.png +./*.log + +node_modules/ +build/ + +maintenance-worker/ +neo4j/ + +public/uploads/* +!.gitkeep diff --git a/docs/backend/.env.template b/docs/backend/.env.template new file mode 100644 index 000000000..c1742ef93 --- /dev/null +++ b/docs/backend/.env.template @@ -0,0 +1,34 @@ +DEBUG=true + +NEO4J_URI=bolt://localhost:7687 +NEO4J_USERNAME=neo4j +NEO4J_PASSWORD=letmein +GRAPHQL_URI=http://localhost:4000 +CLIENT_URI=http://localhost:3000 +SMTP_HOST= +SMTP_PORT= +SMTP_IGNORE_TLS=true +SMTP_USERNAME= +SMTP_PASSWORD= + +JWT_SECRET="b/&&7b78BF&fv/Vd" +JWT_EXPIRES="2y" +MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + +PRIVATE_KEY_PASSPHRASE="a7dsf78sadg87ad87sfagsadg78" + +SENTRY_DSN_BACKEND= +COMMIT= +PUBLIC_REGISTRATION=false +INVITE_REGISTRATION=true + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_ENDPOINT= +AWS_REGION= +AWS_BUCKET= + +EMAIL_DEFAULT_SENDER="devops@ocelot.social" +EMAIL_SUPPORT="devops@ocelot.social" + +CATEGORIES_ACTIVE=false diff --git a/docs/backend/.eslintrc.js b/docs/backend/.eslintrc.js new file mode 100644 index 000000000..cc5440d82 --- /dev/null +++ b/docs/backend/.eslintrc.js @@ -0,0 +1,219 @@ +module.exports = { + root: true, + env: { + // es6: true, + node: true, + }, + /* parserOptions: { + parser: 'babel-eslint' + },*/ + parser: '@typescript-eslint/parser', + plugins: ['prettier', '@typescript-eslint' /*, 'import', 'n', 'promise'*/], + extends: [ + 'standard', + // 'eslint:recommended', + 'plugin:prettier/recommended', + // 'plugin:import/recommended', + // 'plugin:import/typescript', + // 'plugin:security/recommended', + // 'plugin:@eslint-community/eslint-comments/recommended', + ], + settings: { + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + 'import/resolver': { + typescript: { + project: ['./tsconfig.json'], + }, + node: true, + }, + }, + /* rules: { + //'indent': [ 'error', 2 ], + //'quotes': [ "error", "single"], + // 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + > 'no-console': ['error'], + > 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + > 'prettier/prettier': ['error'], + }, */ + rules: { + 'no-console': 'error', + camelcase: 'error', + 'no-debugger': 'error', + 'prettier/prettier': [ + 'error', + { + htmlWhitespaceSensitivity: 'ignore', + }, + ], + // import + // 'import/export': 'error', + // 'import/no-deprecated': 'error', + // 'import/no-empty-named-blocks': 'error', + // 'import/no-extraneous-dependencies': 'error', + // 'import/no-mutable-exports': 'error', + // 'import/no-unused-modules': 'error', + // 'import/no-named-as-default': 'error', + // 'import/no-named-as-default-member': 'error', + // 'import/no-amd': 'error', + // 'import/no-commonjs': 'error', + // 'import/no-import-module-exports': 'error', + // 'import/no-nodejs-modules': 'off', + // 'import/unambiguous': 'error', + // 'import/default': 'error', + // 'import/named': 'error', + // 'import/namespace': 'error', + // 'import/no-absolute-path': 'error', + // 'import/no-cycle': 'error', + // 'import/no-dynamic-require': 'error', + // 'import/no-internal-modules': 'off', + // 'import/no-relative-packages': 'error', + // 'import/no-relative-parent-imports': ['error', { ignore: ['@/*'] }], + // 'import/no-self-import': 'error', + // 'import/no-unresolved': 'error', + // 'import/no-useless-path-segments': 'error', + // 'import/no-webpack-loader-syntax': 'error', + // 'import/consistent-type-specifier-style': 'error', + // 'import/exports-last': 'off', + // 'import/extensions': 'error', + // 'import/first': 'error', + // 'import/group-exports': 'off', + // 'import/newline-after-import': 'error', + // 'import/no-anonymous-default-export': 'error', + // 'import/no-default-export': 'error', + // 'import/no-duplicates': 'error', + // 'import/no-named-default': 'error', + // 'import/no-namespace': 'error', + // 'import/no-unassigned-import': 'error', + // 'import/order': [ + // 'error', + // { + // groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'], + // 'newlines-between': 'always', + // pathGroups: [ + // { + // pattern: '@?*/**', + // group: 'external', + // position: 'after', + // }, + // { + // pattern: '@/**', + // group: 'external', + // position: 'after', + // }, + // ], + // alphabetize: { + // order: 'asc' /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */, + // caseInsensitive: true /* ignore case. Options: [true, false] */, + // }, + // distinctGroup: true, + // }, + // ], + // 'import/prefer-default-export': 'off', + // n + // 'n/handle-callback-err': 'error', + // 'n/no-callback-literal': 'error', + // 'n/no-exports-assign': 'error', + // 'n/no-extraneous-import': 'error', + // 'n/no-extraneous-require': 'error', + // 'n/no-hide-core-modules': 'error', + // 'n/no-missing-import': 'off', // not compatible with typescript + // 'n/no-missing-require': 'error', + // 'n/no-new-require': 'error', + // 'n/no-path-concat': 'error', + // 'n/no-process-exit': 'error', + // 'n/no-unpublished-bin': 'error', + // 'n/no-unpublished-import': 'off', // TODO need to exclude seeds + // 'n/no-unpublished-require': 'error', + // 'n/no-unsupported-features': ['error', { ignores: ['modules'] }], + // 'n/no-unsupported-features/es-builtins': 'error', + // 'n/no-unsupported-features/es-syntax': 'error', + // 'n/no-unsupported-features/node-builtins': 'error', + // 'n/process-exit-as-throw': 'error', + // 'n/shebang': 'error', + // 'n/callback-return': 'error', + // 'n/exports-style': 'error', + // 'n/file-extension-in-import': 'off', + // 'n/global-require': 'error', + // 'n/no-mixed-requires': 'error', + // 'n/no-process-env': 'error', + // 'n/no-restricted-import': 'error', + // 'n/no-restricted-require': 'error', + // 'n/no-sync': 'error', + // 'n/prefer-global/buffer': 'error', + // 'n/prefer-global/console': 'error', + // 'n/prefer-global/process': 'error', + // 'n/prefer-global/text-decoder': 'error', + // 'n/prefer-global/text-encoder': 'error', + // 'n/prefer-global/url': 'error', + // 'n/prefer-global/url-search-params': 'error', + // 'n/prefer-promises/dns': 'error', + // 'n/prefer-promises/fs': 'error', + // promise + // 'promise/catch-or-return': 'error', + // 'promise/no-return-wrap': 'error', + // 'promise/param-names': 'error', + // 'promise/always-return': 'error', + // 'promise/no-native': 'off', + // 'promise/no-nesting': 'warn', + // 'promise/no-promise-in-callback': 'warn', + // 'promise/no-callback-in-promise': 'warn', + // 'promise/avoid-new': 'warn', + // 'promise/no-new-statics': 'error', + // 'promise/no-return-in-finally': 'warn', + // 'promise/valid-params': 'warn', + // 'promise/prefer-await-to-callbacks': 'error', + // 'promise/no-multiple-resolved': 'error', + // eslint comments + // '@eslint-community/eslint-comments/disable-enable-pair': ['error', { allowWholeFile: true }], + // '@eslint-community/eslint-comments/no-restricted-disable': 'error', + // '@eslint-community/eslint-comments/no-use': 'off', + // '@eslint-community/eslint-comments/require-description': 'off', + }, + overrides: [ + // only for ts files + { + files: ['*.ts', '*.tsx'], + extends: [ + // 'plugin:@typescript-eslint/recommended', + // 'plugin:@typescript-eslint/recommended-requiring-type-checking', + // 'plugin:@typescript-eslint/strict', + ], + rules: { + // allow explicitly defined dangling promises + // '@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }], + 'no-void': ['error', { allowAsStatement: true }], + // ignore prefer-regexp-exec rule to allow string.match(regex) + '@typescript-eslint/prefer-regexp-exec': 'off', + // this should not run on ts files: https://github.com/import-js/eslint-plugin-import/issues/2215#issuecomment-911245486 + 'import/unambiguous': 'off', + // this is not compatible with typeorm, due to joined tables can be null, but are not defined as nullable + '@typescript-eslint/no-unnecessary-condition': 'off', + }, + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + // this is to properly reference the referenced project database without requirement of compiling it + // eslint-disable-next-line camelcase + EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true, + }, + }, + { + files: ['*.spec.ts'], + plugins: ['jest'], + env: { + jest: true, + }, + rules: { + 'jest/no-disabled-tests': 'error', + 'jest/no-focused-tests': 'error', + 'jest/no-identical-title': 'error', + 'jest/prefer-to-have-length': 'error', + 'jest/valid-expect': 'error', + '@typescript-eslint/unbound-method': 'off', + // 'jest/unbound-method': 'error', + }, + }, + ], +}; diff --git a/docs/backend/.gitignore b/docs/backend/.gitignore new file mode 100644 index 000000000..833f7e34e --- /dev/null +++ b/docs/backend/.gitignore @@ -0,0 +1,13 @@ +node_modules/ +.env +.vscode +.idea +yarn-error.log +build/* +coverage.lcov +.nyc_output/ +public/uploads/* +!.gitkeep + +# Apple macOS folder attribute file +.DS_Store \ No newline at end of file diff --git a/docs/backend/.graphqlconfig b/docs/backend/.graphqlconfig new file mode 100644 index 000000000..ca328bc83 --- /dev/null +++ b/docs/backend/.graphqlconfig @@ -0,0 +1,3 @@ +{ + "schemaPath": "./src/schema.graphql" +} diff --git a/docs/backend/.nvmrc b/docs/backend/.nvmrc new file mode 100644 index 000000000..58b8c2a00 --- /dev/null +++ b/docs/backend/.nvmrc @@ -0,0 +1 @@ +v20.2.0 \ No newline at end of file diff --git a/docs/backend/.prettierrc.js b/docs/backend/.prettierrc.js new file mode 100644 index 000000000..e2cf91e91 --- /dev/null +++ b/docs/backend/.prettierrc.js @@ -0,0 +1,9 @@ + +module.exports = { + semi: false, + printWidth: 100, + singleQuote: true, + trailingComma: "all", + tabWidth: 2, + bracketSpacing: true +}; diff --git a/docs/backend/Dockerfile b/docs/backend/Dockerfile new file mode 100644 index 000000000..fc6c1f4b3 --- /dev/null +++ b/docs/backend/Dockerfile @@ -0,0 +1,103 @@ +################################################################################## +# BASE (Is pushed to DockerHub for rebranding) ################################### +################################################################################## +FROM node:20.2.0-alpine3.17 as base + +# ENVs +## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame +ENV DOCKER_WORKDIR="/app" +## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 +ARG BBUILD_DATE="1970-01-01T00:00:00.00Z" +ENV BUILD_DATE=$BBUILD_DATE +## We cannot do $(yarn run version)-${BUILD_NUMBER} here so we default to 0.0.0-0 +ARG BBUILD_VERSION="0.0.0-0" +ENV BUILD_VERSION=$BBUILD_VERSION +## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 +ARG BBUILD_COMMIT="0000000" +ENV BUILD_COMMIT=$BBUILD_COMMIT +## SET NODE_ENV +ENV NODE_ENV="production" +## App relevant Envs +ENV PORT="4000" + +# Labels +LABEL org.label-schema.build-date="${BUILD_DATE}" +LABEL org.label-schema.name="ocelot.social:backend" +LABEL org.label-schema.description="Backend of the Social Network Software ocelot.social" +LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md" +LABEL org.label-schema.url="https://ocelot.social" +LABEL org.label-schema.vcs-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/backend" +LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}" +LABEL org.label-schema.vendor="ocelot.social Community" +LABEL org.label-schema.version="${BUILD_VERSION}" +LABEL org.label-schema.schema-version="1.0" +LABEL maintainer="devops@ocelot.social" + +# Install Additional Software +## install: git +RUN apk --no-cache add git python3 make g++ + +# Settings +## Expose Container Port +EXPOSE ${PORT} + +## Workdir +RUN mkdir -p ${DOCKER_WORKDIR} +WORKDIR ${DOCKER_WORKDIR} + +################################################################################## +# DEVELOPMENT (Connected to the local environment, to reload on demand) ########## +################################################################################## +FROM base as development + +# We don't need to copy or build anything since we gonna bind to the +# local filesystem which will need a rebuild anyway + +# Run command +# (for development we need to execute yarn install since the +# node_modules are on another volume and need updating) +CMD /bin/sh -c "yarn install && yarn run dev" + +################################################################################## +# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ### +################################################################################## +FROM base as code + +# copy everything, but do not build. +COPY . . + +################################################################################## +# BUILD (Does contain all files and the compilate and is therefore bloated) ###### +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN /bin/sh -c "yarn run build" + +################################################################################## +# TEST ########################################################################### +################################################################################## +FROM build as test + +# Run command +CMD /bin/sh -c "yarn run dev" + +################################################################################## +# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) # +################################################################################## +FROM base as production + +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/build ./build +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +# Copy static files +# TODO - externalize the uploads so we can copy the whole folder +COPY --from=build ${DOCKER_WORKDIR}/public/img/ ./public/img/ +COPY --from=build ${DOCKER_WORKDIR}/public/providers.json ./public/providers.json +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/docs/backend/babel.config.json b/docs/backend/babel.config.json new file mode 100644 index 000000000..f36dbeadb --- /dev/null +++ b/docs/backend/babel.config.json @@ -0,0 +1,15 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "10" + } + } + ] + ], + "plugins": [ + "@babel/plugin-proposal-throw-expressions" + ] +} diff --git a/docs/backend/graphql.html b/docs/backend/graphql.html new file mode 100644 index 000000000..00ef4019c --- /dev/null +++ b/docs/backend/graphql.html @@ -0,0 +1,543 @@ + + + + + + + GraphQL · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + + + + + + + + +
          + +
          + +
          + + + + + + + + +
          +
          + +
          +
          + +
          + +

          GraphQL with Apollo

          +

          GraphQL is a data query language which provides an alternative to REST and ad-hoc web service architectures. It allows clients to define the structure of the data required, and exactly the same structure of the data is returned from the server.

          +

          GraphQL Playground

          +

          Middleware keeps resolvers clean

          +

          +

          A well-organized codebase is key for the ability to maintain and easily introduce changes into an app. Figuring out the right structure for your code remains a continuous challenge - especially as an application grows and more developers are joining a project.

          +

          A common problem in GraphQL servers is that resolvers often get cluttered with business logic, making the entire resolver system harder to understand and maintain.

          +

          GraphQL Middleware uses the middleware pattern (well-known from Express.js) to pull out repetitive code from resolvers and execute it before or after one of your resolvers is invoked. This improves code modularity and keeps your resolvers clean and simple.

          + + +
          + +
          +
          +
          + +

          results matching ""

          +
            + +
            +
            + +

            No results matching ""

            + +
            +
            +
            + +
            +
            + +
            + + + + + + + + + + + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/index.html b/docs/backend/index.html new file mode 100644 index 000000000..6c809f577 --- /dev/null +++ b/docs/backend/index.html @@ -0,0 +1,647 @@ + + + + + + + Backend · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + + +
            + +
            + +
            + + + + + + + + +
            +
            + +
            +
            + +
            + +

            Backend

            +

            Installation with Docker

            +

            Run the following command to install everything through docker.

            +

            The installation takes a bit longer on the first pass or on rebuild ...

            +
            # in main folder
            +$ docker-compose up
            +# or
            +# rebuild the containers for a cleanup
            +$ docker-compose up --build
            +
            +

            Wait a little until your backend is up and running at http://localhost:4000/.

            +

            Installation without Docker

            +

            For the local installation you need a recent version of +Node (>= v16.19.0). We are using +v19.4.0 and therefore we recommend to use the same version +(see +some known problems with more recent node versions). You can use the +node version manager nvm to switch +between different local Node versions:

            +
            # install Node
            +$ cd backend
            +$ nvm install v19.4.0
            +$ nvm use v19.4.0
            +
            +

            Install node dependencies with yarn:

            +
            # in main folder
            +$ cd backend
            +$ yarn install
            +# or just
            +$ yarn
            +# or just later on to use version of ".nvmrc" file
            +$ nvm use && yarn
            +
            +

            Copy Environment Variables:

            +
            # in backend/
            +$ cp .env.template .env
            +
            +

            Configure the new file according to your needs and your local setup. Make sure +a local Neo4J instance is up and running.

            +

            Start the backend for development with:

            +
            # in backend/
            +$ yarn run dev
            +
            +

            or start the backend in production environment with:

            +
            # in backend/
            +$ yarn run start
            +
            +

            For e-mail delivery, please configure at least SMTP_HOST and SMTP_PORT in +your .env configuration file.

            +

            Your backend is up and running at http://localhost:4000/ +This will start the GraphQL service (by default on localhost:4000) where you +can issue GraphQL requests or access GraphQL Playground in the browser. +More details about our GraphQL playground and how to use it with ocelot.social can be found here.

            +

            GraphQL Playground

            +

            Database Indexes and Constraints

            +

            Database indexes and constraints need to be created and upgraded when the database and the backend are running:

            +

            # in main folder while docker-compose is running
            +$ docker exec backend yarn run db:migrate init
            +
            +# only once: init admin user and create indexes and constraints in Neo4j database
            +# for development
            +$ docker compose exec backend yarn prod:migrate init
            +# in production mode use command
            +$ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
            +
            # in main folder with docker compose running
            +$ docker exec backend yarn run db:migrate up
            +
            # in folder backend/ while database is running
            +# make sure your database is running on http://localhost:7474/browser/
            +yarn run db:migrate init
            +
            # in backend/ with database running (In docker or local)
            +yarn run db:migrate up
            +

            +

            Seed Database

            +

            If you want your backend to return anything else than an empty response, you +need to seed your database:

            +

            In another terminal run:

            # in main folder while docker-compose is running
            +$ docker exec backend yarn run db:seed
            +

            To reset the database run:

            # in main folder while docker-compose is running
            +$ docker exec backend yarn run db:reset
            +# you could also wipe out your neo4j database and delete all volumes with:
            +$ docker-compose down -v
            +# if container is not running, run this command to set up your database indexes and constraints
            +$ docker exec backend yarn run db:migrate init
            +# And then upgrade the indexes and const
            +$ docker exec backend yarn run db:migrate up
            +

            Run:

            # in backend/ while database is running
            +$ yarn run db:seed
            +

            To reset the database run:

            # in backend/ while database is running
            +$ yarn run db:reset
            +

            +

            Data migrations

            +

            Although Neo4J is schema-less,you might find yourself in a situation in which +you have to migrate your data e.g. because your data modeling has changed.

            +

            Generate a data migration file:

            # in main folder while docker-compose is running
            +$ docker-compose exec backend yarn run db:migrate:create your_data_migration
            +# Edit the file in ./src/db/migrations/
            +

            To run the migration:

            # in main folder while docker-compose is running
            +$ docker exec backend yarn run db:migrate up
            +

            Generate a data migration file:

            # in backend/
            +$ yarn run db:migrate:create your_data_migration
            +# Edit the file in ./src/db/migrations/
            +

            To run the migration:

            # in backend/ while database is running
            +$ yarn run db:migrate up
            +

            +

            Testing

            +

            Beware: We have no multiple database setup at the moment. We clean the +database after each test, running the tests will wipe out all your data!

            +

            Run the unit tests:

            # in main folder while docker-compose is running
            +$ docker exec backend yarn run test
            +

            Run the unit tests:

            # in backend/ while database is running
            +$ yarn run test
            +

            + + +
            + +
            +
            +
            + +

            results matching ""

            +
              + +
              +
              + +

              No results matching ""

              + +
              +
              +
              + +
              +
              + +
              + + + + + + + + + + + + + + +
              + + +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/jest.config.js b/docs/backend/jest.config.js new file mode 100644 index 000000000..d1cc7bd3f --- /dev/null +++ b/docs/backend/jest.config.js @@ -0,0 +1,19 @@ +module.exports = { + verbose: true, + preset: 'ts-jest', + collectCoverage: true, + collectCoverageFrom: [ + '**/*.ts', + '!**/node_modules/**', + '!**/test/**', + '!**/build/**', + '!**/src/**/?(*.)+(spec|test).ts?(x)' + ], + coverageThreshold: { + global: { + lines: 67, + }, + }, + testMatch: ['**/src/**/?(*.)+(spec|test).ts?(x)'], + setupFilesAfterEnv: ['/test/setup.ts'] +} diff --git a/docs/backend/neo4j-graphql-js.html b/docs/backend/neo4j-graphql-js.html new file mode 100644 index 000000000..5b67623c3 --- /dev/null +++ b/docs/backend/neo4j-graphql-js.html @@ -0,0 +1,545 @@ + + + + + + + neo4j-graphql-js · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              +
              + + + + + + + + +
              + +
              + +
              + + + + + + + + +
              +
              + +
              +
              + +
              + +

              neo4j-graphql.js

              +

              We use an npm package called neo4j-graphql-js as a cypher query builder. This +library also generates resolvers for graphql queries, unless we implement them +ourselves.

              +

              Debugging

              +

              As you can see in their documentation +it is possible to log out the generated cypher statements. To do so, run the +backend like this:

              +
              DEBUG=neo4j-graphql-js yarn run dev
              +
              + + +
              + +
              +
              +
              + +

              results matching ""

              +
                + +
                +
                + +

                No results matching ""

                + +
                +
                +
                + +
                +
                + +
                + + + + + + + + + + + + + + +
                + + +
                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/package.json b/docs/backend/package.json new file mode 100644 index 000000000..9b5dde62e --- /dev/null +++ b/docs/backend/package.json @@ -0,0 +1,129 @@ +{ + "name": "ocelot-social-backend", + "version": "3.0.1", + "description": "GraphQL Backend for ocelot.social", + "repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social", + "author": "ocelot.social Community", + "license": "MIT", + "private": false, + "main": "src/index.ts", + "scripts": { + "__migrate": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations", + "prod:migrate": "migrate --migrations-dir ./build/src/db/migrations --store ./build/src/db/migrate/store.js", + "start": "node build/src/", + "build": "tsc && ./scripts/build.copy.files.sh", + "dev": "nodemon --exec ts-node src/ -e js,ts,gql", + "dev:debug": "nodemon --exec babel-node --inspect=0.0.0.0:9229 src/ -e js,ts,gql", + "lint": "eslint --max-warnings=0 --ext .js,.ts ./src", + "test": "cross-env NODE_ENV=test NODE_OPTIONS=--max-old-space-size=8192 jest --runInBand --coverage --forceExit --detectOpenHandles", + "db:clean": "ts-node src/db/clean.ts", + "db:reset": "yarn run db:clean", + "db:seed": "ts-node src/db/seed.ts", + "db:migrate": "yarn run __migrate --store ./src/db/migrate/store.ts", + "db:migrate:create": "yarn run __migrate --template-file ./src/db/migrate/template.ts --date-format 'yyyymmddHHmmss' create" + }, + "dependencies": { + "@babel/cli": "~7.8.4", + "@babel/core": "~7.9.0", + "@babel/node": "~7.8.7", + "@babel/plugin-proposal-throw-expressions": "^7.8.3", + "@babel/preset-env": "~7.9.5", + "@babel/register": "^7.9.0", + "@sentry/node": "^5.15.4", + "apollo-cache-inmemory": "~1.6.5", + "apollo-client": "~2.6.8", + "apollo-link-context": "~1.0.20", + "apollo-link-http": "~1.5.17", + "apollo-server": "~2.14.2", + "apollo-server-express": "^2.14.2", + "aws-sdk": "^2.652.0", + "babel-core": "~7.0.0-0", + "babel-eslint": "~10.1.0", + "babel-jest": "~25.2.6", + "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.3", + "dotenv": "~8.2.0", + "express": "^4.17.1", + "graphql": "^14.6.0", + "graphql-middleware": "~4.0.2", + "graphql-middleware-sentry": "^3.2.1", + "graphql-redis-subscriptions": "^2.2.1", + "graphql-shield": "~7.2.2", + "graphql-tag": "~2.10.3", + "helmet": "~7.0.0", + "ioredis": "^4.16.1", + "jsonwebtoken": "~8.5.1", + "languagedetect": "^2.0.0", + "linkifyjs": "~2.1.8", + "lodash": "~4.17.14", + "merge-graphql-schemas": "^1.7.8", + "metascraper": "^5.33.5", + "metascraper-audio": "^5.34.4", + "metascraper-author": "^5.33.5", + "metascraper-date": "^5.33.5", + "metascraper-description": "^5.33.5", + "metascraper-image": "^5.33.5", + "metascraper-lang": "^5.33.5", + "metascraper-lang-detector": "^4.10.2", + "metascraper-logo": "^5.33.5", + "metascraper-publisher": "^5.33.5", + "metascraper-soundcloud": "^5.34.4", + "metascraper-title": "^5.34.7", + "metascraper-url": "^5.34.2", + "metascraper-video": "^5.33.5", + "metascraper-youtube": "^5.33.5", + "migrate": "^2.0.0", + "mime-types": "^2.1.26", + "minimatch": "^3.0.4", + "mustache": "^4.2.0", + "neo4j-driver": "^4.0.2", + "neo4j-graphql-js": "^2.11.5", + "neode": "^0.4.9", + "node-fetch": "~2.6.1", + "nodemailer": "^6.4.4", + "nodemailer-html-to-text": "^3.2.0", + "request": "~2.88.2", + "sanitize-html": "~1.22.0", + "slug": "~6.0.0", + "subscriptions-transport-ws": "^0.9.19", + "trunc-html": "~1.1.2", + "uuid": "~8.3.2", + "validator": "^13.9.0", + "xregexp": "^4.3.0" + }, + "devDependencies": { + "@faker-js/faker": "7.6.0", + "@types/jest": "^27.0.2", + "@types/node": "^20.2.5", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "apollo-server-testing": "~2.11.0", + "chai": "~4.2.0", + "cucumber": "~6.0.5", + "eslint": "^8.37.0", + "eslint-config-prettier": "^8.8.0", + "eslint-config-standard": "^17.0.0", + "eslint-import-resolver-typescript": "^3.5.4", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-security": "^1.7.1", + "jest": "^27.2.4", + "nodemon": "~2.0.2", + "prettier": "^2.8.7", + "rosie": "^2.0.1", + "ts-jest": "^27.0.5", + "ts-node": "^10.9.1", + "typescript": "^4.9.4" + }, + "resolutions": { + "**/**/fs-capacitor": "^6.2.0", + "**/graphql-upload": "^11.0.0", + "nan": "2.17.0" + } +} diff --git a/docs/backend/public/.gitkeep b/docs/backend/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/backend/public/img/badges/fundraisingbox_de_airship.svg b/docs/backend/public/img/badges/fundraisingbox_de_airship.svg new file mode 100644 index 000000000..078dcf4f9 --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_airship.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_alienship.svg b/docs/backend/public/img/badges/fundraisingbox_de_alienship.svg new file mode 100644 index 000000000..e891c5fa9 --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_alienship.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_balloon.svg b/docs/backend/public/img/badges/fundraisingbox_de_balloon.svg new file mode 100644 index 000000000..6fc436d86 --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_balloon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_bigballoon.svg b/docs/backend/public/img/badges/fundraisingbox_de_bigballoon.svg new file mode 100644 index 000000000..e2650963a --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_bigballoon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_crane.svg b/docs/backend/public/img/badges/fundraisingbox_de_crane.svg new file mode 100644 index 000000000..4904c5ec5 --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_crane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_glider.svg b/docs/backend/public/img/badges/fundraisingbox_de_glider.svg new file mode 100644 index 000000000..0c15955de --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_glider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_helicopter.svg b/docs/backend/public/img/badges/fundraisingbox_de_helicopter.svg new file mode 100644 index 000000000..3a84e4466 --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_helicopter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/fundraisingbox_de_starter.svg b/docs/backend/public/img/badges/fundraisingbox_de_starter.svg new file mode 100644 index 000000000..99980560e --- /dev/null +++ b/docs/backend/public/img/badges/fundraisingbox_de_starter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_bear.svg b/docs/backend/public/img/badges/indiegogo_en_bear.svg new file mode 100644 index 000000000..43465a0e6 --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_bear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_panda.svg b/docs/backend/public/img/badges/indiegogo_en_panda.svg new file mode 100644 index 000000000..a2f211e85 --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_panda.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_rabbit.svg b/docs/backend/public/img/badges/indiegogo_en_rabbit.svg new file mode 100644 index 000000000..c8c0c9727 --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_rabbit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_racoon.svg b/docs/backend/public/img/badges/indiegogo_en_racoon.svg new file mode 100644 index 000000000..619cb75f1 --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_racoon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_rhino.svg b/docs/backend/public/img/badges/indiegogo_en_rhino.svg new file mode 100644 index 000000000..71c0eb1ad --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_rhino.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_tiger.svg b/docs/backend/public/img/badges/indiegogo_en_tiger.svg new file mode 100644 index 000000000..88583a472 --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_tiger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_turtle.svg b/docs/backend/public/img/badges/indiegogo_en_turtle.svg new file mode 100644 index 000000000..6b5431c2e --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_turtle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_whale.svg b/docs/backend/public/img/badges/indiegogo_en_whale.svg new file mode 100644 index 000000000..458e03b6d --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_whale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/indiegogo_en_wolf.svg b/docs/backend/public/img/badges/indiegogo_en_wolf.svg new file mode 100644 index 000000000..e4952d86f --- /dev/null +++ b/docs/backend/public/img/badges/indiegogo_en_wolf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/user_role_admin.svg b/docs/backend/public/img/badges/user_role_admin.svg new file mode 100644 index 000000000..101e7458d --- /dev/null +++ b/docs/backend/public/img/badges/user_role_admin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/user_role_developer.svg b/docs/backend/public/img/badges/user_role_developer.svg new file mode 100644 index 000000000..55d363c9a --- /dev/null +++ b/docs/backend/public/img/badges/user_role_developer.svg @@ -0,0 +1 @@ +</> \ No newline at end of file diff --git a/docs/backend/public/img/badges/user_role_moderator.svg b/docs/backend/public/img/badges/user_role_moderator.svg new file mode 100644 index 000000000..bb2e5fde6 --- /dev/null +++ b/docs/backend/public/img/badges/user_role_moderator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_bee.svg b/docs/backend/public/img/badges/wooold_de_bee.svg new file mode 100644 index 000000000..e716c6116 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_bee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_butterfly.svg b/docs/backend/public/img/badges/wooold_de_butterfly.svg new file mode 100644 index 000000000..6d2b83e31 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_butterfly.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_double_rainbow.svg b/docs/backend/public/img/badges/wooold_de_double_rainbow.svg new file mode 100644 index 000000000..406001188 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_double_rainbow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_end_of_rainbow.svg b/docs/backend/public/img/badges/wooold_de_end_of_rainbow.svg new file mode 100644 index 000000000..2ae24cb7b --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_end_of_rainbow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_flower.svg b/docs/backend/public/img/badges/wooold_de_flower.svg new file mode 100644 index 000000000..ffc4b3da4 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_flower.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_lifetree.svg b/docs/backend/public/img/badges/wooold_de_lifetree.svg new file mode 100644 index 000000000..5a89fa5f9 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_lifetree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_magic_rainbow.svg b/docs/backend/public/img/badges/wooold_de_magic_rainbow.svg new file mode 100644 index 000000000..74df95190 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_magic_rainbow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/img/badges/wooold_de_super_founder.svg b/docs/backend/public/img/badges/wooold_de_super_founder.svg new file mode 100644 index 000000000..b437f6383 --- /dev/null +++ b/docs/backend/public/img/badges/wooold_de_super_founder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/backend/public/providers.json b/docs/backend/public/providers.json new file mode 100644 index 000000000..ef9f04bff --- /dev/null +++ b/docs/backend/public/providers.json @@ -0,0 +1,257 @@ +[ + { + "provider_name": "Codepen", + "provider_url": "https:\/\/codepen.io", + "endpoints": [ + { + "schemes": [ + "http:\/\/codepen.io\/*", + "https:\/\/codepen.io\/*" + ], + "url": "http:\/\/codepen.io\/api\/oembed" + } + ] + }, + { + "provider_name": "DTube", + "provider_url": "https:\/\/d.tube\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/d.tube\/v\/*" + ], + "url": "https:\/\/api.d.tube\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Facebook (Post)", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/posts\/*", + "https:\/\/www.facebook.com\/photos\/*", + "https:\/\/www.facebook.com\/*\/photos\/*", + "https:\/\/www.facebook.com\/photo.php*", + "https:\/\/www.facebook.com\/photo.php", + "https:\/\/www.facebook.com\/*\/activity\/*", + "https:\/\/www.facebook.com\/permalink.php", + "https:\/\/www.facebook.com\/media\/set?set=*", + "https:\/\/www.facebook.com\/questions\/*", + "https:\/\/www.facebook.com\/notes\/*\/*\/*" + ], + "url": "https:\/\/www.facebook.com\/plugins\/post\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "Facebook (Video)", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/videos\/*", + "https:\/\/www.facebook.com\/video.php" + ], + "url": "https:\/\/www.facebook.com\/plugins\/video\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "Flickr", + "provider_url": "https:\/\/www.flickr.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.flickr.com\/photos\/*", + "http:\/\/flic.kr\/p\/*", + "https:\/\/*.flickr.com\/photos\/*", + "https:\/\/flic.kr\/p\/*" + ], + "url": "https:\/\/www.flickr.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "GIPHY", + "provider_url": "https:\/\/giphy.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/giphy.com\/gifs\/*", + "http:\/\/gph.is\/*", + "https:\/\/media.giphy.com\/media\/*\/giphy.gif" + ], + "url": "https:\/\/giphy.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Instagram", + "provider_url": "https:\/\/instagram.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/instagram.com\/p\/*", + "http:\/\/instagr.am\/p\/*", + "http:\/\/www.instagram.com\/p\/*", + "http:\/\/www.instagr.am\/p\/*", + "https:\/\/instagram.com\/p\/*", + "https:\/\/instagr.am\/p\/*", + "https:\/\/www.instagram.com\/p\/*", + "https:\/\/www.instagr.am\/p\/*" + ], + "url": "https:\/\/api.instagram.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Meetup", + "provider_url": "http:\/\/www.meetup.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/meetup.com\/*", + "https:\/\/www.meetup.com\/*", + "https:\/\/meetup.com\/*", + "http:\/\/meetu.ps\/*" + ], + "url": "https:\/\/api.meetup.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "MixCloud", + "provider_url": "https:\/\/mixcloud.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.mixcloud.com\/*\/*\/", + "https:\/\/www.mixcloud.com\/*\/*\/" + ], + "url": "https:\/\/www.mixcloud.com\/oembed\/" + } + ] + }, + { + "provider_name": "Reddit", + "provider_url": "https:\/\/reddit.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/reddit.com\/r\/*\/comments\/*\/*", + "https:\/\/www.reddit.com\/r\/*\/comments\/*\/*" + ], + "url": "https:\/\/www.reddit.com\/oembed" + } + ] + }, + { + "provider_name": "SlideShare", + "provider_url": "http:\/\/www.slideshare.net\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.slideshare.net\/*\/*", + "http:\/\/fr.slideshare.net\/*\/*", + "http:\/\/de.slideshare.net\/*\/*", + "http:\/\/es.slideshare.net\/*\/*", + "http:\/\/pt.slideshare.net\/*\/*" + ], + "url": "http:\/\/www.slideshare.net\/api\/oembed\/2", + "discovery": true + } + ] + }, + { + "provider_name": "SoundCloud", + "provider_url": "http:\/\/soundcloud.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/soundcloud.com\/*", + "https:\/\/soundcloud.com\/*" + ], + "url": "https:\/\/soundcloud.com\/oembed" + } + ] + }, + { + "provider_name": "Twitch", + "provider_url": "https:\/\/www.twitch.tv", + "endpoints": [ + { + "schemes": [ + "http:\/\/clips.twitch.tv\/*", + "https:\/\/clips.twitch.tv\/*", + "http:\/\/www.twitch.tv\/*", + "https:\/\/www.twitch.tv\/*", + "http:\/\/twitch.tv\/*", + "https:\/\/twitch.tv\/*" + ], + "url": "https:\/\/api.twitch.tv\/v4\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Twitter", + "provider_url": "http:\/\/www.twitter.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/twitter.com\/*\/status\/*", + "https:\/\/*.twitter.com\/*\/status\/*" + ], + "url": "https:\/\/publish.twitter.com\/oembed" + } + ] + }, + { + "provider_name": "Vimeo", + "provider_url": "https:\/\/vimeo.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vimeo.com\/*", + "https:\/\/vimeo.com\/album\/*\/video\/*", + "https:\/\/vimeo.com\/channels\/*\/*", + "https:\/\/vimeo.com\/groups\/*\/videos\/*", + "https:\/\/vimeo.com\/ondemand\/*\/*", + "https:\/\/player.vimeo.com\/video\/*" + ], + "url": "https:\/\/vimeo.com\/api\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "YouTube", + "provider_url": "https:\/\/www.youtube.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.youtube.com\/watch*", + "https:\/\/*.youtube.com\/v\/*", + "https:\/\/youtu.be\/*" + ], + "url": "https:\/\/www.youtube.com\/oembed", + "discovery": true + } + ] + } +] \ No newline at end of file diff --git a/docs/backend/public/uploads/.gitkeep b/docs/backend/public/uploads/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/backend/scripts/build.copy.files.sh b/docs/backend/scripts/build.copy.files.sh new file mode 100644 index 000000000..9d17f46ae --- /dev/null +++ b/docs/backend/scripts/build.copy.files.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# html files +mkdir -p build/src/middleware/helpers/email/templates/ +cp -r src/middleware/helpers/email/templates/*.html build/src/middleware/helpers/email/templates/ + +mkdir -p build/src/middleware/helpers/email/templates/en/ +cp -r src/middleware/helpers/email/templates/en/*.html build/src/middleware/helpers/email/templates/en/ + +mkdir -p build/src/middleware/helpers/email/templates/de/ +cp -r src/middleware/helpers/email/templates/de/*.html build/src/middleware/helpers/email/templates/de/ + +# gql files +mkdir -p build/src/schema/types/ +cp -r src/schema/types/*.gql build/src/schema/types/ + +mkdir -p build/src/schema/types/enum/ +cp -r src/schema/types/enum/*.gql build/src/schema/types/enum/ + +mkdir -p build/src/schema/types/scalar/ +cp -r src/schema/types/scalar/*.gql build/src/schema/types/scalar/ + +mkdir -p build/src/schema/types/type/ +cp -r src/schema/types/type/*.gql build/src/schema/types/type/ \ No newline at end of file diff --git a/docs/backend/snapshots/embeds/HumanConnectionOrg.html b/docs/backend/snapshots/embeds/HumanConnectionOrg.html new file mode 100644 index 000000000..67a7844d2 --- /dev/null +++ b/docs/backend/snapshots/embeds/HumanConnectionOrg.html @@ -0,0 +1,2667 @@ + + + + + + + +Human Connection - Startseite | +Facebook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                +
                +
                +
                +
                Gehe +zu:
                + +
                +
                +
                +
                +
                +
                +
                +
                + + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                Mehr von Human Connection auf Facebook +anzeigen
                + +
                +
                +
                +
                +
                +
                Mehr von Human Connection auf Facebook +anzeigen
                +
                +
                + +
                +
                +
                +
                +
                +
                + + +
                +
                +
                +
                +
                oder
                +
                +Neues Konto erstellen + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                Willkommen bei Human Connection
                +
                +
                Human Connection +ist ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk mit +Sitz in Weilheim-T...
                +
                +Mehr anzeigen
                +
                +
                +
                CommunityAlle +ansehen +
                +
                +
                +
                +
                +"Highlights
                +
                +
                24.407 Personen gefällt das
                +
                +
                +
                +
                +
                +
                +"Highlights
                +
                +
                25.652 Personen haben das abonniert
                +
                +
                +
                +
                +
                +
                +"Highlights
                +
                +
                72 Besuche
                +
                +
                +
                +
                +
                +
                InfoAlle ansehen +
                +
                +
                + +
                +
                +
                +
                +"Highlights
                +
                +
                Bahnhofstraße 11 (512,71 km)
                +73235 Weilheim an der Teck
                + +
                +
                +
                +
                +
                +
                +"Highlights
                +
                +
                01514 3804222
                +
                +
                +
                + +
                + +
                +
                +
                + +
                +
                +
                +
                +
                +"Highlights
                +
                +
                Preisklasse €
                +
                +
                +
                +
                + +
                +
                +
                +
                SeitentransparenzMehr +anzeigen +
                +
                +
                Facebook liefert +Informationen, mit denen du die Intention von Seiten besser +verstehst. Hier erfährst du mehr zu den Personen, die die Seiten +verwalten und Beiträge darin posten.
                +
                +
                +Seite erstellt – 21. Oktober 2015
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                Personen
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                Ähnliche +Seiten
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                + +
                Seiten, die +dieser Seite gefallen
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                Orte +Weilheim an der Teck +Human Connection
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                Beiträge +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +

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

                +
                +

                Wie kann Human Connection dabei helfen?

                +

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

                +
                +Mehr anzeigen
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +

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

                +

                Hier erfahrt ihr die Antwort:

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

                + + + +Wird geladen... + +

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

                + + + + + Baby Loves Cat + + +

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

                + + + +Wird geladen... + +

                + +
                +
                +
                + +
                + +
                +
                +
                +

                + + + +Wird geladen... + +

                + +
                +
                +
                +

                + Transkript +

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

                + + + +Wird geladen... + +

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

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

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

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

                +
                +
                +
                  +
                • +

                  + Kategorie +

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

                + Nächstes Video +

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

                + Hinzufügen +

                +
                +
                +

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

                + +
                +
                +
                + + + + + + + diff --git a/docs/backend/snapshots/embeds/pr3934.html b/docs/backend/snapshots/embeds/pr3934.html new file mode 100644 index 000000000..03d7c3ee5 --- /dev/null +++ b/docs/backend/snapshots/embeds/pr3934.html @@ -0,0 +1,5504 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feat: [WIP] 🍰 Rebranding And White-Labeling by Mogge · Pull Request #3934 · Ocelot-Social-Community/Ocelot-Social + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + Skip to content + + + + + + + + + +
                + +
                + + + + + +
                + + + +
                + + + + + + + + + +
                +
                +
                + + + + + + + + + + + + + + + + + +
                + +
                + +
                +

                + + + / + + Ocelot-Social + + +

                + + +
                + +
                  + +
                • +
                  + +
                  + + + Unwatch + + + +
                  + Notifications +
                  +
                  + + + + + + + +
                  +
                  +
                  + +
                  +
                • + +
                • +
                  +
                  + + +
                  +
                  + + +
                  + +
                • + +
                • +
                  +
                  + + + Fork + + + +
                  + +

                  Fork Ocelot-Social

                  +
                  + +
                  + +
                  +

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

                  +
                  +
                  + +
                  +
                  +
                  + + +
                • +
                + +
                + + +
                + + +
                +
                + + + +
                + + + + +
                + + +
                + + + + +
                +
                +
                +
                + + +
                + + Open with + + + + +
                +
                +
                +
                +
                +
                + + +
                +
                + + + +
                + +

                + + feat: [WIP] 🍰 Rebranding And White-Labeling + + #3934 +

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

                + feat: [WIP] 🍰 Rebranding And White-Labeling + #3934 +

                + +
                + + + wants to merge + 39 + commits into + + + + + +from + + + + + +
                +
                +
                +
                +
                +
                +
                +
                + + + + + + + +

                Conversation

                +
                + +
                + +
                +
                +
                + + +
                + + +
                + @Mogge + +
                + +
                +
                + + + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + + + +
                +

                + Pick your reaction +

                + + + +
                + + + + + + + + + + +
                +
                + +
                + + + + +
                + + + + + + Copy link + + + + + + + + + + + + Report content + + + +
                + +
                + +
                + + + + + + + + Member + + + + + +
                + +

                + + + @Mogge + + + + + Mogge + + + + + + commented + + + 6 days ago + + + + +

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

                cake Pullrequest

                +

                Have all the information for the brand in separate config files. Set these defaults to ocelot.social

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

                + The content you are editing has changed. + Please copy your edits and refresh the page. +

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

                Nothing to preview

                +
                +
                + +
                + +
                + + +
                + + +
                +
                + + +
                + +
                +
                +
                + +
                + + + + +
                + + + + +
                + +
                +
                +
                + +
                +
                + + roschaefer + + added 30 commits + + on Jun 4 + +
                +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Rename dockerhub organizations + + + + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 23ae569 + +
                +
                +
                +
                +
                ..plus get rid of obsolete prefix `nitro-`.
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 2c4c9ab + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + + +
                + +
                +
                + + +
                + + d7d31e0 + +
                +
                +
                +
                +
                …_on_production
                +
                +feat: Avoid new builds on base docker-compose.yml
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 9360181 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 73c1f3c + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Remove labels from Dockerfiles + + + + + + +
                + +
                + + +
                + +
                +
                + + +
                + + a741721 + +
                +
                +
                +
                +
                Version was out of date anyways
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + refactor: Image paths + + + + + + +
                + +
                + + +
                + +
                +
                + + +
                + + bc70e8b + +
                +
                +
                +
                +
                * removed obsolete images
                +* moved all overwritable images to a location webapp/static/img/custom/
                +* better names
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 0ee3a30 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 3a21622 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Replace example link + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 92fba41 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 063200b + +
                +
                +
                +
                +
                fix: #7
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 16c7be1 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 4ea0d65 + +
                +
                +
                +
                +
                This link is helpful but points to Human Connection, so unfortunately I
                +have to remove it.
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Parameterize links + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 387ea64 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + fix: Remove broken moreInfoURL + + + + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 193f977 + +
                +
                +
                +
                +
                The links specified in the locales were pointing to the English site and
                +were mostly broken anyways.
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Parameterize manifest + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 37b3014 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 36679da + +
                +
                +
                +
                +
                I removed it. We cannot parameterize localizations with absolute urls
                +properly.
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 3fa0723 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Add CI workflow + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 92920fe + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Fix image tags + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 811027f + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Run lint --fix + + + +
                + +
                + + +
                + +
                +
                + + +
                + + d171d78 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 0d5cf7a + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 4a91066 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Make four static pages + + + + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 77b0310 + +
                +
                +
                +
                +
                * imprint
                +* data privacy
                +* terms of service
                +* code of conduct
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + dd09dfa + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 9bb827a + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + Fix lint + + + +
                + +
                + + +
                + +
                +
                + + +
                + + 68c5f0d + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + a20aebc + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 1d98f58 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + +
                + + fix image path + + + +
                + +
                + + +
                + +
                +
                + + +
                + + d78e181 + +
                +
                +
                +
                + + +
                +
                +
                +
                + + +
                + + + + + +
                + +
                +
                +
                + +
                +
                + + roschaefer + and others + added 7 commits + + on Jun 16 + +
                +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + c2d9288 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 650b3ce + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @roschaefer +
                +
                + + + + +
                + + +
                + +
                +
                + + +
                + + 906ab2d + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @Mogge +
                +
                + + +
                + + merged conflicts + + + +
                + +
                + + +
                + +
                + +
                + + + + +
                + +
                + + +
                + + 5fc24a3 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @Mogge +
                +
                + + + + +
                + + +
                + +
                + +
                + + + + +
                + +
                + + +
                + + bd962bb + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @Mogge +
                +
                + + + + +
                + + +
                + +
                + +
                + + + + +
                + +
                + + +
                + + ecb0bb3 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @Mogge +
                +
                + + + + +
                + + +
                + +
                + +
                + + + + +
                + +
                + + +
                + + 128e1f0 + +
                +
                +
                +
                + + +
                +
                +
                +
                + + +
                + + + +
                + +
                +
                + +
                +
                + + + + @Tirokk +Tirokk + + + + + + + assigned + Mogge + + 4 days ago + +
                +
                + + +
                +
                + +
                +
                + + + + @Tirokk +Tirokk + + + + + +changed the title +feat: Rebranding and White-Labeling + +feat: [WIP] 🍰 Rebranding And White-Labeling + + + 4 days ago + +
                +
                + + + + +
                + + + +
                + +
                +
                +
                + +
                +
                + + Mogge + + added 2 commits + + 3 hours ago + +
                +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @Mogge +
                +
                + + +
                + + further rebranding + + + +
                + +
                + + +
                + +
                + +
                + + + + +
                + +
                + + +
                + + 5cfb735 + +
                +
                +
                +
                + + +
                +
                +
                +
                + +
                +
                + + +
                +
                +
                + +
                +
                + + @Mogge +
                +
                + + +
                + + define volumes + + + +
                + +
                + + +
                + +
                + +
                + + + + +
                + +
                + + +
                + + 78f9e20 + +
                +
                +
                +
                + + +
                +
                +
                +
                + + +
                + + + + + +
                +
                + +
                + + +
                + +
                + + + +
                + +

                Merge state

                +
                +

                Add more commits by pushing to the white-labeling branch on Ocelot-Social-Community/Ocelot-Social.

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

                + Review required +

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

                All checks have passed

                + 2 successful checks +
                + +
                +
                +
                + +
                + + + @github-actions + + + +
                + + CI / Continuous Integration (push) + + + Successful in 8m + +
                + +
                + + Details +
                + +
                +
                +
                + +
                + + + @travis-ci + + + +
                + + Travis CI - Branch + + + Successful in 20m + + — + Build Passed +
                + +
                + + Details +
                + +
                + +
                +
                + + +
                + + + Resolve conflicts + + +
                + +
                +

                This branch has conflicts that must be resolved

                + + Use the web editor or the to resolve conflicts. + + +
                +

                Conflicting files

                +
                + neo4j/Dockerfile +
                + +
                +
                + + + + +
                + + +
                + + +
                +
                + + + + + + + +
                +
                + + +

                + + or view + . +

                + + + + +

                Checkout via command line

                +

                + If you cannot merge a pull request automatically here, you have the option + of checking it out via command line to resolve conflicts and perform a + manual merge. +

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

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

                +
                +
                + + + +
                +
                git fetch origin
                +git checkout -b white-labeling origin/white-labeling
                +git merge master
                +
                + +

                Step 2: Merge the changes and update on GitHub.

                +
                +
                + + + +
                +
                git checkout master
                +git merge --no-ff white-labeling
                +git push origin master
                +
                +
                + +
                +
                + +
                +
                +
                + + + +
                + + @Mogge +
                +
                + +
                + + + +
                + +
                + + +
                + + +
                +
                + +
                + +
                + +
                + +
                + +
                + + +
                + +
                +
                +
                + + +
                + +
                + + + + + + +
                + + + +
                + +

                Couldn’t update branch

                +

                Oops, something went wrong.

                + +
                +
                + +
                + +
                +
                +
                + @Mogge +
                + +
                + +
                + +
                + + +
                +
                + + +
                + +
                + +
                + + + +
                + + + + + + + + + + + +
                + +
                + + + + + + + + + + + + + + + +
                + +
                + + + + + + + + + + + +
                + +
                + + + + + + + + + + +
                + + + + + + +
                + Select a reply + ctrl . +
                + + + + + +
                +
                + + +
                + + +
                + + + + + + + + + + + + + + + + + + + + + + + +
                +
                + +
                + + + + +
                + + + + + + + + + + + + +
                +
                + + + + + +
                + +
                +
                +
                + +
                +
                + + +
                +
                + +
                +
                +
                + +
                +
                +
                +
                + Remember, contributions to this repository should follow + its + contributing guidelines + and + code of conduct. +
                + + +
                + + ProTip! + Add comments to specific lines under Files changed. +
                +
                + + +
                +
                +
                + +
                +
                + + +
                + + + + + + + + + + + + + + +
                +
                + +
                + + + + Projects + + + +
                + Projects + +
                + + + + +
                +
                + + + + None yet + + +
                + + + + + + + +
                +
                + +
                + + + + Linked issues + + + +
                + Link an issue from this repository + +
                + + + + +
                +
                + + + +

                Successfully merging this pull request may close these issues.

                + +

                None yet

                + +
                +
                + + + + + +
                +
                +
                + 2 participants +
                + +
                +
                + + + +
                +
                + + + Lock conversation + + +
                +
                + +

                + Lock conversation on this pull request +

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

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

                +
                +
                +
                + +
                +
                +
                + + + + + + + + +
                + + + +
                +
                +
                + + + +
                + + +
                +
                + + +
                +
                + +
                + + + + + + +
                + + + You can’t perform that action at this time. +
                + + + + + + + + + + + + + +
                \ No newline at end of file diff --git a/docs/backend/src/config/emails.ts b/docs/backend/src/config/emails.ts new file mode 100644 index 000000000..34daaecb0 --- /dev/null +++ b/docs/backend/src/config/emails.ts @@ -0,0 +1,8 @@ +// this file is duplicated in `backend/src/config/` and `webapp/constants/` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ +export default { + SUPPORT_EMAIL: 'devops@ocelot.social', + MODERATION_EMAIL: 'devops@ocelot.social', + // ATTENTION: the following links have to be defined even for internal pages with full URLs as example like 'https://staging.ocelot.social/support', because they are used in e-mails! + ORGANIZATION_LINK: 'https://ocelot.social', + SUPPORT_LINK: 'https://ocelot.social', +} diff --git a/docs/backend/src/config/index.ts b/docs/backend/src/config/index.ts new file mode 100644 index 000000000..b6098df11 --- /dev/null +++ b/docs/backend/src/config/index.ts @@ -0,0 +1,111 @@ +import dotenv from 'dotenv' +import emails from './emails' +import metadata from './metadata' + +// Load env file +if (require.resolve) { + try { + dotenv.config({ path: require.resolve('../../.env') }) + } catch (error) { + // This error is thrown when the .env is not found + if (error.code !== 'MODULE_NOT_FOUND') { + throw error + } + } +} + +// Use Cypress env or process.env +declare let Cypress: any | undefined +const env = typeof Cypress !== 'undefined' ? Cypress.env() : process.env // eslint-disable-line no-undef + +const environment = { + NODE_ENV: env.NODE_ENV || process.env.NODE_ENV, + DEBUG: env.NODE_ENV !== 'production' && env.DEBUG, + TEST: env.NODE_ENV === 'test', + PRODUCTION: env.NODE_ENV === 'production', + // used for staging enviroments if 'PRODUCTION=true' and 'PRODUCTION_DB_CLEAN_ALLOW=true' + PRODUCTION_DB_CLEAN_ALLOW: env.PRODUCTION_DB_CLEAN_ALLOW === 'true' || false, // default = false + DISABLED_MIDDLEWARES: (env.NODE_ENV !== 'production' && env.DISABLED_MIDDLEWARES) || false, +} + +const required = { + MAPBOX_TOKEN: env.MAPBOX_TOKEN, + JWT_SECRET: env.JWT_SECRET, + PRIVATE_KEY_PASSPHRASE: env.PRIVATE_KEY_PASSPHRASE, +} + +const server = { + CLIENT_URI: env.CLIENT_URI || 'http://localhost:3000', + GRAPHQL_URI: env.GRAPHQL_URI || 'http://localhost:4000', + JWT_EXPIRES: env.JWT_EXPIRES || '2y', +} + +const smtp = { + SMTP_HOST: env.SMTP_HOST, + SMTP_PORT: env.SMTP_PORT, + SMTP_IGNORE_TLS: env.SMTP_IGNORE_TLS !== 'false', // default = true + SMTP_SECURE: env.SMTP_SECURE === 'true', + SMTP_USERNAME: env.SMTP_USERNAME, + SMTP_PASSWORD: env.SMTP_PASSWORD, +} + +const neo4j = { + NEO4J_URI: env.NEO4J_URI || 'bolt://localhost:7687', + NEO4J_USERNAME: env.NEO4J_USERNAME || 'neo4j', + NEO4J_PASSWORD: env.NEO4J_PASSWORD || 'neo4j', +} + +const sentry = { + SENTRY_DSN_BACKEND: env.SENTRY_DSN_BACKEND, + COMMIT: env.COMMIT, +} + +const redis = { + REDIS_DOMAIN: env.REDIS_DOMAIN, + REDIS_PORT: env.REDIS_PORT, + REDIS_PASSWORD: env.REDIS_PASSWORD, +} + +const s3 = { + AWS_ACCESS_KEY_ID: env.AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY: env.AWS_SECRET_ACCESS_KEY, + AWS_ENDPOINT: env.AWS_ENDPOINT, + AWS_REGION: env.AWS_REGION, + AWS_BUCKET: env.AWS_BUCKET, + S3_CONFIGURED: + env.AWS_ACCESS_KEY_ID && + env.AWS_SECRET_ACCESS_KEY && + env.AWS_ENDPOINT && + env.AWS_REGION && + env.AWS_BUCKET, +} + +const options = { + EMAIL_DEFAULT_SENDER: env.EMAIL_DEFAULT_SENDER, + SUPPORT_URL: emails.SUPPORT_LINK, + APPLICATION_NAME: metadata.APPLICATION_NAME, + ORGANIZATION_URL: emails.ORGANIZATION_LINK, + PUBLIC_REGISTRATION: env.PUBLIC_REGISTRATION === 'true' || false, + INVITE_REGISTRATION: env.INVITE_REGISTRATION !== 'false', // default = true + CATEGORIES_ACTIVE: process.env.CATEGORIES_ACTIVE === 'true' || false, +} + +// Check if all required configs are present +Object.entries(required).map((entry) => { + if (!entry[1]) { + throw new Error(`ERROR: "${entry[0]}" env variable is missing.`) + } + return entry +}) + +export default { + ...environment, + ...server, + ...required, + ...smtp, + ...neo4j, + ...sentry, + ...redis, + ...s3, + ...options, +} diff --git a/docs/backend/src/config/logos.ts b/docs/backend/src/config/logos.ts new file mode 100644 index 000000000..41b83b30c --- /dev/null +++ b/docs/backend/src/config/logos.ts @@ -0,0 +1,10 @@ +// this file is duplicated in `backend/src/config/logos` and `webapp/constants/logos.js` and replaced on rebranding +// this are the paths in the webapp +export default { + LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', + LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', + LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', + LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg', + LOGO_PASSWORD_RESET_PATH: '/img/custom/logo-squared.svg', + LOGO_MAINTENACE_RESET_PATH: '/img/custom/logo-squared.svg', +} diff --git a/docs/backend/src/config/metadata.ts b/docs/backend/src/config/metadata.ts new file mode 100644 index 000000000..282fcb655 --- /dev/null +++ b/docs/backend/src/config/metadata.ts @@ -0,0 +1,9 @@ +// this file is duplicated in `backend/src/config/metadata` and `webapp/constants/metadata.js` and replaced on rebranding +export default { + APPLICATION_NAME: 'ocelot.social', + APPLICATION_SHORT_NAME: 'ocelot', + APPLICATION_DESCRIPTION: 'ocelot.social Community Network', + COOKIE_NAME: 'ocelot-social-token', + ORGANIZATION_NAME: 'ocelot.social Community', + ORGANIZATION_JURISDICTION: 'City of Angels', +} diff --git a/docs/backend/src/constants/categories.ts b/docs/backend/src/constants/categories.ts new file mode 100644 index 000000000..6365d268a --- /dev/null +++ b/docs/backend/src/constants/categories.ts @@ -0,0 +1,102 @@ +// this file is duplicated in `backend/src/constants/metadata` and `webapp/constants/metadata.js` +export const CATEGORIES_MIN = 1 +export const CATEGORIES_MAX = 3 + +export const categories = [ + { + icon: 'networking', + name: 'networking', + description: 'Kooperation, Aktionsbündnisse, Solidarität, Hilfe', + }, + { + icon: 'home', + name: 'home', + description: 'Bauen, Lebensgemeinschaften, Tiny Houses, Gemüsegarten', + }, + { + icon: 'energy', + name: 'energy', + description: 'Öl, Gas, Kohle, Wind, Wasserkraft, Biogas, Atomenergie, ...', + }, + { + icon: 'psyche', + name: 'psyche', + description: 'Seele, Gefühle, Glück', + }, + { + icon: 'movement', + name: 'body-and-excercise', + description: 'Sport, Yoga, Massage, Tanzen, Entspannung', + }, + { + icon: 'balance-scale', + name: 'law', + description: 'Menschenrechte, Gesetze, Verordnungen', + }, + { + icon: 'finance', + name: 'finance', + description: 'Geld, Finanzsystem, Alternativwährungen, ...', + }, + { + icon: 'child', + name: 'children', + description: 'Familie, Pädagogik, Schule, Prägung', + }, + { + icon: 'mobility', + name: 'mobility', + description: 'Reise, Verkehr, Elektromobilität', + }, + { + icon: 'shopping-cart', + name: 'economy', + description: 'Handel, Konsum, Marketing, Lebensmittel, Lieferketten, ...', + }, + { + icon: 'peace', + name: 'peace', + description: 'Krieg, Militär, soziale Verteidigung, Waffen, Cyberattacken', + }, + { + icon: 'politics', + name: 'politics', + description: 'Demokratie, Mitbestimmung, Wahlen, Korruption, Parteien', + }, + { + icon: 'nature', + name: 'nature', + description: 'Tiere, Pflanzen, Landwirtschaft, Ökologie, Artenvielfalt', + }, + { + icon: 'science', + name: 'science', + description: 'Bildung, Hochschule, Publikationen, ...', + }, + { + icon: 'health', + name: 'health', + description: 'Medizin, Ernährung, WHO, Impfungen, Schadstoffe, ...', + }, + { + icon: 'media', + name: 'it-and-media', + description: + 'Nachrichten, Manipulation, Datenschutz, Überwachung, Datenkraken, AI, Software, Apps', + }, + { + icon: 'spirituality', + name: 'spirituality', + description: 'Religion, Werte, Ethik', + }, + { + icon: 'culture', + name: 'culture', + description: 'Kunst, Theater, Musik, Fotografie, Film', + }, + { + icon: 'miscellaneous', + name: 'miscellaneous', + description: '', + }, +] diff --git a/docs/backend/src/constants/groups.ts b/docs/backend/src/constants/groups.ts new file mode 100644 index 000000000..b1c305add --- /dev/null +++ b/docs/backend/src/constants/groups.ts @@ -0,0 +1,3 @@ +// this file is duplicated in `backend/src/constants/group` and `webapp/constants/group.js` +export const DESCRIPTION_WITHOUT_HTML_LENGTH_MIN = 50 // with removed HTML tags +export const DESCRIPTION_EXCERPT_HTML_LENGTH = 250 // with removed HTML tags diff --git a/docs/backend/src/constants/registration.ts b/docs/backend/src/constants/registration.ts new file mode 100644 index 000000000..a08be3521 --- /dev/null +++ b/docs/backend/src/constants/registration.ts @@ -0,0 +1,5 @@ +// this file is duplicated in `backend/src/config/metadata` and `webapp/constants/metadata.js` +export default { + NONCE_LENGTH: 5, + INVITE_CODE_LENGTH: 6, +} diff --git a/docs/backend/src/db/clean.ts b/docs/backend/src/db/clean.ts new file mode 100644 index 000000000..eac26036c --- /dev/null +++ b/docs/backend/src/db/clean.ts @@ -0,0 +1,17 @@ +import CONFIG from '../config' +import { cleanDatabase } from '../db/factories' + +if (CONFIG.PRODUCTION && !CONFIG.PRODUCTION_DB_CLEAN_ALLOW) { + throw new Error(`You cannot clean the database in a non-staging and real production environment!`) +} + +;(async function () { + try { + await cleanDatabase() + console.log('Successfully deleted all nodes and relations!') // eslint-disable-line no-console + process.exit(0) + } catch (err) { + console.log(`Error occurred deleting the nodes and relations (reset the db)\n\n${err}`) // eslint-disable-line no-console + process.exit(1) + } +})() diff --git a/docs/backend/src/db/compiler.ts b/docs/backend/src/db/compiler.ts new file mode 100644 index 000000000..8b09ac9c3 --- /dev/null +++ b/docs/backend/src/db/compiler.ts @@ -0,0 +1,2 @@ +const tsNode = require('ts-node') +module.exports = tsNode.register diff --git a/docs/backend/src/db/factories.ts b/docs/backend/src/db/factories.ts new file mode 100644 index 000000000..4ec34e289 --- /dev/null +++ b/docs/backend/src/db/factories.ts @@ -0,0 +1,301 @@ +import { v4 as uuid } from 'uuid' +import slugify from 'slug' +import { hashSync } from 'bcryptjs' +import { Factory } from 'rosie' +import { faker } from '@faker-js/faker' +import { getDriver, getNeode } from './neo4j' +import CONFIG from '../config/index' +import generateInviteCode from '../schema/resolvers/helpers/generateInviteCode' + +const neode = getNeode() + +const uniqueImageUrl = (imageUrl) => { + const newUrl = new URL(imageUrl, CONFIG.CLIENT_URI) + newUrl.search = `random=${uuid()}` + return newUrl.toString() +} + +export const cleanDatabase = async (options: any = {}) => { + const { driver = getDriver() } = options + const session = driver.session() + try { + await session.writeTransaction((transaction) => { + return transaction.run( + ` + MATCH (everything) + WHERE NOT 'Migration' IN labels(everything) + DETACH DELETE everything + `, + ) + }) + } finally { + session.close() + } +} + +Factory.define('category') + .attr('id', uuid) + .attr('icon', 'globe') + .attr('name', 'Global Peace & Nonviolence') + .after((buildObject, options) => { + return neode.create('Category', buildObject) + }) + +Factory.define('badge') + .attr('type', 'crowdfunding') + .attr('status', 'permanent') + .after((buildObject, options) => { + return neode.create('Badge', buildObject) + }) + +Factory.define('image') + .attr('url', faker.image.unsplash.imageUrl) + .attr('aspectRatio', 1.3333333333333333) + .attr('alt', faker.lorem.sentence) + .attr('type', 'image/jpeg') + .after((buildObject, options) => { + const { url: imageUrl } = buildObject + if (imageUrl) buildObject.url = uniqueImageUrl(imageUrl) + return neode.create('Image', buildObject) + }) + +Factory.define('basicUser') + .option('password', '1234') + .attrs({ + id: uuid, + name: faker.name.fullName, + password: '1234', + role: 'user', + termsAndConditionsAgreedVersion: '0.0.1', + termsAndConditionsAgreedAt: '2019-08-01T10:47:19.212Z', + allowEmbedIframes: false, + showShoutsPublicly: false, + sendNotificationEmails: true, + locale: 'en', + }) + .attr('slug', ['slug', 'name'], (slug, name) => { + return slug || slugify(name, { lower: true }) + }) + .attr('encryptedPassword', ['password'], (password) => { + return hashSync(password, 10) + }) + +Factory.define('userWithoutEmailAddress') + .extend('basicUser') + .option('about', faker.lorem.paragraph) + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('userWithAboutNull') + .extend('basicUser') + .option('about', null) + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('userWithAboutEmpty') + .extend('basicUser') + .option('about', '') + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('user') + .extend('basicUser') + .option('about', faker.lorem.paragraph) + .option('email', faker.internet.exampleEmail) + .option('avatar', () => + Factory.build('image', { + url: faker.internet.avatar(), + }), + ) + .after(async (buildObject, options) => { + const [user, email, avatar] = await Promise.all([ + neode.create('User', buildObject), + neode.create('EmailAddress', { email: options.email }), + options.avatar, + ]) + await Promise.all([user.relateTo(email, 'primaryEmail'), email.relateTo(user, 'belongsTo')]) + if (avatar) await user.relateTo(avatar, 'avatar') + return user + }) + +Factory.define('post') + /* .option('categoryIds', []) + .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('authorId', null) + .option('author', ['authorId'], (authorId) => { + if (authorId) return neode.find('User', authorId) + return Factory.build('user') + }) + .option('pinnedBy', null) + .option('image', () => Factory.build('image')) + .attrs({ + id: uuid, + title: faker.lorem.sentence, + content: faker.lorem.paragraphs, + visibility: 'public', + deleted: false, + imageBlurred: false, + imageAspectRatio: 1.333, + clickedCount: 0, + viewedTeaserCount: 0, + }) + .attr('pinned', ['pinned'], (pinned) => { + // Convert false to null + return pinned || null + }) + .attr('contentExcerpt', ['contentExcerpt', 'content'], (contentExcerpt, content) => { + return contentExcerpt || content + }) + .attr('slug', ['slug', 'title'], (slug, title) => { + return slug || slugify(title, { lower: true }) + }) + .attr('language', ['language'], (language) => { + return language || 'en' + }) + .after(async (buildObject, options) => { + const [post, author, image, /* categories, */ tags] = await Promise.all([ + neode.create('Article', buildObject), + options.author, + options.image, + // options.categories, + options.tags, + ]) + 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'))), + ]) + if (image) await post.relateTo(image, 'image') + if (buildObject.pinned) { + const pinnedBy = await (options.pinnedBy || Factory.build('user', { role: 'admin' })) + await pinnedBy.relateTo(post, 'pinned') + } + return post + }) + +Factory.define('comment') + .option('postId', null) + .option('post', ['postId'], (postId) => { + if (postId) return neode.find('Post', postId) + return Factory.build('post') + }) + .option('authorId', null) + .option('author', ['authorId'], (authorId) => { + if (authorId) return neode.find('User', authorId) + return Factory.build('user') + }) + .attrs({ + id: uuid, + content: faker.lorem.sentence, + }) + .attr('contentExcerpt', ['contentExcerpt', 'content'], (contentExcerpt, content) => { + return contentExcerpt || content + }) + .after(async (buildObject, options) => { + const [comment, author, post] = await Promise.all([ + neode.create('Comment', buildObject), + options.author, + options.post, + ]) + await Promise.all([comment.relateTo(author, 'author'), comment.relateTo(post, 'post')]) + return comment + }) + +Factory.define('donations') + .attr('id', uuid) + .attr('showDonations', true) + .attr('goal', 15000) + .attr('progress', 7000) + .after((buildObject, options) => { + return neode.create('Donations', buildObject) + }) + +const emailDefaults = { + email: faker.internet.email, + verifiedAt: () => new Date().toISOString(), +} + +Factory.define('emailAddress') + .attrs(emailDefaults) + .after((buildObject, options) => { + return neode.create('EmailAddress', buildObject) + }) + +Factory.define('unverifiedEmailAddress') + .attr(emailDefaults) + .after((buildObject, options) => { + return neode.create('UnverifiedEmailAddress', buildObject) + }) + +const inviteCodeDefaults = { + code: () => generateInviteCode(), + createdAt: () => new Date().toISOString(), + expiresAt: () => null, +} + +Factory.define('inviteCode') + .attrs(inviteCodeDefaults) + .option('generatedById', null) + .option('generatedBy', ['generatedById'], (generatedById) => { + if (generatedById) return neode.find('User', generatedById) + return Factory.build('user') + }) + .after(async (buildObject, options) => { + const [inviteCode, generatedBy] = await Promise.all([ + neode.create('InviteCode', buildObject), + options.generatedBy, + ]) + await Promise.all([inviteCode.relateTo(generatedBy, 'generated')]) + return inviteCode + }) + +Factory.define('location') + .attrs({ + name: 'Germany', + namePT: 'Alemanha', + nameDE: 'Deutschland', + nameES: 'Alemania', + nameNL: 'Duitsland', + namePL: 'Niemcy', + nameFR: 'Allemagne', + nameIT: 'Germania', + nameEN: 'Germany', + id: 'country.10743216036480410', + type: 'country', + }) + .after((buildObject, options) => { + return neode.create('Location', buildObject) + }) + +Factory.define('report').after((buildObject, options) => { + return neode.create('Report', buildObject) +}) + +Factory.define('tag') + .attrs({ + name: '#human-connection', + }) + .after((buildObject, options) => { + return neode.create('Tag', buildObject) + }) + +Factory.define('socialMedia') + .attrs({ + url: 'https://mastodon.social/@Gargron', + }) + .after((buildObject, options) => { + return neode.create('SocialMedia', buildObject) + }) + +export default Factory diff --git a/docs/backend/src/db/migrate/store.ts b/docs/backend/src/db/migrate/store.ts new file mode 100644 index 000000000..0c0b63943 --- /dev/null +++ b/docs/backend/src/db/migrate/store.ts @@ -0,0 +1,169 @@ +import { getDriver, getNeode } from '../../db/neo4j' +import { hashSync } from 'bcryptjs' +import { v4 as uuid } from 'uuid' +import { categories } from '../../constants/categories' +import CONFIG from '../../config' + +const defaultAdmin = { + email: 'admin@example.org', + password: hashSync('1234', 10), + name: 'admin', + id: uuid(), + slug: 'admin', +} + +const createCategories = async (session) => { + const createCategoriesTxResultPromise = session.writeTransaction(async (txc) => { + categories.forEach(({ icon, name }, index) => { + const id = `cat${index + 1}` + txc.run( + `MERGE (c:Category { + icon: "${icon}", + slug: "${name}", + name: "${name}", + id: "${id}", + createdAt: toString(datetime()) + })`, + ) + }) + }) + try { + await createCategoriesTxResultPromise + console.log('Successfully created categories!') // eslint-disable-line no-console + } catch (error) { + console.log(`Error creating categories: ${error}`) // eslint-disable-line no-console + } +} + +const createDefaultAdminUser = async (session) => { + const readTxResultPromise = session.readTransaction(async (txc) => { + const result = await txc.run('MATCH (user:User) RETURN count(user) AS userCount') + return result.records.map((r) => r.get('userCount')) + }) + let createAdmin = false + try { + const userCount = parseInt(String(await readTxResultPromise)) + if (userCount === 0) createAdmin = true + } catch (error) { + console.log(error) // eslint-disable-line no-console + } + if (createAdmin) { + const createAdminTxResultPromise = session.writeTransaction(async (txc) => { + txc.run( + `MERGE (e:EmailAddress { + email: "${defaultAdmin.email}", + createdAt: toString(datetime()) + })-[:BELONGS_TO]->(u:User { + name: "${defaultAdmin.name}", + encryptedPassword: "${defaultAdmin.password}", + role: "admin", + id: "${defaultAdmin.id}", + slug: "${defaultAdmin.slug}", + createdAt: toString(datetime()), + allowEmbedIframes: false, + showShoutsPublicly: false, + sendNotificationEmails: true, + deleted: false, + disabled: false + })-[:PRIMARY_EMAIL]->(e)`, + ) + }) + try { + await createAdminTxResultPromise + console.log('Successfully created default admin user!') // eslint-disable-line no-console + } catch (error) { + console.log(error) // eslint-disable-line no-console + } + } +} + +class Store { + async init(next) { + const neode = getNeode() + const { driver } = neode + const session = driver.session() + await createDefaultAdminUser(session) + if (CONFIG.CATEGORIES_ACTIVE) await createCategories(session) + const writeTxResultPromise = session.writeTransaction(async (txc) => { + await txc.run('CALL apoc.schema.assert({},{},true)') // drop all indices and constraints + }) + try { + await writeTxResultPromise + await getNeode().schema.install() + // eslint-disable-next-line no-console + console.log('Successfully created database indices and constraints!') + next() + } catch (error) { + console.log(error) // eslint-disable-line no-console + next(error, null) + } finally { + session.close() + driver.close() + } + } + + async load(next) { + const driver = getDriver() + const session = driver.session() + 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')) + }) + try { + const migrations = await readTxResultPromise + if (migrations.length <= 0) { + // eslint-disable-next-line no-console + console.log( + "No migrations found in database. If it's the first time you run migrations, then this is normal.", + ) + return next(null, {}) + } + const [{ title: lastRun }] = migrations + next(null, { lastRun, migrations }) + } catch (error) { + console.log(error) // eslint-disable-line no-console + next(error) + } finally { + session.close() + } + } + + async save(set, next) { + const driver = getDriver() + const session = driver.session() + const { migrations } = set + const writeTxResultPromise = session.writeTransaction((txc) => { + return Promise.all( + migrations.map(async (migration) => { + const { title, description, timestamp } = migration + const properties = { title, description, timestamp } + const migrationResult = await txc.run( + ` + MERGE (migration:Migration { title: $properties.title }) + ON MATCH SET + migration += $properties + ON CREATE SET + migration += $properties, + migration.migratedAt = toString(datetime()) + `, + { properties }, + ) + return migrationResult + }), + ) + }) + try { + await writeTxResultPromise + next() + } catch (error) { + console.log(error) // eslint-disable-line no-console + next(error) + } finally { + session.close() + } + } +} + +module.exports = Store diff --git a/docs/backend/src/db/migrate/template.ts b/docs/backend/src/db/migrate/template.ts new file mode 100644 index 000000000..72bfc9b1b --- /dev/null +++ b/docs/backend/src/db/migrate/template.ts @@ -0,0 +1,47 @@ +import { getDriver } from '../../db/neo4j' + +export const description = '' + +export async function up(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') + 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') + throw new Error(error) + } finally { + session.close() + } +} diff --git a/docs/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.ts b/docs/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.ts new file mode 100644 index 000000000..7d98d9dcc --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.ts @@ -0,0 +1,83 @@ +import { throwError, concat } from 'rxjs' +import { flatMap, mergeMap, map, catchError, filter } from 'rxjs/operators' +import { getDriver } from '../neo4j' +import normalizeEmail from '../../schema/resolvers//helpers/normalizeEmail' + +export const description = ` + This migration merges duplicate :User and :EmailAddress nodes. It became + necessary after we implemented the email normalization but forgot to migrate + the existing data. Some (40) users decided to just register with a new account + but the same email address. On signup our backend would normalize the email, + which is good, but would also keep the existing unnormalized email address. + + This led to about 40 duplicate user and email address nodes in our database. +` +export function up(next) { + const driver = getDriver() + const rxSession = driver.rxSession() + rxSession + .beginTransaction() + .pipe( + flatMap((txc: any) => + concat( + txc + .run('MATCH (email:EmailAddress) RETURN email {.email}') + .records() + .pipe( + map((record: any) => { + const { email } = record.get('email') + const normalizedEmail = normalizeEmail(email) + return { email, normalizedEmail } + }), + filter(({ email, normalizedEmail }) => email !== normalizedEmail), + mergeMap(({ email, normalizedEmail }) => { + return txc + .run( + ` + MATCH (oldUser:User)-[:PRIMARY_EMAIL]->(oldEmail:EmailAddress {email: $email}) + MATCH (user:User)-[:PRIMARY_EMAIL]->(email:EmailAddress {email: $normalizedEmail}) + WITH oldUser, oldEmail, user, email + CALL apoc.refactor.mergeNodes([user, oldUser], { properties: { createdAt: 'overwrite', \`.*\`: 'discard' }, mergeRels: true }) YIELD node as mergedUser + CALL apoc.refactor.mergeNodes([email, oldEmail], { properties: { createdAt: 'overwrite', verifiedAt: 'overwrite', \`.*\`: 'discard' }, mergeRels: true }) YIELD node as mergedEmail + RETURN user {.*}, email {.*} + `, + { email, normalizedEmail }, + ) + .records() + .pipe( + map((r: any) => ({ + oldEmail: email, + email: r.get('email'), + user: r.get('user'), + })), + ) + }), + ), + txc.commit(), + ).pipe(catchError((err) => txc.rollback().pipe(throwError(err)))), + ), + ) + .subscribe({ + next: ({ user, email, oldUser, oldEmail }) => + // eslint-disable-next-line no-console + console.log(` + Merged: + ============================= + userId: ${user.id} + email: ${oldEmail} => ${email.email} + ============================= + `), + complete: () => { + // eslint-disable-next-line no-console + console.log('Merging of duplicate users completed') + next() + }, + error: (error) => { + next(new Error(error), null) + }, + }) +} + +export function down(next) { + next(new Error('Irreversible migration')) +} diff --git a/docs/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.ts b/docs/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.ts new file mode 100644 index 000000000..10b77c6dd --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.ts @@ -0,0 +1,77 @@ +import { throwError, concat } from 'rxjs' +import { flatMap, mergeMap, map, catchError } from 'rxjs/operators' +import { getDriver } from '../neo4j' + +export const description = ` + This migration merges duplicate :Location nodes. It became + necessary after we realized that we had not set up constraints for Location.id in production. +` +export function up(next) { + const driver = getDriver() + const rxSession = driver.rxSession() + rxSession + .beginTransaction() + .pipe( + flatMap((transaction: any) => + concat( + transaction + .run( + ` + MATCH (location:Location) + RETURN location {.id} + `, + ) + .records() + .pipe( + map((record: any) => { + const { id: locationId } = record.get('location') + return { locationId } + }), + mergeMap(({ locationId }) => { + return transaction + .run( + ` + MATCH(location:Location {id: $locationId}), (location2:Location {id: $locationId}) + WHERE location.id = location2.id AND id(location) < id(location2) + CALL apoc.refactor.mergeNodes([location, location2], { properties: 'combine', mergeRels: true }) YIELD node as updatedLocation + RETURN location {.*},updatedLocation {.*} + `, + { locationId }, + ) + .records() + .pipe( + map((record: any) => ({ + location: record.get('location'), + updatedLocation: record.get('updatedLocation'), + })), + ) + }), + ), + transaction.commit(), + ).pipe(catchError((error) => transaction.rollback().pipe(throwError(error)))), + ), + ) + .subscribe({ + next: ({ updatedLocation, location }) => + // eslint-disable-next-line no-console + console.log(` + Merged: + ============================= + locationId: ${location.id} + updatedLocation: ${location.id} => ${updatedLocation.id} + ============================= + `), + complete: () => { + // eslint-disable-next-line no-console + console.log('Merging of duplicate locations completed') + next() + }, + error: (error) => { + next(new Error(error), null) + }, + }) +} + +export function down(next) { + next(new Error('Irreversible migration')) +} diff --git a/docs/backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.ts b/docs/backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.ts new file mode 100644 index 000000000..ce46be9d6 --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.ts @@ -0,0 +1,46 @@ +import { getDriver } from '../../db/neo4j' + +export const description = ` + This migration creates a MUTED relationship between two edges(:User) that have a pre-existing BLOCKED relationship. + It also sets the createdAt date for the BLOCKED relationship to the datetime the migration was run. This became + necessary after we redefined what it means to block someone, and what it means to mute them. Muting is about filtering + another user's content, whereas blocking means preventing that user from interacting with you/your contributions. + A blocked user will still be able to see your contributions, but will not be able to interact with them and vice versa. +` + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + try { + await transaction.run( + ` + MATCH (blocker:User)-[blocked:BLOCKED]->(blockee:User) + MERGE (blocker)-[muted:MUTED]->(blockee) + SET muted.createdAt = toString(datetime()), blocked.createdAt = toString(datetime()) + `, + ) + await transaction.commit() + } 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() + } +} + +export function down(next) { + const driver = getDriver() + const session = driver.session() + try { + // Rollback your migration here. + next() + } catch (err) { + next(err) + } finally { + session.close() + } +} diff --git a/docs/backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.ts b/docs/backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.ts new file mode 100644 index 000000000..94a2f442d --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.ts @@ -0,0 +1,42 @@ +import { getDriver } from '../../db/neo4j' + +export const description = ` +This migration swaps the value stored in Location.lat with the value +of Location.lng. This is necessary as the values of lat and lng were +stored incorrectly. For example Hamburg, Germany, was stored with the +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 driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + try { + // Implement your migration here. + await transaction.run(` + MATCH (l:Location) WHERE NOT(l.lat IS NULL) + WITH l.lng AS longitude, l.lat AS latitude, l AS location + SET location.lat = longitude, location.lng = latitude + `) + 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 up(next) { + swap(next) +} + +export async function down(next) { + swap(next) +} diff --git a/docs/backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.ts b/docs/backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.ts new file mode 100644 index 000000000..ffcd3d4b6 --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.ts @@ -0,0 +1,57 @@ +import { getDriver } from '../../db/neo4j' + +export const description = + 'This migration adds a fulltext index for the tags in order to search for Hasthags.' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + await transaction.run(` + CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"]) + `) + await transaction.commit() + next() + } catch (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() + } +} + +export async function down(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + await transaction.run(` + CALL db.index.fulltext.drop("tag_fulltext_search") + `) + 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() + } +} diff --git a/docs/backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.ts b/docs/backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.ts new file mode 100644 index 000000000..4582d938c --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.ts @@ -0,0 +1,60 @@ +import { getDriver } from '../../db/neo4j' + +export const description = ` + We introduced a new node label 'Image' and we need a primary key for it. Best + would probably be the 'url' property which should be unique and would also + prevent us from overwriting existing images. +` + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + await transaction.run(` + CREATE CONSTRAINT ON ( image:Image ) ASSERT image.url IS UNIQUE + `) + await transaction.commit() + next() + } catch (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() + } +} + +export async function down(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + await transaction.run(` + DROP CONSTRAINT ON ( image:Image ) ASSERT image.url IS UNIQUE + `) + 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/docs/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.ts b/docs/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.ts new file mode 100644 index 000000000..356004237 --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.ts @@ -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/docs/backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.ts b/docs/backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.ts new file mode 100644 index 000000000..1ad5e645d --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.ts @@ -0,0 +1,101 @@ +/* eslint-disable no-console */ +import { getDriver } from '../../db/neo4j' + +export const description = ` + Refactor all our image properties on posts and users to a dedicated type + "Image" which contains metadata and image file urls. +` + +const printSummaries = (summaries) => { + console.log('=========================================') + summaries.forEach((stat) => { + console.log(stat.query.text) + console.log(JSON.stringify(stat.counters, null, 2)) + }) + console.log('=========================================') +} + +export async function up() { + const driver = getDriver() + const session = driver.session() + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const runs = await Promise.all( + [ + ` + MATCH (post:Post) + WHERE post.image IS NOT NULL AND post.deleted = FALSE + MERGE(image:Image {url: post.image}) + CREATE (post)-[:HERO_IMAGE]->(image) + SET + image.sensitive = post.imageBlurred, + image.aspectRatio = post.imageAspectRatio + REMOVE + post.image, + post.imageBlurred, + post.imageAspectRatio + `, + ` + MATCH (user:User) + WHERE user.avatar IS NOT NULL AND user.deleted = FALSE + MERGE(avatar:Image {url: user.avatar}) + CREATE (user)-[:AVATAR_IMAGE]->(avatar) + REMOVE user.avatar + `, + ` + MATCH (user:User) + WHERE user.coverImg IS NOT NULL AND user.deleted = FALSE + MERGE(coverImage:Image {url: user.coverImg}) + CREATE (user)-[:COVER_IMAGE]->(coverImage) + REMOVE user.coverImg + `, + ].map((s) => txc.run(s)), + ) + return runs.map(({ summary }) => summary) + }) + + try { + const stats = await writeTxResultPromise + console.log('Created image nodes from all user avatars and post images.') + printSummaries(stats) + } finally { + session.close() + } +} + +export async function down() { + const driver = getDriver() + const session = driver.session() + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const runs = await Promise.all( + [ + ` + MATCH (post)-[:HERO_IMAGE]->(image:Image) + SET + post.image = image.url, + post.imageBlurred = image.sensitive, + post.imageAspectRatio = image.aspectRatio + DETACH DELETE image + `, + ` + MATCH(user)-[:AVATAR_IMAGE]->(avatar:Image) + SET user.avatar = avatar.url + DETACH DELETE avatar + `, + ` + MATCH(user)-[:COVER_IMAGE]->(coverImage:Image) + SET user.coverImg = coverImage.url + DETACH DELETE coverImage + `, + ].map((s) => txc.run(s)), + ) + return runs.map(({ summary }) => summary) + }) + + try { + const stats = await writeTxResultPromise + console.log('UNDO: Split images from users and posts.') + printSummaries(stats) + } finally { + session.close() + } +} diff --git a/docs/backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.ts b/docs/backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.ts new file mode 100644 index 000000000..e4852f79c --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.ts @@ -0,0 +1,44 @@ +import { getDriver } from '../../db/neo4j' + +export const description = + 'We should not maintain obsolete attributes for users who have been deleted.' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + const updateDeletedUserAttributes = await transaction.run(` + MATCH (user:User) + WHERE user.deleted = TRUE + SET user.createdAt = 'UNAVAILABLE' + SET user.updatedAt = 'UNAVAILABLE' + SET user.lastActiveAt = 'UNAVAILABLE' + SET user.termsAndConditionsAgreedVersion = 'UNAVAILABLE' + SET user.avatar = null + SET user.coverImg = null + RETURN user {.*}; + `) + try { + // Implement your migration here. + const users = await updateDeletedUserAttributes.records.map((record) => record.get('user')) + // eslint-disable-next-line no-console + console.log(users) + 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) { + // eslint-disable-next-line no-console + console.log('Irreversible migration') + next() +} diff --git a/docs/backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.ts b/docs/backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.ts new file mode 100644 index 000000000..8c1efe5c6 --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.ts @@ -0,0 +1,46 @@ +import { getDriver } from '../../db/neo4j' + +export const description = + 'We should not maintain obsolete attributes for posts which have been deleted.' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + const updateDeletedPostsAttributes = await transaction.run(` + MATCH (post:Post) + WHERE post.deleted = TRUE + SET post.language = 'UNAVAILABLE' + SET post.createdAt = 'UNAVAILABLE' + SET post.updatedAt = 'UNAVAILABLE' + SET post.content = 'UNAVAILABLE' + SET post.title = 'UNAVAILABLE' + SET post.visibility = 'UNAVAILABLE' + SET post.contentExcerpt = 'UNAVAILABLE' + SET post.image = null + RETURN post {.*}; + `) + try { + // Implement your migration here. + const posts = await updateDeletedPostsAttributes.records.map((record) => record.get('post')) + // eslint-disable-next-line no-console + console.log(posts) + 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) { + // eslint-disable-next-line no-console + console.log('Irreversible migration') + next() +} diff --git a/docs/backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.ts b/docs/backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.ts new file mode 100644 index 000000000..a77ac360c --- /dev/null +++ b/docs/backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.ts @@ -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/docs/backend/src/db/migrations/.gitkeep b/docs/backend/src/db/migrations/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/backend/src/db/migrations/1613589876420-null_mutation.ts b/docs/backend/src/db/migrations/1613589876420-null_mutation.ts new file mode 100644 index 000000000..f158549de --- /dev/null +++ b/docs/backend/src/db/migrations/1613589876420-null_mutation.ts @@ -0,0 +1,9 @@ +'use strict' + +module.exports.up = function (next) { + next() +} + +module.exports.down = function (next) { + next() +} diff --git a/docs/backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.ts b/docs/backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.ts new file mode 100644 index 000000000..ff95a25df --- /dev/null +++ b/docs/backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.ts @@ -0,0 +1,53 @@ +import { getDriver } from '../../db/neo4j' + +export const description = ` +This migration adds the clickedCount property to all posts, setting it to 0. +` + +module.exports.up = async function (next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + try { + // Implement your migration here. + await transaction.run(` + MATCH (p:Post) + SET p.clickedCount = 0 + `) + 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() + } +} + +module.exports.down = async function (next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + try { + // Implement your migration here. + await transaction.run(` + MATCH (p:Post) + REMOVE p.clickedCount + `) + 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() + } +} diff --git a/docs/backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.ts b/docs/backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.ts new file mode 100644 index 000000000..ee1fad124 --- /dev/null +++ b/docs/backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.ts @@ -0,0 +1,53 @@ +import { getDriver } from '../../db/neo4j' + +export const description = ` +This migration adds the viewedTeaserCount property to all posts, setting it to 0. +` + +module.exports.up = async function (next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + try { + // Implement your migration here. + await transaction.run(` + MATCH (p:Post) + SET p.viewedTeaserCount = 0 + `) + 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() + } +} + +module.exports.down = async function (next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + try { + // Implement your migration here. + await transaction.run(` + MATCH (p:Post) + REMOVE p.viewedTeaserCount + `) + 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() + } +} diff --git a/docs/backend/src/db/migrations/20210506150512-add-donations-node.ts b/docs/backend/src/db/migrations/20210506150512-add-donations-node.ts new file mode 100644 index 000000000..6cbc1e897 --- /dev/null +++ b/docs/backend/src/db/migrations/20210506150512-add-donations-node.ts @@ -0,0 +1,66 @@ +import { getDriver } from '../../db/neo4j' +import { v4 as uuid } from 'uuid' + +export const description = + 'This migration adds a Donations node with default settings to the database.' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + const donationId = uuid() + await transaction.run( + ` + MERGE (donationInfo:Donations) + SET donationInfo.id = $donationId + SET donationInfo.createdAt = toString(datetime()) + SET donationInfo.updatedAt = donationInfo.createdAt + SET donationInfo.showDonations = false + SET donationInfo.goal = 15000.0 + SET donationInfo.progress = 1200.0 + RETURN donationInfo {.*} + `, + { donationId }, + ) + 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(` + MATCH (donationInfo:Donations) + DETACH DELETE donationInfo + RETURN donationInfo + `) + 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() + } +} diff --git a/docs/backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.ts b/docs/backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.ts new file mode 100644 index 000000000..0d1f4fb91 --- /dev/null +++ b/docs/backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.ts @@ -0,0 +1,59 @@ +import { getDriver } from '../../db/neo4j' + +export const description = '' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + await transaction.run( + ` + MATCH (user:User) + SET user.sendNotificationEmails = true + RETURN user {.*} + `, + ) + 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( + ` + MATCH (user:User) + REMOVE user.sendNotificationEmails + RETURN user {.*} + `, + ) + 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() + } +} diff --git a/docs/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.ts b/docs/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.ts new file mode 100644 index 000000000..63e40c72b --- /dev/null +++ b/docs/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.ts @@ -0,0 +1,66 @@ +import { getDriver } from '../../db/neo4j' + +export const description = ` + We introduced a new node label 'Group' and we need two primary keys 'id' and 'slug' for it. + Additional we like to have fulltext indices the keys 'name', 'slug', 'about', and 'description'. +` + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Those two indexes already exist + // await transaction.run(` + // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.id IS UNIQUE + // `) + // await transaction.run(` + // CREATE CONSTRAINT ON ( group:Group ) ASSERT group.slug IS UNIQUE + // `) + await transaction.run(` + CALL db.index.fulltext.createNodeIndex("group_fulltext_search",["Group"],["name", "slug", "about", "description"]) + `) + 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(` + DROP CONSTRAINT ON ( group:Group ) ASSERT group.id IS UNIQUE + `) + await transaction.run(` + DROP CONSTRAINT ON ( group:Group ) ASSERT group.slug IS UNIQUE + `) + await transaction.run(` + CALL db.index.fulltext.drop("group_fulltext_search") + `) + 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() + } +} diff --git a/docs/backend/src/db/migrations/20230320130345-fulltext-search-indexes.ts b/docs/backend/src/db/migrations/20230320130345-fulltext-search-indexes.ts new file mode 100644 index 000000000..40ebc6c2e --- /dev/null +++ b/docs/backend/src/db/migrations/20230320130345-fulltext-search-indexes.ts @@ -0,0 +1,68 @@ +import { getDriver } from '../../db/neo4j' + +export const description = '' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Drop indexes if they exist because due to legacy code they might be set already + const indexesResponse = await transaction.run(`CALL db.indexes()`) + const indexes = indexesResponse.records.map((record) => record.get('name')) + if (indexes.indexOf('user_fulltext_search') > -1) { + await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`) + } + if (indexes.indexOf('post_fulltext_search') > -1) { + await transaction.run(`CALL db.index.fulltext.drop("post_fulltext_search")`) + } + if (indexes.indexOf('tag_fulltext_search') > -1) { + await transaction.run(`CALL db.index.fulltext.drop("tag_fulltext_search")`) + } + // Create indexes + await transaction.run( + `CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])`, + ) + await transaction.run( + `CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"])`, + ) + await transaction.run( + `CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"])`, + ) + 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 { + await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`) + await transaction.run(`CALL db.index.fulltext.drop("post_fulltext_search")`) + await transaction.run(`CALL db.index.fulltext.drop("tag_fulltext_search")`) + 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() + } +} diff --git a/docs/backend/src/db/migrations/20230329150329-article-label-for-posts.ts b/docs/backend/src/db/migrations/20230329150329-article-label-for-posts.ts new file mode 100644 index 000000000..3cf435203 --- /dev/null +++ b/docs/backend/src/db/migrations/20230329150329-article-label-for-posts.ts @@ -0,0 +1,53 @@ +import { getDriver } from '../../db/neo4j' + +export const description = 'Add to all existing posts the Article label' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + await transaction.run(` + MATCH (post:Post) + SET post:Article + RETURN post + `) + 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 { + await transaction.run(` + MATCH (post:Post) + REMOVE post:Article + RETURN post + `) + 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() + } +} diff --git a/docs/backend/src/db/migrations/20230608130637-add-postType-property.ts b/docs/backend/src/db/migrations/20230608130637-add-postType-property.ts new file mode 100644 index 000000000..433577715 --- /dev/null +++ b/docs/backend/src/db/migrations/20230608130637-add-postType-property.ts @@ -0,0 +1,53 @@ +import { getDriver } from '../../db/neo4j' + +export const description = 'Add postType property Article to all posts' + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + await transaction.run(` + MATCH (post:Post) + SET post.postType = 'Article' + RETURN post + `) + 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 { + await transaction.run(` + MATCH (post:Post) + REMOVE post.postType + RETURN post + `) + 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() + } +} diff --git a/docs/backend/src/db/neo4j.ts b/docs/backend/src/db/neo4j.ts new file mode 100644 index 000000000..78b52237e --- /dev/null +++ b/docs/backend/src/db/neo4j.ts @@ -0,0 +1,30 @@ +import neo4j from 'neo4j-driver' +import CONFIG from './../config' +import Neode from 'neode' +import models from '../models' + +let driver +const defaultOptions = { + uri: CONFIG.NEO4J_URI, + username: CONFIG.NEO4J_USERNAME, + password: CONFIG.NEO4J_PASSWORD, +} + +export function getDriver(options = {}) { + const { uri, username, password } = { ...defaultOptions, ...options } + if (!driver) { + driver = neo4j.driver(uri, neo4j.auth.basic(username, password)) + } + return driver +} + +let neodeInstance +export function getNeode(options = {}) { + if (!neodeInstance) { + const { uri, username, password } = { ...defaultOptions, ...options } + neodeInstance = new Neode(uri, username, password).with(models) + neodeInstance.extend('Post', 'Article', {}) + return neodeInstance + } + return neodeInstance +} diff --git a/docs/backend/src/db/seed.ts b/docs/backend/src/db/seed.ts new file mode 100644 index 000000000..53cd4cea6 --- /dev/null +++ b/docs/backend/src/db/seed.ts @@ -0,0 +1,1574 @@ +import sample from 'lodash/sample' +import { createTestClient } from 'apollo-server-testing' +import CONFIG from '../config' +import createServer from '../server' +import { faker } from '@faker-js/faker' +import Factory from '../db/factories' +import { getNeode, getDriver } from '../db/neo4j' +import { + createGroupMutation, + joinGroupMutation, + changeGroupMemberRoleMutation, +} from '../graphql/groups' +import { createPostMutation } from '../graphql/posts' +import { createRoomMutation } from '../graphql/rooms' +import { createMessageMutation } from '../graphql/messages' +import { createCommentMutation } from '../graphql/comments' +import { categories } from '../constants/categories' + +if (CONFIG.PRODUCTION && !CONFIG.PRODUCTION_DB_CLEAN_ALLOW) { + throw new Error(`You cannot seed the database in a non-staging and real production environment!`) +} + +const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] + +/* eslint-disable no-multi-spaces */ +;(async function () { + let authenticatedUser = null + const driver = getDriver() + const neode = getNeode() + + try { + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + const { mutate } = createTestClient(server) + + // locations + const Hamburg = await Factory.build('location', { + id: 'region.5127278006398860', + name: 'Hamburg', + type: 'region', + lng: 10.0, + lat: 53.55, + nameES: 'Hamburgo', + nameFR: 'Hambourg', + nameIT: 'Amburgo', + nameEN: 'Hamburg', + namePT: 'Hamburgo', + nameDE: 'Hamburg', + nameNL: 'Hamburg', + namePL: 'Hamburg', + nameRU: 'Гамбург', + }) + const Berlin = await Factory.build('location', { + id: 'region.14880313158564380', + type: 'region', + name: 'Berlin', + lng: 13.38333, + lat: 52.51667, + nameES: 'Berlín', + nameFR: 'Berlin', + nameIT: 'Berlino', + nameEN: 'Berlin', + namePT: 'Berlim', + nameDE: 'Berlin', + nameNL: 'Berlijn', + namePL: 'Berlin', + nameRU: 'Берлин', + }) + const Germany = await Factory.build('location', { + id: 'country.10743216036480410', + name: 'Germany', + type: 'country', + namePT: 'Alemanha', + nameDE: 'Deutschland', + nameES: 'Alemania', + nameNL: 'Duitsland', + namePL: 'Niemcy', + nameFR: 'Allemagne', + nameIT: 'Germania', + nameEN: 'Germany', + nameRU: 'Германия', + }) + const Paris = await Factory.build('location', { + id: 'region.9397217726497330', + name: 'Paris', + type: 'region', + lng: 2.35183, + lat: 48.85658, + nameES: 'París', + nameFR: 'Paris', + nameIT: 'Parigi', + nameEN: 'Paris', + namePT: 'Paris', + nameDE: 'Paris', + nameNL: 'Parijs', + namePL: 'Paryż', + nameRU: 'Париж', + }) + const France = await Factory.build('location', { + id: 'country.9759535382641660', + name: 'France', + type: 'country', + namePT: 'França', + nameDE: 'Frankreich', + nameES: 'Francia', + nameNL: 'Frankrijk', + namePL: 'Francja', + nameFR: 'France', + nameIT: 'Francia', + nameEN: 'France', + nameRU: 'Франция', + }) + await Berlin.relateTo(Germany, 'isIn') + await Hamburg.relateTo(Germany, 'isIn') + await Paris.relateTo(France, 'isIn') + + // badges + const racoon = await Factory.build('badge', { + id: 'indiegogo_en_racoon', + icon: '/img/badges/indiegogo_en_racoon.svg', + }) + const rabbit = await Factory.build('badge', { + id: 'indiegogo_en_rabbit', + icon: '/img/badges/indiegogo_en_rabbit.svg', + }) + const wolf = await Factory.build('badge', { + id: 'indiegogo_en_wolf', + icon: '/img/badges/indiegogo_en_wolf.svg', + }) + const bear = await Factory.build('badge', { + id: 'indiegogo_en_bear', + icon: '/img/badges/indiegogo_en_bear.svg', + }) + const turtle = await Factory.build('badge', { + id: 'indiegogo_en_turtle', + icon: '/img/badges/indiegogo_en_turtle.svg', + }) + const rhino = await Factory.build('badge', { + id: 'indiegogo_en_rhino', + icon: '/img/badges/indiegogo_en_rhino.svg', + }) + + // users + const peterLustig = await Factory.build( + 'user', + { + id: 'u1', + name: 'Peter Lustig', + slug: 'peter-lustig', + role: 'admin', + }, + { + email: 'admin@example.org', + }, + ) + const bobDerBaumeister = await Factory.build( + 'user', + { + id: 'u2', + name: 'Bob der Baumeister', + slug: 'bob-der-baumeister', + role: 'moderator', + }, + { + email: 'moderator@example.org', + avatar: null, + }, + ) + const jennyRostock = await Factory.build( + 'user', + { + id: 'u3', + name: 'Jenny Rostock', + slug: 'jenny-rostock', + role: 'user', + }, + { + email: 'user@example.org', + }, + ) + const huey = await Factory.build( + 'user', + { + id: 'u4', + name: 'Huey', + slug: 'huey', + role: 'user', + }, + { + email: 'huey@example.org', + }, + ) + const dewey = await Factory.build( + 'user', + { + id: 'u5', + name: 'Dewey', + slug: 'dewey', + role: 'user', + }, + { + email: 'dewey@example.org', + avatar: null, + }, + ) + const louie = await Factory.build( + 'user', + { + id: 'u6', + name: 'Louie', + slug: 'louie', + role: 'user', + }, + { + email: 'louie@example.org', + }, + ) + const dagobert = await Factory.build( + 'user', + { + id: 'u7', + name: 'Dagobert', + slug: 'dagobert', + role: 'user', + }, + { + email: 'dagobert@example.org', + }, + ) + + await peterLustig.relateTo(Berlin, 'isIn') + await bobDerBaumeister.relateTo(Hamburg, 'isIn') + await jennyRostock.relateTo(Paris, 'isIn') + await huey.relateTo(Paris, 'isIn') + + await peterLustig.relateTo(racoon, 'rewarded') + await peterLustig.relateTo(rhino, 'rewarded') + await peterLustig.relateTo(wolf, 'rewarded') + await bobDerBaumeister.relateTo(racoon, 'rewarded') + await bobDerBaumeister.relateTo(turtle, 'rewarded') + await jennyRostock.relateTo(bear, 'rewarded') + await dagobert.relateTo(rabbit, 'rewarded') + + await peterLustig.relateTo(bobDerBaumeister, 'friends') + await peterLustig.relateTo(jennyRostock, 'friends') + await bobDerBaumeister.relateTo(jennyRostock, 'friends') + + await peterLustig.relateTo(jennyRostock, 'following') + await peterLustig.relateTo(huey, 'following') + await bobDerBaumeister.relateTo(huey, 'following') + await jennyRostock.relateTo(huey, 'following') + await huey.relateTo(dewey, 'following') + await dewey.relateTo(huey, 'following') + await louie.relateTo(jennyRostock, 'following') + + await huey.relateTo(dagobert, 'muted') + await dewey.relateTo(dagobert, 'muted') + await louie.relateTo(dagobert, 'muted') + + await dagobert.relateTo(huey, 'blocked') + await dagobert.relateTo(dewey, 'blocked') + await dagobert.relateTo(louie, 'blocked') + + // categories + let i = 0 + for (const category of categories) { + await Factory.build('category', { + id: `cat${i++}`, + slug: category.name, + naem: category.name, + icon: category.icon, + }) + } + + // tags + const environment = await Factory.build('tag', { + id: 'Environment', + }) + const nature = await Factory.build('tag', { + id: 'Nature', + }) + const democracy = await Factory.build('tag', { + id: 'Democracy', + }) + const freedom = await Factory.build('tag', { + id: 'Freedom', + }) + + // groups + authenticatedUser = await peterLustig.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'g0', + name: 'Investigative Journalism', + about: 'Investigative journalists share ideas and insights and can collaborate.', + description: `

                English:

                This group is hidden.

                What is our group for?

                This group was created to allow investigative journalists to share and collaborate.

                How does it work?

                Here you can internally share posts and comments about them.


                Deutsch:

                Diese Gruppe ist verborgen.

                Wofür ist unsere Gruppe?

                Diese Gruppe wurde geschaffen, um investigativen Journalisten den Austausch und die Zusammenarbeit zu ermöglichen.

                Wie funktioniert das?

                Hier könnt ihr euch intern über Beiträge und Kommentare zu ihnen austauschen.

                `, + groupType: 'hidden', + actionRadius: 'global', + categoryIds: ['cat6', 'cat12', 'cat16'], + locationName: 'Hamburg, Germany', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g0', + userId: 'u2', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g0', + userId: 'u4', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g0', + userId: 'u6', + }, + }) + + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g0', + userId: 'u2', + roleInGroup: 'usual', + }, + }) + + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g0', + userId: 'u4', + roleInGroup: 'admin', + }, + }) + + // post into group + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p0-g0', + groupId: 'g0', + title: `What happend in Shanghai?`, + content: 'A sack of rise dropped in Shanghai. Should we further investigate?', + categoryIds: ['cat6'], + }, + }) + + authenticatedUser = await bobDerBaumeister.toJson() + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p1-g0', + groupId: 'g0', + title: `The man on the moon`, + content: 'We have to further investigate about the stories of a man living on the moon.', + categoryIds: ['cat12', 'cat16'], + }, + }) + + authenticatedUser = await jennyRostock.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'g1', + name: 'School For Citizens', + about: 'Our children shall receive education for life.', + description: `

                English

                Our goal

                Only those who enjoy learning and do not lose their curiosity can obtain a good education for life and continue to learn with joy throughout their lives.

                Curiosity

                For this we need a school that takes up the curiosity of the children, the people, and satisfies it through a lot of experience.


                Deutsch

                Unser Ziel

                Nur wer Spaß am Lernen hat und seine Neugier nicht verliert, kann gute Bildung für's Leben erlangen und sein ganzes Leben mit Freude weiter lernen.

                Neugier

                Dazu benötigen wir eine Schule, die die Neugier der Kinder, der Menschen, aufnimmt und durch viel Erfahrung befriedigt.

                `, + groupType: 'closed', + actionRadius: 'national', + categoryIds: ['cat8', 'cat14'], + locationName: 'France', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g1', + userId: 'u1', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g1', + userId: 'u2', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g1', + userId: 'u5', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g1', + userId: 'u6', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g1', + userId: 'u7', + }, + }) + + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g1', + userId: 'u1', + roleInGroup: 'usual', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g1', + userId: 'u5', + roleInGroup: 'admin', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g1', + userId: 'u6', + roleInGroup: 'owner', + }, + }) + // post into group + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p0-g1', + groupId: 'g1', + title: `Can we use ocelot for education?`, + content: 'I like the concept of this school. Can we use our software in this?', + categoryIds: ['cat8'], + }, + }) + authenticatedUser = await peterLustig.toJson() + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p1-g1', + groupId: 'g1', + title: `Can we push this idea out of France?`, + content: 'This idea is too inportant to have the scope only on France.', + categoryIds: ['cat14'], + }, + }) + + authenticatedUser = await bobDerBaumeister.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'g2', + name: 'Yoga Practice', + about: 'We do yoga around the clock.', + description: `

                What Is yoga?

                Yoga is not just about practicing asanas. It's about how we do it.

                And practicing asanas doesn't have to be yoga, it can be more athletic than yogic.

                What makes practicing asanas yogic?

                The important thing is:

                `, + groupType: 'public', + actionRadius: 'interplanetary', + categoryIds: ['cat4', 'cat5', 'cat17'], + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g2', + userId: 'u3', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g2', + userId: 'u4', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g2', + userId: 'u5', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g2', + userId: 'u6', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'g2', + userId: 'u7', + }, + }) + + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g2', + userId: 'u3', + roleInGroup: 'usual', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g2', + userId: 'u4', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g2', + userId: 'u5', + roleInGroup: 'admin', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'g2', + userId: 'u6', + roleInGroup: 'usual', + }, + }) + + authenticatedUser = await louie.toJson() + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p0-g2', + groupId: 'g2', + title: `I am a Noob`, + content: 'I am new to Yoga and did not join this group so far.', + categoryIds: ['cat4'], + }, + }) + + // Create Events (by peter lustig) + authenticatedUser = await peterLustig.toJson() + const now = new Date() + + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'e0', + title: 'Illegaler Kindergeburtstag', + content: 'Elli hat nächste Woche Geburtstag. Wir feiern das!', + categoryIds: ['cat4'], + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 7).toISOString(), + eventVenue: 'Ellis Kinderzimmer', + eventLocationName: 'Deutschland', + }, + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'e1', + title: 'Wir Schützen den Stuttgarter Schlossgarten', + content: 'Kein Baum wird gefällt werden!', + categoryIds: ['cat5'], + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1).toISOString(), + eventVenue: 'Schlossgarten', + eventLocationName: 'Stuttgart', + }, + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'e2', + title: 'IT 4 Change Treffen', + content: 'Wir sitzen eine Woche zusammen rum und glotzen uns blöde an.', + categoryIds: ['cat5'], + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 4).toISOString(), + eventVenue: 'Ferienlager', + eventLocationName: 'Bahra, Sachsen', + }, + }, + }) + + let passedEvent = await neode.find('Post', 'e1') + await passedEvent.update({ eventStart: new Date(2010, 8, 30, 10).toISOString() }) + passedEvent = await neode.find('Post', 'e2') + await passedEvent.update({ + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() - 3).toISOString(), + }) + + // posts (articles) + const p0 = await Factory.build( + 'post', + { + id: 'p0', + language: sample(languages), + }, + { + categoryIds: ['cat16'], + author: peterLustig, + image: Factory.build('image', { + url: faker.image.unsplash.food(300, 169), + sensitive: true, + aspectRatio: 300 / 169, + }), + }, + ) + const p1 = await Factory.build( + 'post', + { + id: 'p1', + language: sample(languages), + }, + { + categoryIds: ['cat1'], + author: bobDerBaumeister, + image: Factory.build('image', { + url: faker.image.unsplash.technology(300, 1500), + aspectRatio: 300 / 1500, + }), + }, + ) + const p3 = await Factory.build( + 'post', + { + id: 'p3', + language: sample(languages), + }, + { + categoryIds: ['cat3'], + author: huey, + }, + ) + const p4 = await Factory.build( + 'post', + { + id: 'p4', + language: sample(languages), + }, + { + categoryIds: ['cat4'], + author: dewey, + }, + ) + const p5 = await Factory.build( + 'post', + { + id: 'p5', + language: sample(languages), + }, + { + categoryIds: ['cat5'], + author: louie, + }, + ) + const p6 = await Factory.build( + 'post', + { + id: 'p6', + language: sample(languages), + }, + { + categoryIds: ['cat6'], + author: peterLustig, + image: Factory.build('image', { + url: faker.image.unsplash.buildings(300, 857), + aspectRatio: 300 / 857, + }), + }, + ) + const p9 = await Factory.build( + 'post', + { + id: 'p9', + language: sample(languages), + }, + { + categoryIds: ['cat9'], + author: huey, + }, + ) + const p10 = await Factory.build( + 'post', + { + id: 'p10', + }, + { + categoryIds: ['cat10'], + author: dewey, + image: Factory.build('image', { + sensitive: true, + }), + }, + ) + const p11 = await Factory.build( + 'post', + { + id: 'p11', + language: sample(languages), + }, + { + categoryIds: ['cat11'], + author: louie, + image: Factory.build('image', { + url: faker.image.unsplash.people(300, 901), + aspectRatio: 300 / 901, + }), + }, + ) + const p13 = await Factory.build( + 'post', + { + id: 'p13', + language: sample(languages), + }, + { + categoryIds: ['cat13'], + author: bobDerBaumeister, + }, + ) + const p14 = await Factory.build( + 'post', + { + id: 'p14', + language: sample(languages), + }, + { + categoryIds: ['cat14'], + author: jennyRostock, + image: Factory.build('image', { + url: faker.image.unsplash.objects(300, 200), + aspectRatio: 300 / 450, + }), + }, + ) + const p15 = await Factory.build( + 'post', + { + id: 'p15', + language: sample(languages), + }, + { + categoryIds: ['cat15'], + author: huey, + }, + ) + + // invite code + await Factory.build( + 'inviteCode', + { + code: 'ABCDEF', + }, + { + generatedBy: jennyRostock, + }, + ) + + authenticatedUser = await louie.toJson() + const mention1 = + 'Hey @jenny-rostock, what\'s up?' + const mention2 = + 'Hey @jenny-rostock, here is another notification for you!' + const hashtag1 = + 'See #NaturphilosophieYoga, it can really help you!' + const hashtagAndMention1 = + 'The new physics of #QuantenFlussTheorie can explain #QuantumGravity! @peter-lustig got that already. ;-)' + + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: `Nature Philosophy Yoga`, + content: hashtag1, + categoryIds: ['cat2'], + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p7', + title: 'This is post #7', + content: `${mention1} ${faker.lorem.paragraph()}`, + categoryIds: ['cat7'], + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p8', + image: faker.image.unsplash.nature(), + title: `Quantum Flow Theory explains Quantum Gravity`, + content: hashtagAndMention1, + categoryIds: ['cat8'], + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'p12', + title: 'This is post #12', + content: `${mention2} ${faker.lorem.paragraph()}`, + categoryIds: ['cat12'], + }, + }) + + const p2 = await neode.find('Post', 'p2') + const p7 = await neode.find('Post', 'p7') + const p8 = await neode.find('Post', 'p8') + const p12 = await neode.find('Post', 'p12') + + authenticatedUser = null + + authenticatedUser = await dewey.toJson() + const mentionInComment1 = + 'I heard @jenny-rostock has practiced it for 3 years now.' + const mentionInComment2 = + 'Did @peter-lustig tell you?' + await mutate({ + mutation: createCommentMutation, + variables: { + id: 'c4', + postId: 'p2', + content: mentionInComment1, + }, + }) + await mutate({ + mutation: createCommentMutation, + variables: { + id: 'c4-1', + postId: 'p2', + content: mentionInComment2, + }, + }) + await mutate({ + mutation: createCommentMutation, + variables: { + postId: 'p14', + content: faker.lorem.paragraph(), + }, + }) // should send a notification + + authenticatedUser = null + + const comments: any[] = [] + comments.push( + await Factory.build( + 'comment', + { + id: 'c1', + }, + { + author: jennyRostock, + postId: 'p1', + }, + ), + await Factory.build( + 'comment', + { + id: 'c2', + }, + { + author: huey, + postId: 'p1', + }, + ), + await Factory.build( + 'comment', + { + id: 'c3', + }, + { + author: louie, + postId: 'p3', + }, + ), + await Factory.build( + 'comment', + { + id: 'c5', + }, + { + author: jennyRostock, + postId: 'p3', + }, + ), + await Factory.build( + 'comment', + { + id: 'c6', + }, + { + author: peterLustig, + postId: 'p4', + }, + ), + await Factory.build( + 'comment', + { + id: 'c7', + }, + { + author: jennyRostock, + postId: 'p2', + }, + ), + await Factory.build( + 'comment', + { + id: 'c8', + }, + { + author: huey, + postId: 'p15', + }, + ), + await Factory.build( + 'comment', + { + id: 'c9', + }, + { + author: dewey, + postId: 'p15', + }, + ), + await Factory.build( + 'comment', + { + id: 'c10', + }, + { + author: louie, + postId: 'p15', + }, + ), + await Factory.build( + 'comment', + { + id: 'c11', + }, + { + author: jennyRostock, + postId: 'p15', + }, + ), + await Factory.build( + 'comment', + { + id: 'c12', + }, + { + author: jennyRostock, + postId: 'p15', + }, + ), + ) + + const trollingComment = comments[0] + + await democracy.relateTo(p3, 'post') + await democracy.relateTo(p11, 'post') + await democracy.relateTo(p15, 'post') + await democracy.relateTo(p7, 'post') + await environment.relateTo(p1, 'post') + await environment.relateTo(p5, 'post') + await environment.relateTo(p9, 'post') + await environment.relateTo(p13, 'post') + await freedom.relateTo(p0, 'post') + await freedom.relateTo(p4, 'post') + await freedom.relateTo(p8, 'post') + await freedom.relateTo(p12, 'post') + await nature.relateTo(p2, 'post') + await nature.relateTo(p6, 'post') + await nature.relateTo(p10, 'post') + await nature.relateTo(p14, 'post') + await peterLustig.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await bobDerBaumeister.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await jennyRostock.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await huey.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await dewey.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await louie.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await dagobert.relateTo(p15, 'emoted', { emotion: 'surprised' }) + await bobDerBaumeister.relateTo(p14, 'emoted', { emotion: 'cry' }) + await jennyRostock.relateTo(p13, 'emoted', { emotion: 'angry' }) + await huey.relateTo(p12, 'emoted', { emotion: 'funny' }) + await dewey.relateTo(p11, 'emoted', { emotion: 'surprised' }) + await louie.relateTo(p10, 'emoted', { emotion: 'cry' }) + await dewey.relateTo(p9, 'emoted', { emotion: 'happy' }) + await huey.relateTo(p8, 'emoted', { emotion: 'angry' }) + await jennyRostock.relateTo(p7, 'emoted', { emotion: 'funny' }) + await bobDerBaumeister.relateTo(p6, 'emoted', { emotion: 'surprised' }) + await peterLustig.relateTo(p5, 'emoted', { emotion: 'cry' }) + await bobDerBaumeister.relateTo(p4, 'emoted', { emotion: 'happy' }) + await jennyRostock.relateTo(p3, 'emoted', { emotion: 'angry' }) + await huey.relateTo(p2, 'emoted', { emotion: 'funny' }) + await dewey.relateTo(p1, 'emoted', { emotion: 'surprised' }) + await louie.relateTo(p0, 'emoted', { emotion: 'cry' }) + + await peterLustig.relateTo(p1, 'shouted') + await peterLustig.relateTo(p6, 'shouted') + await bobDerBaumeister.relateTo(p0, 'shouted') + await bobDerBaumeister.relateTo(p6, 'shouted') + await jennyRostock.relateTo(p6, 'shouted') + await jennyRostock.relateTo(p7, 'shouted') + await huey.relateTo(p8, 'shouted') + await huey.relateTo(p9, 'shouted') + await dewey.relateTo(p10, 'shouted') + await peterLustig.relateTo(p2, 'shouted') + await peterLustig.relateTo(p6, 'shouted') + await bobDerBaumeister.relateTo(p0, 'shouted') + await bobDerBaumeister.relateTo(p6, 'shouted') + await jennyRostock.relateTo(p6, 'shouted') + await jennyRostock.relateTo(p7, 'shouted') + await huey.relateTo(p8, 'shouted') + await huey.relateTo(p9, 'shouted') + await louie.relateTo(p10, 'shouted') + + const reports: any[] = [] + reports.push( + await Factory.build('report'), + await Factory.build('report'), + await Factory.build('report'), + await Factory.build('report'), + ) + const reportAgainstDagobert = reports[0] + const reportAgainstTrollingPost = reports[1] + const reportAgainstTrollingComment = reports[2] + const reportAgainstDewey = reports[3] + + // report resource first time + await reportAgainstDagobert.relateTo(jennyRostock, 'filed', { + resourceId: 'u7', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This user is harassing me with bigoted remarks!', + }) + await reportAgainstDagobert.relateTo(dagobert, 'belongsTo') + await reportAgainstTrollingPost.relateTo(jennyRostock, 'filed', { + resourceId: 'p2', + reasonCategory: 'doxing', + reasonDescription: "This shouldn't be shown to anybody else! It's my private thing!", + }) + await reportAgainstTrollingPost.relateTo(p2, 'belongsTo') + await reportAgainstTrollingComment.relateTo(huey, 'filed', { + resourceId: 'c1', + reasonCategory: 'other', + reasonDescription: 'This comment is bigoted', + }) + await reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo') + await reportAgainstDewey.relateTo(dagobert, 'filed', { + resourceId: 'u5', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This user is harassing me!', + }) + await reportAgainstDewey.relateTo(dewey, 'belongsTo') + + // report resource a second time + await reportAgainstDagobert.relateTo(louie, 'filed', { + resourceId: 'u7', + reasonCategory: 'discrimination_etc', + reasonDescription: 'this user is attacking me for who I am!', + }) + await reportAgainstDagobert.relateTo(dagobert, 'belongsTo') + await reportAgainstTrollingPost.relateTo(peterLustig, 'filed', { + resourceId: 'p2', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This post is bigoted', + }) + await reportAgainstTrollingPost.relateTo(p2, 'belongsTo') + + await reportAgainstTrollingComment.relateTo(bobDerBaumeister, 'filed', { + resourceId: 'c1', + reasonCategory: 'pornographic_content_links', + reasonDescription: 'This comment is porno!!!', + }) + await reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo') + + const disableVariables = { + resourceId: 'undefined-resource', + disable: true, + closed: false, + } + + // review resource first time + await reportAgainstDagobert.relateTo(bobDerBaumeister, 'reviewed', { + ...disableVariables, + resourceId: 'u7', + }) + await dagobert.update({ disabled: true, updatedAt: new Date().toISOString() }) + await reportAgainstTrollingPost.relateTo(peterLustig, 'reviewed', { + ...disableVariables, + resourceId: 'p2', + }) + await p2.update({ disabled: true, updatedAt: new Date().toISOString() }) + await reportAgainstTrollingComment.relateTo(bobDerBaumeister, 'reviewed', { + ...disableVariables, + resourceId: 'c1', + }) + await trollingComment.update({ disabled: true, updatedAt: new Date().toISOString() }) + + // second review of resource and close report + await reportAgainstDagobert.relateTo(peterLustig, 'reviewed', { + resourceId: 'u7', + disable: false, + closed: true, + }) + await dagobert.update({ disabled: false, updatedAt: new Date().toISOString(), closed: true }) + await reportAgainstTrollingPost.relateTo(bobDerBaumeister, 'reviewed', { + resourceId: 'p2', + disable: true, + closed: true, + }) + await p2.update({ disabled: true, updatedAt: new Date().toISOString(), closed: true }) + await reportAgainstTrollingComment.relateTo(peterLustig, 'reviewed', { + ...disableVariables, + resourceId: 'c1', + disable: true, + closed: true, + }) + await trollingComment.update({ + disabled: true, + updatedAt: new Date().toISOString(), + closed: true, + }) + + const additionalUsers: any[] = [] + for (let i = 0; i < 30; i++) { + const user = await Factory.build('user') + await jennyRostock.relateTo(user, 'following') + await user.relateTo(jennyRostock, 'following') + additionalUsers.push(user) + } + + // Jenny users + for (let i = 0; i < 30; i++) { + await Factory.build('user', { name: `Jenny${i}` }) + } + + // Jenny posts + for (let i = 0; i < 30; i++) { + await Factory.build( + 'post', + { content: `Jenny ${faker.lorem.sentence()}` }, + { + categoryIds: ['cat1'], + author: jennyRostock, + image: Factory.build('image', { + url: faker.image.unsplash.objects(), + }), + }, + ) + } + + // comments on p2 jenny + for (let i = 0; i < 6; i++) { + await Factory.build( + 'comment', + {}, + { + author: jennyRostock, + postId: 'p2', + }, + ) + } + + // comments on p15 jenny + for (let i = 0; i < 4; i++) { + await Factory.build( + 'comment', + {}, + { + author: jennyRostock, + postId: 'p15', + }, + ) + } + + // comments on p4 jenny + for (let i = 0; i < 2; i++) { + await Factory.build( + 'comment', + {}, + { + author: jennyRostock, + postId: 'p4', + }, + ) + } + + // Posts Peter Lustig + for (let i = 0; i < 21; i++) { + await Factory.build( + 'post', + {}, + { + categoryIds: ['cat1'], + author: peterLustig, + image: Factory.build('image', { + url: faker.image.unsplash.buildings(), + }), + }, + ) + } + + // comments p4 peter + for (let i = 0; i < 3; i++) { + await Factory.build( + 'comment', + {}, + { + author: peterLustig, + postId: 'p4', + }, + ) + } + + // comments p14 peter + for (let i = 0; i < 3; i++) { + await Factory.build( + 'comment', + {}, + { + author: peterLustig, + postId: 'p14', + }, + ) + } + + // comments p0 peter + for (let i = 0; i < 3; i++) { + await Factory.build( + 'comment', + {}, + { + author: peterLustig, + postId: 'p0', + }, + ) + } + + // Posts dewey + for (let i = 0; i < 11; i++) { + await Factory.build( + 'post', + {}, + { + categoryIds: ['cat1'], + author: dewey, + image: Factory.build('image', { + url: faker.image.unsplash.food(), + }), + }, + ) + } + + // Comments p2 dewey + for (let i = 0; i < 7; i++) { + await Factory.build( + 'comment', + {}, + { + author: dewey, + postId: 'p2', + }, + ) + } + + // Comments p6 dewey + for (let i = 0; i < 5; i++) { + await Factory.build( + 'comment', + {}, + { + author: dewey, + postId: 'p6', + }, + ) + } + + // Comments p9 dewey + for (let i = 0; i < 2; i++) { + await Factory.build( + 'comment', + {}, + { + author: dewey, + postId: 'p9', + }, + ) + } + + // Posts louie + for (let i = 0; i < 16; i++) { + await Factory.build( + 'post', + {}, + { + categoryIds: ['cat1'], + author: louie, + image: Factory.build('image', { + url: faker.image.unsplash.technology(), + }), + }, + ) + } + + // Comments p1 louie + for (let i = 0; i < 4; i++) { + await Factory.build( + 'comment', + {}, + { + postId: 'p1', + author: louie, + }, + ) + } + + // Comments p10 louie + for (let i = 0; i < 8; i++) { + await Factory.build( + 'comment', + {}, + { + author: louie, + postId: 'p10', + }, + ) + } + + // Comments p13 louie + for (let i = 0; i < 5; i++) { + await Factory.build( + 'comment', + {}, + { + author: louie, + postId: 'p13', + }, + ) + } + + // Posts Bob der Baumeister + for (let i = 0; i < 45; i++) { + await Factory.build( + 'post', + {}, + { + categoryIds: ['cat1'], + author: bobDerBaumeister, + image: Factory.build('image', { + url: faker.image.unsplash.people(), + }), + }, + ) + } + + // Comments p2 bob + for (let i = 0; i < 2; i++) { + await Factory.build( + 'comment', + {}, + { + author: bobDerBaumeister, + postId: 'p2', + }, + ) + } + + // Comments p12 bob + for (let i = 0; i < 3; i++) { + await Factory.build( + 'comment', + {}, + { + author: bobDerBaumeister, + postId: 'p12', + }, + ) + } + + // Comments p13 bob + for (let i = 0; i < 7; i++) { + await Factory.build( + 'comment', + {}, + { + author: bobDerBaumeister, + postId: 'p13', + }, + ) + } + + // Posts huey + for (let i = 0; i < 8; i++) { + await Factory.build( + 'post', + {}, + { + categoryIds: ['cat1'], + author: huey, + image: Factory.build('image', { + url: faker.image.unsplash.nature(), + }), + }, + ) + } + + // Comments p0 huey + for (let i = 0; i < 6; i++) { + await Factory.build( + 'comment', + {}, + { + author: huey, + postId: 'p0', + }, + ) + } + + // Comments p13 huey + for (let i = 0; i < 8; i++) { + await Factory.build( + 'comment', + {}, + { + author: huey, + postId: 'p13', + }, + ) + } + + // Comments p15 huey + for (let i = 0; i < 8; i++) { + await Factory.build( + 'comment', + {}, + { + author: huey, + postId: 'p15', + }, + ) + } + + await Factory.build('donations') + + // Chat + authenticatedUser = await huey.toJson() + const { data: roomHueyPeter } = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: (await peterLustig.toJson()).id, + }, + }) + + for (let i = 0; i < 30; i++) { + authenticatedUser = await huey.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: roomHueyPeter?.CreateRoom.id, + content: faker.lorem.sentence(), + }, + }) + authenticatedUser = await peterLustig.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: roomHueyPeter?.CreateRoom.id, + content: faker.lorem.sentence(), + }, + }) + } + + authenticatedUser = await huey.toJson() + const { data: roomHueyJenny } = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: (await jennyRostock.toJson()).id, + }, + }) + for (let i = 0; i < 1000; i++) { + authenticatedUser = await huey.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: roomHueyJenny?.CreateRoom.id, + content: faker.lorem.sentence(), + }, + }) + authenticatedUser = await jennyRostock.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: roomHueyJenny?.CreateRoom.id, + content: faker.lorem.sentence(), + }, + }) + } + + for (const user of additionalUsers) { + authenticatedUser = await jennyRostock.toJson() + const { data: room } = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: (await user.toJson()).id, + }, + }) + + for (let i = 0; i < 29; i++) { + authenticatedUser = await jennyRostock.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: room?.CreateRoom.id, + content: faker.lorem.sentence(), + }, + }) + authenticatedUser = await user.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: room?.CreateRoom.id, + content: faker.lorem.sentence(), + }, + }) + } + } + + /* eslint-disable-next-line no-console */ + console.log('Seeded Data...') + await driver.close() + await neode.close() + process.exit(0) + } catch (err) { + /* eslint-disable-next-line no-console */ + console.error(err) + process.exit(1) + } +})() +/* eslint-enable no-multi-spaces */ diff --git a/docs/backend/src/graphql/GraphQL-Playground.md b/docs/backend/src/graphql/GraphQL-Playground.md new file mode 100644 index 000000000..33e371eb5 --- /dev/null +++ b/docs/backend/src/graphql/GraphQL-Playground.md @@ -0,0 +1,110 @@ +# GraphQL Playground + +***Attention:** For using the GraphQL Playground set `DEBUG=true` in your backend `.env`, see `.env.template`!* + +To use GraphQL Playground, we need to know some basics: + +## How To Login? + +First, we need to have a user from ocelot.social to log in as. +The user can be created by seeding the Neo4j database from the backend or by multiple GraphQL mutations. + +### Seed The Neo4j Database + +In your browser you can reach the GraphQL Playground under `http://localhost:4000/`, if the database and the backend are running, see [backend](../../README.md). +There you will also find instructions on how to seed the database. + +### Use GraphQL Mutations To Create A User + +TODO: Describe how to create a user using GraphQL mutations! + +### Login Via GraphQL + +You can register a user by sending the query: + +```gql +mutation { + login(email: "user@example.org", password: "1234") +} +``` + +Or use `"moderator@example.org"` or `"admin@example.org"` for the roll you need. + +If all goes well, you will receive a QGL response like: + +```json +{ + "data": { + "login": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwibmFtZSI6Ikplbm55IFJvc3RvY2siLCJzbHVnIjoiamVubnktcm9zdG9jayIsImlhdCI6MTY2MjAyMzMwNSwiZXhwIjoxNzI1MTM4NTA1LCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQwMDAiLCJzdWIiOiJ1MyJ9.atBS-SOeS784HPeFl_5s8sRWehEAU1BkgcOZFD8d4bU" + } +} +``` + +You can use this response to set an HTTP header when you click `HTTP HEADERS` in the footer. +Just set it with the login token you received in response: + +```json +{ + "Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwibmFtZSI6Ikplbm55IFJvc3RvY2siLCJzbHVnIjoiamVubnktcm9zdG9jayIsImlhdCI6MTY2MjAyMzMwNSwiZXhwIjoxNzI1MTM4NTA1LCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQwMDAiLCJzdWIiOiJ1MyJ9.atBS-SOeS784HPeFl_5s8sRWehEAU1BkgcOZFD8d4bU" +} +``` + +This token is used for all other queries and mutations you send to the backend. + +## Query And Mutate + +When you are logged in and open a new playground tab by clicking "+", you can create a new group by sending the following mutation: + +```gql +mutation { + CreateGroup( + # id: "" + name: "My Group" + # slug: "" + about: "We will save the world" + description: "

                English:

                This group is hidden.

                What is our group for?

                This group was created to allow investigative journalists to share and collaborate.

                How does it work?

                Here you can internally share posts and comments about them.


                Deutsch:

                Diese Gruppe ist verborgen.

                Wofür ist unsere Gruppe?

                Diese Gruppe wurde geschaffen, um investigativen Journalisten den Austausch und die Zusammenarbeit zu ermöglichen.

                Wie funktioniert das?

                Hier könnt ihr euch intern über Beiträge und Kommentare zu ihnen austauschen.

                " + groupType: hidden + actionRadius: interplanetary + categoryIds: ["cat12"] + ) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + groupType + actionRadius + myRole + } +} +``` + +You will receive the answer: + +```json +{ + "data": { + "CreateGroup": { + "id": "2e3bbadb-804b-4ebc-a673-2d7c7f05e827", + "name": "My Group", + "slug": "my-group", + "createdAt": "2022-09-01T09:44:47.969Z", + "updatedAt": "2022-09-01T09:44:47.969Z", + "disabled": false, + "deleted": false, + "about": "We will save the world", + "description": "

                English:

                This group is hidden.

                What is our group for?

                This group was created to allow investigative journalists to share and collaborate.

                How does it work?

                Here you can internally share posts and comments about them.


                Deutsch:

                Diese Gruppe ist verborgen.

                Wofür ist unsere Gruppe?

                Diese Gruppe wurde geschaffen, um investigativen Journalisten den Austausch und die Zusammenarbeit zu ermöglichen.

                Wie funktioniert das?

                Hier könnt ihr euch intern über Beiträge und Kommentare zu ihnen austauschen.

                ", + "groupType": "hidden", + "actionRadius": "interplanetary", + "myRole": "owner" + } + } +} +``` + +If you look into the Neo4j database with your browser and search the groups, you will now also find your new group. +For more details about our Neo4j database read [here](../../../neo4j/README.md). diff --git a/docs/backend/src/graphql/authentications.ts b/docs/backend/src/graphql/authentications.ts new file mode 100644 index 000000000..91605ec9f --- /dev/null +++ b/docs/backend/src/graphql/authentications.ts @@ -0,0 +1,30 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const signupVerificationMutation = gql` + mutation ( + $password: String! + $email: String! + $name: String! + $slug: String + $nonce: String! + $termsAndConditionsAgreedVersion: String! + ) { + SignupVerification( + email: $email + password: $password + name: $name + slug: $slug + nonce: $nonce + termsAndConditionsAgreedVersion: $termsAndConditionsAgreedVersion + ) { + id + slug + } + } +` + +// ------ queries + +// fill queries in here diff --git a/docs/backend/src/graphql/comments.ts b/docs/backend/src/graphql/comments.ts new file mode 100644 index 000000000..b408c5e95 --- /dev/null +++ b/docs/backend/src/graphql/comments.ts @@ -0,0 +1,15 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const createCommentMutation = gql` + mutation ($id: ID, $postId: ID!, $content: String!) { + CreateComment(id: $id, postId: $postId, content: $content) { + id + } + } +` + +// ------ queries + +// fill queries in here diff --git a/docs/backend/src/graphql/groups.ts b/docs/backend/src/graphql/groups.ts new file mode 100644 index 000000000..a7cfc3351 --- /dev/null +++ b/docs/backend/src/graphql/groups.ts @@ -0,0 +1,216 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const createGroupMutation = () => { + return gql` + mutation ( + $id: ID + $name: String! + $slug: String + $about: String + $description: String! + $groupType: GroupType! + $actionRadius: GroupActionRadius! + $categoryIds: [ID] + $locationName: String # empty string '' sets it to null + ) { + CreateGroup( + id: $id + name: $name + slug: $slug + about: $about + description: $description + groupType: $groupType + actionRadius: $actionRadius + categoryIds: $categoryIds + locationName: $locationName + ) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + locationName + location { + name + nameDE + nameEN + } + myRole + } + } + ` +} + +export const updateGroupMutation = () => { + return gql` + mutation ( + $id: ID! + $name: String + $slug: String + $about: String + $description: String + $actionRadius: GroupActionRadius + $categoryIds: [ID] + $avatar: ImageInput + $locationName: String # empty string '' sets it to null + ) { + UpdateGroup( + id: $id + name: $name + slug: $slug + about: $about + description: $description + actionRadius: $actionRadius + categoryIds: $categoryIds + avatar: $avatar + locationName: $locationName + ) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + # avatar # test this as result + locationName + location { + name + nameDE + nameEN + } + myRole + } + } + ` +} + +export const joinGroupMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!) { + JoinGroup(groupId: $groupId, userId: $userId) { + id + name + slug + myRoleInGroup + } + } + ` +} + +export const leaveGroupMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!) { + LeaveGroup(groupId: $groupId, userId: $userId) { + id + name + slug + myRoleInGroup + } + } + ` +} + +export const changeGroupMemberRoleMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) { + ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) { + id + name + slug + myRoleInGroup + } + } + ` +} + +export const removeUserFromGroupMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!) { + RemoveUserFromGroup(groupId: $groupId, userId: $userId) { + id + name + slug + myRoleInGroup + } + } + ` +} + +// ------ queries + +export const groupQuery = () => { + return gql` + query ($isMember: Boolean, $id: ID, $slug: String) { + Group(isMember: $isMember, id: $id, slug: $slug) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + avatar { + url + } + locationName + location { + name + nameDE + nameEN + } + myRole + } + } + ` +} + +export const groupMembersQuery = () => { + return gql` + query ($id: ID!) { + GroupMembers(id: $id) { + id + name + slug + myRoleInGroup + } + } + ` +} diff --git a/docs/backend/src/graphql/messages.ts b/docs/backend/src/graphql/messages.ts new file mode 100644 index 000000000..2842c7230 --- /dev/null +++ b/docs/backend/src/graphql/messages.ts @@ -0,0 +1,50 @@ +import gql from 'graphql-tag' + +export const createMessageMutation = () => { + return gql` + mutation ($roomId: ID!, $content: String!) { + CreateMessage(roomId: $roomId, content: $content) { + id + content + senderId + username + avatar + date + saved + distributed + seen + } + } + ` +} + +export const messageQuery = () => { + return gql` + query ($roomId: ID!, $first: Int, $offset: Int) { + Message(roomId: $roomId, first: $first, offset: $offset, orderBy: indexId_desc) { + _id + id + indexId + content + senderId + author { + id + } + username + avatar + date + saved + distributed + seen + } + } + ` +} + +export const markMessagesAsSeen = () => { + return gql` + mutation ($messageIds: [String!]) { + MarkMessagesAsSeen(messageIds: $messageIds) + } + ` +} diff --git a/docs/backend/src/graphql/notifications.ts b/docs/backend/src/graphql/notifications.ts new file mode 100644 index 000000000..233077372 --- /dev/null +++ b/docs/backend/src/graphql/notifications.ts @@ -0,0 +1,65 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const markAsReadMutation = () => { + return gql` + mutation ($id: ID!) { + markAsRead(id: $id) { + from { + __typename + ... on Post { + content + } + ... on Comment { + content + } + } + read + createdAt + } + } + ` +} + +export const markAllAsReadMutation = () => { + return gql` + mutation { + markAllAsRead { + from { + __typename + ... on Post { + content + } + ... on Comment { + content + } + } + read + createdAt + } + } + ` +} + +// ------ queries + +export const notificationQuery = () => { + return gql` + query ($read: Boolean, $orderBy: NotificationOrdering) { + notifications(read: $read, orderBy: $orderBy) { + from { + __typename + ... on Post { + content + } + ... on Comment { + content + } + } + read + createdAt + } + } + ` +} diff --git a/docs/backend/src/graphql/posts.ts b/docs/backend/src/graphql/posts.ts new file mode 100644 index 000000000..d1dc3ee45 --- /dev/null +++ b/docs/backend/src/graphql/posts.ts @@ -0,0 +1,111 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const createPostMutation = () => { + return gql` + mutation ( + $id: ID + $title: String! + $slug: String + $content: String! + $categoryIds: [ID] + $groupId: ID + $postType: PostType + $eventInput: _EventInput + ) { + CreatePost( + id: $id + title: $title + slug: $slug + content: $content + categoryIds: $categoryIds + groupId: $groupId + postType: $postType + eventInput: $eventInput + ) { + id + slug + title + content + disabled + deleted + postType + author { + name + } + categories { + id + } + eventStart + eventEnd + eventLocationName + eventVenue + eventIsOnline + eventLocation { + lng + lat + } + } + } + ` +} + +// ------ queries + +export const postQuery = () => { + return gql` + query Post($id: ID!) { + Post(id: $id) { + id + title + content + } + } + ` +} + +export const filterPosts = () => { + return gql` + query Post($filter: _PostFilter, $first: Int, $offset: Int, $orderBy: [_PostOrdering]) { + Post(filter: $filter, first: $first, offset: $offset, orderBy: $orderBy) { + id + title + content + eventStart + } + } + ` +} + +export const profilePagePosts = () => { + return gql` + query profilePagePosts( + $filter: _PostFilter + $first: Int + $offset: Int + $orderBy: [_PostOrdering] + ) { + profilePagePosts(filter: $filter, first: $first, offset: $offset, orderBy: $orderBy) { + id + title + content + } + } + ` +} + +export const searchPosts = () => { + return gql` + query ($query: String!, $firstPosts: Int, $postsOffset: Int) { + searchPosts(query: $query, firstPosts: $firstPosts, postsOffset: $postsOffset) { + postCount + posts { + id + title + content + } + } + } + ` +} diff --git a/docs/backend/src/graphql/rooms.ts b/docs/backend/src/graphql/rooms.ts new file mode 100644 index 000000000..7612641f3 --- /dev/null +++ b/docs/backend/src/graphql/rooms.ts @@ -0,0 +1,67 @@ +import gql from 'graphql-tag' + +export const createRoomMutation = () => { + return gql` + mutation ($userId: ID!) { + CreateRoom(userId: $userId) { + id + roomId + roomName + lastMessageAt + unreadCount + #avatar + users { + _id + id + name + avatar { + url + } + } + } + } + ` +} + +export const roomQuery = () => { + return gql` + query Room($first: Int, $offset: Int, $id: ID) { + Room(first: $first, offset: $offset, id: $id, orderBy: lastMessageAt_desc) { + id + roomId + roomName + avatar + lastMessageAt + unreadCount + lastMessage { + _id + id + content + senderId + username + avatar + date + saved + distributed + seen + } + users { + _id + id + name + avatar { + url + } + } + } + } + ` +} + +export const unreadRoomsQuery = () => { + return gql` + query { + UnreadRooms + } + ` +} diff --git a/docs/backend/src/graphql/userManagement.ts b/docs/backend/src/graphql/userManagement.ts new file mode 100644 index 000000000..3cb8a05f8 --- /dev/null +++ b/docs/backend/src/graphql/userManagement.ts @@ -0,0 +1,13 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const loginMutation = gql` + mutation ($email: String!, $password: String!) { + login(email: $email, password: $password) + } +` + +// ------ queries + +// fill queries in here diff --git a/docs/backend/src/helpers/asyncForEach.ts b/docs/backend/src/helpers/asyncForEach.ts new file mode 100644 index 000000000..5577cce14 --- /dev/null +++ b/docs/backend/src/helpers/asyncForEach.ts @@ -0,0 +1,14 @@ +/** + * Provide a way to iterate for each element in an array while waiting for async functions to finish + * + * @param array + * @param callback + * @returns {Promise} + */ +async function asyncForEach(array, callback) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array) + } +} + +export default asyncForEach diff --git a/docs/backend/src/helpers/encryptPassword.ts b/docs/backend/src/helpers/encryptPassword.ts new file mode 100644 index 000000000..657dee98a --- /dev/null +++ b/docs/backend/src/helpers/encryptPassword.ts @@ -0,0 +1,7 @@ +import { hashSync } from 'bcryptjs' + +export default function (args) { + args.encryptedPassword = hashSync(args.password, 10) + delete args.password + return args +} diff --git a/docs/backend/src/helpers/jest.ts b/docs/backend/src/helpers/jest.ts new file mode 100644 index 000000000..09744e9f2 --- /dev/null +++ b/docs/backend/src/helpers/jest.ts @@ -0,0 +1,8 @@ +// sometime we have to wait to check a db state by having a look into the db in a certain moment +// or we wait a bit to check if we missed to set an await somewhere +// see: https://www.sitepoint.com/delay-sleep-pause-wait/ +export function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} +// usage – 4 seconds for example +// await sleep(4 * 1000) diff --git a/docs/backend/src/helpers/walkRecursive.ts b/docs/backend/src/helpers/walkRecursive.ts new file mode 100644 index 000000000..f3be67575 --- /dev/null +++ b/docs/backend/src/helpers/walkRecursive.ts @@ -0,0 +1,29 @@ +/** + * iterate through all fields and replace it with the callback result + * @property data Array + * @property fields Array + * @property fieldName String + * @property callback Function + */ +function walkRecursive(data, fields, fieldName, callback, _key?) { + if (!Array.isArray(fields)) { + throw new Error('please provide an fields array for the walkRecursive helper') + } + const fieldDef = fields.find((f) => f.field === _key) + if (data && typeof data === 'string' && fieldDef) { + if (!fieldDef.excludes?.includes(fieldName)) data = callback(data, _key) + } else if (data && Array.isArray(data)) { + // go into the rabbit hole and dig through that array + data.forEach((res, index) => { + data[index] = walkRecursive(data[index], fields, fieldName, callback, index) + }) + } else if (data && typeof data === 'object') { + // lets get some keys and stir them + Object.keys(data).forEach((k) => { + data[k] = walkRecursive(data[k], fields, fieldName, callback, k) + }) + } + return data +} + +export default walkRecursive diff --git a/docs/backend/src/index.ts b/docs/backend/src/index.ts new file mode 100644 index 000000000..59718dad1 --- /dev/null +++ b/docs/backend/src/index.ts @@ -0,0 +1,11 @@ +import createServer from './server' +import CONFIG from './config' + +const { server, httpServer } = createServer() +const url = new URL(CONFIG.GRAPHQL_URI) +httpServer.listen({ port: url.port }, () => { + /* eslint-disable-next-line no-console */ + console.log(`🚀 Server ready at http://localhost:${url.port}${server.graphqlPath}`) + /* eslint-disable-next-line no-console */ + console.log(`🚀 Subscriptions ready at ws://localhost:${url.port}${server.subscriptionsPath}`) +}) diff --git a/docs/backend/src/jwt/decode.spec.ts b/docs/backend/src/jwt/decode.spec.ts new file mode 100644 index 000000000..84caba736 --- /dev/null +++ b/docs/backend/src/jwt/decode.spec.ts @@ -0,0 +1,157 @@ +import Factory, { cleanDatabase } from '../db/factories' +import { getDriver, getNeode } from '../db/neo4j' +import decode from './decode' + +const driver = getDriver() +const neode = getNeode() + +// here is the decoded JWT token: +// { +// role: 'user', +// locationName: null, +// name: 'Jenny Rostock', +// about: null, +// avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/128.jpg', +// id: 'u3', +// email: 'user@example.org', +// slug: 'jenny-rostock', +// iat: 1550846680, +// exp: 1637246680, +// aud: 'http://localhost:3000', +// iss: 'http://localhost:4000', +// sub: 'u3' +// } +// !!! if the token expires go into the GraphQL Playground in the browser at 'http://localhost:4000' with a running backend and a seeded Neo4j database +// now do the login mutation: +// mutation { +// login(email:"user@example.org", password:"1234") +// } +// replace this token here with the one you received as the result +export const validAuthorizationHeader = + 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwibmFtZSI6Ikplbm55IFJvc3RvY2siLCJzbHVnIjoiamVubnktcm9zdG9jayIsImlhdCI6MTYzNzY0NDMwMCwiZXhwIjoxNzAwNzU5NTAwLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQwMDAiLCJzdWIiOiJ1MyJ9.ispIfRfgkXuYoIhKx7x2jPxgvHDJVv1ogMycLmfUnsk' + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('decode', () => { + let authorizationHeader + const returnsNull = async () => { + await expect(decode(driver, authorizationHeader)).resolves.toBeNull() + } + + describe('given `null` as JWT Bearer token', () => { + beforeEach(() => { + authorizationHeader = null + }) + + it('returns null', returnsNull) + }) + + describe('given no JWT Bearer token', () => { + beforeEach(() => { + authorizationHeader = undefined + }) + + it('returns null', returnsNull) + }) + + describe('given malformed JWT Bearer token', () => { + beforeEach(() => { + authorizationHeader = 'blah' + }) + + it('returns null', returnsNull) + }) + + describe('given valid JWT Bearer token', () => { + beforeEach(() => { + authorizationHeader = validAuthorizationHeader + }) + + it('returns null', returnsNull) + + describe('and corresponding user in the database', () => { + let user + beforeEach(async () => { + user = await Factory.build( + 'user', + { + role: 'user', + name: 'Jenny Rostock', + id: 'u3', + slug: 'jenny-rostock', + }, + { + image: Factory.build('image', { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/128.jpg', + }), + email: 'user@example.org', + }, + ) + }) + + it('returns user object without email', async () => { + await expect(decode(driver, authorizationHeader)).resolves.toMatchObject({ + role: 'user', + name: 'Jenny Rostock', + id: 'u3', + slug: 'jenny-rostock', + }) + }) + + it('sets `lastActiveAt`', async () => { + let user = await neode.first('User', { id: 'u3' }) + await expect(user.toJson()).resolves.not.toHaveProperty('lastActiveAt') + await decode(driver, authorizationHeader) + user = await neode.first('User', { id: 'u3' }) + await expect(user.toJson()).resolves.toMatchObject({ + lastActiveAt: expect.any(String), + }) + }) + + it('updates `lastActiveAt` for every authenticated request', async () => { + let user = await neode.first('User', { id: 'u3' }) + await user.update({ + updatedAt: new Date().toISOString(), + lastActiveAt: '2019-10-03T23:33:08.598Z', + }) + await expect(user.toJson()).resolves.toMatchObject({ + lastActiveAt: '2019-10-03T23:33:08.598Z', + }) + await decode(driver, authorizationHeader) + user = await neode.first('User', { id: 'u3' }) + await expect(user.toJson()).resolves.toMatchObject({ + // should be a different time by now ;) + lastActiveAt: expect.not.stringContaining('2019-10-03T23:33'), + }) + }) + + describe('but user is deleted', () => { + beforeEach(async () => { + await user.update({ updatedAt: new Date().toISOString(), deleted: true }) + }) + + it('returns null', returnsNull) + }) + + describe('but user is disabled', () => { + beforeEach(async () => { + await user.update({ updatedAt: new Date().toISOString(), disabled: true }) + }) + + it('returns null', returnsNull) + }) + }) + }) +}) diff --git a/docs/backend/src/jwt/decode.ts b/docs/backend/src/jwt/decode.ts new file mode 100644 index 000000000..e02dcc8d4 --- /dev/null +++ b/docs/backend/src/jwt/decode.ts @@ -0,0 +1,38 @@ +import jwt from 'jsonwebtoken' +import CONFIG from './../config' + +export default async (driver, authorizationHeader) => { + if (!authorizationHeader) return null + const token = authorizationHeader.replace('Bearer ', '') + let id = null + try { + const decoded = await jwt.verify(token, CONFIG.JWT_SECRET) + id = decoded.sub + } catch (err) { + return null + } + const session = driver.session() + + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const updateUserLastActiveTransactionResponse = await transaction.run( + ` + MATCH (user:User {id: $id, deleted: false, disabled: false }) + SET user.lastActiveAt = toString(datetime()) + RETURN user {.id, .slug, .name, .role, .disabled, .actorId} + LIMIT 1 + `, + { id }, + ) + return updateUserLastActiveTransactionResponse.records.map((record) => record.get('user')) + }) + try { + const [currentUser] = await writeTxResultPromise + if (!currentUser) return null + return { + token, + ...currentUser, + } + } finally { + session.close() + } +} diff --git a/docs/backend/src/jwt/encode.spec.ts b/docs/backend/src/jwt/encode.spec.ts new file mode 100644 index 000000000..21ebdffec --- /dev/null +++ b/docs/backend/src/jwt/encode.spec.ts @@ -0,0 +1,62 @@ +import encode from './encode' +import jwt from 'jsonwebtoken' +import CONFIG from './../config' + +describe('encode', () => { + let payload + beforeEach(() => { + payload = { + name: 'Some body', + slug: 'some-body', + id: 'some-id', + } + }) + + it('encodes a valided JWT bearer token', () => { + const token = encode(payload) + expect(token.split('.')).toHaveLength(3) + const decoded = jwt.verify(token, CONFIG.JWT_SECRET) + expect(decoded).toEqual({ + name: 'Some body', + slug: 'some-body', + id: 'some-id', + sub: 'some-id', + aud: expect.any(String), + iss: expect.any(String), + iat: expect.any(Number), + exp: expect.any(Number), + }) + }) + + describe('given sensitive data', () => { + beforeEach(() => { + payload = { + ...payload, + email: 'none-of-your-business@example.org', + password: 'topsecret', + } + }) + + it('does not encode sensitive data', () => { + const token = encode(payload) + expect(payload).toEqual({ + email: 'none-of-your-business@example.org', + password: 'topsecret', + name: 'Some body', + slug: 'some-body', + id: 'some-id', + }) + const decoded = jwt.verify(token, CONFIG.JWT_SECRET) + expect(decoded).toEqual({ + name: 'Some body', + slug: 'some-body', + id: 'some-id', + sub: 'some-id', + aud: expect.any(String), + iss: expect.any(String), + iat: expect.any(Number), + exp: expect.any(Number), + }) + }) + }) +}) diff --git a/docs/backend/src/jwt/encode.ts b/docs/backend/src/jwt/encode.ts new file mode 100644 index 000000000..baeb62d3d --- /dev/null +++ b/docs/backend/src/jwt/encode.ts @@ -0,0 +1,14 @@ +import jwt from 'jsonwebtoken' +import CONFIG from './../config' + +// Generate an Access Token for the given User ID +export default function encode(user) { + const { id, name, slug } = user + const token = jwt.sign({ id, name, slug }, CONFIG.JWT_SECRET, { + expiresIn: CONFIG.JWT_EXPIRES, + issuer: CONFIG.GRAPHQL_URI, + audience: CONFIG.CLIENT_URI, + subject: user.id.toString(), + }) + return token +} diff --git a/docs/backend/src/middleware/chatMiddleware.ts b/docs/backend/src/middleware/chatMiddleware.ts new file mode 100644 index 000000000..8ae252e13 --- /dev/null +++ b/docs/backend/src/middleware/chatMiddleware.ts @@ -0,0 +1,60 @@ +import { isArray } from 'lodash' + +const setRoomProps = (room) => { + if (room.users) { + room.users.forEach((user) => { + user._id = user.id + }) + } + if (room.lastMessage) { + room.lastMessage._id = room.lastMessage.id + } +} + +const setMessageProps = (message, context) => { + message._id = message.id + if (message.senderId !== context.user.id) { + message.distributed = true + } +} + +const roomProperties = async (resolve, root, args, context, info) => { + const resolved = await resolve(root, args, context, info) + if (resolved) { + if (isArray(resolved)) { + resolved.forEach((room) => { + setRoomProps(room) + }) + } else { + setRoomProps(resolved) + } + } + return resolved +} + +const messageProperties = async (resolve, root, args, context, info) => { + const resolved = await resolve(root, args, context, info) + if (resolved) { + if (isArray(resolved)) { + resolved.forEach((message) => { + setMessageProps(message, context) + }) + } else { + setMessageProps(resolved, context) + } + } + return resolved +} + +export default { + Query: { + Room: roomProperties, + Message: messageProperties, + }, + Mutation: { + CreateRoom: roomProperties, + }, + Subscription: { + chatMessageAdded: messageProperties, + }, +} diff --git a/docs/backend/src/middleware/excerptMiddleware.ts b/docs/backend/src/middleware/excerptMiddleware.ts new file mode 100644 index 000000000..28b30fb4f --- /dev/null +++ b/docs/backend/src/middleware/excerptMiddleware.ts @@ -0,0 +1,32 @@ +import trunc from 'trunc-html' +import { DESCRIPTION_EXCERPT_HTML_LENGTH } from '../constants/groups' + +export default { + Mutation: { + CreateGroup: async (resolve, root, args, context, info) => { + args.descriptionExcerpt = trunc(args.description, DESCRIPTION_EXCERPT_HTML_LENGTH).html + return resolve(root, args, context, info) + }, + UpdateGroup: async (resolve, root, args, context, info) => { + if (args.description) + args.descriptionExcerpt = trunc(args.description, DESCRIPTION_EXCERPT_HTML_LENGTH).html + return resolve(root, args, context, info) + }, + CreatePost: async (resolve, root, args, context, info) => { + args.contentExcerpt = trunc(args.content, 120).html + return resolve(root, args, context, info) + }, + UpdatePost: async (resolve, root, args, context, info) => { + args.contentExcerpt = trunc(args.content, 120).html + return resolve(root, args, context, info) + }, + CreateComment: async (resolve, root, args, context, info) => { + args.contentExcerpt = trunc(args.content, 180).html + return resolve(root, args, context, info) + }, + UpdateComment: async (resolve, root, args, context, info) => { + args.contentExcerpt = trunc(args.content, 180).html + return resolve(root, args, context, info) + }, + }, +} diff --git a/docs/backend/src/middleware/hashtags/extractHashtags.spec.ts b/docs/backend/src/middleware/hashtags/extractHashtags.spec.ts new file mode 100644 index 000000000..739c7de54 --- /dev/null +++ b/docs/backend/src/middleware/hashtags/extractHashtags.spec.ts @@ -0,0 +1,111 @@ +import extractHashtags from './extractHashtags' + +describe('extractHashtags', () => { + describe('content undefined', () => { + it('returns empty array', () => { + expect(extractHashtags()).toEqual([]) + }) + }) + + describe('searches through links', () => { + it('without `class="hashtag"` but `data-hashtag-id="something"`, and extracts the Hashtag to make a Hashtag link', () => { + const content = ` +

                + + #Elections + + + #Democracy + +

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

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

                ' + expect(extractHashtags(content)).toEqual([]) + }) + + it('ignores hashtag links with unsupported character combinations', () => { + // Allowed are all unicode letters '\pL' and all digits '0-9'. There haveto be at least one letter in it. + const content = ` +

                + Something inspirational about + + #AbcDefXyz0123456789!*(),2 + , + + #0123456789 + , + + #0123456789a + , + + #AbcDefXyz0123456789 + , and + + #ħπαλ + . +

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

                Something inspirational about #Democracy and #liberty.

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

                Something inspirational about #anchor.

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

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

                ' + expect(extractHashtags(content)).toEqual([]) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/hashtags/extractHashtags.ts b/docs/backend/src/middleware/hashtags/extractHashtags.ts new file mode 100644 index 000000000..7570802af --- /dev/null +++ b/docs/backend/src/middleware/hashtags/extractHashtags.ts @@ -0,0 +1,29 @@ +import cheerio from 'cheerio' +import { exec, build } from 'xregexp/xregexp-all.js' +// formats of a Hashtag: +// https://en.wikipedia.org/w/index.php?title=Hashtag&oldid=905141980#Style +// here: +// 0. Search for whole string. +// 1. Hashtag has only all unicode letters and '0-9'. +// 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?) { + if (!content) return [] + const $ = cheerio.load(content) + // We can not search for class '.hashtag', because the classes are removed at the 'xss' middleware. + // But we have to know, which Hashtags are removed from the content as well, so we search for the 'a' html-tag. + const ids = $('a[data-hashtag-id]') + .map((_, el) => { + return $(el).attr('data-hashtag-id') + }) + .get() + const hashtags: any = [] + ids.forEach((id) => { + const match = exec(id, regX) + if (match != null) { + hashtags.push(match[1]) + } + }) + return hashtags +} diff --git a/docs/backend/src/middleware/hashtags/hashtagsMiddleware.spec.ts b/docs/backend/src/middleware/hashtags/hashtagsMiddleware.spec.ts new file mode 100644 index 000000000..10d53ab7b --- /dev/null +++ b/docs/backend/src/middleware/hashtags/hashtagsMiddleware.spec.ts @@ -0,0 +1,226 @@ +import gql from 'graphql-tag' +import { cleanDatabase } from '../../db/factories' +import { createTestClient } from 'apollo-server-testing' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +let server +let query +let mutate +let hashtagingUser +let authenticatedUser +const driver = getDriver() +const neode = getNeode() +const categoryIds = ['cat9'] +const createPostMutation = gql` + mutation ($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + CreatePost(id: $id, title: $title, content: $postContent, categoryIds: $categoryIds) { + id + title + content + } + } +` +const updatePostMutation = gql` + mutation ($id: ID!, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + UpdatePost(id: $id, content: $postContent, title: $title, categoryIds: $categoryIds) { + title + content + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + const createServerResult = createServer({ + context: () => { + return { + user: authenticatedUser, + neode, + driver, + } + }, + }) + server = createServerResult.server + const createTestClientResult = createTestClient(server) + query = createTestClientResult.query + mutate = createTestClientResult.mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + hashtagingUser = await neode.create( + 'User', + { + id: 'you', + name: 'Al Capone', + slug: 'al-capone', + }, + { + password: '1234', + email: 'test@example.org', + }, + ) + await neode.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('hashtags', () => { + const id = 'p135' + const title = 'Two Hashtags' + const postContent = ` +

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

                + ` + const postWithHastagsQuery = gql` + query ($id: ID) { + Post(id: $id) { + tags { + id + } + } + } + ` + const postWithHastagsVariables = { + id, + } + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await hashtagingUser.toJson() + }) + + describe('create a Post with Hashtags', () => { + beforeEach(async () => { + await mutate({ + mutation: createPostMutation, + variables: { + id, + title, + postContent, + categoryIds, + }, + }) + }) + + it('both hashtags are created with the "id" set to their "name"', async () => { + const expected = [ + { + id: 'Democracy', + }, + { + id: 'Liberty', + }, + ] + await expect( + query({ + query: postWithHastagsQuery, + variables: postWithHastagsVariables, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + Post: [ + { + tags: expect.arrayContaining(expected), + }, + ], + }, + }), + ) + }) + + describe('updates the Post by removing, keeping and adding one hashtag respectively', () => { + // The already existing hashtag has no class at this point. + const postContent = ` +

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

                + ` + + it('only one previous Hashtag and the new Hashtag exists', async () => { + await mutate({ + mutation: updatePostMutation, + variables: { + id, + title, + postContent, + categoryIds, + }, + }) + + const expected = [ + { + id: 'Elections', + }, + { + id: 'Liberty', + }, + ] + await expect( + query({ + query: postWithHastagsQuery, + variables: postWithHastagsVariables, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + Post: [ + { + tags: expect.arrayContaining(expected), + }, + ], + }, + }), + ) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/hashtags/hashtagsMiddleware.ts b/docs/backend/src/middleware/hashtags/hashtagsMiddleware.ts new file mode 100644 index 000000000..985cd3c92 --- /dev/null +++ b/docs/backend/src/middleware/hashtags/hashtagsMiddleware.ts @@ -0,0 +1,45 @@ +import extractHashtags from '../hashtags/extractHashtags' + +const updateHashtagsOfPost = async (postId, hashtags, context) => { + if (!hashtags.length) return + const session = context.driver.session() + + try { + await session.writeTransaction((txc) => { + return txc.run( + ` + MATCH (post:Post { id: $postId}) + OPTIONAL MATCH (post)-[previousRelations:TAGGED]->(tag:Tag) + DELETE previousRelations + WITH post + UNWIND $hashtags AS tagName + MERGE (tag:Tag {id: tagName, disabled: false, deleted: false }) + MERGE (post)-[:TAGGED]->(tag) + RETURN post, tag + `, + { postId, hashtags }, + ) + }) + } finally { + session.close() + } +} + +const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo) => { + const hashtags = extractHashtags(args.content) + + const post = await resolve(root, args, context, resolveInfo) + + if (post) { + await updateHashtagsOfPost(post.id, hashtags, context) + } + + return post +} + +export default { + Mutation: { + CreatePost: handleContentDataOfPost, + UpdatePost: handleContentDataOfPost, + }, +} diff --git a/docs/backend/src/middleware/helpers/cleanHtml.ts b/docs/backend/src/middleware/helpers/cleanHtml.ts new file mode 100644 index 000000000..84497760d --- /dev/null +++ b/docs/backend/src/middleware/helpers/cleanHtml.ts @@ -0,0 +1,94 @@ +import sanitizeHtml from 'sanitize-html' +import linkifyHtml from 'linkifyjs/html' + +export const removeHtmlTags = (input) => { + return sanitizeHtml(input, { + allowedTags: [], + allowedAttributes: {}, + }) +} + +const standardSanitizeHtmlOptions = { + allowedTags: [ + 'img', + 'p', + 'h3', + 'h4', + 'br', + 'hr', + 'b', + 'i', + 'u', + 'em', + 'strong', + 'a', + 'pre', + 'ul', + 'li', + 'ol', + 's', + 'strike', + 'span', + 'blockquote', + 'usertag', + ], + allowedAttributes: { + a: ['href', 'class', 'target', 'data-*', 'contenteditable'], + span: ['contenteditable', 'class', 'data-*'], + img: ['src'], + }, + allowedIframeHostnames: ['www.youtube.com', 'player.vimeo.com'], + parser: { + lowerCaseTags: true, + }, + transformTags: { + h1: 'h3', + h2: 'h3', + h3: 'h3', + h4: 'h4', + h5: 'strong', + i: 'em', + a: (tagName, attribs) => { + return { + tagName: 'a', + attribs: { + ...attribs, + href: attribs.href || '', + target: '_blank', + rel: 'noopener noreferrer nofollow', + }, + } + }, + b: 'strong', + s: 'strike', + }, +} + +export function cleanHtml(dirty, _key, sanitizeHtmlOptions = standardSanitizeHtmlOptions) { + if (!dirty) { + return dirty + } + + dirty = linkifyHtml(dirty) + dirty = sanitizeHtml(dirty, sanitizeHtmlOptions) + + // remove empty html tags and duplicated linebreaks and returns + dirty = dirty + // remove all tags with "space only" + .replace(/<[a-z-]+>[\s]+<\/[a-z-]+>/gim, '') + .replace(/[\n]{3,}/gim, '\n\n') + .replace(/(\r\n|\n\r|\r|\n)/g, '
                $1') + + // replace all p tags with line breaks (and spaces) only by single linebreaks + // limit linebreaks to max 2 (equivalent to html "br" linebreak) + .replace(/(
                \s*){2,}/gim, '
                ') + // remove additional linebreaks after p tags + .replace(/<\/(p|div|th|tr)>\s*(
                \s*)+\s*<(p|div|th|tr)>/gim, '

                ') + // remove additional linebreaks inside p tags + .replace(/<[a-z-]+>(<[a-z-]+>)*\s*(
                \s*)+\s*(<\/[a-z-]+>)*<\/[a-z-]+>/gim, '') + // remove additional linebreaks when first child inside p tags + .replace(/

                (\s*
                \s*)+/gim, '

                ') + // remove additional linebreaks when last child inside p tags + .replace(/(\s*
                \s*)+<\/p+>/gim, '

                ') + return dirty +} diff --git a/docs/backend/src/middleware/helpers/email/sendMail.ts b/docs/backend/src/middleware/helpers/email/sendMail.ts new file mode 100644 index 000000000..359efc91e --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/sendMail.ts @@ -0,0 +1,61 @@ +import CONFIG from '../../../config' +import { cleanHtml } from '../../../middleware/helpers/cleanHtml' +import nodemailer from 'nodemailer' +import { htmlToText } from 'nodemailer-html-to-text' + +const hasEmailConfig = CONFIG.SMTP_HOST && CONFIG.SMTP_PORT +const hasAuthData = CONFIG.SMTP_USERNAME && CONFIG.SMTP_PASSWORD + +let sendMailCallback: any = async () => {} +if (!hasEmailConfig) { + if (!CONFIG.TEST) { + // eslint-disable-next-line no-console + console.log('Warning: Middlewares will not try to send mails.') + // TODO: disable e-mail logging on database seeding? + // TODO: implement general logging like 'log4js', see Gradido project: https://github.com/gradido/gradido/blob/master/backend/log4js-config.json + sendMailCallback = async (templateArgs) => { + // eslint-disable-next-line no-console + console.log('--- Log Unsend E-Mail ---') + // eslint-disable-next-line no-console + console.log('To: ' + templateArgs.to) + // eslint-disable-next-line no-console + console.log('From: ' + templateArgs.from) + // eslint-disable-next-line no-console + console.log('Subject: ' + templateArgs.subject) + // eslint-disable-next-line no-console + console.log('Content:') + // eslint-disable-next-line no-console + console.log( + cleanHtml(templateArgs.html, 'dummyKey', { + allowedTags: ['a'], + allowedAttributes: { a: ['href'] }, + } as any).replace(/&/g, '&'), + ) + } + } +} else { + sendMailCallback = async (templateArgs) => { + const transporter = nodemailer.createTransport({ + host: CONFIG.SMTP_HOST, + port: CONFIG.SMTP_PORT, + ignoreTLS: CONFIG.SMTP_IGNORE_TLS, + secure: CONFIG.SMTP_SECURE, // true for 465, false for other ports + auth: hasAuthData && { + user: CONFIG.SMTP_USERNAME, + pass: CONFIG.SMTP_PASSWORD, + }, + }) + + transporter.use( + 'compile', + htmlToText({ + ignoreImage: true, + wordwrap: false, + }), + ) + + await transporter.sendMail(templateArgs) + } +} + +export const sendMail = sendMailCallback diff --git a/docs/backend/src/middleware/helpers/email/templateBuilder.spec.ts b/docs/backend/src/middleware/helpers/email/templateBuilder.spec.ts new file mode 100644 index 000000000..cb516c0a9 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templateBuilder.spec.ts @@ -0,0 +1,238 @@ +import CONFIG from '../../../config' +import logosWebapp from '../../../config/logos' +import { + signupTemplate, + emailVerificationTemplate, + resetPasswordTemplate, + wrongAccountTemplate, + notificationTemplate, +} from './templateBuilder' + +const englishHint = 'English version below!' +const welcomeImageUrl = new URL(logosWebapp.LOGO_WELCOME_PATH, CONFIG.CLIENT_URI) +const supportUrl = CONFIG.SUPPORT_URL.toString() +let actionUrl, name, settingsUrl + +const signupTemplateData = () => ({ + email: 'test@example.org', + variables: { + nonce: '12345', + inviteCode: 'AAAAAA', + }, +}) +const emailVerificationTemplateData = () => ({ + email: 'test@example.org', + variables: { + nonce: '12345', + name: 'Mr Example', + }, +}) +const resetPasswordTemplateData = () => ({ + email: 'test@example.org', + variables: { + nonce: '12345', + name: 'Mr Example', + }, +}) +const wrongAccountTemplateData = () => ({ + email: 'test@example.org', + variables: {}, +}) +const notificationTemplateData = (locale) => ({ + email: 'test@example.org', + variables: { + notification: { + to: { name: 'Mr Example', locale }, + }, + }, +}) +const textsStandard = [ + { + templPropName: 'from', + isContaining: false, + text: CONFIG.EMAIL_DEFAULT_SENDER, + }, + { + templPropName: 'to', + isContaining: false, + text: 'test@example.org', + }, + // is contained in html + welcomeImageUrl.toString(), + CONFIG.ORGANIZATION_URL, + CONFIG.APPLICATION_NAME, +] +const testEmailData = (emailTemplate, templateBuilder, templateData, texts) => { + if (!emailTemplate) { + emailTemplate = templateBuilder(templateData) + } + texts.forEach((element) => { + if (typeof element === 'object') { + if (element.isContaining) { + expect(emailTemplate[element.templPropName]).toEqual(expect.stringContaining(element.text)) + } else { + expect(emailTemplate[element.templPropName]).toEqual(element.text) + } + } else { + expect(emailTemplate.html).toEqual(expect.stringContaining(element)) + } + }) + return emailTemplate +} + +describe('templateBuilder', () => { + describe('signupTemplate', () => { + describe('multi language', () => { + it('e-mail is build with all data', () => { + const subject = `Willkommen, Bienvenue, Welcome to ${CONFIG.APPLICATION_NAME}!` + const actionUrl = new URL('/registration', CONFIG.CLIENT_URI).toString() + const theSignupTemplateData = signupTemplateData() + const enContent = "Thank you for joining our cause – it's awesome to have you on board." + const deContent = + 'Danke, dass Du dich angemeldet hast – wir freuen uns, Dich dabei zu haben.' + testEmailData(null, signupTemplate, theSignupTemplateData, [ + ...textsStandard, + { + templPropName: 'subject', + isContaining: false, + text: subject, + }, + englishHint, + actionUrl, + theSignupTemplateData.variables.nonce, + theSignupTemplateData.variables.inviteCode, + enContent, + deContent, + supportUrl, + ]) + }) + }) + }) + + describe('emailVerificationTemplate', () => { + describe('multi language', () => { + it('e-mail is build with all data', () => { + const subject = 'Neue E-Mail Adresse | New E-Mail Address' + const actionUrl = new URL('/settings/my-email-address/verify', CONFIG.CLIENT_URI).toString() + const theEmailVerificationTemplateData = emailVerificationTemplateData() + const enContent = 'So, you want to change your e-mail? No problem!' + const deContent = 'Du möchtest also deine E-Mail ändern? Kein Problem!' + testEmailData(null, emailVerificationTemplate, theEmailVerificationTemplateData, [ + ...textsStandard, + { + templPropName: 'subject', + isContaining: false, + text: subject, + }, + englishHint, + actionUrl, + theEmailVerificationTemplateData.variables.nonce, + theEmailVerificationTemplateData.variables.name, + enContent, + deContent, + supportUrl, + ]) + }) + }) + }) + + describe('resetPasswordTemplate', () => { + describe('multi language', () => { + it('e-mail is build with all data', () => { + const subject = 'Neues Passwort | Reset Password' + const actionUrl = new URL('/password-reset/change-password', CONFIG.CLIENT_URI).toString() + const theResetPasswordTemplateData = resetPasswordTemplateData() + const enContent = 'So, you forgot your password? No problem!' + const deContent = 'Du hast also dein Passwort vergessen? Kein Problem!' + testEmailData(null, resetPasswordTemplate, theResetPasswordTemplateData, [ + ...textsStandard, + { + templPropName: 'subject', + isContaining: false, + text: subject, + }, + englishHint, + actionUrl, + theResetPasswordTemplateData.variables.nonce, + theResetPasswordTemplateData.variables.name, + enContent, + deContent, + supportUrl, + ]) + }) + }) + }) + + describe('wrongAccountTemplate', () => { + describe('multi language', () => { + it('e-mail is build with all data', () => { + const subject = 'Falsche Mailadresse? | Wrong E-mail?' + const actionUrl = new URL('/password-reset/request', CONFIG.CLIENT_URI).toString() + const theWrongAccountTemplateData = wrongAccountTemplateData() + const enContent = + "You requested a password reset but unfortunately we couldn't find an account associated with your e-mail address." + const deContent = + 'Du hast bei uns ein neues Passwort angefordert – leider haben wir aber keinen Account mit Deiner E-Mailadresse gefunden.' + testEmailData(null, wrongAccountTemplate, theWrongAccountTemplateData, [ + ...textsStandard, + { + templPropName: 'subject', + isContaining: false, + text: subject, + }, + englishHint, + actionUrl, + enContent, + deContent, + supportUrl, + ]) + }) + }) + }) + + describe('notificationTemplate', () => { + beforeEach(() => { + actionUrl = new URL('/notifications', CONFIG.CLIENT_URI).toString() + name = notificationTemplateData('en').variables.notification.to.name + settingsUrl = new URL('/settings/notifications', CONFIG.CLIENT_URI) + }) + + describe('en', () => { + it('e-mail is build with all data', () => { + const subject = `${CONFIG.APPLICATION_NAME} – Notification` + const content = 'You received at least one notification. Click on this button to view them:' + testEmailData(null, notificationTemplate, notificationTemplateData('en'), [ + ...textsStandard, + { + templPropName: 'subject', + isContaining: false, + text: subject, + }, + actionUrl, + name, + content, + settingsUrl, + ]) + }) + }) + + describe('de', () => { + it('e-mail is build with all data', async () => { + const subject = `${CONFIG.APPLICATION_NAME} – Benachrichtigung` + const content = `Du hast mindestens eine Benachrichtigung erhalten. Klick auf diesen Button, um sie anzusehen:` + testEmailData(null, notificationTemplate, notificationTemplateData('de'), [ + ...textsStandard, + { + templPropName: 'subject', + isContaining: false, + text: subject, + }, + actionUrl, + name, + content, + settingsUrl, + ]) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/helpers/email/templateBuilder.ts b/docs/backend/src/middleware/helpers/email/templateBuilder.ts new file mode 100644 index 000000000..78d7a9bf9 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templateBuilder.ts @@ -0,0 +1,113 @@ +import mustache from 'mustache' +import CONFIG from '../../../config' +import metadata from '../../../config/metadata' +import logosWebapp from '../../../config/logos' + +import * as templates from './templates' +import * as templatesEN from './templates/en' +import * as templatesDE from './templates/de' + +const from = CONFIG.EMAIL_DEFAULT_SENDER +const welcomeImageUrl = new URL(logosWebapp.LOGO_WELCOME_PATH, CONFIG.CLIENT_URI) + +const defaultParams = { + welcomeImageUrl, + APPLICATION_NAME: CONFIG.APPLICATION_NAME, + ORGANIZATION_NAME: metadata.ORGANIZATION_NAME, + ORGANIZATION_URL: CONFIG.ORGANIZATION_URL, + supportUrl: CONFIG.SUPPORT_URL, +} +const englishHint = 'English version below!' + +export const signupTemplate = ({ email, variables: { nonce, inviteCode = null } }) => { + const subject = `Willkommen, Bienvenue, Welcome to ${CONFIG.APPLICATION_NAME}!` + // dev format example: http://localhost:3000/registration?method=invite-mail&email=huss%40pjannto.com&nonce=64853 + const actionUrl = new URL('/registration', CONFIG.CLIENT_URI) + actionUrl.searchParams.set('email', email) + actionUrl.searchParams.set('nonce', nonce) + if (inviteCode) { + actionUrl.searchParams.set('inviteCode', inviteCode) + actionUrl.searchParams.set('method', 'invite-code') + } else { + actionUrl.searchParams.set('method', 'invite-mail') + } + const renderParams = { ...defaultParams, englishHint, actionUrl, nonce, subject } + + return { + from, + to: email, + subject, + html: mustache.render(templates.layout, renderParams, { content: templates.signup }), + } +} + +export const emailVerificationTemplate = ({ email, variables: { nonce, name } }) => { + const subject = 'Neue E-Mail Adresse | New E-Mail Address' + const actionUrl = new URL('/settings/my-email-address/verify', CONFIG.CLIENT_URI) + actionUrl.searchParams.set('email', email) + actionUrl.searchParams.set('nonce', nonce) + const renderParams = { ...defaultParams, englishHint, actionUrl, name, nonce, subject } + + return { + from, + to: email, + subject, + html: mustache.render(templates.layout, renderParams, { content: templates.emailVerification }), + } +} + +export const resetPasswordTemplate = ({ email, variables: { nonce, name } }) => { + const subject = 'Neues Passwort | Reset Password' + const actionUrl = new URL('/password-reset/change-password', CONFIG.CLIENT_URI) + actionUrl.searchParams.set('nonce', nonce) + actionUrl.searchParams.set('email', email) + const renderParams = { ...defaultParams, englishHint, actionUrl, name, nonce, subject } + + return { + from, + to: email, + subject, + html: mustache.render(templates.layout, renderParams, { content: templates.passwordReset }), + } +} + +export const wrongAccountTemplate = ({ email, _variables = {} }) => { + const subject = 'Falsche Mailadresse? | Wrong E-mail?' + const actionUrl = new URL('/password-reset/request', CONFIG.CLIENT_URI) + const renderParams = { ...defaultParams, englishHint, actionUrl } + + return { + from, + to: email, + subject, + html: mustache.render(templates.layout, renderParams, { content: templates.wrongAccount }), + } +} + +export const notificationTemplate = ({ email, variables: { notification } }) => { + const actionUrl = new URL('/notifications', CONFIG.CLIENT_URI) + const settingsUrl = new URL('/settings/notifications', CONFIG.CLIENT_URI) + const renderParams = { ...defaultParams, name: notification.to.name, settingsUrl, actionUrl } + let content + switch (notification.to.locale) { + case 'de': + content = templatesDE.notification + break + case 'en': + content = templatesEN.notification + break + + default: + content = templatesEN.notification + break + } + const subjectUnrendered = content.split('\n')[0].split('"')[1] + const subject = mustache.render(subjectUnrendered, renderParams, {}) + + return { + from, + to: email, + subject, + html: mustache.render(templates.layout, renderParams, { content }), + } +} diff --git a/docs/backend/src/middleware/helpers/email/templates/de/index.ts b/docs/backend/src/middleware/helpers/email/templates/de/index.ts new file mode 100644 index 000000000..0f9d13c36 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/de/index.ts @@ -0,0 +1,6 @@ +import fs from 'fs' +import path from 'path' + +const readFile = (fileName) => fs.readFileSync(path.join(__dirname, fileName), 'utf-8') + +export const notification = readFile('./notification.html') diff --git a/docs/backend/src/middleware/helpers/email/templates/de/notification.html b/docs/backend/src/middleware/helpers/email/templates/de/notification.html new file mode 100644 index 000000000..a54943310 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/de/notification.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/src/middleware/helpers/email/templates/emailVerification.html b/docs/backend/src/middleware/helpers/email/templates/emailVerification.html new file mode 100644 index 000000000..35ce27e5a --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/emailVerification.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/src/middleware/helpers/email/templates/en/index.ts b/docs/backend/src/middleware/helpers/email/templates/en/index.ts new file mode 100644 index 000000000..0f9d13c36 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/en/index.ts @@ -0,0 +1,6 @@ +import fs from 'fs' +import path from 'path' + +const readFile = (fileName) => fs.readFileSync(path.join(__dirname, fileName), 'utf-8') + +export const notification = readFile('./notification.html') diff --git a/docs/backend/src/middleware/helpers/email/templates/en/notification.html b/docs/backend/src/middleware/helpers/email/templates/en/notification.html new file mode 100644 index 000000000..168b21864 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/en/notification.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/src/middleware/helpers/email/templates/index.ts b/docs/backend/src/middleware/helpers/email/templates/index.ts new file mode 100644 index 000000000..b8ae01bdb --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/index.ts @@ -0,0 +1,11 @@ +import fs from 'fs' +import path from 'path' + +const readFile = (fileName) => fs.readFileSync(path.join(__dirname, fileName), 'utf-8') + +export const signup = readFile('./signup.html') +export const passwordReset = readFile('./resetPassword.html') +export const wrongAccount = readFile('./wrongAccount.html') +export const emailVerification = readFile('./emailVerification.html') + +export const layout = readFile('./layout.html') diff --git a/docs/backend/src/middleware/helpers/email/templates/layout.html b/docs/backend/src/middleware/helpers/email/templates/layout.html new file mode 100644 index 000000000..0c68d6309 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/layout.html @@ -0,0 +1,197 @@ + + + + + + + + + + {{ subject }} + + + + + + + + + + + + + + + + + +
                + + + + + +
                + + + diff --git a/docs/backend/src/middleware/helpers/email/templates/resetPassword.html b/docs/backend/src/middleware/helpers/email/templates/resetPassword.html new file mode 100644 index 000000000..43c45455e --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/resetPassword.html @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/src/middleware/helpers/email/templates/signup.html b/docs/backend/src/middleware/helpers/email/templates/signup.html new file mode 100644 index 000000000..4bf17fd61 --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/signup.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/src/middleware/helpers/email/templates/wrongAccount.html b/docs/backend/src/middleware/helpers/email/templates/wrongAccount.html new file mode 100644 index 000000000..e8f71e9ea --- /dev/null +++ b/docs/backend/src/middleware/helpers/email/templates/wrongAccount.html @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/src/middleware/includedFieldsMiddleware.ts b/docs/backend/src/middleware/includedFieldsMiddleware.ts new file mode 100644 index 000000000..fd95029b0 --- /dev/null +++ b/docs/backend/src/middleware/includedFieldsMiddleware.ts @@ -0,0 +1,29 @@ +import cloneDeep from 'lodash/cloneDeep' + +const _includeFieldsRecursively = (selectionSet, includedFields) => { + if (!selectionSet) return + includedFields.forEach((includedField) => { + selectionSet.selections.unshift({ + kind: 'Field', + name: { kind: 'Name', value: includedField }, + }) + }) + selectionSet.selections.forEach((selection) => { + _includeFieldsRecursively(selection.selectionSet, includedFields) + }) +} + +const includeFieldsRecursively = (includedFields) => { + return (resolve, root, args, context, resolveInfo) => { + const copy = cloneDeep(resolveInfo) + copy.fieldNodes.forEach((fieldNode) => { + _includeFieldsRecursively(fieldNode.selectionSet, includedFields) + }) + return resolve(root, args, context, copy) + } +} + +export default { + Query: includeFieldsRecursively(['id', 'createdAt', 'disabled', 'deleted']), + Mutation: includeFieldsRecursively(['id', 'createdAt', 'disabled', 'deleted']), +} diff --git a/docs/backend/src/middleware/index.ts b/docs/backend/src/middleware/index.ts new file mode 100644 index 000000000..08c872db7 --- /dev/null +++ b/docs/backend/src/middleware/index.ts @@ -0,0 +1,71 @@ +import { applyMiddleware } from 'graphql-middleware' +import CONFIG from './../config' +import softDelete from './softDelete/softDeleteMiddleware' +import sluggify from './sluggifyMiddleware' +import excerpt from './excerptMiddleware' +import xss from './xssMiddleware' +import permissions from './permissionsMiddleware' +import includedFields from './includedFieldsMiddleware' +import orderBy from './orderByMiddleware' +import validation from './validation/validationMiddleware' +import notifications from './notifications/notificationsMiddleware' +import hashtags from './hashtags/hashtagsMiddleware' +import login from './login/loginMiddleware' +import sentry from './sentryMiddleware' +import languages from './languages/languages' +import userInteractions from './userInteractions' +import chatMiddleware from './chatMiddleware' + +export default (schema) => { + const middlewares = { + sentry, + permissions, + xss, + validation, + sluggify, + excerpt, + login, + notifications, + hashtags, + softDelete, + includedFields, + orderBy, + languages, + userInteractions, + chatMiddleware, + } + + let order = [ + 'sentry', + 'permissions', + 'xss', + // 'activityPub', disabled temporarily + 'validation', + 'userInteractions', + 'sluggify', + 'languages', + 'excerpt', + 'login', + 'notifications', + 'hashtags', + 'softDelete', + 'includedFields', + 'orderBy', + 'chatMiddleware', + ] + + // 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) => { + if (disabledMiddlewares.includes(key)) { + /* eslint-disable-next-line no-console */ + console.log(`Warning: Disabled "${disabledMiddlewares}" middleware.`) + } + return !disabledMiddlewares.includes(key) + }) + } + + const appliedMiddlewares = order.map((key) => middlewares[key]) + return applyMiddleware(schema, ...appliedMiddlewares) +} diff --git a/docs/backend/src/middleware/languages/languages.spec.ts b/docs/backend/src/middleware/languages/languages.spec.ts new file mode 100644 index 000000000..f4f57adc4 --- /dev/null +++ b/docs/backend/src/middleware/languages/languages.spec.ts @@ -0,0 +1,134 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +let mutate +let authenticatedUser +let variables + +const driver = getDriver() +const neode = getNeode() + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +const createPostMutation = gql` + mutation ($title: String!, $content: String!, $categoryIds: [ID]) { + CreatePost(title: $title, content: $content, categoryIds: $categoryIds) { + language + } + } +` + +describe('languagesMiddleware', () => { + variables = { + title: 'Test post languages', + categoryIds: ['cat9'], + } + + beforeAll(async () => { + const user = await Factory.build('user') + authenticatedUser = await user.toJson() + await Factory.build('category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) + }) + + it('detects German', async () => { + variables = { + ...variables, + content: 'Jeder sollte vor seiner eigenen Tür kehren.', + } + await expect( + mutate({ + mutation: createPostMutation, + variables, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + language: 'de', + }, + }, + }) + }) + + it('detects English', async () => { + variables = { + ...variables, + content: 'A journey of a thousand miles begins with a single step.', + } + await expect( + mutate({ + mutation: createPostMutation, + variables, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + language: 'en', + }, + }, + }) + }) + + it('detects Spanish', async () => { + variables = { + ...variables, + content: 'A caballo regalado, no le mires el diente.', + } + await expect( + mutate({ + mutation: createPostMutation, + variables, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + language: 'es', + }, + }, + }) + }) + + it('detects German in between lots of html tags', async () => { + variables = { + ...variables, + content: + 'Jeder sollte vor seiner eigenen
                Tür
                kehren.', + } + await expect( + mutate({ + mutation: createPostMutation, + variables, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + language: 'de', + }, + }, + }) + }) +}) diff --git a/docs/backend/src/middleware/languages/languages.ts b/docs/backend/src/middleware/languages/languages.ts new file mode 100644 index 000000000..83d4e424c --- /dev/null +++ b/docs/backend/src/middleware/languages/languages.ts @@ -0,0 +1,21 @@ +import LanguageDetect from 'languagedetect' +import { removeHtmlTags } from '../helpers/cleanHtml' + +const setPostLanguage = (text) => { + const lngDetector = new LanguageDetect() + lngDetector.setLanguageType('iso2') + return lngDetector.detect(removeHtmlTags(text), 1)[0][0] +} + +export default { + Mutation: { + CreatePost: async (resolve, root, args, context, info) => { + args.language = await setPostLanguage(args.content) + return resolve(root, args, context, info) + }, + UpdatePost: async (resolve, root, args, context, info) => { + args.language = await setPostLanguage(args.content) + return resolve(root, args, context, info) + }, + }, +} diff --git a/docs/backend/src/middleware/login/loginMiddleware.ts b/docs/backend/src/middleware/login/loginMiddleware.ts new file mode 100644 index 000000000..abf0d0b18 --- /dev/null +++ b/docs/backend/src/middleware/login/loginMiddleware.ts @@ -0,0 +1,49 @@ +import { sendMail } from '../helpers/email/sendMail' +import { + signupTemplate, + resetPasswordTemplate, + wrongAccountTemplate, + emailVerificationTemplate, +} from '../helpers/email/templateBuilder' + +const sendSignupMail = async (resolve, root, args, context, resolveInfo) => { + const { inviteCode } = args + const response = await resolve(root, args, context, resolveInfo) + const { email, nonce } = response + if (nonce) { + // emails that already exist do not have a nonce + if (inviteCode) { + await sendMail(signupTemplate({ email, variables: { nonce, inviteCode } })) + } else { + await sendMail(signupTemplate({ email, variables: { nonce } })) + } + } + delete response.nonce + return response +} + +const sendPasswordResetMail = async (resolve, root, args, context, resolveInfo) => { + const { email } = args + const { email: userFound, nonce, name } = await resolve(root, args, context, resolveInfo) + const template = userFound ? resetPasswordTemplate : wrongAccountTemplate + await sendMail(template({ email, variables: { nonce, name } })) + return true +} + +const sendEmailVerificationMail = async (resolve, root, args, context, resolveInfo) => { + const response = await resolve(root, args, context, resolveInfo) + const { email, nonce, name } = response + if (nonce) { + await sendMail(emailVerificationTemplate({ email, variables: { nonce, name } })) + } + delete response.nonce + return response +} + +export default { + Mutation: { + AddEmailAddress: sendEmailVerificationMail, + requestPasswordReset: sendPasswordResetMail, + Signup: sendSignupMail, + }, +} diff --git a/docs/backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.ts b/docs/backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.ts new file mode 100644 index 000000000..9865eab0d --- /dev/null +++ b/docs/backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.ts @@ -0,0 +1,36 @@ +import extractMentionedUsers from './extractMentionedUsers' + +const contentWithMentions = + '

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

                ' +const contentEmptyMentions = + '

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

                ' +const contentWithPlainLinks = + '

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

                ' +const contentWithDuplicateIds = + 'One more mention to @al-capone and again: @al-capone and again @al-capone ' + +describe('extractMentionedUsers', () => { + describe('content undefined', () => { + it('returns empty array', () => { + expect(extractMentionedUsers()).toEqual([]) + }) + }) + + it('ignores links without .mention class', () => { + expect(extractMentionedUsers(contentWithPlainLinks)).toEqual([]) + }) + + it('removes duplicates', () => { + expect(extractMentionedUsers(contentWithDuplicateIds)).toEqual(['you']) + }) + + describe('given a link with .mention class and `data-mention-id` attribute ', () => { + it('extracts ids', () => { + expect(extractMentionedUsers(contentWithMentions)).toEqual(['u3']) + }) + + it('ignores empty `data-mention-id` attributes', () => { + expect(extractMentionedUsers(contentEmptyMentions)).toEqual([]) + }) + }) +}) diff --git a/docs/backend/src/middleware/notifications/mentions/extractMentionedUsers.ts b/docs/backend/src/middleware/notifications/mentions/extractMentionedUsers.ts new file mode 100644 index 000000000..ccee18af9 --- /dev/null +++ b/docs/backend/src/middleware/notifications/mentions/extractMentionedUsers.ts @@ -0,0 +1,15 @@ +import cheerio from 'cheerio' + +export default (content?) => { + if (!content) return [] + const $ = cheerio.load(content) + const userIds = $('a.mention[data-mention-id]') + .map((_, el) => { + return $(el).attr('data-mention-id') + }) + .get() + return userIds + .map((id) => id.trim()) + .filter((id) => !!id) + .filter((id, index, allIds) => allIds.indexOf(id) === index) +} diff --git a/docs/backend/src/middleware/notifications/notificationsMiddleware.spec.ts b/docs/backend/src/middleware/notifications/notificationsMiddleware.spec.ts new file mode 100644 index 000000000..6cec5c940 --- /dev/null +++ b/docs/backend/src/middleware/notifications/notificationsMiddleware.spec.ts @@ -0,0 +1,864 @@ +import gql from 'graphql-tag' +import { cleanDatabase } from '../../db/factories' +import { createTestClient } from 'apollo-server-testing' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer, { pubsub } from '../../server' +import { + createGroupMutation, + joinGroupMutation, + leaveGroupMutation, + changeGroupMemberRoleMutation, + removeUserFromGroupMutation, +} from '../../graphql/groups' + +let server, query, mutate, notifiedUser, authenticatedUser +let publishSpy +const driver = getDriver() +const neode = getNeode() +const categoryIds = ['cat9'] +const createPostMutation = gql` + mutation ($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + CreatePost(id: $id, title: $title, content: $postContent, categoryIds: $categoryIds) { + id + title + content + } + } +` +const updatePostMutation = gql` + mutation ($id: ID!, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + UpdatePost(id: $id, content: $postContent, title: $title, categoryIds: $categoryIds) { + title + content + } + } +` +const createCommentMutation = gql` + mutation ($id: ID, $postId: ID!, $commentContent: String!) { + CreateComment(id: $id, postId: $postId, content: $commentContent) { + id + content + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + publishSpy = jest.spyOn(pubsub, 'publish') + const createServerResult = createServer({ + context: () => { + return { + user: authenticatedUser, + neode, + driver, + } + }, + }) + server = createServerResult.server + const createTestClientResult = createTestClient(server) + query = createTestClientResult.query + mutate = createTestClientResult.mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + publishSpy.mockClear() + notifiedUser = await neode.create( + 'User', + { + id: 'you', + name: 'Al Capone', + slug: 'al-capone', + }, + { + email: 'test@example.org', + password: '1234', + }, + ) + await neode.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('notifications', () => { + const notificationQuery = gql` + query ($read: Boolean) { + notifications(read: $read, orderBy: updatedAt_desc) { + read + reason + createdAt + relatedUser { + id + } + from { + __typename + ... on Post { + id + content + } + ... on Comment { + id + content + } + ... on Group { + id + } + } + } + } + ` + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await notifiedUser.toJson() + }) + + describe('given another user', () => { + let title + let postContent + let postAuthor + + const createPostAction = async () => { + authenticatedUser = await postAuthor.toJson() + await mutate({ + mutation: createPostMutation, + variables: { + id: 'p47', + title, + postContent, + categoryIds, + }, + }) + authenticatedUser = await notifiedUser.toJson() + } + + let commentContent + let commentAuthor + const createCommentOnPostAction = async () => { + await createPostAction() + authenticatedUser = await commentAuthor.toJson() + await mutate({ + mutation: createCommentMutation, + variables: { + id: 'c47', + postId: 'p47', + commentContent, + }, + }) + authenticatedUser = await notifiedUser.toJson() + } + + describe('comments on my post', () => { + beforeEach(async () => { + title = 'My post' + postContent = 'My post content.' + postAuthor = notifiedUser + }) + + describe('commenter is not me', () => { + beforeEach(async () => { + commentContent = 'Commenters comment.' + commentAuthor = await neode.create( + 'User', + { + id: 'commentAuthor', + name: 'Mrs Comment', + slug: 'mrs-comment', + }, + { + email: 'commentauthor@example.org', + password: '1234', + }, + ) + }) + + it('sends me a notification', async () => { + await createCommentOnPostAction() + const expected = expect.objectContaining({ + data: { + notifications: [ + { + read: false, + createdAt: expect.any(String), + reason: 'commented_on_post', + from: { + __typename: 'Comment', + id: 'c47', + content: commentContent, + }, + relatedUser: null, + }, + ], + }, + }) + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toEqual(expected) + }) + + it('sends me no notification if I have blocked the comment author', async () => { + await notifiedUser.relateTo(commentAuthor, 'blocked') + await createCommentOnPostAction() + const expected = expect.objectContaining({ + data: { notifications: [] }, + }) + + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toEqual(expected) + }) + }) + + describe('commenter is me', () => { + beforeEach(async () => { + commentContent = 'My comment.' + commentAuthor = notifiedUser + }) + + it('sends me no notification', async () => { + await notifiedUser.relateTo(commentAuthor, 'blocked') + await createCommentOnPostAction() + const expected = expect.objectContaining({ + data: { notifications: [] }, + }) + + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toEqual(expected) + }) + }) + }) + + beforeEach(async () => { + postAuthor = await neode.create( + 'User', + { + id: 'postAuthor', + name: 'Mrs Post', + slug: 'mrs-post', + }, + { + email: 'post-author@example.org', + password: '1234', + }, + ) + }) + + describe('mentions me in a post', () => { + beforeEach(async () => { + title = 'Mentioning Al Capone' + + postContent = + 'Hey @al-capone how do you do?' + }) + + it('sends me a notification', async () => { + await createPostAction() + const expectedContent = + 'Hey @al-capone how do you do?' + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + notifications: [ + { + read: false, + createdAt: expect.any(String), + reason: 'mentioned_in_post', + from: { + __typename: 'Post', + id: 'p47', + content: expectedContent, + }, + }, + ], + }, + }) + }) + + it('publishes `NOTIFICATION_ADDED` to me', async () => { + await createPostAction() + expect(publishSpy).toHaveBeenCalledWith( + 'NOTIFICATION_ADDED', + expect.objectContaining({ + notificationAdded: expect.objectContaining({ + reason: 'mentioned_in_post', + to: expect.objectContaining({ + id: 'you', + }), + }), + }), + ) + expect(publishSpy).toHaveBeenCalledTimes(1) + }) + + describe('updates the post and mentions me again', () => { + const updatePostAction = async () => { + const updatedContent = ` + One more mention to + + @al-capone + + and again: + + @al-capone + + and again + + @al-capone + + ` + authenticatedUser = await postAuthor.toJson() + await mutate({ + mutation: updatePostMutation, + variables: { + id: 'p47', + title, + postContent: updatedContent, + categoryIds, + }, + }) + authenticatedUser = await notifiedUser.toJson() + } + + it('creates no duplicate notification for the same resource', async () => { + const expectedUpdatedContent = + '
                One more mention to

                @al-capone

                and again:

                @al-capone

                and again

                @al-capone

                ' + await createPostAction() + await updatePostAction() + const expected = expect.objectContaining({ + data: { + notifications: [ + { + read: false, + createdAt: expect.any(String), + reason: 'mentioned_in_post', + from: { + __typename: 'Post', + id: 'p47', + content: expectedUpdatedContent, + }, + relatedUser: null, + }, + ], + }, + }) + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toEqual(expected) + }) + + describe('if the notification was marked as read earlier', () => { + const markAsReadAction = async () => { + const mutation = gql` + mutation ($id: ID!) { + markAsRead(id: $id) { + read + } + } + ` + await mutate({ mutation, variables: { id: 'p47' } }) + } + + describe('but the next mention happens after the notification was marked as read', () => { + it('sets the `read` attribute to false again', async () => { + await createPostAction() + await markAsReadAction() + const { + data: { + notifications: [{ read: readBefore }], + }, + } = await query({ + query: notificationQuery, + }) + await updatePostAction() + const { + data: { + notifications: [{ read: readAfter }], + }, + } = await query({ + query: notificationQuery, + }) + expect(readBefore).toEqual(true) + expect(readAfter).toEqual(false) + }) + + it('does not update the `createdAt` attribute', async () => { + await createPostAction() + await markAsReadAction() + const { + data: { + notifications: [{ createdAt: createdAtBefore }], + }, + } = await query({ + query: notificationQuery, + }) + await updatePostAction() + const { + data: { + notifications: [{ createdAt: createdAtAfter }], + }, + } = await query({ + query: notificationQuery, + }) + expect(createdAtBefore).toBeTruthy() + expect(Date.parse(createdAtBefore)).toEqual(expect.any(Number)) + expect(createdAtAfter).toBeTruthy() + expect(Date.parse(createdAtAfter)).toEqual(expect.any(Number)) + expect(createdAtBefore).toEqual(createdAtAfter) + }) + }) + }) + }) + + describe('but the author of the post blocked me', () => { + beforeEach(async () => { + await postAuthor.relateTo(notifiedUser, 'blocked') + }) + + it('sends no notification', async () => { + await createPostAction() + const expected = expect.objectContaining({ + data: { notifications: [] }, + }) + + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toEqual(expected) + }) + + it('does not publish `NOTIFICATION_ADDED`', async () => { + await createPostAction() + expect(publishSpy).not.toHaveBeenCalled() + }) + }) + }) + + describe('mentions me in a comment', () => { + beforeEach(async () => { + title = 'Post where I get mentioned in a comment' + postContent = 'Content of post where I get mentioned in a comment.' + }) + + describe('I am not blocked at all', () => { + beforeEach(async () => { + commentContent = + 'One mention about me with @al-capone.' + commentAuthor = await neode.create( + 'User', + { + id: 'commentAuthor', + name: 'Mrs Comment', + slug: 'mrs-comment', + }, + { + email: 'comment-author@example.org', + password: '1234', + }, + ) + }) + + it('sends only one notification with reason mentioned_in_comment', async () => { + postAuthor = await neode.create( + 'User', + { + id: 'MrPostAuthor', + name: 'Mr Author', + slug: 'mr-author', + }, + { + email: 'post-author@example.org', + password: '1234', + }, + ) + + await createCommentOnPostAction() + const expected = expect.objectContaining({ + data: { + notifications: [ + { + read: false, + createdAt: expect.any(String), + reason: 'mentioned_in_comment', + from: { + __typename: 'Comment', + id: 'c47', + content: commentContent, + }, + relatedUser: null, + }, + ], + }, + }) + + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toEqual(expected) + }) + + beforeEach(async () => { + title = "Post where I'm the author and I get mentioned in a comment" + postContent = 'Content of post where I get mentioned in a comment.' + postAuthor = notifiedUser + }) + it('sends only one notification with reason commented_on_post, no notification with reason mentioned_in_comment', async () => { + await createCommentOnPostAction() + const expected = { + data: { + notifications: [ + { + read: false, + createdAt: expect.any(String), + reason: 'commented_on_post', + from: { + __typename: 'Comment', + id: 'c47', + content: commentContent, + }, + relatedUser: null, + }, + ], + }, + } + + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toMatchObject({ ...expected, errors: undefined }) + }) + }) + + describe('but the author of the post blocked me', () => { + beforeEach(async () => { + await postAuthor.relateTo(notifiedUser, 'blocked') + commentContent = + 'One mention about me with @al-capone.' + commentAuthor = await neode.create( + 'User', + { + id: 'commentAuthor', + name: 'Mrs Comment', + slug: 'mrs-comment', + }, + { + email: 'comment-author@example.org', + password: '1234', + }, + ) + }) + + it('sends no notification', async () => { + await createCommentOnPostAction() + await expect( + query({ + query: notificationQuery, + variables: { + read: false, + }, + }), + ).resolves.toMatchObject({ + data: { notifications: [] }, + errors: undefined, + }) + }) + + it('does not publish `NOTIFICATION_ADDED` to authenticated user', async () => { + await createCommentOnPostAction() + expect(publishSpy).toHaveBeenCalledWith( + 'NOTIFICATION_ADDED', + expect.objectContaining({ + notificationAdded: expect.objectContaining({ + reason: 'commented_on_post', + to: expect.objectContaining({ + id: 'postAuthor', // that's expected, it's not me but the post author + }), + }), + }), + ) + expect(publishSpy).toHaveBeenCalledTimes(1) + }) + }) + }) + }) + }) + + describe('group notifications', () => { + let groupOwner + + beforeEach(async () => { + groupOwner = await neode.create( + 'User', + { + id: 'group-owner', + name: 'Group Owner', + slug: 'group-owner', + }, + { + email: 'owner@example.org', + password: '1234', + }, + ) + authenticatedUser = await groupOwner.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'closed-group', + name: 'The Closed Group', + about: 'Will test the closed group!', + description: 'Some description' + Array(50).join('_'), + groupType: 'public', + actionRadius: 'regional', + categoryIds, + }, + }) + }) + + describe('user joins group', () => { + beforeEach(async () => { + authenticatedUser = await notifiedUser.toJson() + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: authenticatedUser.id, + }, + }) + authenticatedUser = await groupOwner.toJson() + }) + + it('has the notification in database', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + read: false, + reason: 'user_joined_group', + createdAt: expect.any(String), + from: { + __typename: 'Group', + id: 'closed-group', + }, + relatedUser: { + id: 'you', + }, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('user leaves group', () => { + beforeEach(async () => { + authenticatedUser = await notifiedUser.toJson() + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: authenticatedUser.id, + }, + }) + await mutate({ + mutation: leaveGroupMutation(), + variables: { + groupId: 'closed-group', + userId: authenticatedUser.id, + }, + }) + authenticatedUser = await groupOwner.toJson() + }) + + it('has two the notification in database', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + read: false, + reason: 'user_left_group', + createdAt: expect.any(String), + from: { + __typename: 'Group', + id: 'closed-group', + }, + relatedUser: { + id: 'you', + }, + }, + { + read: false, + reason: 'user_joined_group', + createdAt: expect.any(String), + from: { + __typename: 'Group', + id: 'closed-group', + }, + relatedUser: { + id: 'you', + }, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('user role in group changes', () => { + beforeEach(async () => { + authenticatedUser = await notifiedUser.toJson() + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: authenticatedUser.id, + }, + }) + authenticatedUser = await groupOwner.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'you', + roleInGroup: 'admin', + }, + }) + authenticatedUser = await notifiedUser.toJson() + }) + + it('has notification in database', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + read: false, + reason: 'changed_group_member_role', + createdAt: expect.any(String), + from: { + __typename: 'Group', + id: 'closed-group', + }, + relatedUser: { + id: 'group-owner', + }, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('user is removed from group', () => { + beforeEach(async () => { + authenticatedUser = await notifiedUser.toJson() + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: authenticatedUser.id, + }, + }) + authenticatedUser = await groupOwner.toJson() + await mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'closed-group', + userId: 'you', + }, + }) + authenticatedUser = await notifiedUser.toJson() + }) + + it('has notification in database', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + read: false, + reason: 'removed_user_from_group', + createdAt: expect.any(String), + from: { + __typename: 'Group', + id: 'closed-group', + }, + relatedUser: { + id: 'group-owner', + }, + }, + ], + }, + errors: undefined, + }) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/notifications/notificationsMiddleware.ts b/docs/backend/src/middleware/notifications/notificationsMiddleware.ts new file mode 100644 index 000000000..706e46c51 --- /dev/null +++ b/docs/backend/src/middleware/notifications/notificationsMiddleware.ts @@ -0,0 +1,317 @@ +import { pubsub, NOTIFICATION_ADDED } from '../../server' +import extractMentionedUsers from './mentions/extractMentionedUsers' +import { validateNotifyUsers } from '../validation/validationMiddleware' +import { sendMail } from '../helpers/email/sendMail' +import { notificationTemplate } from '../helpers/email/templateBuilder' + +const queryNotificationEmails = async (context, notificationUserIds) => { + if (!(notificationUserIds && notificationUserIds.length)) return [] + const userEmailCypher = ` + MATCH (user: User) + // blocked users are filtered out from notifications already + WHERE user.id in $notificationUserIds + WITH user + MATCH (user)-[:PRIMARY_EMAIL]->(emailAddress:EmailAddress) + RETURN emailAddress {.email} + ` + const session = context.driver.session() + const writeTxResultPromise = session.readTransaction(async (transaction) => { + const emailAddressTransactionResponse = await transaction.run(userEmailCypher, { + notificationUserIds, + }) + return emailAddressTransactionResponse.records.map((record) => record.get('emailAddress')) + }) + try { + const emailAddresses = await writeTxResultPromise + return emailAddresses + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +} + +const publishNotifications = async (context, promises) => { + let notifications = await Promise.all(promises) + notifications = notifications.flat() + const notificationsEmailAddresses = await queryNotificationEmails( + context, + notifications.map((notification) => notification.to.id), + ) + notifications.forEach((notificationAdded, index) => { + pubsub.publish(NOTIFICATION_ADDED, { notificationAdded }) + if (notificationAdded.to.sendNotificationEmails) { + sendMail( + notificationTemplate({ + email: notificationsEmailAddresses[index].email, + variables: { notification: notificationAdded }, + }), + ) + } + }) +} + +const handleJoinGroup = async (resolve, root, args, context, resolveInfo) => { + const { groupId, userId } = args + const user = await resolve(root, args, context, resolveInfo) + if (user) { + await publishNotifications(context, [ + notifyOwnersOfGroup(groupId, userId, 'user_joined_group', context), + ]) + } + return user +} + +const handleLeaveGroup = async (resolve, root, args, context, resolveInfo) => { + const { groupId, userId } = args + const user = await resolve(root, args, context, resolveInfo) + if (user) { + await publishNotifications(context, [ + notifyOwnersOfGroup(groupId, userId, 'user_left_group', context), + ]) + } + return user +} + +const handleChangeGroupMemberRole = async (resolve, root, args, context, resolveInfo) => { + const { groupId, userId } = args + const user = await resolve(root, args, context, resolveInfo) + if (user) { + await publishNotifications(context, [ + notifyMemberOfGroup(groupId, userId, 'changed_group_member_role', context), + ]) + } + return user +} + +const handleRemoveUserFromGroup = async (resolve, root, args, context, resolveInfo) => { + const { groupId, userId } = args + const user = await resolve(root, args, context, resolveInfo) + if (user) { + await publishNotifications(context, [ + notifyMemberOfGroup(groupId, userId, 'removed_user_from_group', context), + ]) + } + return user +} + +const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo) => { + const idsOfUsers = extractMentionedUsers(args.content) + const post = await resolve(root, args, context, resolveInfo) + if (post) { + await publishNotifications(context, [ + notifyUsersOfMention('Post', post.id, idsOfUsers, 'mentioned_in_post', context), + ]) + } + return post +} + +const handleContentDataOfComment = async (resolve, root, args, context, resolveInfo) => { + const { content } = args + 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) + await publishNotifications(context, [ + notifyUsersOfMention('Comment', comment.id, idsOfUsers, 'mentioned_in_comment', context), + notifyUsersOfComment('Comment', comment.id, postAuthor.id, 'commented_on_post', context), + ]) + return comment +} + +const postAuthorOfComment = async (commentId, { context }) => { + const session = context.driver.session() + let postAuthorId + try { + postAuthorId = await session.readTransaction((transaction) => { + return transaction.run( + ` + MATCH (author:User)-[:WROTE]->(:Post)<-[:COMMENTS]-(:Comment { id: $commentId }) + RETURN author { .id } as authorId + `, + { commentId }, + ) + }) + return postAuthorId.records.map((record) => record.get('authorId')) + } finally { + session.close() + } +} + +const notifyOwnersOfGroup = async (groupId, userId, reason, context) => { + const cypher = ` + MATCH (user:User { id: $userId }) + MATCH (group:Group { id: $groupId })<-[membership:MEMBER_OF]-(owner:User) + WHERE membership.role = 'owner' + WITH owner, group, user, membership + MERGE (group)-[notification:NOTIFIED {reason: $reason}]->(owner) + WITH group, owner, notification, user, membership + SET notification.read = FALSE + SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime())) + SET notification.updatedAt = toString(datetime()) + SET notification.relatedUserId = $userId + WITH owner, group { __typename: 'Group', .*, myRole: membership.roleInGroup } AS finalGroup, user, notification + RETURN notification {.*, from: finalGroup, to: properties(owner), relatedUser: properties(user) } + ` + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const notificationTransactionResponse = await transaction.run(cypher, { + groupId, + reason, + userId, + }) + return notificationTransactionResponse.records.map((record) => record.get('notification')) + }) + try { + const notifications = await writeTxResultPromise + return notifications + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +} + +const notifyMemberOfGroup = async (groupId, userId, reason, context) => { + const { user: owner } = context + const cypher = ` + MATCH (owner:User { id: $ownerId }) + MATCH (user:User { id: $userId }) + MATCH (group:Group { id: $groupId }) + OPTIONAL MATCH (user)-[membership:MEMBER_OF]->(group) + WITH user, group, owner, membership + MERGE (group)-[notification:NOTIFIED {reason: $reason}]->(user) + WITH group, user, notification, owner, membership + SET notification.read = FALSE + SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime())) + SET notification.updatedAt = toString(datetime()) + SET notification.relatedUserId = $ownerId + WITH group { __typename: 'Group', .*, myRole: membership.roleInGroup } AS finalGroup, + notification, user, owner + RETURN notification {.*, from: finalGroup, to: properties(user), relatedUser: properties(owner) } + ` + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const notificationTransactionResponse = await transaction.run(cypher, { + groupId, + reason, + userId, + ownerId: owner.id, + }) + return notificationTransactionResponse.records.map((record) => record.get('notification')) + }) + try { + const notifications = await writeTxResultPromise + return notifications + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +} + +const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => { + if (!(idsOfUsers && idsOfUsers.length)) return [] + await validateNotifyUsers(label, reason) + let mentionedCypher + switch (reason) { + case 'mentioned_in_post': { + mentionedCypher = ` + MATCH (post: Post { id: $id })<-[:WROTE]-(author: User) + MATCH (user: User) + WHERE user.id in $idsOfUsers + AND NOT (user)-[:BLOCKED]-(author) + MERGE (post)-[notification:NOTIFIED {reason: $reason}]->(user) + WITH post AS resource, notification, user + ` + break + } + case 'mentioned_in_comment': { + mentionedCypher = ` + MATCH (postAuthor: User)-[:WROTE]->(post: Post)<-[:COMMENTS]-(comment: Comment { id: $id })<-[:WROTE]-(commenter: User) + MATCH (user: User) + WHERE user.id in $idsOfUsers + AND NOT (user)-[:BLOCKED]-(commenter) + AND NOT (user)-[:BLOCKED]-(postAuthor) + MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(user) + WITH comment AS resource, notification, user + ` + break + } + } + mentionedCypher += ` + WITH notification, user, resource, + [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, + [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts + WITH resource, user, notification, authors, posts, + resource {.*, __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'Group']][0], author: authors[0], post: posts[0]} AS finalResource + SET notification.read = FALSE + SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime())) + SET notification.updatedAt = toString(datetime()) + RETURN notification {.*, from: finalResource, to: properties(user), relatedUser: properties(user) } + ` + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const notificationTransactionResponse = await transaction.run(mentionedCypher, { + id, + idsOfUsers, + reason, + }) + return notificationTransactionResponse.records.map((record) => record.get('notification')) + }) + try { + const notifications = await writeTxResultPromise + return notifications + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +} + +const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, context) => { + if (context.user.id === postAuthorId) return [] + await validateNotifyUsers(label, reason) + const session = context.driver.session() + 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) + WHERE NOT (postAuthor)-[:BLOCKED]-(commenter) + MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(postAuthor) + SET notification.read = FALSE + SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime())) + SET notification.updatedAt = toString(datetime()) + WITH notification, postAuthor, post, commenter, + comment {.*, __typename: labels(comment)[0], author: properties(commenter), post: post {.*, author: properties(postAuthor) } } AS finalResource + RETURN notification { + .*, + from: finalResource, + to: properties(postAuthor), + relatedUser: properties(commenter) + } + `, + { commentId, postAuthorId, reason }, + ) + return notificationTransactionResponse.records.map((record) => record.get('notification')) + }) + try { + const notifications = await writeTxResultPromise + return notifications + } finally { + session.close() + } +} + +export default { + Mutation: { + CreatePost: handleContentDataOfPost, + UpdatePost: handleContentDataOfPost, + CreateComment: handleContentDataOfComment, + UpdateComment: handleContentDataOfComment, + JoinGroup: handleJoinGroup, + LeaveGroup: handleLeaveGroup, + ChangeGroupMemberRole: handleChangeGroupMemberRole, + RemoveUserFromGroup: handleRemoveUserFromGroup, + }, +} diff --git a/docs/backend/src/middleware/orderByMiddleware.spec.ts b/docs/backend/src/middleware/orderByMiddleware.spec.ts new file mode 100644 index 000000000..7453cf301 --- /dev/null +++ b/docs/backend/src/middleware/orderByMiddleware.spec.ts @@ -0,0 +1,90 @@ +import gql from 'graphql-tag' +import { cleanDatabase } from '../db/factories' +import { getNeode, getDriver } from '../db/neo4j' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../server' + +const neode = getNeode() +const driver = getDriver() + +const { server } = createServer({ + context: () => { + return { + user: null, + neode, + driver, + } + }, +}) +const { query } = createTestClient(server) + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + await neode.create('Post', { title: 'first' }) + await neode.create('Post', { title: 'second' }) + await neode.create('Post', { title: 'third' }) + await neode.create('Post', { title: 'last' }) +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('Query', () => { + describe('Post', () => { + describe('orderBy', () => { + it('createdAt descending is default', async () => { + const posts = [ + { title: 'last' }, + { title: 'third' }, + { title: 'second' }, + { title: 'first' }, + ] + const expected = expect.objectContaining({ data: { Post: posts } }) + await expect( + query({ + query: gql` + { + Post { + title + } + } + `, + }), + ).resolves.toEqual(expected) + }) + + describe('(orderBy: createdAt_asc)', () => { + it('orders by createdAt ascending', async () => { + const posts = [ + { title: 'first' }, + { title: 'second' }, + { title: 'third' }, + { title: 'last' }, + ] + const expected = expect.objectContaining({ data: { Post: posts } }) + await expect( + query({ + query: gql` + { + Post(orderBy: createdAt_asc) { + title + } + } + `, + }), + ).resolves.toEqual(expected) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/orderByMiddleware.ts b/docs/backend/src/middleware/orderByMiddleware.ts new file mode 100644 index 000000000..64eac8b74 --- /dev/null +++ b/docs/backend/src/middleware/orderByMiddleware.ts @@ -0,0 +1,19 @@ +import cloneDeep from 'lodash/cloneDeep' + +const defaultOrderBy = (resolve, root, args, context, resolveInfo) => { + const copy = cloneDeep(resolveInfo) + const newestFirst = { + kind: 'Argument', + name: { kind: 'Name', value: 'orderBy' }, + value: { kind: 'EnumValue', value: 'createdAt_desc' }, + } + const [fieldNode] = copy.fieldNodes + if (fieldNode) fieldNode.arguments.push(newestFirst) + return resolve(root, args, context, copy) +} + +export default { + Query: { + Post: defaultOrderBy, + }, +} diff --git a/docs/backend/src/middleware/permissionsMiddleware.spec.ts b/docs/backend/src/middleware/permissionsMiddleware.spec.ts new file mode 100644 index 000000000..667e74164 --- /dev/null +++ b/docs/backend/src/middleware/permissionsMiddleware.spec.ts @@ -0,0 +1,300 @@ +import { createTestClient } from 'apollo-server-testing' +import createServer from '../server' +import Factory, { cleanDatabase } from '../db/factories' +import gql from 'graphql-tag' +import { getDriver, getNeode } from '../db/neo4j' +import CONFIG from '../config' + +const instance = getNeode() +const driver = getDriver() + +let query, mutate, variables +let authenticatedUser, owner, anotherRegularUser, administrator, moderator + +describe('authorization', () => { + beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => ({ + driver, + instance, + user: authenticatedUser, + }), + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate + }) + + afterAll(async () => { + await cleanDatabase() + driver.close() + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('given an owner, an other user, an admin, a moderator', () => { + beforeEach(async () => { + ;[owner, anotherRegularUser, administrator, moderator] = await Promise.all([ + Factory.build( + 'user', + { + name: 'Owner', + }, + { + email: 'owner@example.org', + password: 'iamtheowner', + }, + ), + Factory.build( + 'user', + { + name: 'Another Regular User', + }, + { + email: 'another.regular.user@example.org', + password: 'else', + }, + ), + Factory.build( + 'user', + { + name: 'Admin', + role: 'admin', + }, + { + email: 'admin@example.org', + password: 'admin', + }, + ), + Factory.build( + 'user', + { + name: 'Moderator', + role: 'moderator', + }, + { + email: 'moderator@example.org', + password: 'moderator', + }, + ), + ]) + variables = {} + }) + + describe('access email address', () => { + const userQuery = gql` + query ($name: String) { + User(name: $name) { + email + } + } + ` + + describe('unauthenticated', () => { + beforeEach(() => { + authenticatedUser = null + }) + + it("throws an error and does not expose the owner's email address", async () => { + await expect( + query({ query: userQuery, variables: { name: 'Owner' } }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { User: [null] }, + }) + }) + }) + + describe('authenticated', () => { + describe('as the owner', () => { + beforeEach(async () => { + authenticatedUser = await owner.toJson() + }) + + it("exposes the owner's email address", async () => { + variables = { name: 'Owner' } + await expect(query({ query: userQuery, variables })).resolves.toMatchObject({ + data: { User: [{ email: 'owner@example.org' }] }, + errors: undefined, + }) + }) + }) + + describe('as another regular user', () => { + beforeEach(async () => { + authenticatedUser = await anotherRegularUser.toJson() + }) + + it("throws an error and does not expose the owner's email address", async () => { + await expect( + query({ query: userQuery, variables: { name: 'Owner' } }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { User: [null] }, + }) + }) + }) + + describe('as a moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + it("throws an error and does not expose the owner's email address", async () => { + await expect( + query({ query: userQuery, variables: { name: 'Owner' } }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { User: [null] }, + }) + }) + }) + + describe('as an administrator', () => { + beforeEach(async () => { + authenticatedUser = await administrator.toJson() + }) + + it("exposes the owner's email address", async () => { + variables = { name: 'Owner' } + await expect(query({ query: userQuery, variables })).resolves.toMatchObject({ + data: { User: [{ email: 'owner@example.org' }] }, + errors: undefined, + }) + }) + }) + }) + }) + + describe('access Signup', () => { + const signupMutation = gql` + mutation ($email: String!, $inviteCode: String) { + Signup(email: $email, inviteCode: $inviteCode) { + email + } + } + ` + + describe('admin invite only', () => { + beforeEach(async () => { + variables = { + email: 'some@email.org', + inviteCode: 'ABCDEF', + } + CONFIG.INVITE_REGISTRATION = false + CONFIG.PUBLIC_REGISTRATION = false + await Factory.build('inviteCode', { + code: 'ABCDEF', + }) + }) + + describe('as user', () => { + beforeEach(async () => { + authenticatedUser = await anotherRegularUser.toJson() + }) + + it('denies permission', async () => { + await expect(mutate({ mutation: signupMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { Signup: null }, + }) + }) + }) + + describe('as admin', () => { + beforeEach(async () => { + authenticatedUser = await administrator.toJson() + }) + + it('returns an email', async () => { + await expect(mutate({ mutation: signupMutation, variables })).resolves.toMatchObject({ + errors: undefined, + data: { + Signup: { email: 'some@email.org' }, + }, + }) + }) + }) + }) + + describe('public registration', () => { + beforeEach(async () => { + variables = { + email: 'some@email.org', + inviteCode: 'ABCDEF', + } + CONFIG.INVITE_REGISTRATION = false + CONFIG.PUBLIC_REGISTRATION = true + await Factory.build('inviteCode', { + code: 'ABCDEF', + }) + }) + + describe('as anyone', () => { + beforeEach(async () => { + authenticatedUser = null + }) + + it('returns an email', async () => { + await expect(mutate({ mutation: signupMutation, variables })).resolves.toMatchObject({ + errors: undefined, + data: { + Signup: { email: 'some@email.org' }, + }, + }) + }) + }) + }) + + describe('invite registration', () => { + beforeEach(async () => { + CONFIG.INVITE_REGISTRATION = true + CONFIG.PUBLIC_REGISTRATION = false + await Factory.build('inviteCode', { + code: 'ABCDEF', + }) + }) + + describe('as anyone with valid invite code', () => { + beforeEach(async () => { + variables = { + email: 'some@email.org', + inviteCode: 'ABCDEF', + } + authenticatedUser = null + }) + + it('returns an email', async () => { + await expect(mutate({ mutation: signupMutation, variables })).resolves.toMatchObject({ + errors: undefined, + data: { + Signup: { email: 'some@email.org' }, + }, + }) + }) + }) + + describe('as anyone without valid invite', () => { + beforeEach(async () => { + variables = { + email: 'some@email.org', + inviteCode: 'no valid invite code', + } + authenticatedUser = null + }) + + it('denies permission', async () => { + await expect(mutate({ mutation: signupMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { Signup: null }, + }) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/permissionsMiddleware.ts b/docs/backend/src/middleware/permissionsMiddleware.ts new file mode 100644 index 000000000..f87f4b079 --- /dev/null +++ b/docs/backend/src/middleware/permissionsMiddleware.ts @@ -0,0 +1,480 @@ +import { rule, shield, deny, allow, or, and } from 'graphql-shield' +import { getNeode } from '../db/neo4j' +import CONFIG from '../config' +import { validateInviteCode } from '../schema/resolvers/transactions/inviteCodes' + +const debug = !!CONFIG.DEBUG +const allowExternalErrors = true + +const neode = getNeode() + +const isAuthenticated = rule({ + cache: 'contextual', +})(async (_parent, _args, ctx, _info) => { + return !!(ctx && ctx.user && ctx.user.id) +}) + +const isModerator = rule()(async (parent, args, { user }, info) => { + return user && (user.role === 'moderator' || user.role === 'admin') +}) + +const isAdmin = rule()(async (parent, args, { user }, info) => { + return user && user.role === 'admin' +}) + +const onlyYourself = rule({ + cache: 'no_cache', +})(async (parent, args, context, info) => { + return context.user.id === args.id +}) + +const isMyOwn = rule({ + cache: 'no_cache', +})(async (parent, args, { user }, info) => { + return user && user.id === parent.id +}) + +const isMySocialMedia = rule({ + cache: 'no_cache', +})(async (_, args, { user }) => { + // We need a User + if (!user) { + return false + } + let socialMedia = await neode.find('SocialMedia', args.id) + // Did we find a social media node? + if (!socialMedia) { + return false + } + socialMedia = await socialMedia.toJson() // whats this for? + + // Is it my social media entry? + return socialMedia.ownedBy.node.id === user.id +}) + +const isAllowedToChangeGroupSettings = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const ownerId = user.id + const { id: groupId } = args + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (owner:User {id: $ownerId})-[membership:MEMBER_OF]->(group:Group {id: $groupId}) + RETURN group {.*}, owner {.*, myRoleInGroup: membership.role} + `, + { groupId, ownerId }, + ) + return { + owner: transactionResponse.records.map((record) => record.get('owner'))[0], + group: transactionResponse.records.map((record) => record.get('group'))[0], + } + }) + try { + const { owner, group } = await readTxPromise + return !!group && !!owner && ['owner'].includes(owner.myRoleInGroup) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const isAllowedSeeingGroupMembers = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const { id: groupId } = args + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (group:Group {id: $groupId}) + OPTIONAL MATCH (member:User {id: $userId})-[membership:MEMBER_OF]->(group) + RETURN group {.*}, member {.*, myRoleInGroup: membership.role} + `, + { groupId, userId: user.id }, + ) + return { + member: transactionResponse.records.map((record) => record.get('member'))[0], + group: transactionResponse.records.map((record) => record.get('group'))[0], + } + }) + try { + const { member, group } = await readTxPromise + return ( + !!group && + (group.groupType === 'public' || + (['closed', 'hidden'].includes(group.groupType) && + !!member && + ['usual', 'admin', 'owner'].includes(member.myRoleInGroup))) + ) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const isAllowedToChangeGroupMemberRole = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const currentUserId = user.id + const { groupId, userId, roleInGroup } = args + if (currentUserId === userId) return false + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (currentUser:User {id: $currentUserId})-[currentUserMembership:MEMBER_OF]->(group:Group {id: $groupId}) + OPTIONAL MATCH (group)<-[userMembership:MEMBER_OF]-(member:User {id: $userId}) + RETURN group {.*}, currentUser {.*, myRoleInGroup: currentUserMembership.role}, member {.*, myRoleInGroup: userMembership.role} + `, + { groupId, currentUserId, userId }, + ) + return { + currentUser: transactionResponse.records.map((record) => record.get('currentUser'))[0], + group: transactionResponse.records.map((record) => record.get('group'))[0], + member: transactionResponse.records.map((record) => record.get('member'))[0], + } + }) + try { + const { currentUser, group, member } = await readTxPromise + const groupExists = !!group + const currentUserExists = !!currentUser + const userIsMember = !!member + const sameUserRoleInGroup = member && member.myRoleInGroup === roleInGroup + const userIsOwner = member && ['owner'].includes(member.myRoleInGroup) + const currentUserIsAdmin = currentUser && ['admin'].includes(currentUser.myRoleInGroup) + const adminCanSetRole = ['pending', 'usual', 'admin'].includes(roleInGroup) + const currentUserIsOwner = currentUser && ['owner'].includes(currentUser.myRoleInGroup) + const ownerCanSetRole = ['pending', 'usual', 'admin', 'owner'].includes(roleInGroup) + return ( + groupExists && + currentUserExists && + (!userIsMember || (userIsMember && (sameUserRoleInGroup || !userIsOwner))) && + ((currentUserIsAdmin && adminCanSetRole) || (currentUserIsOwner && ownerCanSetRole)) + ) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const isAllowedToJoinGroup = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const { groupId, userId } = args + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (group:Group {id: $groupId}) + OPTIONAL MATCH (group)<-[membership:MEMBER_OF]-(member:User {id: $userId}) + RETURN group {.*}, member {.*, myRoleInGroup: membership.role} + `, + { groupId, userId }, + ) + return { + group: transactionResponse.records.map((record) => record.get('group'))[0], + member: transactionResponse.records.map((record) => record.get('member'))[0], + } + }) + try { + const { group, member } = await readTxPromise + return !!group && (group.groupType !== 'hidden' || (!!member && !!member.myRoleInGroup)) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const isAllowedToLeaveGroup = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const { groupId, userId } = args + if (user.id !== userId) return false + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (member:User {id: $userId})-[membership:MEMBER_OF]->(group:Group {id: $groupId}) + RETURN group {.*}, member {.*, myRoleInGroup: membership.role} + `, + { groupId, userId }, + ) + return { + group: transactionResponse.records.map((record) => record.get('group'))[0], + member: transactionResponse.records.map((record) => record.get('member'))[0], + } + }) + try { + const { group, member } = await readTxPromise + return !!group && !!member && !!member.myRoleInGroup && member.myRoleInGroup !== 'owner' + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const isMemberOfGroup = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const { groupId } = args + if (!groupId) return true + const userId = user.id + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (User {id: $userId})-[membership:MEMBER_OF]->(Group {id: $groupId}) + RETURN membership.role AS role + `, + { groupId, userId }, + ) + return transactionResponse.records.map((record) => record.get('role'))[0] + }) + try { + const role = await readTxPromise + return ['usual', 'admin', 'owner'].includes(role) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const canRemoveUserFromGroup = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const { groupId, userId } = args + const currentUserId = user.id + if (currentUserId === userId) return false + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (User {id: $currentUserId})-[currentUserMembership:MEMBER_OF]->(group:Group {id: $groupId}) + OPTIONAL MATCH (group)<-[userMembership:MEMBER_OF]-(user:User { id: $userId }) + RETURN currentUserMembership.role AS currentUserRole, userMembership.role AS userRole + `, + { currentUserId, groupId, userId }, + ) + return { + currentUserRole: transactionResponse.records.map((record) => + record.get('currentUserRole'), + )[0], + userRole: transactionResponse.records.map((record) => record.get('userRole'))[0], + } + }) + try { + const { currentUserRole, userRole } = await readTxPromise + return ( + currentUserRole && ['owner'].includes(currentUserRole) && userRole && userRole !== 'owner' + ) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const canCommentPost = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!(user && user.id)) return false + const { postId } = args + const userId = user.id + const session = driver.session() + const readTxPromise = session.readTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (post:Post { id: $postId }) + OPTIONAL MATCH (post)-[:IN]->(group:Group) + OPTIONAL MATCH (user:User { id: $userId })-[membership:MEMBER_OF]->(group) + RETURN group AS group, membership AS membership + `, + { postId, userId }, + ) + return { + group: transactionResponse.records.map((record) => record.get('group'))[0], + membership: transactionResponse.records.map((record) => record.get('membership'))[0], + } + }) + try { + const { group, membership } = await readTxPromise + return ( + !group || (membership && ['usual', 'admin', 'owner'].includes(membership.properties.role)) + ) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } +}) + +const isAuthor = rule({ + cache: 'no_cache', +})(async (_parent, args, { user, driver }) => { + if (!user) return false + const { id: resourceId } = args + const session = driver.session() + const authorReadTxPromise = session.readTransaction(async (transaction) => { + const authorTransactionResponse = await transaction.run( + ` + MATCH (resource {id: $resourceId})<-[:WROTE]-(author {id: $userId}) + RETURN author + `, + { resourceId, userId: user.id }, + ) + return authorTransactionResponse.records.map((record) => record.get('author')) + }) + try { + const [author] = await authorReadTxPromise + return !!author + } finally { + session.close() + } +}) + +const isDeletingOwnAccount = rule({ + cache: 'no_cache', +})(async (parent, args, context, _info) => { + return context.user.id === args.id +}) + +const noEmailFilter = rule({ + cache: 'no_cache', +})(async (_, args) => { + return !('email' in args) +}) + +const publicRegistration = rule()(() => CONFIG.PUBLIC_REGISTRATION) + +const inviteRegistration = rule()(async (_parent, args, { user, driver }) => { + if (!CONFIG.INVITE_REGISTRATION) return false + const { inviteCode } = args + const session = driver.session() + return validateInviteCode(session, inviteCode) +}) + +// Permissions +export default shield( + { + Query: { + '*': deny, + searchResults: allow, + searchPosts: allow, + searchUsers: allow, + searchGroups: allow, + searchHashtags: allow, + embed: allow, + Category: allow, + Tag: allow, + reports: isModerator, + statistics: allow, + currentUser: allow, + Group: isAuthenticated, + GroupMembers: isAllowedSeeingGroupMembers, + GroupCount: isAuthenticated, + Post: allow, + profilePagePosts: allow, + Comment: allow, + User: or(noEmailFilter, isAdmin), + isLoggedIn: allow, + Badge: allow, + PostsEmotionsCountByEmotion: allow, + PostsEmotionsByCurrentUser: isAuthenticated, + mutedUsers: isAuthenticated, + blockedUsers: isAuthenticated, + notifications: isAuthenticated, + Donations: isAuthenticated, + userData: isAuthenticated, + MyInviteCodes: isAuthenticated, + isValidInviteCode: allow, + VerifyNonce: allow, + queryLocations: isAuthenticated, + availableRoles: isAdmin, + getInviteCode: isAuthenticated, // and inviteRegistration + Room: isAuthenticated, + Message: isAuthenticated, + UnreadRooms: isAuthenticated, + }, + Mutation: { + '*': deny, + login: allow, + Signup: or(publicRegistration, inviteRegistration, isAdmin), + SignupVerification: allow, + UpdateUser: onlyYourself, + CreateGroup: isAuthenticated, + UpdateGroup: isAllowedToChangeGroupSettings, + JoinGroup: isAllowedToJoinGroup, + LeaveGroup: isAllowedToLeaveGroup, + ChangeGroupMemberRole: isAllowedToChangeGroupMemberRole, + RemoveUserFromGroup: canRemoveUserFromGroup, + CreatePost: and(isAuthenticated, isMemberOfGroup), + UpdatePost: isAuthor, + DeletePost: isAuthor, + fileReport: isAuthenticated, + CreateSocialMedia: isAuthenticated, + UpdateSocialMedia: isMySocialMedia, + DeleteSocialMedia: isMySocialMedia, + // AddBadgeRewarded: isAdmin, + // RemoveBadgeRewarded: isAdmin, + reward: isAdmin, + unreward: isAdmin, + followUser: isAuthenticated, + unfollowUser: isAuthenticated, + shout: isAuthenticated, + unshout: isAuthenticated, + changePassword: isAuthenticated, + review: isModerator, + CreateComment: and(isAuthenticated, canCommentPost), + UpdateComment: isAuthor, + DeleteComment: isAuthor, + DeleteUser: or(isDeletingOwnAccount, isAdmin), + requestPasswordReset: allow, + resetPassword: allow, + AddPostEmotions: isAuthenticated, + RemovePostEmotions: isAuthenticated, + muteUser: isAuthenticated, + unmuteUser: isAuthenticated, + blockUser: isAuthenticated, + unblockUser: isAuthenticated, + markAsRead: isAuthenticated, + markAllAsRead: isAuthenticated, + AddEmailAddress: isAuthenticated, + VerifyEmailAddress: isAuthenticated, + pinPost: isAdmin, + unpinPost: isAdmin, + UpdateDonations: isAdmin, + GenerateInviteCode: isAuthenticated, + switchUserRole: isAdmin, + markTeaserAsViewed: allow, + saveCategorySettings: isAuthenticated, + CreateRoom: isAuthenticated, + CreateMessage: isAuthenticated, + MarkMessagesAsSeen: isAuthenticated, + }, + User: { + email: or(isMyOwn, isAdmin), + }, + Report: isModerator, + }, + { + debug, + allowExternalErrors, + fallbackRule: allow, + fallbackError: Error('Not Authorized!'), + }, +) diff --git a/docs/backend/src/middleware/sentryMiddleware.ts b/docs/backend/src/middleware/sentryMiddleware.ts new file mode 100644 index 000000000..73f393eef --- /dev/null +++ b/docs/backend/src/middleware/sentryMiddleware.ts @@ -0,0 +1,29 @@ +import { sentry } from 'graphql-middleware-sentry' +import CONFIG from '../config' + +let sentryMiddleware: any = (resolve, root, args, context, resolveInfo) => + resolve(root, args, context, resolveInfo) + +if (CONFIG.SENTRY_DSN_BACKEND) { + sentryMiddleware = sentry({ + forwardErrors: true, + config: { + dsn: CONFIG.SENTRY_DSN_BACKEND, + release: CONFIG.COMMIT, + environment: CONFIG.NODE_ENV, + }, + withScope: (scope, error, context: any) => { + scope.setUser({ + id: context.user && context.user.id, + }) + scope.setExtra('body', context.req.body) + scope.setExtra('origin', context.req.headers.origin) + scope.setExtra('user-agent', context.req.headers['user-agent']) + }, + }) +} else { + // eslint-disable-next-line no-console + if (!CONFIG.TEST) console.log('Warning: Sentry middleware inactive.') +} + +export default sentryMiddleware diff --git a/docs/backend/src/middleware/sluggifyMiddleware.ts b/docs/backend/src/middleware/sluggifyMiddleware.ts new file mode 100644 index 000000000..bbe47c9aa --- /dev/null +++ b/docs/backend/src/middleware/sluggifyMiddleware.ts @@ -0,0 +1,43 @@ +import uniqueSlug from './slugify/uniqueSlug' + +const isUniqueFor = (context, type) => { + return async (slug) => { + const session = context.driver.session() + try { + const existingSlug = await session.readTransaction((transaction) => { + return transaction.run( + ` + MATCH(p:${type} {slug: $slug }) + RETURN p.slug + `, + { slug }, + ) + }) + return existingSlug.records.length === 0 + } finally { + session.close() + } + } +} + +export default { + Mutation: { + SignupVerification: async (resolve, root, args, context, info) => { + args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'User'))) + return resolve(root, args, context, info) + }, + CreateGroup: async (resolve, root, args, context, info) => { + args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'Group'))) + return resolve(root, args, context, info) + }, + CreatePost: async (resolve, root, args, context, info) => { + args.slug = args.slug || (await uniqueSlug(args.title, isUniqueFor(context, 'Post'))) + return resolve(root, args, context, info) + }, + UpdatePost: async (resolve, root, args, context, info) => { + // TODO: is this absolutely correct? what happens if "args.title" is not defined? may it works accidentally, because "args.title" or "args.slug" is always send? + args.slug = args.slug || (await uniqueSlug(args.title, isUniqueFor(context, 'Post'))) + return resolve(root, args, context, info) + }, + }, +} diff --git a/docs/backend/src/middleware/slugify/uniqueSlug.spec.ts b/docs/backend/src/middleware/slugify/uniqueSlug.spec.ts new file mode 100644 index 000000000..659a439c2 --- /dev/null +++ b/docs/backend/src/middleware/slugify/uniqueSlug.spec.ts @@ -0,0 +1,33 @@ +import uniqueSlug from './uniqueSlug' + +describe('uniqueSlug', () => { + it('slugifies given string', async () => { + const string = 'Hello World' + const isUnique = jest.fn().mockResolvedValue(true) + await expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world') + }) + + it('increments slugified string until unique', async () => { + const string = 'Hello World' + const isUnique = jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true) + await expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world-1') + }) + + it('slugify null string', async () => { + const string = null + const isUnique = jest.fn().mockResolvedValue(true) + await expect(uniqueSlug(string, isUnique)).resolves.toEqual('anonymous') + }) + + it('Converts umlaut to a two letter equivalent', async () => { + const umlaut = 'ÄÖÜäöüß' + const isUnique = jest.fn().mockResolvedValue(true) + await expect(uniqueSlug(umlaut, isUnique)).resolves.toEqual('aeoeueaeoeuess') + }) + + it('Removes Spanish enya and diacritics', async () => { + const diacritics = 'áàéèíìóòúùñçÁÀÉÈÍÌÓÒÚÙÑÇ' + const isUnique = jest.fn().mockResolvedValue(true) + await expect(uniqueSlug(diacritics, isUnique)).resolves.toEqual('aaeeiioouuncaaeeiioouunc') + }) +}) diff --git a/docs/backend/src/middleware/slugify/uniqueSlug.ts b/docs/backend/src/middleware/slugify/uniqueSlug.ts new file mode 100644 index 000000000..41d58ece3 --- /dev/null +++ b/docs/backend/src/middleware/slugify/uniqueSlug.ts @@ -0,0 +1,17 @@ +import slugify from 'slug' + +export default async function uniqueSlug(string, isUnique) { + const slug = slugify(string || 'anonymous', { + lower: true, + multicharmap: { Ä: 'AE', ä: 'ae', Ö: 'OE', ö: 'oe', Ü: 'UE', ü: 'ue', ß: 'ss' }, + }) + if (await isUnique(slug)) return slug + + let count = 0 + let uniqueSlug + do { + count += 1 + uniqueSlug = `${slug}-${count}` + } while (!(await isUnique(uniqueSlug))) + return uniqueSlug +} diff --git a/docs/backend/src/middleware/slugifyMiddleware.spec.ts b/docs/backend/src/middleware/slugifyMiddleware.spec.ts new file mode 100644 index 000000000..b0b2371b2 --- /dev/null +++ b/docs/backend/src/middleware/slugifyMiddleware.spec.ts @@ -0,0 +1,535 @@ +import { getNeode, getDriver } from '../db/neo4j' +import createServer from '../server' +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../db/factories' +import { createGroupMutation, updateGroupMutation } from '../graphql/groups' +import { createPostMutation } from '../graphql/posts' +import { signupVerificationMutation } from '../graphql/authentications' + +let authenticatedUser +let variables +const categoryIds = ['cat9'] + +const driver = getDriver() +const neode = getNeode() +const descriptionAdditional100 = + ' 123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789' + +const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, +}) + +const { mutate } = createTestClient(server) + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + variables = {} + const admin = await Factory.build('user', { + role: 'admin', + }) + await Factory.build( + 'user', + {}, + { + email: 'someone@example.org', + password: '1234', + }, + ) + await Factory.build('category', { + id: 'cat9', + name: 'Democracy & Politics', + slug: 'democracy-politics', + icon: 'university', + }) + authenticatedUser = await admin.toJson() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('slugifyMiddleware', () => { + describe('CreateGroup', () => { + beforeEach(() => { + variables = { + ...variables, + name: 'The Best Group', + about: 'Some about', + description: 'Some description' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + categoryIds, + } + }) + + describe('if slug not exists', () => { + it('generates a slug based on name', async () => { + await expect( + mutate({ + mutation: createGroupMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + CreateGroup: { + name: 'The Best Group', + slug: 'the-best-group', + about: 'Some about', + description: 'Some description' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + }, + }, + errors: undefined, + }) + }) + + it('generates a slug based on given slug', async () => { + await expect( + mutate({ + mutation: createGroupMutation(), + variables: { + ...variables, + slug: 'the-group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreateGroup: { + slug: 'the-group', + }, + }, + errors: undefined, + }) + }) + }) + + describe('if slug exists', () => { + beforeEach(async () => { + await mutate({ + mutation: createGroupMutation(), + variables: { + ...variables, + name: 'Pre-Existing Group', + slug: 'pre-existing-group', + about: 'As an about', + }, + }) + }) + + it('chooses another slug', async () => { + await expect( + mutate({ + mutation: createGroupMutation(), + variables: { + ...variables, + name: 'Pre-Existing Group', + about: 'As an about', + }, + }), + ).resolves.toMatchObject({ + data: { + CreateGroup: { + slug: 'pre-existing-group-1', + }, + }, + errors: undefined, + }) + }) + + describe('but if the client specifies a slug', () => { + it('rejects CreateGroup', async () => { + try { + await expect( + mutate({ + mutation: createGroupMutation(), + variables: { + ...variables, + name: 'Pre-Existing Group', + about: 'As an about', + slug: 'pre-existing-group', + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Group with this slug already exists!', + }, + ], + }) + } catch (error) { + throw new Error(` + ${error} + + Probably your database has no unique constraints! + + To see all constraints go to http://localhost:7474/browser/ and + paste the following: + \`\`\` + CALL db.constraints(); + \`\`\` + + Learn how to setup the database here: + https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/backend/README.md#database-indices-and-constraints + `) + } + }) + }) + }) + }) + + describe('UpdateGroup', () => { + let createGroupResult + + beforeEach(async () => { + createGroupResult = await mutate({ + mutation: createGroupMutation(), + variables: { + name: 'The Best Group', + slug: 'the-best-group', + about: 'Some about', + description: 'Some description' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + categoryIds, + }, + }) + }) + + describe('if group exists', () => { + describe('if new slug not(!) exists', () => { + describe('setting slug explicitly', () => { + it('has the new slug', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: createGroupResult.data.CreateGroup.id, + slug: 'my-best-group', + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + name: 'The Best Group', + slug: 'my-best-group', + about: 'Some about', + description: 'Some description' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('if new slug exists in another group', () => { + beforeEach(async () => { + await mutate({ + mutation: createGroupMutation(), + variables: { + name: 'Pre-Existing Group', + slug: 'pre-existing-group', + about: 'Some about', + description: 'Some description' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + categoryIds, + }, + }) + }) + + describe('setting slug explicitly', () => { + it('rejects UpdateGroup', async () => { + try { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: createGroupResult.data.CreateGroup.id, + slug: 'pre-existing-group', + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Group with this slug already exists!', + }, + ], + }) + } catch (error) { + throw new Error(` + ${error} + + Probably your database has no unique constraints! + + To see all constraints go to http://localhost:7474/browser/ and + paste the following: + \`\`\` + CALL db.constraints(); + \`\`\` + + Learn how to setup the database here: + https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/backend/README.md#database-indices-and-constraints + `) + } + }) + }) + }) + }) + }) + + describe('CreatePost', () => { + beforeEach(() => { + variables = { + ...variables, + title: 'I am a brand new post', + content: 'Some content', + categoryIds, + } + }) + + describe('if slug not exists', () => { + it('generates a slug based on title', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + slug: 'i-am-a-brand-new-post', + }, + }, + errors: undefined, + }) + }) + + it('generates a slug based on given slug', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + slug: 'the-post', + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + slug: 'the-post', + }, + }, + errors: undefined, + }) + }) + }) + + describe('if slug exists', () => { + beforeEach(async () => { + await Factory.build( + 'post', + { + title: 'Pre-existing post', + slug: 'pre-existing-post', + content: 'as Someone else content', + }, + { + categoryIds, + }, + ) + }) + + it('chooses another slug', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + title: 'Pre-existing post', + content: 'Some content', + categoryIds, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + slug: 'pre-existing-post-1', + }, + }, + errors: undefined, + }) + }) + + describe('but if the client specifies a slug', () => { + it('rejects CreatePost', async () => { + try { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + title: 'Pre-existing post', + content: 'Some content', + slug: 'pre-existing-post', + categoryIds, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Post with this slug already exists!', + }, + ], + }) + } catch (error) { + throw new Error(` + ${error} + + Probably your database has no unique constraints! + + To see all constraints go to http://localhost:7474/browser/ and + paste the following: + \`\`\` + CALL db.constraints(); + \`\`\` + + Learn how to setup the database here: + https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/backend/README.md#database-indices-and-constraints + `) + } + }) + }) + }) + }) + + it.todo('UpdatePost') + + describe('SignupVerification', () => { + beforeEach(() => { + variables = { + ...variables, + name: 'I am a user', + nonce: '12345', + password: 'yo', + email: '123@example.org', + termsAndConditionsAgreedVersion: '0.0.1', + } + }) + + describe('given a user has signed up with their email address', () => { + beforeEach(async () => { + await Factory.build('emailAddress', { + email: '123@example.org', + nonce: '12345', + verifiedAt: null, + }) + }) + + describe('if slug not exists', () => { + it('generates a slug based on name', async () => { + await expect( + mutate({ + mutation: signupVerificationMutation, + variables, + }), + ).resolves.toMatchObject({ + data: { + SignupVerification: { + slug: 'i-am-a-user', + }, + }, + errors: undefined, + }) + }) + + it('generates a slug based on given slug', async () => { + await expect( + mutate({ + mutation: signupVerificationMutation, + variables: { + ...variables, + slug: 'the-user', + }, + }), + ).resolves.toMatchObject({ + data: { + SignupVerification: { + slug: 'the-user', + }, + }, + errors: undefined, + }) + }) + }) + + describe('if slug exists', () => { + beforeEach(async () => { + await Factory.build('user', { + name: 'I am a user', + slug: 'i-am-a-user', + }) + }) + + it('chooses another slug', async () => { + await expect( + mutate({ + mutation: signupVerificationMutation, + variables, + }), + ).resolves.toMatchObject({ + data: { + SignupVerification: { + slug: 'i-am-a-user-1', + }, + }, + errors: undefined, + }) + }) + + describe('but if the client specifies a slug', () => { + beforeEach(() => { + variables = { + ...variables, + slug: 'i-am-a-user', + } + }) + + it('rejects SignupVerification (on FAIL Neo4j constraints may not defined in database)', async () => { + await expect( + mutate({ + mutation: signupVerificationMutation, + variables, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'User with this slug already exists!', + }, + ], + }) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/softDelete/softDeleteMiddleware.spec.ts b/docs/backend/src/middleware/softDelete/softDeleteMiddleware.spec.ts new file mode 100644 index 000000000..88d46a1c7 --- /dev/null +++ b/docs/backend/src/middleware/softDelete/softDeleteMiddleware.spec.ts @@ -0,0 +1,426 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +const neode = getNeode() +const driver = getDriver() + +const categoryIds = ['cat9'] +let query, graphqlQuery, authenticatedUser, user, moderator, troll + +const action = () => { + return query({ query: graphqlQuery }) +} + +beforeAll(async () => { + await cleanDatabase() + + // For performance reasons we do this only once + const users = await Promise.all([ + Factory.build('user', { id: 'u1', role: 'user' }), + Factory.build( + 'user', + { + id: 'm1', + role: 'moderator', + }, + { + password: '1234', + }, + ), + Factory.build( + 'user', + { + id: 'u2', + role: 'user', + name: 'Offensive Name', + slug: 'offensive-name', + about: 'This self description is very offensive', + }, + { + avatar: Factory.build('image', { + url: '/some/offensive/avatar.jpg', + }), + }, + ), + neode.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }), + ]) + + user = users[0] + moderator = users[1] + troll = users[2] + + await Promise.all([ + user.relateTo(troll, 'following'), + Factory.build( + 'post', + { + id: 'p1', + title: 'Deleted post', + slug: 'deleted-post', + deleted: true, + }, + { + author: user, + categoryIds, + }, + ), + Factory.build( + 'post', + { + id: 'p3', + title: 'Publicly visible post', + slug: 'publicly-visible-post', + deleted: false, + }, + { + author: user, + categoryIds, + }, + ), + ]) + + const resources = await Promise.all([ + Factory.build( + 'comment', + { + id: 'c2', + content: 'Enabled comment on public post', + }, + { + author: user, + postId: 'p3', + }, + ), + Factory.build( + 'post', + { + id: 'p2', + title: 'Disabled post', + content: 'This is an offensive post content', + contentExcerpt: 'This is an offensive post content', + deleted: false, + }, + { + image: Factory.build('image', { + url: '/some/offensive/image.jpg', + }), + author: troll, + categoryIds, + }, + ), + Factory.build( + 'comment', + { + id: 'c1', + content: 'Disabled comment', + contentExcerpt: 'Disabled comment', + }, + { + author: troll, + postId: 'p3', + }, + ), + ]) + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + const client = createTestClient(server) + query = client.query + + const trollingPost = resources[1] + const trollingComment = resources[2] + + const reports = await Promise.all([ + Factory.build('report'), + Factory.build('report'), + Factory.build('report'), + ]) + const reportAgainstTroll = reports[0] + const reportAgainstTrollingPost = reports[1] + const reportAgainstTrollingComment = reports[2] + + const reportVariables = { + resourceId: 'undefined-resource', + reasonCategory: 'discrimination_etc', + reasonDescription: 'I am what I am !!!', + } + + await Promise.all([ + reportAgainstTroll.relateTo(user, 'filed', { ...reportVariables, resourceId: 'u2' }), + reportAgainstTroll.relateTo(troll, 'belongsTo'), + reportAgainstTrollingPost.relateTo(user, 'filed', { ...reportVariables, resourceId: 'p2' }), + reportAgainstTrollingPost.relateTo(trollingPost, 'belongsTo'), + reportAgainstTrollingComment.relateTo(moderator, 'filed', { + ...reportVariables, + resourceId: 'c1', + }), + reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo'), + ]) + + const disableVariables = { + resourceId: 'undefined-resource', + disable: true, + closed: false, + } + + await Promise.all([ + reportAgainstTroll.relateTo(moderator, 'reviewed', { ...disableVariables, resourceId: 'u2' }), + troll.update({ disabled: true, updatedAt: new Date().toISOString() }), + reportAgainstTrollingPost.relateTo(moderator, 'reviewed', { + ...disableVariables, + resourceId: 'p2', + }), + trollingPost.update({ disabled: true, updatedAt: new Date().toISOString() }), + reportAgainstTrollingComment.relateTo(moderator, 'reviewed', { + ...disableVariables, + resourceId: 'c1', + }), + trollingComment.update({ disabled: true, updatedAt: new Date().toISOString() }), + ]) +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('softDeleteMiddleware', () => { + describe('read disabled content', () => { + let subject + const beforeComment = async () => { + graphqlQuery = gql` + { + User(id: "u1") { + following { + comments { + content + contentExcerpt + } + } + } + } + ` + const { data } = await action() + subject = data.User[0].following[0].comments[0] + } + const beforeUser = async () => { + graphqlQuery = gql` + { + User(id: "u1") { + following { + name + slug + about + avatar { + url + } + } + } + } + ` + const { data } = await action() + subject = data.User[0].following[0] + } + const beforePost = async () => { + graphqlQuery = gql` + { + User(id: "u1") { + following { + contributions { + title + slug + image { + url + } + content + contentExcerpt + } + } + } + } + ` + const { data } = await action() + subject = data.User[0].following[0].contributions[0] + } + + describe('as moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + describe('User', () => { + beforeEach(beforeUser) + + it('displays name', () => expect(subject.name).toEqual('Offensive Name')) + it('displays slug', () => expect(subject.slug).toEqual('offensive-name')) + it('displays about', () => + expect(subject.about).toEqual('This self description is very offensive')) + it('displays avatar', () => + expect(subject.avatar).toEqual({ + url: expect.stringContaining('/some/offensive/avatar.jpg'), + })) + }) + + describe('Post', () => { + beforeEach(beforePost) + + it('displays title', () => expect(subject.title).toEqual('Disabled post')) + it('displays slug', () => expect(subject.slug).toEqual('disabled-post')) + it('displays content', () => + expect(subject.content).toEqual('This is an offensive post content')) + it('displays contentExcerpt', () => + expect(subject.contentExcerpt).toEqual('This is an offensive post content')) + it('displays image', () => + expect(subject.image).toEqual({ + url: expect.stringContaining('/some/offensive/image.jpg'), + })) + }) + + describe('Comment', () => { + beforeEach(beforeComment) + + it('displays content', () => expect(subject.content).toEqual('Disabled comment')) + it('displays contentExcerpt', () => + expect(subject.contentExcerpt).toEqual('Disabled comment')) + }) + }) + + describe('as user', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('User', () => { + beforeEach(beforeUser) + + it('obfuscates name', () => expect(subject.name).toEqual('UNAVAILABLE')) + it('obfuscates slug', () => expect(subject.slug).toEqual('UNAVAILABLE')) + it('obfuscates about', () => expect(subject.about).toEqual('UNAVAILABLE')) + it('obfuscates avatar', () => expect(subject.avatar).toEqual(null)) + }) + + describe('Post', () => { + beforeEach(beforePost) + + it('obfuscates title', () => expect(subject.title).toEqual('UNAVAILABLE')) + it('obfuscates slug', () => expect(subject.slug).toEqual('UNAVAILABLE')) + it('obfuscates content', () => expect(subject.content).toEqual('UNAVAILABLE')) + it('obfuscates contentExcerpt', () => expect(subject.contentExcerpt).toEqual('UNAVAILABLE')) + it('obfuscates image', () => expect(subject.image).toEqual(null)) + }) + + describe('Comment', () => { + beforeEach(beforeComment) + + it('obfuscates content', () => expect(subject.content).toEqual('UNAVAILABLE')) + it('obfuscates contentExcerpt', () => expect(subject.contentExcerpt).toEqual('UNAVAILABLE')) + }) + }) + }) + + describe('Query', () => { + describe('Post', () => { + beforeEach(async () => { + graphqlQuery = gql` + { + Post { + title + } + } + ` + }) + + describe('as user', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('hides deleted or disabled posts', async () => { + const expected = { data: { Post: [{ title: 'Publicly visible post' }] } } + await expect(action()).resolves.toMatchObject(expected) + }) + }) + + describe('as moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + it('shows disabled but hides deleted posts', async () => { + const expected = [{ title: 'Disabled post' }, { title: 'Publicly visible post' }] + const { + data: { Post }, + } = await action() + await expect(Post).toEqual(expect.arrayContaining(expected)) + }) + }) + + describe('.comments', () => { + beforeEach(async () => { + graphqlQuery = gql` + { + Post(id: "p3") { + title + comments { + content + } + } + } + ` + }) + + describe('as user', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('conceals disabled comments', async () => { + const expected = [ + { content: 'Enabled comment on public post' }, + { content: 'UNAVAILABLE' }, + ] + const { + data: { + Post: [{ comments }], + }, + } = await action() + await expect(comments).toEqual(expect.arrayContaining(expected)) + }) + }) + + describe('as moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + it('shows disabled comments', async () => { + const expected = [ + { content: 'Enabled comment on public post' }, + { content: 'Disabled comment' }, + ] + const { + data: { + Post: [{ comments }], + }, + } = await action() + await expect(comments).toEqual(expect.arrayContaining(expected)) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/softDelete/softDeleteMiddleware.ts b/docs/backend/src/middleware/softDelete/softDeleteMiddleware.ts new file mode 100644 index 000000000..2e1f60251 --- /dev/null +++ b/docs/backend/src/middleware/softDelete/softDeleteMiddleware.ts @@ -0,0 +1,46 @@ +const isModerator = ({ user }) => { + return user && (user.role === 'moderator' || user.role === 'admin') +} + +const setDefaultFilters = (resolve, root, args, context, info) => { + args.deleted = false + + if (!isModerator(context)) { + args.disabled = false + } + return resolve(root, args, context, info) +} + +const obfuscate = async (resolve, root, args, context, info) => { + if (root.deleted || (!isModerator(context) && root.disabled)) { + root.content = 'UNAVAILABLE' + root.contentExcerpt = 'UNAVAILABLE' + root.title = 'UNAVAILABLE' + root.slug = 'UNAVAILABLE' + root.avatar = null + root.about = 'UNAVAILABLE' + root.name = 'UNAVAILABLE' + root.image = null + } + return resolve(root, args, context, info) +} + +export default { + Query: { + Post: setDefaultFilters, + Comment: setDefaultFilters, + User: setDefaultFilters, + profilePagePosts: setDefaultFilters, + }, + Mutation: async (resolve, root, args, context, info) => { + args.disabled = false + // TODO: remove as soon as our factories don't need this anymore + if (typeof args.deleted !== 'boolean') { + args.deleted = false + } + return resolve(root, args, context, info) + }, + Post: obfuscate, + User: obfuscate, + Comment: obfuscate, +} diff --git a/docs/backend/src/middleware/userInteractions.spec.ts b/docs/backend/src/middleware/userInteractions.spec.ts new file mode 100644 index 000000000..94d1ff274 --- /dev/null +++ b/docs/backend/src/middleware/userInteractions.spec.ts @@ -0,0 +1,100 @@ +import Factory, { cleanDatabase } from '../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../db/neo4j' +import createServer from '../server' +import { createTestClient } from 'apollo-server-testing' + +let query, aUser, bUser, post, authenticatedUser, variables + +const driver = getDriver() +const neode = getNeode() + +const postQuery = gql` + query ($id: ID) { + Post(id: $id) { + clickedCount + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + aUser = await Factory.build('user', { + id: 'a-user', + }) + bUser = await Factory.build('user', { + id: 'b-user', + }) + post = await Factory.build('post') + authenticatedUser = await aUser.toJson() + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('middleware/userInteractions', () => { + describe('given one post', () => { + it('does not change clickedCount when queried without ID', async () => { + await expect(query({ query: postQuery, variables })).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + clickedCount: 0, + }, + ]), + }, + }) + }) + + it('changes clickedCount when queried with ID', async () => { + variables = { id: post.get('id') } + await expect(query({ query: postQuery, variables })).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + clickedCount: 1, + }, + ]), + }, + }) + }) + + it('does not change clickedCount when same user queries the post again', async () => { + await expect(query({ query: postQuery, variables })).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + clickedCount: 1, + }, + ]), + }, + }) + }) + + it('changes clickedCount when another user queries the post', async () => { + authenticatedUser = await bUser.toJson() + await expect(query({ query: postQuery, variables })).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + clickedCount: 2, + }, + ]), + }, + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/userInteractions.ts b/docs/backend/src/middleware/userInteractions.ts new file mode 100644 index 000000000..62e8e47f7 --- /dev/null +++ b/docs/backend/src/middleware/userInteractions.ts @@ -0,0 +1,44 @@ +const createRelatedCypher = (relation) => ` +MATCH (user:User { id: $currentUser}) +MATCH (post:Post { id: $postId}) +OPTIONAL MATCH (post)<-[r:${relation}]-(u:User) +WHERE NOT u.disabled AND NOT u.deleted +WITH user, post, count(DISTINCT u) AS count +MERGE (user)-[relation:${relation} { }]->(post) +ON CREATE +SET relation.count = 1, +relation.createdAt = toString(datetime()), +post.clickedCount = count + 1 +ON MATCH +SET relation.count = relation.count + 1, +relation.updatedAt = toString(datetime()), +post.clickedCount = count +RETURN user, post, relation +` + +const setPostCounter = async (postId, relation, context) => { + const { + user: { id: currentUser }, + } = context + const session = context.driver.session() + try { + await session.writeTransaction((txc) => { + return txc.run(createRelatedCypher(relation), { currentUser, postId }) + }) + } finally { + session.close() + } +} + +const userClickedPost = async (resolve, root, args, context, info) => { + if (args.id && context.user) { + await setPostCounter(args.id, 'CLICKED', context) + } + return resolve(root, args, context, info) +} + +export default { + Query: { + Post: userClickedPost, + }, +} diff --git a/docs/backend/src/middleware/validation/validationMiddleware.spec.ts b/docs/backend/src/middleware/validation/validationMiddleware.spec.ts new file mode 100644 index 000000000..2e1cd6fa7 --- /dev/null +++ b/docs/backend/src/middleware/validation/validationMiddleware.spec.ts @@ -0,0 +1,341 @@ +import gql from 'graphql-tag' +import Factory, { cleanDatabase } from '../../db/factories' +import { getNeode, getDriver } from '../../db/neo4j' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../server' + +const neode = getNeode() +const driver = getDriver() +let authenticatedUser, + mutate, + users, + offensivePost, + reportVariables, + disableVariables, + reportingUser, + moderatingUser, + commentingUser + +const createCommentMutation = gql` + mutation ($id: ID, $postId: ID!, $content: String!) { + CreateComment(id: $id, postId: $postId, content: $content) { + id + } + } +` +const updateCommentMutation = gql` + mutation ($content: String!, $id: ID!) { + UpdateComment(content: $content, id: $id) { + id + } + } +` + +const reportMutation = gql` + mutation ($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + fileReport( + resourceId: $resourceId + reasonCategory: $reasonCategory + reasonDescription: $reasonDescription + ) { + reportId + } + } +` +const reviewMutation = gql` + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + review(resourceId: $resourceId, disable: $disable, closed: $closed) { + createdAt + updatedAt + } + } +` +const updateUserMutation = gql` + mutation ($id: ID!, $name: String) { + UpdateUser(id: $id, name: $name) { + name + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + user: authenticatedUser, + neode, + driver, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + users = await Promise.all([ + Factory.build('user', { + id: 'reporting-user', + }), + Factory.build('user', { + id: 'moderating-user', + role: 'moderator', + }), + Factory.build('user', { + id: 'commenting-user', + }), + ]) + reportVariables = { + resourceId: 'whatever', + reasonCategory: 'other', + reasonDescription: 'Violates code of conduct !!!', + } + disableVariables = { + resourceId: 'undefined-resource', + disable: true, + closed: false, + } + reportingUser = users[0] + moderatingUser = users[1] + commentingUser = users[2] + const posts = await Promise.all([ + Factory.build( + 'post', + { + id: 'offensive-post', + }, + { + authorId: 'moderating-user', + }, + ), + Factory.build( + 'post', + { + id: 'post-4-commenting', + }, + { + authorId: 'commenting-user', + }, + ), + ]) + offensivePost = posts[0] +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('validateCreateComment', () => { + let createCommentVariables + beforeEach(async () => { + createCommentVariables = { + postId: 'whatever', + content: '', + } + authenticatedUser = await commentingUser.toJson() + }) + + it('throws an error if content is empty', async () => { + createCommentVariables = { ...createCommentVariables, postId: 'post-4-commenting' } + await expect( + mutate({ mutation: createCommentMutation, variables: createCommentVariables }), + ).resolves.toMatchObject({ + data: { CreateComment: null }, + errors: [{ message: 'Comment must be at least 1 character long!' }], + }) + }) + + it('sanitizes content and throws an error if not longer than 1 character', async () => { + createCommentVariables = { postId: 'post-4-commenting', content: '' } + await expect( + mutate({ mutation: createCommentMutation, variables: createCommentVariables }), + ).resolves.toMatchObject({ + data: { CreateComment: null }, + errors: [{ message: 'Comment must be at least 1 character long!' }], + }) + }) + + it('throws an error if there is no post with given id in the database', async () => { + createCommentVariables = { + ...createCommentVariables, + postId: 'non-existent-post', + content: 'valid content', + } + await expect( + mutate({ mutation: createCommentMutation, variables: createCommentVariables }), + ).resolves.toMatchObject({ + data: { CreateComment: null }, + errors: [{ message: 'Comment cannot be created without a post!' }], + }) + }) + + describe('validateUpdateComment', () => { + let updateCommentVariables + beforeEach(async () => { + await Factory.build( + 'comment', + { + id: 'comment-id', + }, + { + authorId: 'commenting-user', + }, + ) + updateCommentVariables = { + id: 'whatever', + content: '', + } + authenticatedUser = await commentingUser.toJson() + }) + + it('throws an error if content is empty', async () => { + updateCommentVariables = { ...updateCommentVariables, id: 'comment-id' } + await expect( + mutate({ mutation: updateCommentMutation, variables: updateCommentVariables }), + ).resolves.toMatchObject({ + data: { UpdateComment: null }, + errors: [{ message: 'Comment must be at least 1 character long!' }], + }) + }) + + it('sanitizes content and throws an error if not longer than 1 character', async () => { + updateCommentVariables = { id: 'comment-id', content: '' } + await expect( + mutate({ mutation: updateCommentMutation, variables: updateCommentVariables }), + ).resolves.toMatchObject({ + data: { UpdateComment: null }, + errors: [{ message: 'Comment must be at least 1 character long!' }], + }) + }) + }) +}) + +describe('validateReport', () => { + it('throws an error if a user tries to report themself', async () => { + authenticatedUser = await reportingUser.toJson() + reportVariables = { ...reportVariables, resourceId: 'reporting-user' } + await expect( + mutate({ mutation: reportMutation, variables: reportVariables }), + ).resolves.toMatchObject({ + data: { fileReport: null }, + errors: [{ message: 'You cannot report yourself!' }], + }) + }) +}) + +describe('validateReview', () => { + beforeEach(async () => { + const reportAgainstModerator = await Factory.build('report') + await Promise.all([ + reportAgainstModerator.relateTo(reportingUser, 'filed', { + ...reportVariables, + resourceId: 'moderating-user', + }), + reportAgainstModerator.relateTo(moderatingUser, 'belongsTo'), + ]) + authenticatedUser = await moderatingUser.toJson() + }) + + it('throws an error if a user tries to review a report against them', async () => { + disableVariables = { ...disableVariables, resourceId: 'moderating-user' } + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: null }, + errors: [{ message: 'You cannot review yourself!' }], + }) + }) + + it('throws an error for invaild resource', async () => { + disableVariables = { ...disableVariables, resourceId: 'non-existent-resource' } + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: null }, + errors: [{ message: 'Resource not found or is not a Post|Comment|User!' }], + }) + }) + + it('throws an error if no report exists', async () => { + disableVariables = { ...disableVariables, resourceId: 'offensive-post' } + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: null }, + errors: [{ message: 'Before starting the review process, please report the Post!' }], + }) + }) + + it('throws an error if a moderator tries to review their own resource(Post|Comment)', async () => { + const reportAgainstOffensivePost = await Factory.build('report') + await Promise.all([ + reportAgainstOffensivePost.relateTo(reportingUser, 'filed', { + ...reportVariables, + resourceId: 'offensive-post', + }), + reportAgainstOffensivePost.relateTo(offensivePost, 'belongsTo'), + ]) + disableVariables = { ...disableVariables, resourceId: 'offensive-post' } + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: null }, + errors: [{ message: 'You cannot review your own Post!' }], + }) + }) + + describe('moderate a resource that is not a (Comment|Post|User) ', () => { + beforeEach(async () => { + await Promise.all([Factory.build('tag', { id: 'tag-id' })]) + }) + + it('returns null', async () => { + disableVariables = { + ...disableVariables, + resourceId: 'tag-id', + } + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: null }, + errors: [{ message: 'Resource not found or is not a Post|Comment|User!' }], + }) + }) + }) + + describe('validateUpdateUser', () => { + let userParams, variables, updatingUser + + beforeEach(async () => { + userParams = { + id: 'updating-user', + name: 'John Doe', + } + + variables = { + id: 'updating-user', + name: 'John Doughnut', + } + updatingUser = await Factory.build('user', userParams) + authenticatedUser = await updatingUser.toJson() + }) + + it('with name too short', async () => { + variables = { + ...variables, + name: ' ', + } + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject({ + data: { UpdateUser: null }, + errors: [{ message: 'Username must be at least 3 character long!' }], + }) + }) + }) +}) diff --git a/docs/backend/src/middleware/validation/validationMiddleware.ts b/docs/backend/src/middleware/validation/validationMiddleware.ts new file mode 100644 index 000000000..ff26f5ef1 --- /dev/null +++ b/docs/backend/src/middleware/validation/validationMiddleware.ts @@ -0,0 +1,129 @@ +import { UserInputError } from 'apollo-server' + +const COMMENT_MIN_LENGTH = 1 +const NO_POST_ERR_MESSAGE = 'Comment cannot be created without a post!' +const USERNAME_MIN_LENGTH = 3 +const validateCreateComment = async (resolve, root, args, context, info) => { + const content = args.content.replace(/<(?:.|\n)*?>/gm, '').trim() + const { postId } = args + + if (!args.content || content.length < COMMENT_MIN_LENGTH) { + throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`) + } + const session = context.driver.session() + try { + const postQueryRes = await session.readTransaction((transaction) => { + return transaction.run( + ` + MATCH (post:Post {id: $postId}) + RETURN post + `, + { postId }, + ) + }) + const [post] = postQueryRes.records.map((record) => { + return record.get('post') + }) + + if (!post) { + throw new UserInputError(NO_POST_ERR_MESSAGE) + } else { + return resolve(root, args, context, info) + } + } finally { + session.close() + } +} + +const validateUpdateComment = async (resolve, root, args, context, info) => { + const content = args.content.replace(/<(?:.|\n)*?>/gm, '').trim() + if (!args.content || content.length < COMMENT_MIN_LENGTH) { + throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`) + } + + return resolve(root, args, context, info) +} + +const validateReport = async (resolve, root, args, context, info) => { + const { resourceId } = args + const { user } = context + if (resourceId === user.id) throw new Error('You cannot report yourself!') + return resolve(root, args, context, info) +} + +const validateReview = async (resolve, root, args, context, info) => { + const { resourceId } = args + let existingReportedResource + 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 validateReviewTransactionResponse = await transaction.run( + ` + MATCH (resource {id: $resourceId}) + WHERE resource:User OR resource:Post OR resource:Comment + OPTIONAL MATCH (:User)-[filed:FILED]->(:Report {closed: false})-[:BELONGS_TO]->(resource) + OPTIONAL MATCH (resource)<-[:WROTE]-(author:User) + RETURN [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'User']][0] AS label, author, filed + `, + { + resourceId, + submitterId: user.id, + }, + ) + return validateReviewTransactionResponse.records.map((record) => ({ + label: record.get('label'), + author: record.get('author'), + filed: record.get('filed'), + })) + }) + try { + const txResult = await reportReadTxPromise + existingReportedResource = txResult + if (!existingReportedResource || !existingReportedResource.length) + throw new Error(`Resource not found or is not a Post|Comment|User!`) + existingReportedResource = existingReportedResource[0] + if (!existingReportedResource.filed) + throw new Error( + `Before starting the review process, please report the ${existingReportedResource.label}!`, + ) + const authorId = + existingReportedResource.label !== 'User' && existingReportedResource.author + ? existingReportedResource.author.properties.id + : null + if (authorId && authorId === user.id) + throw new Error(`You cannot review your own ${existingReportedResource.label}!`) + } finally { + session.close() + } + + return resolve(root, args, context, info) +} + +export const validateNotifyUsers = async (label, reason) => { + const reasonsAllowed = ['mentioned_in_post', 'mentioned_in_comment', 'commented_on_post'] + if (!reasonsAllowed.includes(reason)) throw new Error('Notification reason is not allowed!') + if ( + (label === 'Post' && reason !== 'mentioned_in_post') || + (label === 'Comment' && !['mentioned_in_comment', 'commented_on_post'].includes(reason)) + ) { + throw new Error('Notification does not fit the reason!') + } +} + +const validateUpdateUser = async (resolve, root, params, context, info) => { + const { name } = params + if (typeof name === 'string' && name.trim().length < USERNAME_MIN_LENGTH) + throw new UserInputError(`Username must be at least ${USERNAME_MIN_LENGTH} character long!`) + return resolve(root, params, context, info) +} + +export default { + Mutation: { + CreateComment: validateCreateComment, + UpdateComment: validateUpdateComment, + UpdateUser: validateUpdateUser, + fileReport: validateReport, + review: validateReview, + }, +} diff --git a/docs/backend/src/middleware/xssMiddleware.ts b/docs/backend/src/middleware/xssMiddleware.ts new file mode 100644 index 000000000..c10997e8d --- /dev/null +++ b/docs/backend/src/middleware/xssMiddleware.ts @@ -0,0 +1,22 @@ +import walkRecursive from '../helpers/walkRecursive' +import { cleanHtml } from '../middleware/helpers/cleanHtml' + +// exclamation mark separetes field names, that should not be sanitized +const fields = [ + { field: 'content', excludes: ['CreateMessage', 'Message'] }, + { field: 'contentExcerpt' }, + { field: 'reasonDescription' }, + { field: 'description', excludes: ['embed'] }, + { field: 'descriptionExcerpt' }, +] + +export default { + Mutation: async (resolve, root, args, context, info) => { + args = walkRecursive(args, fields, info.fieldName, cleanHtml) + return resolve(root, args, context, info) + }, + Query: async (resolve, root, args, context, info) => { + const result = await resolve(root, args, context, info) + return walkRecursive(result, fields, info.fieldName, cleanHtml) + }, +} diff --git a/docs/backend/src/models/Badge.ts b/docs/backend/src/models/Badge.ts new file mode 100644 index 000000000..9c4831041 --- /dev/null +++ b/docs/backend/src/models/Badge.ts @@ -0,0 +1,7 @@ +export default { + id: { type: 'string', primary: true, lowercase: true }, + status: { type: 'string', valid: ['permanent', 'temporary'] }, + type: { type: 'string', valid: ['role', 'crowdfunding'] }, + icon: { type: 'string', required: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, +} diff --git a/docs/backend/src/models/Category.ts b/docs/backend/src/models/Category.ts new file mode 100644 index 000000000..9a3f47fd0 --- /dev/null +++ b/docs/backend/src/models/Category.ts @@ -0,0 +1,20 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, + name: { type: 'string', required: true, default: false }, + slug: { type: 'string', unique: 'true' }, + icon: { type: 'string', required: true, default: false }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { + type: 'string', + isoDate: true, + required: false, + }, + post: { + type: 'relationship', + relationship: 'CATEGORIZED', + target: 'Post', + direction: 'in', + }, +} diff --git a/docs/backend/src/models/Comment.ts b/docs/backend/src/models/Comment.ts new file mode 100644 index 000000000..f4548f0c2 --- /dev/null +++ b/docs/backend/src/models/Comment.ts @@ -0,0 +1,42 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + content: { type: 'string', disallow: [null], min: 3 }, + contentExcerpt: { type: 'string', allow: [null] }, + deleted: { type: 'boolean', default: false }, + disabled: { type: 'boolean', default: false }, + post: { + type: 'relationship', + relationship: 'COMMENTS', + target: 'Post', + direction: 'out', + }, + author: { + type: 'relationship', + relationship: 'WROTE', + target: 'User', + direction: 'in', + }, + notified: { + type: 'relationship', + relationship: 'NOTIFIED', + target: 'User', + direction: 'out', + properties: { + read: { type: 'boolean', default: false }, + reason: { + type: 'string', + valid: ['mentioned_in_post', 'mentioned_in_comment', 'commented_on_post'], + }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, +} diff --git a/docs/backend/src/models/Donations.ts b/docs/backend/src/models/Donations.ts new file mode 100644 index 000000000..742bfb569 --- /dev/null +++ b/docs/backend/src/models/Donations.ts @@ -0,0 +1,20 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, + showDonations: { type: 'boolean', required: true }, + goal: { type: 'number', required: true }, + progress: { type: 'number', required: true }, + createdAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, +} diff --git a/docs/backend/src/models/EmailAddress.ts b/docs/backend/src/models/EmailAddress.ts new file mode 100644 index 000000000..fa2aa0b27 --- /dev/null +++ b/docs/backend/src/models/EmailAddress.ts @@ -0,0 +1,13 @@ +export default { + email: { type: 'string', primary: true, lowercase: true, email: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + verifiedAt: { type: 'string', isoDate: true }, + nonce: { type: 'string', token: true }, + belongsTo: { + type: 'relationship', + relationship: 'BELONGS_TO', + target: 'User', + direction: 'out', + eager: true, + }, +} diff --git a/docs/backend/src/models/Group.ts b/docs/backend/src/models/Group.ts new file mode 100644 index 000000000..a75ad518f --- /dev/null +++ b/docs/backend/src/models/Group.ts @@ -0,0 +1,46 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, // TODO: should be type: 'uuid' but simplified for our tests + name: { type: 'string', disallow: [null], min: 3 }, + slug: { type: 'string', unique: 'true', regex: /^[a-z0-9_-]+$/, lowercase: true }, + + createdAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + deleted: { type: 'boolean', default: false }, + disabled: { type: 'boolean', default: false }, + + avatar: { + type: 'relationship', + relationship: 'AVATAR_IMAGE', + target: 'Image', + direction: 'out', + }, + + about: { type: 'string', allow: [null, ''] }, + description: { type: 'string', disallow: [null], min: 100 }, + descriptionExcerpt: { type: 'string', allow: [null] }, + groupType: { type: 'string', default: 'public' }, + actionRadius: { type: 'string', default: 'regional' }, + + myRole: { type: 'string', default: 'pending' }, + + locationName: { type: 'string', allow: [null] }, + + isIn: { + type: 'relationship', + relationship: 'IS_IN', + target: 'Location', + direction: 'out', + }, +} diff --git a/docs/backend/src/models/Image.ts b/docs/backend/src/models/Image.ts new file mode 100644 index 000000000..b46342c18 --- /dev/null +++ b/docs/backend/src/models/Image.ts @@ -0,0 +1,8 @@ +export default { + url: { primary: true, type: 'string', uri: { allowRelative: true } }, + alt: { type: 'string' }, + sensitive: { type: 'boolean', default: false }, + aspectRatio: { type: 'float', default: 1.0 }, + type: { type: 'string' }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, +} diff --git a/docs/backend/src/models/InviteCode.ts b/docs/backend/src/models/InviteCode.ts new file mode 100644 index 000000000..7204f1b38 --- /dev/null +++ b/docs/backend/src/models/InviteCode.ts @@ -0,0 +1,17 @@ +export default { + code: { type: 'string', primary: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + expiresAt: { type: 'string', isoDate: true, default: null }, + generated: { + type: 'relationship', + relationship: 'GENERATED', + target: 'User', + direction: 'in', + }, + redeemed: { + type: 'relationship', + relationship: 'REDEEMED', + target: 'User', + direction: 'in', + }, +} diff --git a/docs/backend/src/models/Location.ts b/docs/backend/src/models/Location.ts new file mode 100644 index 000000000..d33186da4 --- /dev/null +++ b/docs/backend/src/models/Location.ts @@ -0,0 +1,22 @@ +export default { + id: { type: 'string', primary: true }, + lat: { type: 'number' }, + lng: { type: 'number' }, + type: { type: 'string' }, + name: { type: 'string' }, + nameES: { type: 'string' }, + nameFR: { type: 'string' }, + nameIT: { type: 'string' }, + nameEN: { type: 'string' }, + namePT: { type: 'string' }, + nameDE: { type: 'string' }, + nameNL: { type: 'string' }, + namePL: { type: 'string' }, + nameRU: { type: 'string' }, + isIn: { + type: 'relationship', + relationship: 'IS_IN', + target: 'Location', + direction: 'out', + }, +} diff --git a/docs/backend/src/models/Migration.ts b/docs/backend/src/models/Migration.ts new file mode 100644 index 000000000..8f16b800a --- /dev/null +++ b/docs/backend/src/models/Migration.ts @@ -0,0 +1,5 @@ +export default { + title: { type: 'string', primary: true, token: true }, + description: { type: 'string' }, + migratedAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, +} diff --git a/docs/backend/src/models/Post.ts b/docs/backend/src/models/Post.ts new file mode 100644 index 000000000..e206ea1f5 --- /dev/null +++ b/docs/backend/src/models/Post.ts @@ -0,0 +1,61 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, + activityId: { type: 'string', allow: [null] }, + objectId: { type: 'string', allow: [null] }, + image: { + type: 'relationship', + relationship: 'HERO_IMAGE', + target: 'Image', + direction: 'out', + }, + author: { + type: 'relationship', + relationship: 'WROTE', + target: 'User', + direction: 'in', + }, + title: { type: 'string', disallow: [null], min: 3 }, + slug: { type: 'string', allow: [null], unique: 'true' }, + content: { type: 'string', disallow: [null], min: 3 }, + contentExcerpt: { type: 'string', allow: [null] }, + deleted: { type: 'boolean', default: false }, + disabled: { type: 'boolean', default: false }, + clickedCount: { type: 'int', default: 0 }, + viewedTeaserCount: { type: 'int', default: 0 }, + notified: { + type: 'relationship', + relationship: 'NOTIFIED', + target: 'User', + direction: 'out', + properties: { + read: { type: 'boolean', default: false }, + reason: { + type: 'string', + valid: ['mentioned_in_post', 'mentioned_in_comment', 'commented_on_post'], + }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + language: { type: 'string', allow: [null] }, + comments: { + type: 'relationship', + relationship: 'COMMENTS', + target: 'Comment', + direction: 'in', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + pinned: { type: 'boolean', default: null, valid: [null, true] }, + postType: { type: 'string', default: 'Article', valid: ['Article', 'Event'] }, +} diff --git a/docs/backend/src/models/Report.ts b/docs/backend/src/models/Report.ts new file mode 100644 index 000000000..3e001746b --- /dev/null +++ b/docs/backend/src/models/Report.ts @@ -0,0 +1,52 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + rule: { type: 'string', default: 'latestReviewUpdatedAtRules' }, + closed: { type: 'boolean', default: false }, + belongsTo: { + type: 'relationship', + relationship: 'BELONGS_TO', + target: ['User', 'Comment', 'Post'], + direction: 'out', + }, + filed: { + type: 'relationship', + relationship: 'FILED', + target: 'User', + direction: 'in', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + resourceId: { type: 'string', primary: true, default: uuid }, + reasonCategory: { + type: 'string', + valid: [ + 'other', + 'discrimination_etc', + 'pornographic_content_links', + 'glorific_trivia_of_cruel_inhuman_acts', + 'doxing', + 'intentional_intimidation_stalking_persecution', + 'advert_products_services_commercial', + 'criminal_behavior_violation_german_law', + ], + invalid: [null], + }, + reasonDescription: { type: 'string', allow: [null] }, + }, + }, + reviewed: { + type: 'relationship', + relationship: 'REVIEWED', + target: 'User', + direction: 'in', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + disable: { type: 'boolean', default: false }, + closed: { type: 'boolean', default: false }, + }, + }, +} diff --git a/docs/backend/src/models/SocialMedia.ts b/docs/backend/src/models/SocialMedia.ts new file mode 100644 index 000000000..6010c97bb --- /dev/null +++ b/docs/backend/src/models/SocialMedia.ts @@ -0,0 +1,15 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, + url: { type: 'string', uri: true, required: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + ownedBy: { + type: 'relationship', + relationship: 'OWNED_BY', + target: 'User', + direction: 'out', + eager: true, + cascade: 'detach', + }, +} diff --git a/docs/backend/src/models/Tag.ts b/docs/backend/src/models/Tag.ts new file mode 100644 index 000000000..8df60c761 --- /dev/null +++ b/docs/backend/src/models/Tag.ts @@ -0,0 +1,17 @@ +export default { + id: { type: 'string', primary: true }, + deleted: { type: 'boolean', default: false }, + disabled: { type: 'boolean', default: false }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + post: { + type: 'relationship', + relationship: 'TAGGED', + target: 'Post', + direction: 'in', + }, +} diff --git a/docs/backend/src/models/UnverifiedEmailAddress.ts b/docs/backend/src/models/UnverifiedEmailAddress.ts new file mode 100644 index 000000000..c582ed011 --- /dev/null +++ b/docs/backend/src/models/UnverifiedEmailAddress.ts @@ -0,0 +1,12 @@ +export default { + email: { type: 'string', lowercase: true, email: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + nonce: { type: 'string', token: true }, + belongsTo: { + type: 'relationship', + relationship: 'BELONGS_TO', + target: 'User', + direction: 'out', + eager: true, + }, +} diff --git a/docs/backend/src/models/User.spec.ts b/docs/backend/src/models/User.spec.ts new file mode 100644 index 000000000..17f2fe0a9 --- /dev/null +++ b/docs/backend/src/models/User.spec.ts @@ -0,0 +1,89 @@ +import { cleanDatabase } from '../db/factories' +import { getNeode, getDriver } from '../db/neo4j' + +const driver = getDriver() +const neode = getNeode() + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('role', () => { + it('defaults to `user`', async () => { + const user = await neode.create('User', { name: 'John' }) + await expect(user.toJson()).resolves.toEqual( + expect.objectContaining({ + role: 'user', + }), + ) + }) +}) + +describe('slug', () => { + it('normalizes to lowercase letters', async () => { + const user = await neode.create('User', { slug: 'Matt' }) + await expect(user.toJson()).resolves.toEqual( + expect.objectContaining({ + slug: 'matt', + }), + ) + }) + + it('must be unique', async () => { + await neode.create('User', { slug: 'Matt' }) + try { + await expect(neode.create('User', { slug: 'Matt' })).rejects.toThrow('already exists') + } catch (error) { + throw new Error(` + ${error} + + Probably your database has no unique constraints! + + To see all constraints go to http://localhost:7474/browser/ and + paste the following: + \`\`\` + CALL db.constraints(); + \`\`\` + + Learn how to setup the database here: + https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/backend/README.md#database-indices-and-constraints + `) + } + }) + + describe('characters', () => { + const createUser = (attrs) => { + return neode.create('User', attrs).then((user) => user.toJson()) + } + + it('-', async () => { + await expect(createUser({ slug: 'matt-rider' })).resolves.toMatchObject({ + slug: 'matt-rider', + }) + }) + + it('_', async () => { + await expect(createUser({ slug: 'matt_rider' })).resolves.toMatchObject({ + slug: 'matt_rider', + }) + }) + + it(' ', async () => { + await expect(createUser({ slug: 'matt rider' })).rejects.toThrow('ERROR_VALIDATION') + }) + + it('ä', async () => { + await expect(createUser({ slug: 'mätt' })).rejects.toThrow('ERROR_VALIDATION') + }) + }) +}) diff --git a/docs/backend/src/models/User.ts b/docs/backend/src/models/User.ts new file mode 100644 index 000000000..b8d024216 --- /dev/null +++ b/docs/backend/src/models/User.ts @@ -0,0 +1,164 @@ +import { v4 as uuid } from 'uuid' + +export default { + id: { type: 'string', primary: true, default: uuid }, // TODO: should be type: 'uuid' but simplified for our tests + actorId: { type: 'string', allow: [null] }, + name: { type: 'string', disallow: [null], min: 3 }, + slug: { type: 'string', unique: 'true', regex: /^[a-z0-9_-]+$/, lowercase: true }, + encryptedPassword: 'string', + avatar: { + type: 'relationship', + relationship: 'AVATAR_IMAGE', + target: 'Image', + direction: 'out', + }, + deleted: { type: 'boolean', default: false }, + disabled: { type: 'boolean', default: false }, + role: { type: 'string', default: 'user' }, + publicKey: 'string', + privateKey: 'string', + wasInvited: 'boolean', + wasSeeded: 'boolean', + locationName: { type: 'string', allow: [null] }, + about: { type: 'string', allow: [null, ''] }, + primaryEmail: { + type: 'relationship', + relationship: 'PRIMARY_EMAIL', + target: 'EmailAddress', + direction: 'out', + }, + following: { + type: 'relationship', + relationship: 'FOLLOWS', + target: 'User', + direction: 'out', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + followedBy: { + type: 'relationship', + relationship: 'FOLLOWS', + target: 'User', + direction: 'in', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + friends: { type: 'relationship', relationship: 'FRIENDS', target: 'User', direction: 'both' }, + rewarded: { + type: 'relationship', + relationship: 'REWARDED', + target: 'Badge', + direction: 'in', + }, + invitedBy: { type: 'relationship', relationship: 'INVITED', target: 'User', direction: 'in' }, + lastActiveAt: { type: 'string', isoDate: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, + emoted: { + type: 'relationships', + relationship: 'EMOTED', + target: 'Post', + direction: 'out', + properties: { + emotion: { + type: 'string', + valid: ['happy', 'cry', 'surprised', 'angry', 'funny'], + invalid: [null], + }, + }, + eager: true, + cascade: true, + }, + blocked: { + type: 'relationship', + relationship: 'BLOCKED', + target: 'User', + direction: 'out', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + muted: { + type: 'relationship', + relationship: 'MUTED', + target: 'User', + direction: 'out', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + notifications: { + type: 'relationship', + relationship: 'NOTIFIED', + target: 'User', + direction: 'in', + }, + inviteCodes: { + type: 'relationship', + relationship: 'GENERATED', + target: 'InviteCode', + direction: 'out', + }, + redeemedInviteCode: { + type: 'relationship', + relationship: 'REDEEMED', + target: 'InviteCode', + direction: 'out', + }, + termsAndConditionsAgreedVersion: { + type: 'string', + allow: [null], + }, + termsAndConditionsAgreedAt: { + type: 'string', + isoDate: true, + allow: [null], + }, + shouted: { + type: 'relationship', + relationship: 'SHOUTED', + target: 'Post', + direction: 'out', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + isIn: { + type: 'relationship', + relationship: 'IS_IN', + target: 'Location', + direction: 'out', + }, + pinned: { + type: 'relationship', + relationship: 'PINNED', + target: 'Post', + direction: 'out', + properties: { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + }, + }, + allowEmbedIframes: { + type: 'boolean', + default: false, + }, + showShoutsPublicly: { + type: 'boolean', + default: false, + }, + sendNotificationEmails: { + type: 'boolean', + default: true, + }, + locale: { + type: 'string', + allow: [null], + }, +} diff --git a/docs/backend/src/models/index.ts b/docs/backend/src/models/index.ts new file mode 100644 index 000000000..f7d338684 --- /dev/null +++ b/docs/backend/src/models/index.ts @@ -0,0 +1,29 @@ +// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm +// module that is not browser-compatible. Node's `fs` module is server-side only +declare let Cypress: any | undefined +export default { + Image: typeof Cypress !== 'undefined' ? require('./Image') : require('./Image').default, + Badge: typeof Cypress !== 'undefined' ? require('./Badge') : require('./Badge').default, + User: typeof Cypress !== 'undefined' ? require('./User') : require('./User').default, + Group: typeof Cypress !== 'undefined' ? require('./Group') : require('./Group').default, + EmailAddress: + typeof Cypress !== 'undefined' ? require('./EmailAddress') : require('./EmailAddress').default, + UnverifiedEmailAddress: + typeof Cypress !== 'undefined' + ? require('./UnverifiedEmailAddress') + : require('./UnverifiedEmailAddress').default, + SocialMedia: + typeof Cypress !== 'undefined' ? require('./SocialMedia') : require('./SocialMedia').default, + Post: typeof Cypress !== 'undefined' ? require('./Post') : require('./Post').default, + Comment: typeof Cypress !== 'undefined' ? require('./Comment') : require('./Comment').default, + Category: typeof Cypress !== 'undefined' ? require('./Category') : require('./Category').default, + Tag: typeof Cypress !== 'undefined' ? require('./Tag') : require('./Tag').default, + Location: typeof Cypress !== 'undefined' ? require('./Location') : require('./Location').default, + Donations: + typeof Cypress !== 'undefined' ? require('./Donations') : require('./Donations').default, + Report: typeof Cypress !== 'undefined' ? require('./Report') : require('./Report').default, + Migration: + typeof Cypress !== 'undefined' ? require('./Migration') : require('./Migration').default, + InviteCode: + typeof Cypress !== 'undefined' ? require('./InviteCode') : require('./InviteCode').default, +} diff --git a/docs/backend/src/schema/index.ts b/docs/backend/src/schema/index.ts new file mode 100644 index 000000000..07721bceb --- /dev/null +++ b/docs/backend/src/schema/index.ts @@ -0,0 +1,28 @@ +import { makeAugmentedSchema } from 'neo4j-graphql-js' +import typeDefs from './types' +import resolvers from './resolvers' + +export default makeAugmentedSchema({ + typeDefs, + resolvers, + config: { + query: { + exclude: [ + 'Badge', + 'Embed', + 'EmailAddress', + 'Notification', + 'Statistics', + 'LoggedInUser', + 'Location', + 'SocialMedia', + 'NOTIFIED', + 'FILED', + 'REVIEWED', + 'Report', + 'Group', + ], + }, + mutation: false, + }, +}) diff --git a/docs/backend/src/schema/resolvers/Upload.ts b/docs/backend/src/schema/resolvers/Upload.ts new file mode 100644 index 000000000..2a2525f0f --- /dev/null +++ b/docs/backend/src/schema/resolvers/Upload.ts @@ -0,0 +1,7 @@ +import { GraphQLUpload } from 'graphql-upload' + +export default { + // This maps the `Upload` scalar to the implementation provided + // by the `graphql-upload` package. + Upload: GraphQLUpload, +} diff --git a/docs/backend/src/schema/resolvers/badges.ts b/docs/backend/src/schema/resolvers/badges.ts new file mode 100644 index 000000000..d10d6b482 --- /dev/null +++ b/docs/backend/src/schema/resolvers/badges.ts @@ -0,0 +1,9 @@ +import { neo4jgraphql } from 'neo4j-graphql-js' + +export default { + Query: { + Badge: async (object, args, context, resolveInfo) => { + return neo4jgraphql(object, args, context, resolveInfo) + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/comments.spec.ts b/docs/backend/src/schema/resolvers/comments.spec.ts new file mode 100644 index 000000000..b2730dad4 --- /dev/null +++ b/docs/backend/src/schema/resolvers/comments.spec.ts @@ -0,0 +1,281 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../server' +import { getNeode, getDriver } from '../../db/neo4j' + +const driver = getDriver() +const neode = getNeode() + +let variables, mutate, authenticatedUser, commentAuthor, newlyCreatedComment + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + variables = {} + await neode.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +const createCommentMutation = gql` + mutation ($id: ID, $postId: ID!, $content: String!) { + CreateComment(id: $id, postId: $postId, content: $content) { + id + content + author { + name + } + } + } +` +const setupPostAndComment = async () => { + commentAuthor = await Factory.build('user') + await Factory.build( + 'post', + { + id: 'p1', + content: 'Post to be commented', + }, + { + categoryIds: ['cat9'], + }, + ) + newlyCreatedComment = await Factory.build( + 'comment', + { + id: 'c456', + content: 'Comment to be deleted', + }, + { + postId: 'p1', + author: commentAuthor, + }, + ) + variables = { + ...variables, + id: 'c456', + content: 'The comment is updated', + } +} + +describe('CreateComment', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + variables = { + ...variables, + postId: 'p1', + content: "I'm not authorized to comment", + } + const { errors } = await mutate({ mutation: createCommentMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + const user = await neode.create('User', { name: 'Author' }) + authenticatedUser = await user.toJson() + }) + + describe('given a post', () => { + beforeEach(async () => { + await Factory.build('post', { id: 'p1' }, { categoryIds: ['cat9'] }) + variables = { + ...variables, + postId: 'p1', + content: "I'm authorized to comment", + } + }) + + it('creates a comment', async () => { + await expect(mutate({ mutation: createCommentMutation, variables })).resolves.toMatchObject( + { + data: { CreateComment: { content: "I'm authorized to comment" } }, + errors: undefined, + }, + ) + }) + + it('assigns the authenticated user as author', async () => { + await expect(mutate({ mutation: createCommentMutation, variables })).resolves.toMatchObject( + { + data: { CreateComment: { author: { name: 'Author' } } }, + errors: undefined, + }, + ) + }) + }) + }) +}) + +describe('UpdateComment', () => { + const updateCommentMutation = gql` + mutation ($content: String!, $id: ID!) { + UpdateComment(content: $content, id: $id) { + id + content + createdAt + updatedAt + } + } + ` + + describe('given a post and a comment', () => { + beforeEach(setupPostAndComment) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: updateCommentMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated but not the author', () => { + beforeEach(async () => { + const randomGuy = await Factory.build('user') + authenticatedUser = await randomGuy.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: updateCommentMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + authenticatedUser = await commentAuthor.toJson() + }) + + it('updates the comment', async () => { + const expected = { + data: { UpdateComment: { id: 'c456', content: 'The comment is updated' } }, + errors: undefined, + } + await expect(mutate({ mutation: updateCommentMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('updates a comment, but maintains non-updated attributes', async () => { + const expected = { + data: { + UpdateComment: { + id: 'c456', + content: 'The comment is updated', + createdAt: expect.any(String), + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: updateCommentMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('updates the updatedAt attribute', async () => { + newlyCreatedComment = await newlyCreatedComment.toJson() + const { + data: { UpdateComment }, + } = await mutate({ mutation: updateCommentMutation, variables }) + expect(newlyCreatedComment.updatedAt).toBeTruthy() + expect(Date.parse(newlyCreatedComment.updatedAt)).toEqual(expect.any(Number)) + expect(UpdateComment.updatedAt).toBeTruthy() + expect(Date.parse(UpdateComment.updatedAt)).toEqual(expect.any(Number)) + expect(newlyCreatedComment.updatedAt).not.toEqual(UpdateComment.updatedAt) + }) + + describe('if comment does not exist for given id', () => { + beforeEach(() => { + variables = { ...variables, id: 'does-not-exist' } + }) + + it('returns null', async () => { + const { data, errors } = await mutate({ mutation: updateCommentMutation, variables }) + expect(data).toMatchObject({ UpdateComment: null }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) +}) + +describe('DeleteComment', () => { + const deleteCommentMutation = gql` + mutation ($id: ID!) { + DeleteComment(id: $id) { + id + content + contentExcerpt + deleted + } + } + ` + + describe('given a post and a comment', () => { + beforeEach(setupPostAndComment) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const result = await mutate({ mutation: deleteCommentMutation, variables }) + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated but not the author', () => { + beforeEach(async () => { + const randomGuy = await Factory.build('user') + authenticatedUser = await randomGuy.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: deleteCommentMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + authenticatedUser = await commentAuthor.toJson() + }) + + it('marks the comment as deleted and blacks out content', async () => { + const { data } = await mutate({ mutation: deleteCommentMutation, variables }) + const expected = { + DeleteComment: { + id: 'c456', + deleted: true, + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + }, + } + expect(data).toMatchObject(expected) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/comments.ts b/docs/backend/src/schema/resolvers/comments.ts new file mode 100644 index 000000000..c6f07245c --- /dev/null +++ b/docs/backend/src/schema/resolvers/comments.ts @@ -0,0 +1,99 @@ +import { v4 as uuid } from 'uuid' +import Resolver from './helpers/Resolver' + +export default { + Mutation: { + CreateComment: async (object, params, context, resolveInfo) => { + const { postId } = params + const { user, driver } = context + // Adding relationship from comment to post by passing in the postId, + // but we do not want to create the comment with postId as an attribute + // because we use relationships for this. So, we are deleting it from params + // before comment creation. + delete params.postId + params.id = params.id || uuid() + + const session = driver.session() + + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const createCommentTransactionResponse = await transaction.run( + ` + MATCH (post:Post {id: $postId}) + MATCH (author:User {id: $userId}) + WITH post, author + CREATE (comment:Comment $params) + SET comment.createdAt = toString(datetime()) + SET comment.updatedAt = toString(datetime()) + MERGE (post)<-[:COMMENTS]-(comment)<-[:WROTE]-(author) + RETURN comment + `, + { userId: user.id, postId, params }, + ) + return createCommentTransactionResponse.records.map( + (record) => record.get('comment').properties, + ) + }) + try { + const [comment] = await writeTxResultPromise + return comment + } finally { + session.close() + } + }, + UpdateComment: async (_parent, params, context, _resolveInfo) => { + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const updateCommentTransactionResponse = await transaction.run( + ` + MATCH (comment:Comment {id: $params.id}) + SET comment += $params + SET comment.updatedAt = toString(datetime()) + RETURN comment + `, + { params }, + ) + return updateCommentTransactionResponse.records.map( + (record) => record.get('comment').properties, + ) + }) + try { + const [comment] = await writeTxResultPromise + return comment + } finally { + session.close() + } + }, + DeleteComment: async (_parent, args, context, _resolveInfo) => { + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const deleteCommentTransactionResponse = await transaction.run( + ` + MATCH (comment:Comment {id: $commentId}) + SET comment.deleted = TRUE + SET comment.content = 'UNAVAILABLE' + SET comment.contentExcerpt = 'UNAVAILABLE' + RETURN comment + `, + { commentId: args.id }, + ) + return deleteCommentTransactionResponse.records.map( + (record) => record.get('comment').properties, + ) + }) + try { + const [comment] = await writeTxResultPromise + return comment + } finally { + session.close() + } + }, + }, + Comment: { + ...Resolver('Comment', { + hasOne: { + author: '<-[:WROTE]-(related:User)', + post: '-[:COMMENTS]->(related:Post)', + }, + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/donations.spec.ts b/docs/backend/src/schema/resolvers/donations.spec.ts new file mode 100644 index 000000000..9fc010eca --- /dev/null +++ b/docs/backend/src/schema/resolvers/donations.spec.ts @@ -0,0 +1,186 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +let mutate, query, authenticatedUser, variables +const instance = getNeode() +const driver = getDriver() + +const updateDonationsMutation = gql` + mutation ($showDonations: Boolean, $goal: Int, $progress: Int) { + UpdateDonations(showDonations: $showDonations, goal: $goal, progress: $progress) { + id + showDonations + goal + progress + createdAt + updatedAt + } + } +` +const donationsQuery = gql` + query { + Donations { + id + showDonations + goal + progress + } + } +` + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('donations', () => { + let currentUser, newlyCreatedDonations + beforeAll(async () => { + await cleanDatabase() + authenticatedUser = undefined + const { server } = createServer({ + context: () => { + return { + driver, + neode: instance, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + query = createTestClient(server).query + }) + + beforeEach(async () => { + variables = {} + newlyCreatedDonations = await Factory.build('donations') + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('query for donations', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = undefined + await expect(query({ query: donationsQuery, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + currentUser = await Factory.build('user', { + id: 'normal-user', + role: 'user', + }) + authenticatedUser = await currentUser.toJson() + }) + + it('returns the current Donations info', async () => { + await expect(query({ query: donationsQuery, variables })).resolves.toMatchObject({ + data: { Donations: { showDonations: true, goal: 15000, progress: 7000 } }, + errors: undefined, + }) + }) + }) + }) + + describe('update donations', () => { + beforeEach(() => { + variables = { showDonations: false, goal: 20000, progress: 3000 } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = undefined + await expect( + mutate({ mutation: updateDonationsMutation, variables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + describe('as a normal user', () => { + beforeEach(async () => { + currentUser = await Factory.build('user', { + id: 'normal-user', + role: 'user', + }) + authenticatedUser = await currentUser.toJson() + }) + + it('throws authorization error', async () => { + await expect( + mutate({ mutation: updateDonationsMutation, variables }), + ).resolves.toMatchObject({ + data: { UpdateDonations: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('as a moderator', () => { + beforeEach(async () => { + currentUser = await Factory.build('user', { + id: 'moderator', + role: 'moderator', + }) + authenticatedUser = await currentUser.toJson() + }) + + it('throws authorization error', async () => { + await expect( + mutate({ mutation: updateDonationsMutation, variables }), + ).resolves.toMatchObject({ + data: { UpdateDonations: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('as an admin', () => { + beforeEach(async () => { + currentUser = await Factory.build('user', { + id: 'admin', + role: 'admin', + }) + authenticatedUser = await currentUser.toJson() + }) + + it('updates Donations info', async () => { + await expect( + mutate({ mutation: updateDonationsMutation, variables }), + ).resolves.toMatchObject({ + data: { UpdateDonations: { showDonations: false, goal: 20000, progress: 3000 } }, + errors: undefined, + }) + }) + + it('updates the updatedAt attribute', async () => { + newlyCreatedDonations = await newlyCreatedDonations.toJson() + const { + data: { UpdateDonations }, + } = await mutate({ mutation: updateDonationsMutation, variables }) + expect(newlyCreatedDonations.updatedAt).toBeTruthy() + expect(Date.parse(newlyCreatedDonations.updatedAt)).toEqual(expect.any(Number)) + expect(UpdateDonations.updatedAt).toBeTruthy() + expect(Date.parse(UpdateDonations.updatedAt)).toEqual(expect.any(Number)) + expect(newlyCreatedDonations.updatedAt).not.toEqual(UpdateDonations.updatedAt) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/donations.ts b/docs/backend/src/schema/resolvers/donations.ts new file mode 100644 index 000000000..d077e7bed --- /dev/null +++ b/docs/backend/src/schema/resolvers/donations.ts @@ -0,0 +1,60 @@ +export default { + Query: { + Donations: async (_parent, _params, context, _resolveInfo) => { + const { driver } = context + let donations + const session = driver.session() + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const donationsTransactionResponse = await txc.run( + ` + MATCH (donations:Donations) + WITH donations LIMIT 1 + RETURN donations + `, + {}, + ) + return donationsTransactionResponse.records.map( + (record) => record.get('donations').properties, + ) + }) + try { + const txResult = await writeTxResultPromise + if (!txResult[0]) return null + donations = txResult[0] + } finally { + session.close() + } + return donations + }, + }, + Mutation: { + UpdateDonations: async (_parent, params, context, _resolveInfo) => { + const { driver } = context + let donations + const session = driver.session() + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const updateDonationsTransactionResponse = await txc.run( + ` + MATCH (donations:Donations) + WITH donations LIMIT 1 + SET donations += $params + SET donations.updatedAt = toString(datetime()) + RETURN donations + `, + { params }, + ) + return updateDonationsTransactionResponse.records.map( + (record) => record.get('donations').properties, + ) + }) + try { + const txResult = await writeTxResultPromise + if (!txResult[0]) return null + donations = txResult[0] + } finally { + session.close() + } + return donations + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/emails.spec.ts b/docs/backend/src/schema/resolvers/emails.spec.ts new file mode 100644 index 000000000..02a631495 --- /dev/null +++ b/docs/backend/src/schema/resolvers/emails.spec.ts @@ -0,0 +1,349 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getDriver, getNeode } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +const neode = getNeode() + +let mutate, query +let authenticatedUser +let user +let variables +const driver = getDriver() + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + query = createTestClient(server).query +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + variables = {} +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('AddEmailAddress', () => { + const mutation = gql` + mutation ($email: String!) { + AddEmailAddress(email: $email) { + email + verifiedAt + createdAt + } + } + ` + beforeEach(() => { + variables = { ...variables, email: 'new-email@example.org' } + }) + + describe('unauthenticated', () => { + beforeEach(() => { + authenticatedUser = null + }) + + it('throws AuthorizationError', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { AddEmailAddress: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + user = await Factory.build('user', { id: '567' }, { email: 'user@example.org' }) + authenticatedUser = await user.toJson() + }) + + describe('email attribute is not a valid email', () => { + beforeEach(() => { + variables = { ...variables, email: 'foobar' } + }) + + it('throws UserInputError', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { AddEmailAddress: null }, + errors: [{ message: 'must be a valid email' }], + }) + }) + }) + + describe('email attribute is a valid email', () => { + it('creates a new unverified `EmailAddress` node', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + AddEmailAddress: { + email: 'new-email@example.org', + verifiedAt: null, + createdAt: expect.any(String), + }, + }, + errors: undefined, + }) + }) + + it('connects `UnverifiedEmailAddress` to the authenticated user', async () => { + await mutate({ mutation, variables }) + const result = await neode.cypher(` + MATCH(u:User)-[:PRIMARY_EMAIL]->(:EmailAddress {email: "user@example.org"}) + MATCH(u:User)<-[:BELONGS_TO]-(e:UnverifiedEmailAddress {email: "new-email@example.org"}) + RETURN e + `) + const email = neode.hydrateFirst(result, 'e', neode.model('UnverifiedEmailAddress')) + await expect(email.toJson()).resolves.toMatchObject({ + email: 'new-email@example.org', + nonce: expect.any(String), + }) + }) + + describe('if another `UnverifiedEmailAddress` node already exists with that email', () => { + it('throws no unique constraint violation error', async () => { + await Factory.build('unverifiedEmailAddress', { + createdAt: '2019-09-24T14:00:01.565Z', + email: 'new-email@example.org', + }) + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + AddEmailAddress: { + email: 'new-email@example.org', + verifiedAt: null, + }, + }, + errors: undefined, + }) + }) + }) + + describe('but if another user owns an `EmailAddress` already with that email', () => { + it('does not throw UserInputError', async () => { + await Factory.build('user', {}, { email: 'new-email@example.org' }) + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + AddEmailAddress: { + createdAt: expect.any(String), + verifiedAt: null, + email: 'new-email@example.org', + }, + }, + errors: undefined, + }) + }) + }) + }) + }) +}) + +describe('VerifyEmailAddress', () => { + const mutation = gql` + mutation ($email: String!, $nonce: String!) { + VerifyEmailAddress(email: $email, nonce: $nonce) { + email + createdAt + verifiedAt + } + } + ` + + beforeEach(() => { + variables = { ...variables, email: 'to-be-verified@example.org', nonce: '12345' } + }) + + describe('unauthenticated', () => { + beforeEach(() => { + authenticatedUser = null + }) + + it('throws AuthorizationError', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { VerifyEmailAddress: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + user = await Factory.build('user', { id: '567' }, { email: 'user@example.org' }) + authenticatedUser = await user.toJson() + }) + + describe('if no unverified `EmailAddress` node exists', () => { + it('throws UserInputError', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { VerifyEmailAddress: null }, + errors: [{ message: 'Invalid nonce or no email address found.' }], + }) + }) + }) + + describe('given a `UnverifiedEmailAddress`', () => { + let emailAddress + beforeEach(async () => { + emailAddress = await Factory.build('unverifiedEmailAddress', { + nonce: '12345', + verifiedAt: null, + createdAt: new Date().toISOString(), + email: 'to-be-verified@example.org', + }) + }) + + describe('given invalid nonce', () => { + it('throws UserInputError', async () => { + variables.nonce = 'asdfgh' + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { VerifyEmailAddress: null }, + errors: [{ message: 'Invalid nonce or no email address found.' }], + }) + }) + }) + + describe('given valid nonce for `UnverifiedEmailAddress` node', () => { + beforeEach(() => { + variables = { ...variables, nonce: '12345' } + }) + + describe('but the address does not belong to the authenticated user', () => { + it('throws UserInputError', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { VerifyEmailAddress: null }, + errors: [{ message: 'Invalid nonce or no email address found.' }], + }) + }) + }) + + describe('and the `UnverifiedEmailAddress` belongs to the authenticated user', () => { + beforeEach(async () => { + await emailAddress.relateTo(user, 'belongsTo') + }) + + it('adds `verifiedAt`', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + VerifyEmailAddress: { + email: 'to-be-verified@example.org', + verifiedAt: expect.any(String), + createdAt: expect.any(String), + }, + }, + errors: undefined, + }) + }) + + it('connects the new `EmailAddress` as PRIMARY', async () => { + await mutate({ mutation, variables }) + const result = await neode.cypher(` + MATCH(u:User {id: "567"})-[:PRIMARY_EMAIL]->(e:EmailAddress {email: "to-be-verified@example.org"}) + RETURN e + `) + const email = neode.hydrateFirst(result, 'e', neode.model('EmailAddress')) + await expect(email.toJson()).resolves.toMatchObject({ + email: 'to-be-verified@example.org', + }) + }) + + it('removes previous PRIMARY relationship', async () => { + const cypherStatement = ` + MATCH(u:User {id: "567"})-[:PRIMARY_EMAIL]->(e:EmailAddress {email: "user@example.org"}) + RETURN e + ` + let result = await neode.cypher(cypherStatement) + let email = neode.hydrateFirst(result, 'e', neode.model('EmailAddress')) + await expect(email.toJson()).resolves.toMatchObject({ + email: 'user@example.org', + }) + await mutate({ mutation, variables }) + result = await neode.cypher(cypherStatement) + email = neode.hydrateFirst(result, 'e', neode.model('EmailAddress')) + await expect(email).toBe(false) + }) + + it('removes previous `EmailAddress` node', async () => { + const cypherStatement = ` + MATCH(u:User {id: "567"})<-[:BELONGS_TO]-(e:EmailAddress {email: "user@example.org"}) + RETURN e + ` + let result = await neode.cypher(cypherStatement) + let email = neode.hydrateFirst(result, 'e', neode.model('EmailAddress')) + await expect(email.toJson()).resolves.toMatchObject({ + email: 'user@example.org', + }) + await mutate({ mutation, variables }) + result = await neode.cypher(cypherStatement) + email = neode.hydrateFirst(result, 'e', neode.model('EmailAddress')) + await expect(email).toBe(false) + }) + + describe('Edge case: In the meantime someone created an `EmailAddress` node with the given email', () => { + beforeEach(async () => { + await Factory.build('emailAddress', { email: 'to-be-verified@example.org' }) + }) + + it('throws UserInputError because of unique constraints', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { VerifyEmailAddress: null }, + errors: [{ message: 'A user account with this email already exists.' }], + }) + }) + }) + }) + }) + }) + }) +}) + +describe('VerifyNonce', () => { + beforeEach(async () => { + await Factory.build('emailAddress', { + nonce: '12345', + verifiedAt: null, + createdAt: new Date().toISOString(), + email: 'to-be-verified@example.org', + }) + }) + + const verifyNonceQuery = gql` + query ($email: String!, $nonce: String!) { + VerifyNonce(email: $email, nonce: $nonce) + } + ` + + it('returns true when nonce and email match', async () => { + variables = { + email: 'to-be-verified@example.org', + nonce: '12345', + } + await expect(query({ query: verifyNonceQuery, variables })).resolves.toMatchObject({ + data: { VerifyNonce: true }, + }) + }) + + it('returns false when nonce and email do not match', async () => { + variables = { + email: 'to-be-verified@example.org', + nonce: '---', + } + await expect(query({ query: verifyNonceQuery, variables })).resolves.toMatchObject({ + data: { VerifyNonce: false }, + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/emails.ts b/docs/backend/src/schema/resolvers/emails.ts new file mode 100644 index 000000000..d705781ca --- /dev/null +++ b/docs/backend/src/schema/resolvers/emails.ts @@ -0,0 +1,118 @@ +import generateNonce from './helpers/generateNonce' +import Resolver from './helpers/Resolver' +import existingEmailAddress from './helpers/existingEmailAddress' +import { UserInputError } from 'apollo-server' +import Validator from 'neode/build/Services/Validator.js' +import normalizeEmail from './helpers/normalizeEmail' + +export default { + Query: { + VerifyNonce: async (_parent, args, context, _resolveInfo) => { + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (txc) => { + const result = await txc.run( + ` + MATCH (email:EmailAddress {email: $email, nonce: $nonce}) + RETURN count(email) > 0 AS result + `, + { email: args.email, nonce: args.nonce }, + ) + return result + }) + try { + const txResult = await readTxResultPromise + return txResult.records[0].get('result') + } finally { + session.close() + } + }, + }, + Mutation: { + AddEmailAddress: async (_parent, args, context, _resolveInfo) => { + let response + args.email = normalizeEmail(args.email) + + try { + const { neode } = context + await new Validator(neode, neode.model('UnverifiedEmailAddress'), args) + } catch (e) { + throw new UserInputError('must be a valid email') + } + + // check email does not belong to anybody + const existingEmail = await existingEmailAddress({ args, context }) + if (existingEmail && existingEmail.alreadyExistingEmail && existingEmail.user) + return existingEmail.alreadyExistingEmail + + const nonce = generateNonce() + const { + user: { id: userId }, + } = context + + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const result = await txc.run( + ` + MATCH (user:User {id: $userId}) + MERGE (user)<-[:BELONGS_TO]-(email:UnverifiedEmailAddress {email: $email, nonce: $nonce}) + SET email.createdAt = toString(datetime()) + RETURN email, user + `, + { userId, email: args.email, nonce }, + ) + return result.records.map((record) => ({ + name: record.get('user').properties.name, + ...record.get('email').properties, + })) + }) + try { + const txResult = await writeTxResultPromise + response = txResult[0] + } finally { + session.close() + } + return response + }, + VerifyEmailAddress: async (_parent, args, context, _resolveInfo) => { + let response + const { + user: { id: userId }, + } = context + const { nonce, email } = args + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const result = await txc.run( + ` + MATCH (user:User {id: $userId})-[:PRIMARY_EMAIL]->(previous:EmailAddress) + MATCH (user)<-[:BELONGS_TO]-(email:UnverifiedEmailAddress {email: $email, nonce: $nonce}) + MERGE (user)-[:PRIMARY_EMAIL]->(email) + SET email:EmailAddress + SET email.verifiedAt = toString(datetime()) + REMOVE email:UnverifiedEmailAddress + DETACH DELETE previous + RETURN email + `, + { userId, email, nonce }, + ) + return result.records.map((record) => record.get('email').properties) + }) + try { + const txResult = await writeTxResultPromise + response = txResult[0] + } catch (e) { + if (e.code === 'Neo.ClientError.Schema.ConstraintValidationFailed') + throw new UserInputError('A user account with this email already exists.') + throw new Error(e) + } finally { + session.close() + } + if (!response) throw new UserInputError('Invalid nonce or no email address found.') + return response + }, + }, + EmailAddress: { + ...Resolver('EmailAddress', { + undefinedToNull: ['verifiedAt'], + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/embeds.spec.ts b/docs/backend/src/schema/resolvers/embeds.spec.ts new file mode 100644 index 000000000..8e7a69891 --- /dev/null +++ b/docs/backend/src/schema/resolvers/embeds.spec.ts @@ -0,0 +1,215 @@ +import fetch from 'node-fetch' +import fs from 'fs' +import path from 'path' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../server' +import gql from 'graphql-tag' + +jest.mock('node-fetch') +const mockedFetch = jest.mocked(fetch) +const { Response } = jest.requireActual('node-fetch') + +afterEach(() => { + mockedFetch.mockRestore() +}) + +let variables = {} + +const HumanConnectionOrg = fs.readFileSync( + path.join(__dirname, '../../../snapshots/embeds/HumanConnectionOrg.html'), + 'utf8', +) +const pr3934 = fs.readFileSync( + path.join(__dirname, '../../../snapshots/embeds/pr3934.html'), + 'utf8', +) +const babyLovesCat = fs.readFileSync( + path.join(__dirname, '../../../snapshots/embeds/babyLovesCat.html'), + 'utf8', +) + +const babyLovesCatEmbedResponse = new Response( + JSON.stringify({ + height: 270, + provider_name: 'YouTube', + title: 'Baby Loves Cat', + type: 'video', + width: 480, + thumbnail_height: 360, + provider_url: 'https://www.youtube.com/', + thumbnail_width: 480, + html: '', + thumbnail_url: 'https://i.ytimg.com/vi/qkdXAtO40Fo/hqdefault.jpg', + version: '1.0', + author_name: 'Merkley Family', + author_url: 'https://www.youtube.com/channel/UC5P8yei950tif7UmdPpkJLQ', + }), +) + +describe('Query', () => { + describe('embed', () => { + let embedAction + + beforeEach(() => { + embedAction = async (variables) => { + const { server } = createServer({ + context: () => {}, + }) + const { query } = createTestClient(server) + const embed = gql` + query ($url: String!) { + embed(url: $url) { + type + title + author + publisher + date + description + url + image + audio + video + lang + sources + html + } + } + ` + return query({ query: embed, variables }) + } + }) + + describe('given a video link', () => { + beforeEach(() => { + mockedFetch + .mockReturnValueOnce(Promise.resolve(new Response(''))) + .mockReturnValueOnce(Promise.resolve(new Response(JSON.stringify({})))) + variables = { url: 'https://www.w3schools.com/html/mov_bbb.mp4' } + }) + + it('shows some default data', async () => { + await expect(embedAction(variables)).resolves.toMatchObject({ + data: { + embed: { + audio: null, + author: null, + date: null, + description: null, + html: null, + image: null, + lang: 'false', + publisher: null, + sources: ['resource'], + title: null, + type: 'link', + url: 'https://www.w3schools.com/html/mov_bbb.mp4', + video: null, + }, + }, + errors: undefined, + }) + }) + }) + + describe('given a Facebook link', () => { + beforeEach(() => { + mockedFetch + .mockReturnValueOnce(Promise.resolve(new Response(HumanConnectionOrg))) + .mockReturnValueOnce(Promise.resolve(new Response('invalid json'))) + variables = { url: 'https://www.facebook.com/HumanConnectionOrg/' } + }) + + it('does not crash if embed provider returns invalid JSON', async () => { + await expect(embedAction(variables)).resolves.toMatchObject({ + data: { + embed: { + audio: null, + author: null, + date: expect.any(String), + description: + 'Human Connection, Weilheim an der Teck. Gefällt 24.407 Mal. An upcoming non-profit social network focused on local and global positive change. Twitter accounts : @hc_world (EN), @hc_deutschland (GE),…', + html: null, + image: + 'https://scontent.ftxl3-1.fna.fbcdn.net/v/t1.0-1/c5.0.200.200a/p200x200/12108307_997373093648222_70057205881020137_n.jpg?_nc_cat=110&_nc_oc=AQnPPYQlR0dU556gOfl4xkXr7IPZdRIAUfQeXl3fpUv4DAsFN8T4PfgOjPwuq85GPKGZ5S5E5mWQ8IVV1UiRBAIZ&_nc_ht=scontent.ftxl3-1.fna&oh=90309adddaab38839782f16e7d4b7bcf&oe=5DEEDFE5', + lang: 'de', + publisher: 'Facebook', + sources: ['resource'], + title: 'Human Connection', + type: 'link', + url: 'https://www.facebook.com/HumanConnectionOrg/', + video: null, + }, + }, + errors: undefined, + }) + }) + }) + + describe('given a Github link', () => { + beforeEach(() => { + mockedFetch + .mockReturnValueOnce(Promise.resolve(new Response(pr3934))) + .mockReturnValueOnce(Promise.resolve(new Response(JSON.stringify({})))) + variables = { url: 'https://github.com/Human-Connection/Human-Connection/pull/960' } + }) + + it('returns meta data even if no embed html can be retrieved', async () => { + await expect(embedAction(variables)).resolves.toMatchObject({ + data: { + embed: { + type: 'link', + title: + 'feat: [WIP] 🍰 Rebranding And White-Labeling by Mogge · Pull Request #3934 · Ocelot-Social-Community/Ocelot-Social', + author: 'Ocelot-Social-Community', + publisher: 'GitHub', + date: expect.any(String), + description: `🍰 Pullrequest +Have all the information for the brand in separate config files. Set these defaults to ocelot.social`, + url: 'https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3934', + image: 'https://avatars3.githubusercontent.com/u/67983243?s=400&v=4', + audio: null, + video: null, + lang: 'en', + sources: ['resource'], + html: null, + }, + }, + errors: undefined, + }) + }) + }) + + describe('given a youtube link', () => { + beforeEach(() => { + mockedFetch + .mockReturnValueOnce(Promise.resolve(new Response(babyLovesCat))) + .mockReturnValueOnce(Promise.resolve(babyLovesCatEmbedResponse)) + variables = { url: 'https://www.youtube.com/watch?v=qkdXAtO40Fo&t=18s' } + }) + + it('returns meta data plus youtube iframe html', async () => { + await expect(embedAction(variables)).resolves.toMatchObject({ + data: { + embed: { + type: 'video', + title: 'Baby Loves Cat', + author: 'Merkley Family', + publisher: 'YouTube', + date: expect.any(String), + description: + 'She’s incapable of controlling her limbs when her kitty is around. The obsession grows every day. Ps. That’s a sleep sack she’s in. Not a starfish outfit. Al…', + url: 'https://www.youtube.com/watch?v=qkdXAtO40Fo', + image: 'https://i.ytimg.com/vi/qkdXAtO40Fo/maxresdefault.jpg', + audio: null, + video: null, + lang: 'de', + sources: ['resource', 'oembed'], + html: '', + }, + }, + errors: undefined, + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/embeds.ts b/docs/backend/src/schema/resolvers/embeds.ts new file mode 100644 index 000000000..a75365ec7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/embeds.ts @@ -0,0 +1,29 @@ +import scrape from './embeds/scraper' +import { undefinedToNullResolver } from './helpers/Resolver' + +export default { + Query: { + embed: async (object, { url }, context, resolveInfo) => { + return scrape(url) + }, + }, + Embed: { + ...undefinedToNullResolver([ + 'type', + 'title', + 'author', + 'publisher', + 'date', + 'description', + 'url', + 'image', + 'audio', + 'video', + 'lang', + 'html', + ]), + sources: async (parent, params, context, resolveInfo) => { + return typeof parent.sources === 'undefined' ? [] : parent.sources + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/embeds/findProvider.spec.ts b/docs/backend/src/schema/resolvers/embeds/findProvider.spec.ts new file mode 100644 index 000000000..963b255ab --- /dev/null +++ b/docs/backend/src/schema/resolvers/embeds/findProvider.spec.ts @@ -0,0 +1,123 @@ +import findProvider from './findProvider' + +describe('Vimeo', () => { + it('matches `https://vimeo.com/showcase/2098620/video/4082288`', () => { + expect(findProvider('https://vimeo.com/showcase/2098620/video/4082288')).toEqual( + 'https://vimeo.com/api/oembed.json', + ) + }) +}) + +describe('D.Tube', () => { + it('matches `https://d.tube/v/alexshumsky/q4D-hIOjknY`', () => { + expect(findProvider('https://d.tube/v/alexshumsky/q4D-hIOjknY')).toEqual( + 'https://api.d.tube/oembed', + ) + }) +}) + +describe('GIPHY', () => { + it('matches `https://giphy.com/gifs/KRB0DCpSFQeT6/html5`', () => { + expect(findProvider('https://giphy.com/gifs/KRB0DCpSFQeT6/html5')).toEqual( + 'https://giphy.com/services/oembed', + ) + }) +}) + +describe('Flicker', () => { + it('matches `https://flic.kr/p/VT2HCQ`', () => { + expect(findProvider('https://flic.kr/p/VT2HCQ')).toEqual( + 'https://www.flickr.com/services/oembed/', + ) + }) +}) + +describe('Codepen', () => { + it('matches `https://codepen.io/goodkatz/pen/LYPGxQz`', () => { + expect(findProvider('https://codepen.io/goodkatz/pen/LYPGxQz')).toEqual( + 'http://codepen.io/api/oembed', + ) + }) +}) + +describe('Meetup', () => { + it('matches `https://www.meetup.com/de-DE/spielego/events/ctdplqyzmbfc/`', () => { + expect(findProvider('https://www.meetup.com/de-DE/spielego/events/ctdplqyzmbfc/')).toEqual( + 'https://api.meetup.com/oembed', + ) + }) +}) + +describe('Mixcloud', () => { + it('matches `https://www.mixcloud.com/diffrent/giraffecast025/`', () => { + expect(findProvider('https://www.mixcloud.com/diffrent/giraffecast025/')).toEqual( + 'https://www.mixcloud.com/oembed/', + ) + }) +}) + +describe('Reddit', () => { + it('matches `https://www.reddit.com/r/LivestreamFail/comments/d6a2ge/greek_banned/`', () => { + expect( + findProvider('https://www.reddit.com/r/LivestreamFail/comments/d6a2ge/greek_banned/'), + ).toEqual('https://www.reddit.com/oembed') + }) +}) + +describe('Slideshare', () => { + it('matches `https://www.slideshare.net/ma6/lets-build-an-airport-how-to-estimate-large-scale-projects`', () => { + expect( + findProvider( + 'https://www.slideshare.net/ma6/lets-build-an-airport-how-to-estimate-large-scale-projects', + ), + ).toEqual('http://www.slideshare.net/api/oembed/2') + }) +}) + +describe('Soundcloud', () => { + it('matches `https://soundcloud.com/placid-records/zangenhand-live-altes-wettb-ro`', () => { + expect( + findProvider('https://soundcloud.com/placid-records/zangenhand-live-altes-wettb-ro'), + ).toEqual('https://soundcloud.com/oembed') + }) +}) + +describe('Twitch', () => { + it('matches `https://www.twitch.tv/gtimetv`', () => { + expect(findProvider('https://www.twitch.tv/gtimetv')).toEqual('https://api.twitch.tv/v4/oembed') + }) +}) + +describe('Twitter', () => { + it('matches `https://twitter.com/kenfm/status/1168682881524232194`', () => { + expect(findProvider('https://twitter.com/kenfm/status/1168682881524232194')).toEqual( + 'https://publish.twitter.com/oembed', + ) + }) +}) + +describe('Facebook', () => { + it('matches `https://www.facebook.com/FacebookDeutschland/videos/1960353927603280/`', () => { + expect( + findProvider('https://www.facebook.com/FacebookDeutschland/videos/1960353927603280/'), + ).toEqual('https://www.facebook.com/plugins/post/oembed.json') + }) +}) + +describe('Youtube', () => { + it('matches `https://www.youtube.com/watch?v=qkdXAtO40Fo`', () => { + expect(findProvider('https://www.youtube.com/watch?v=qkdXAtO40Fo')).toEqual( + 'https://www.youtube.com/oembed', + ) + }) + + it('matches `https://youtu.be/qkdXAtO40Fo`', () => { + expect(findProvider(`https://youtu.be/qkdXAtO40Fo`)).toEqual('https://www.youtube.com/oembed') + }) + + it('matches `https://youtu.be/qkdXAtO40Fo?t=41`', () => { + expect(findProvider(`https://youtu.be/qkdXAtO40Fo?t=41`)).toEqual( + 'https://www.youtube.com/oembed', + ) + }) +}) diff --git a/docs/backend/src/schema/resolvers/embeds/findProvider.ts b/docs/backend/src/schema/resolvers/embeds/findProvider.ts new file mode 100644 index 000000000..344cfed51 --- /dev/null +++ b/docs/backend/src/schema/resolvers/embeds/findProvider.ts @@ -0,0 +1,30 @@ +import fs from 'fs' +import path from 'path' +import minimatch from 'minimatch' + +let oEmbedProvidersFile = fs.readFileSync( + path.join(__dirname, '../../../../public/providers.json'), + 'utf8', +) + +// some providers allow a format parameter +// we need JSON +oEmbedProvidersFile = oEmbedProvidersFile.replace(/\{format\}/g, 'json') +const oEmbedProviders = JSON.parse(oEmbedProvidersFile) + +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 + } + const { hostname } = new URL(embedUrl) + if (provider.provider_url.includes(hostname)) { + const { + endpoints: [{ url }], + } = provider + return url + } + } + return null +} diff --git a/docs/backend/src/schema/resolvers/embeds/scraper.ts b/docs/backend/src/schema/resolvers/embeds/scraper.ts new file mode 100644 index 000000000..bcaa6e462 --- /dev/null +++ b/docs/backend/src/schema/resolvers/embeds/scraper.ts @@ -0,0 +1,81 @@ +import Metascraper from 'metascraper' +import fetch from 'node-fetch' + +import { ApolloError } from 'apollo-server' +import isEmpty from 'lodash/isEmpty' +import isArray from 'lodash/isArray' +import mergeWith from 'lodash/mergeWith' +import findProvider from './findProvider' + +const error = require('debug')('embed:error') + +const metascraper = Metascraper([ + require('metascraper-author')(), + require('metascraper-date')(), + require('metascraper-description')(), + require('metascraper-image')(), + require('metascraper-lang')(), + require('metascraper-lang-detector')(), + require('metascraper-logo')(), + require('metascraper-publisher')(), + require('metascraper-title')(), + require('metascraper-url')(), + require('metascraper-audio')(), + require('metascraper-soundcloud')(), + require('metascraper-video')(), + require('metascraper-youtube')(), + + // require('./rules/metascraper-embed')() +]) + +const fetchEmbed = async (url) => { + let endpointUrl = findProvider(url) + if (!endpointUrl) return {} + endpointUrl = new URL(endpointUrl) + endpointUrl.searchParams.append('url', url) + endpointUrl.searchParams.append('format', 'json') + let json + try { + const response = await fetch(endpointUrl) + json = await response.json() + } catch (err) { + error(`Error fetching embed data: ${err.message}`) + return {} + } + + return { + type: json.type, + html: json.html, + author: json.author_name, + date: json.upload_date, + sources: ['oembed'], + } +} + +const fetchResource = async (url) => { + const response = await fetch(url) + const html = await response.text() + const resource = await metascraper({ html, url }) + return { + sources: ['resource'], + ...resource, + } +} + +export default async function scrape(url) { + const [meta, embed] = await Promise.all([fetchResource(url), fetchEmbed(url)]) + const output = mergeWith(meta, embed, (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue) + } + }) + + if (isEmpty(output)) { + throw new ApolloError('Not found', 'NOT_FOUND') + } + + return { + type: 'link', + ...output, + } +} diff --git a/docs/backend/src/schema/resolvers/filter-posts.spec.ts b/docs/backend/src/schema/resolvers/filter-posts.spec.ts new file mode 100644 index 000000000..41fbd0ea7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/filter-posts.spec.ts @@ -0,0 +1,230 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import CONFIG from '../../config' +import { filterPosts, createPostMutation } from '../../graphql/posts' + +CONFIG.CATEGORIES_ACTIVE = false + +const driver = getDriver() +const neode = getNeode() + +let query +let mutate +let authenticatedUser +let user + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('Filter Posts', () => { + const now = new Date() + + beforeAll(async () => { + user = await Factory.build('user', { + id: 'user', + name: 'User', + about: 'I am a user.', + }) + authenticatedUser = await user.toJson() + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'a1', + title: 'I am an article', + content: 'I am an article written by user.', + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'a2', + title: 'I am anonther article', + content: 'I am another article written by user.', + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'e1', + title: 'Illegaler Kindergeburtstag', + content: 'Elli wird fünf. Wir feiern ihren Geburtstag.', + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventVenue: 'Garten der Familie Maier', + }, + }, + }) + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'e2', + title: 'Räuber-Treffen', + content: 'Planung der nächsten Räuberereien', + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1).toISOString(), + eventVenue: 'Wirtshaus im Spessart', + }, + }, + }) + }) + + describe('no filters set', () => { + it('finds all posts', async () => { + const { + data: { Post: result }, + } = await query({ query: filterPosts() }) + expect(result).toHaveLength(4) + expect(result).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: 'a1' }), + expect.objectContaining({ id: 'a2' }), + expect.objectContaining({ id: 'e1' }), + expect.objectContaining({ id: 'e2' }), + ]), + ) + }) + }) + + describe('post type filter set to ["Article"]', () => { + it('finds the articles', async () => { + const { + data: { Post: result }, + } = await query({ query: filterPosts(), variables: { filter: { postType_in: ['Article'] } } }) + expect(result).toHaveLength(2) + expect(result).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: 'a1' }), + expect.objectContaining({ id: 'a2' }), + ]), + ) + }) + }) + + describe('post type filter set to ["Event"]', () => { + it('finds the articles', async () => { + const { + data: { Post: result }, + } = await query({ query: filterPosts(), variables: { filter: { postType_in: ['Event'] } } }) + expect(result).toHaveLength(2) + expect(result).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: 'e1' }), + expect.objectContaining({ id: 'e2' }), + ]), + ) + }) + }) + + describe('post type filter set to ["Article", "Event"]', () => { + it('finds all posts', async () => { + const { + data: { Post: result }, + } = await query({ + query: filterPosts(), + variables: { filter: { postType_in: ['Article', 'Event'] } }, + }) + expect(result).toHaveLength(4) + expect(result).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: 'a1' }), + expect.objectContaining({ id: 'a2' }), + expect.objectContaining({ id: 'e1' }), + expect.objectContaining({ id: 'e2' }), + ]), + ) + }) + }) + + describe('order events by event start descending', () => { + it('finds the events ordered accordingly', async () => { + const { + data: { Post: result }, + } = await query({ + query: filterPosts(), + variables: { filter: { postType_in: ['Event'] }, orderBy: ['eventStart_desc'] }, + }) + expect(result).toHaveLength(2) + expect(result).toEqual([ + expect.objectContaining({ + id: 'e1', + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }), + expect.objectContaining({ + id: 'e2', + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1).toISOString(), + }), + ]) + }) + }) + + describe('order events by event start ascending', () => { + it('finds the events ordered accordingly', async () => { + const { + data: { Post: result }, + } = await query({ + query: filterPosts(), + variables: { filter: { postType_in: ['Event'] }, orderBy: ['eventStart_asc'] }, + }) + expect(result).toHaveLength(2) + expect(result).toEqual([ + expect.objectContaining({ + id: 'e2', + eventStart: new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1).toISOString(), + }), + expect.objectContaining({ + id: 'e1', + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }), + ]) + }) + }) + + describe('filter events by event start date', () => { + it('finds only events after given date', async () => { + const { + data: { Post: result }, + } = await query({ + query: filterPosts(), + variables: { + filter: { + postType_in: ['Event'], + eventStart_gte: new Date( + now.getFullYear(), + now.getMonth(), + now.getDate() + 2, + ).toISOString(), + }, + }, + }) + expect(result).toHaveLength(1) + expect(result).toEqual([ + expect.objectContaining({ + id: 'e1', + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }), + ]) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/follow.spec.ts b/docs/backend/src/schema/resolvers/follow.spec.ts new file mode 100644 index 000000000..c9d8dc1bf --- /dev/null +++ b/docs/backend/src/schema/resolvers/follow.spec.ts @@ -0,0 +1,212 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import { getDriver, getNeode } from '../../db/neo4j' +import createServer from '../../server' +import gql from 'graphql-tag' + +const driver = getDriver() +const neode = getNeode() + +let query +let mutate +let authenticatedUser + +let user1 +let user2 +let variables + +const mutationFollowUser = gql` + mutation ($id: ID!) { + followUser(id: $id) { + name + followedBy { + id + name + } + followedByCurrentUser + } + } +` +const mutationUnfollowUser = gql` + mutation ($id: ID!) { + unfollowUser(id: $id) { + name + followedBy { + id + name + } + followedByCurrentUser + } + } +` +const userQuery = gql` + query ($id: ID) { + User(id: $id) { + followedBy { + id + } + followedByCurrentUser + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => ({ + driver, + neode, + user: authenticatedUser, + cypherParams: { + currentUserId: authenticatedUser ? authenticatedUser.id : null, + }, + }), + }) + + const testClient = createTestClient(server) + query = testClient.query + mutate = testClient.mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + user1 = await Factory.build( + 'user', + { + id: 'u1', + name: 'user1', + }, + { + email: 'test@example.org', + password: '1234', + }, + ).then((user) => user.toJson()) + user2 = await Factory.build( + 'user', + { + id: 'u2', + name: 'user2', + }, + { + email: 'test2@example.org', + password: '1234', + }, + ).then((user) => user.toJson()) + + authenticatedUser = user1 + variables = { id: user2.id } +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('follow', () => { + describe('follow user', () => { + describe('unauthenticated follow', () => { + test('throws authorization error', async () => { + authenticatedUser = null + await expect( + mutate({ + mutation: mutationFollowUser, + variables, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { followUser: null }, + }) + }) + }) + + test('I can follow another user', async () => { + const expectedUser = { + name: user2.name, + followedBy: [{ id: user1.id, name: user1.name }], + followedByCurrentUser: true, + } + await expect( + mutate({ + mutation: mutationFollowUser, + variables, + }), + ).resolves.toMatchObject({ + data: { followUser: expectedUser }, + errors: undefined, + }) + }) + + test('adds `createdAt` to `FOLLOW` relationship', async () => { + await mutate({ + mutation: mutationFollowUser, + variables, + }) + const relation = await neode.cypher( + 'MATCH (user:User {id: $id})-[relationship:FOLLOWS]->(followed:User) WHERE relationship.createdAt IS NOT NULL RETURN relationship', + { id: 'u1' }, + ) + const relationshipProperties = relation.records.map( + (record) => record.get('relationship').properties.createdAt, + ) + expect(relationshipProperties[0]).toEqual(expect.any(String)) + }) + + test('I can`t follow myself', async () => { + variables.id = user1.id + await expect(mutate({ mutation: mutationFollowUser, variables })).resolves.toMatchObject({ + data: { followUser: null }, + errors: undefined, + }) + + const expectedUser = { + followedBy: [], + followedByCurrentUser: false, + } + await expect( + query({ + query: userQuery, + variables: { id: user1.id }, + }), + ).resolves.toMatchObject({ + data: { + User: [expectedUser], + }, + errors: undefined, + }) + }) + }) + + describe('unfollow user', () => { + beforeEach(async () => { + variables = { id: user2.id } + await mutate({ mutation: mutationFollowUser, variables }) + }) + + describe('unauthenticated follow', () => { + test('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: mutationUnfollowUser, variables })).resolves.toMatchObject({ + data: { unfollowUser: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + test('I can unfollow a user', async () => { + const expectedUser = { + name: user2.name, + followedBy: [], + followedByCurrentUser: false, + } + await expect(mutate({ mutation: mutationUnfollowUser, variables })).resolves.toMatchObject({ + data: { unfollowUser: expectedUser }, + errors: undefined, + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/follow.ts b/docs/backend/src/schema/resolvers/follow.ts new file mode 100644 index 000000000..6cf4938c7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/follow.ts @@ -0,0 +1,43 @@ +import { getNeode } from '../../db/neo4j' + +const neode = getNeode() + +export default { + Mutation: { + followUser: async (_object, params, context, _resolveInfo) => { + const { id: followedUserId } = params + const { user: currentUser } = context + + if (currentUser.id === followedUserId) { + return null + } + + const [user, followedUser] = await Promise.all([ + neode.find('User', currentUser.id), + neode.find('User', followedUserId), + ]) + await user.relateTo(followedUser, 'following') + return followedUser.toJson() + }, + + unfollowUser: async (_object, params, context, _resolveInfo) => { + const { id: followedUserId } = params + const { user: currentUser } = context + + /* + * Note: Neode doesn't provide an easy method for retrieving or removing relationships. + * It's suggested to use query builder feature (https://github.com/adam-cowley/neode/issues/67) + * However, pure cypher query looks cleaner IMO + */ + await neode.writeCypher( + `MATCH (user:User {id: $currentUser.id})-[relation:FOLLOWS]->(followedUser:User {id: $followedUserId}) + DELETE relation + RETURN COUNT(relation) > 0 as isFollowed`, + { followedUserId, currentUser }, + ) + + const followedUser = await neode.find('User', followedUserId) + return followedUser.toJson() + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/groups.spec.ts b/docs/backend/src/schema/resolvers/groups.spec.ts new file mode 100644 index 000000000..315388490 --- /dev/null +++ b/docs/backend/src/schema/resolvers/groups.spec.ts @@ -0,0 +1,3158 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import { + createGroupMutation, + updateGroupMutation, + joinGroupMutation, + leaveGroupMutation, + changeGroupMemberRoleMutation, + removeUserFromGroupMutation, + groupMembersQuery, + groupQuery, +} from '../../graphql/groups' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import CONFIG from '../../config' + +const driver = getDriver() +const neode = getNeode() + +let authenticatedUser +let user +let noMemberUser +let pendingMemberUser +let usualMemberUser +let adminMemberUser +let ownerMemberUser +let secondOwnerMemberUser + +const categoryIds = ['cat9', 'cat4', 'cat15'] +const descriptionAdditional100 = + ' 123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789' +let variables = {} + +const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, +}) +const { mutate, query } = createTestClient(server) + +const seedBasicsAndClearAuthentication = async () => { + variables = {} + user = await Factory.build( + 'user', + { + id: 'current-user', + name: 'TestUser', + }, + { + email: 'test@example.org', + password: '1234', + }, + ) + await Promise.all([ + neode.create('Category', { + id: 'cat4', + name: 'Environment & Nature', + slug: 'environment-nature', + icon: 'tree', + }), + neode.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + slug: 'democracy-politics', + icon: 'university', + }), + neode.create('Category', { + id: 'cat15', + name: 'Consumption & Sustainability', + slug: 'consumption-sustainability', + icon: 'shopping-cart', + }), + neode.create('Category', { + id: 'cat27', + name: 'Animal Protection', + slug: 'animal-protection', + icon: 'paw', + }), + ]) + authenticatedUser = null +} + +const seedComplexScenarioAndClearAuthentication = async () => { + await seedBasicsAndClearAuthentication() + // create users + noMemberUser = await Factory.build( + 'user', + { + id: 'none-member-user', + name: 'None Member TestUser', + }, + { + email: 'none-member-user@example.org', + password: '1234', + }, + ) + pendingMemberUser = await Factory.build( + 'user', + { + id: 'pending-member-user', + name: 'Pending Member TestUser', + }, + { + email: 'pending-member-user@example.org', + password: '1234', + }, + ) + usualMemberUser = await Factory.build( + 'user', + { + id: 'usual-member-user', + name: 'Usual Member TestUser', + }, + { + email: 'usual-member-user@example.org', + password: '1234', + }, + ) + adminMemberUser = await Factory.build( + 'user', + { + id: 'admin-member-user', + name: 'Admin Member TestUser', + }, + { + email: 'admin-member-user@example.org', + password: '1234', + }, + ) + ownerMemberUser = await Factory.build( + 'user', + { + id: 'owner-member-user', + name: 'Owner Member TestUser', + }, + { + email: 'owner-member-user@example.org', + password: '1234', + }, + ) + secondOwnerMemberUser = await Factory.build( + 'user', + { + id: 'second-owner-member-user', + name: 'Second Owner Member TestUser', + }, + { + email: 'second-owner-member-user@example.org', + password: '1234', + }, + ) + // create groups + // public-group + authenticatedUser = await usualMemberUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'public-group', + name: 'The Best Group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + categoryIds, + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'owner-of-closed-group', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'owner-of-hidden-group', + }, + }) + // closed-group + authenticatedUser = await ownerMemberUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'closed-group', + name: 'Uninteresting Group', + about: 'We will change nothing!', + description: 'We love it like it is!?' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + categoryIds, + }, + }) + // hidden-group + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'hidden-group', + name: 'Investigative Journalism Group', + about: 'We will change all.', + description: 'We research …' + descriptionAdditional100, + groupType: 'hidden', + actionRadius: 'global', + categoryIds, + }, + }) + // 'JoinGroup' mutation does not work in hidden groups so we join them by 'ChangeGroupMemberRole' through the owner + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'usual-member-user', + roleInGroup: 'usual', + }, + }) + + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'admin-member-user', + roleInGroup: 'admin', + }, + }) + + authenticatedUser = null +} + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('in mode', () => { + describe('clean db after each single test', () => { + beforeEach(async () => { + await seedBasicsAndClearAuthentication() + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('CreateGroup', () => { + beforeEach(() => { + variables = { + ...variables, + id: 'g589', + name: 'The Best Group', + slug: 'the-group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + categoryIds, + locationName: 'Hamburg, Germany', + } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: createGroupMutation(), variables }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('creates a group', async () => { + await expect( + mutate({ mutation: createGroupMutation(), variables }), + ).resolves.toMatchObject({ + data: { + CreateGroup: { + name: 'The Best Group', + slug: 'the-group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + descriptionExcerpt: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + locationName: 'Hamburg, Germany', + location: expect.objectContaining({ + name: 'Hamburg', + nameDE: 'Hamburg', + nameEN: 'Hamburg', + }), + }, + }, + errors: undefined, + }) + }) + + it('assigns the authenticated user as owner', async () => { + await expect( + mutate({ mutation: createGroupMutation(), variables }), + ).resolves.toMatchObject({ + data: { + CreateGroup: { + name: 'The Best Group', + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + + it('has "disabled" and "deleted" default to "false"', async () => { + await expect( + mutate({ mutation: createGroupMutation(), variables }), + ).resolves.toMatchObject({ + data: { CreateGroup: { disabled: false, deleted: false } }, + }) + }) + + describe('description', () => { + describe('length without HTML', () => { + describe('less then 100 chars', () => { + it('throws error: "Description too short!"', async () => { + const { errors } = await mutate({ + mutation: createGroupMutation(), + variables: { + ...variables, + description: + '0123456789' + + '0123456789', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Description too short!') + }) + }) + }) + }) + + describe('categories', () => { + beforeEach(() => { + CONFIG.CATEGORIES_ACTIVE = true + }) + + describe('with matching amount of categories', () => { + it('has new categories', async () => { + await expect( + mutate({ + mutation: createGroupMutation(), + variables: { + ...variables, + categoryIds: ['cat4', 'cat27'], + }, + }), + ).resolves.toMatchObject({ + data: { + CreateGroup: { + categories: expect.arrayContaining([ + expect.objectContaining({ id: 'cat4' }), + expect.objectContaining({ id: 'cat27' }), + ]), + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('not even one', () => { + describe('by "categoryIds: null"', () => { + it('throws error: "Too view categories!"', async () => { + const { errors } = await mutate({ + mutation: createGroupMutation(), + variables: { ...variables, categoryIds: null }, + }) + expect(errors![0]).toHaveProperty('message', 'Too view categories!') + }) + }) + + describe('by "categoryIds: []"', () => { + it('throws error: "Too view categories!"', async () => { + const { errors } = await mutate({ + mutation: createGroupMutation(), + variables: { ...variables, categoryIds: [] }, + }) + expect(errors![0]).toHaveProperty('message', 'Too view categories!') + }) + }) + }) + + describe('four', () => { + it('throws error: "Too many categories!"', async () => { + const { errors } = await mutate({ + mutation: createGroupMutation(), + variables: { ...variables, categoryIds: ['cat9', 'cat4', 'cat15', 'cat27'] }, + }) + expect(errors![0]).toHaveProperty('message', 'Too many categories!') + }) + }) + }) + }) + }) + }) + + describe('building up – clean db after each resolver', () => { + describe('Group', () => { + beforeAll(async () => { + await seedBasicsAndClearAuthentication() + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await query({ query: groupQuery(), variables: {} }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + let otherUser + let ownerOfHiddenGroupUser + + beforeAll(async () => { + otherUser = await Factory.build( + 'user', + { + id: 'other-user', + name: 'Other TestUser', + }, + { + email: 'other-user@example.org', + password: '1234', + }, + ) + ownerOfHiddenGroupUser = await Factory.build( + 'user', + { + id: 'owner-of-hidden-group', + name: 'Owner Of Hidden Group', + }, + { + email: 'owner-of-hidden-group@example.org', + password: '1234', + }, + ) + authenticatedUser = await otherUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'others-group', + name: 'Uninteresting Group', + about: 'We will change nothing!', + description: 'We love it like it is!?' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'global', + categoryIds, + }, + }) + authenticatedUser = await ownerOfHiddenGroupUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'hidden-group', + name: 'Investigative Journalism Group', + about: 'We will change all.', + description: 'We research …' + descriptionAdditional100, + groupType: 'hidden', + actionRadius: 'global', + categoryIds, + }, + }) + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'second-hidden-group', + name: 'Second Investigative Journalism Group', + about: 'We will change all.', + description: 'We research …' + descriptionAdditional100, + groupType: 'hidden', + actionRadius: 'global', + categoryIds, + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'second-hidden-group', + userId: 'current-user', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'third-hidden-group', + name: 'Third Investigative Journalism Group', + about: 'We will change all.', + description: 'We research …' + descriptionAdditional100, + groupType: 'hidden', + actionRadius: 'global', + categoryIds, + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'third-hidden-group', + userId: 'current-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await user.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'my-group', + name: 'The Best Group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + categoryIds, + locationName: 'Hamburg, Germany', + }, + }) + }) + + describe('query groups', () => { + describe('in general finds only listed groups – no hidden groups where user is none or pending member', () => { + describe('without any filters', () => { + it('finds all listed groups – including the set descriptionExcerpts and locations', async () => { + const result = await query({ query: groupQuery(), variables: {} }) + expect(result).toMatchObject({ + data: { + Group: expect.arrayContaining([ + expect.objectContaining({ + id: 'my-group', + slug: 'the-best-group', + descriptionExcerpt: 'Some description' + descriptionAdditional100, + locationName: 'Hamburg, Germany', + location: expect.objectContaining({ + name: 'Hamburg', + nameDE: 'Hamburg', + nameEN: 'Hamburg', + }), + myRole: 'owner', + }), + expect.objectContaining({ + id: 'others-group', + slug: 'uninteresting-group', + descriptionExcerpt: 'We love it like it is!?' + descriptionAdditional100, + locationName: null, + location: null, + myRole: null, + }), + expect.objectContaining({ + id: 'third-hidden-group', + slug: 'third-investigative-journalism-group', + descriptionExcerpt: 'We research …' + descriptionAdditional100, + myRole: 'usual', + locationName: null, + location: null, + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(3) + }) + + describe('categories', () => { + beforeEach(() => { + CONFIG.CATEGORIES_ACTIVE = true + }) + + it('has set categories', async () => { + await expect( + query({ query: groupQuery(), variables: {} }), + ).resolves.toMatchObject({ + data: { + Group: expect.arrayContaining([ + expect.objectContaining({ + id: 'my-group', + slug: 'the-best-group', + categories: expect.arrayContaining([ + expect.objectContaining({ id: 'cat4' }), + expect.objectContaining({ id: 'cat9' }), + expect.objectContaining({ id: 'cat15' }), + ]), + myRole: 'owner', + }), + expect.objectContaining({ + id: 'others-group', + slug: 'uninteresting-group', + categories: expect.arrayContaining([ + expect.objectContaining({ id: 'cat4' }), + expect.objectContaining({ id: 'cat9' }), + expect.objectContaining({ id: 'cat15' }), + ]), + myRole: null, + }), + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('with given id', () => { + describe("id = 'my-group'", () => { + it('finds only the listed group with this id', async () => { + const result = await query({ query: groupQuery(), variables: { id: 'my-group' } }) + expect(result).toMatchObject({ + data: { + Group: [ + expect.objectContaining({ + id: 'my-group', + slug: 'the-best-group', + myRole: 'owner', + }), + ], + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(1) + }) + }) + + describe("id = 'third-hidden-group'", () => { + it("finds only the hidden group where I'm 'usual' member", async () => { + const result = await query({ + query: groupQuery(), + variables: { id: 'third-hidden-group' }, + }) + expect(result).toMatchObject({ + data: { + Group: expect.arrayContaining([ + expect.objectContaining({ + id: 'third-hidden-group', + slug: 'third-investigative-journalism-group', + myRole: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(1) + }) + }) + + describe("id = 'second-hidden-group'", () => { + it("finds no hidden group where I'm 'pending' member", async () => { + const result = await query({ + query: groupQuery(), + variables: { id: 'second-hidden-group' }, + }) + expect(result.data?.Group.length).toBe(0) + }) + }) + + describe("id = 'hidden-group'", () => { + it("finds no hidden group where I'm not(!) a member at all", async () => { + const result = await query({ + query: groupQuery(), + variables: { id: 'hidden-group' }, + }) + expect(result.data?.Group.length).toBe(0) + }) + }) + }) + + describe('with given slug', () => { + describe("slug = 'the-best-group'", () => { + it('finds only the listed group with this slug', async () => { + const result = await query({ + query: groupQuery(), + variables: { slug: 'the-best-group' }, + }) + expect(result).toMatchObject({ + data: { + Group: [ + expect.objectContaining({ + id: 'my-group', + slug: 'the-best-group', + myRole: 'owner', + }), + ], + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(1) + }) + }) + + describe("slug = 'third-investigative-journalism-group'", () => { + it("finds only the hidden group where I'm 'usual' member", async () => { + const result = await query({ + query: groupQuery(), + variables: { slug: 'third-investigative-journalism-group' }, + }) + expect(result).toMatchObject({ + data: { + Group: expect.arrayContaining([ + expect.objectContaining({ + id: 'third-hidden-group', + slug: 'third-investigative-journalism-group', + myRole: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(1) + }) + }) + + describe("slug = 'second-investigative-journalism-group'", () => { + it("finds no hidden group where I'm 'pending' member", async () => { + const result = await query({ + query: groupQuery(), + variables: { slug: 'second-investigative-journalism-group' }, + }) + expect(result.data?.Group.length).toBe(0) + }) + }) + + describe("slug = 'investigative-journalism-group'", () => { + it("finds no hidden group where I'm not(!) a member at all", async () => { + const result = await query({ + query: groupQuery(), + variables: { slug: 'investigative-journalism-group' }, + }) + expect(result.data?.Group.length).toBe(0) + }) + }) + }) + + describe('isMember = true', () => { + it('finds only listed groups where user is member', async () => { + const result = await query({ query: groupQuery(), variables: { isMember: true } }) + expect(result).toMatchObject({ + data: { + Group: expect.arrayContaining([ + expect.objectContaining({ + id: 'my-group', + slug: 'the-best-group', + myRole: 'owner', + }), + expect.objectContaining({ + id: 'third-hidden-group', + slug: 'third-investigative-journalism-group', + myRole: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(2) + }) + }) + + describe('isMember = false', () => { + it('finds only listed groups where user is not(!) member', async () => { + const result = await query({ query: groupQuery(), variables: { isMember: false } }) + expect(result).toMatchObject({ + data: { + Group: expect.arrayContaining([ + expect.objectContaining({ + id: 'others-group', + slug: 'uninteresting-group', + myRole: null, + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.Group.length).toBe(1) + }) + }) + }) + }) + }) + }) + + describe('JoinGroup', () => { + beforeAll(async () => { + await seedBasicsAndClearAuthentication() + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'not-existing-group', + userId: 'current-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + let ownerOfClosedGroupUser + let ownerOfHiddenGroupUser + + beforeAll(async () => { + // create users + ownerOfClosedGroupUser = await Factory.build( + 'user', + { + id: 'owner-of-closed-group', + name: 'Owner Of Closed Group', + }, + { + email: 'owner-of-closed-group@example.org', + password: '1234', + }, + ) + ownerOfHiddenGroupUser = await Factory.build( + 'user', + { + id: 'owner-of-hidden-group', + name: 'Owner Of Hidden Group', + }, + { + email: 'owner-of-hidden-group@example.org', + password: '1234', + }, + ) + // create groups + // public-group + authenticatedUser = await ownerOfClosedGroupUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'closed-group', + name: 'Uninteresting Group', + about: 'We will change nothing!', + description: 'We love it like it is!?' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + categoryIds, + }, + }) + authenticatedUser = await ownerOfHiddenGroupUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'hidden-group', + name: 'Investigative Journalism Group', + about: 'We will change all.', + description: 'We research …' + descriptionAdditional100, + groupType: 'hidden', + actionRadius: 'global', + categoryIds, + }, + }) + authenticatedUser = await user.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'public-group', + name: 'The Best Group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + categoryIds, + }, + }) + }) + + describe('public group', () => { + describe('joined by "owner-of-closed-group"', () => { + it('has "usual" as membership role', async () => { + await expect( + mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'owner-of-closed-group', + }, + }), + ).resolves.toMatchObject({ + data: { + JoinGroup: { + id: 'owner-of-closed-group', + myRoleInGroup: 'usual', + }, + }, + errors: undefined, + }) + }) + }) + + describe('joined by its owner', () => { + describe('does not create additional "MEMBER_OF" relation and therefore', () => { + it('has still "owner" as membership role', async () => { + await expect( + mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'current-user', + }, + }), + ).resolves.toMatchObject({ + data: { + JoinGroup: { + id: 'current-user', + myRoleInGroup: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + }) + + describe('closed group', () => { + describe('joined by "current-user"', () => { + it('has "pending" as membership role', async () => { + await expect( + mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: 'current-user', + }, + }), + ).resolves.toMatchObject({ + data: { + JoinGroup: { + id: 'current-user', + myRoleInGroup: 'pending', + }, + }, + errors: undefined, + }) + }) + }) + + describe('joined by its owner', () => { + describe('does not create additional "MEMBER_OF" relation and therefore', () => { + it('has still "owner" as membership role', async () => { + await expect( + mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: 'owner-of-closed-group', + }, + }), + ).resolves.toMatchObject({ + data: { + JoinGroup: { + id: 'owner-of-closed-group', + myRoleInGroup: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + }) + + describe('hidden group', () => { + describe('joined by "owner-of-closed-group"', () => { + it('throws authorization error', async () => { + const { errors } = await query({ + query: joinGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'owner-of-closed-group', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('joined by its owner', () => { + describe('does not create additional "MEMBER_OF" relation and therefore', () => { + it('has still "owner" as membership role', async () => { + await expect( + mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'owner-of-hidden-group', + }, + }), + ).resolves.toMatchObject({ + data: { + JoinGroup: { + id: 'owner-of-hidden-group', + myRoleInGroup: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + }) + }) + }) + + describe('GroupMembers', () => { + beforeAll(async () => { + await seedBasicsAndClearAuthentication() + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + variables = { + id: 'not-existing-group', + } + const { errors } = await query({ query: groupMembersQuery(), variables }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + let otherUser + let pendingUser + let ownerOfClosedGroupUser + let ownerOfHiddenGroupUser + + beforeAll(async () => { + // create users + otherUser = await Factory.build( + 'user', + { + id: 'other-user', + name: 'Other TestUser', + }, + { + email: 'other-user@example.org', + password: '1234', + }, + ) + pendingUser = await Factory.build( + 'user', + { + id: 'pending-user', + name: 'Pending TestUser', + }, + { + email: 'pending@example.org', + password: '1234', + }, + ) + ownerOfClosedGroupUser = await Factory.build( + 'user', + { + id: 'owner-of-closed-group', + name: 'Owner Of Closed Group', + }, + { + email: 'owner-of-closed-group@example.org', + password: '1234', + }, + ) + ownerOfHiddenGroupUser = await Factory.build( + 'user', + { + id: 'owner-of-hidden-group', + name: 'Owner Of Hidden Group', + }, + { + email: 'owner-of-hidden-group@example.org', + password: '1234', + }, + ) + // create groups + // public-group + authenticatedUser = await user.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'public-group', + name: 'The Best Group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + categoryIds, + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'owner-of-closed-group', + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'owner-of-hidden-group', + }, + }) + // closed-group + authenticatedUser = await ownerOfClosedGroupUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'closed-group', + name: 'Uninteresting Group', + about: 'We will change nothing!', + description: 'We love it like it is!?' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'national', + categoryIds, + }, + }) + await mutate({ + mutation: joinGroupMutation(), + variables: { + groupId: 'closed-group', + userId: 'current-user', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'owner-of-hidden-group', + roleInGroup: 'usual', + }, + }) + // hidden-group + authenticatedUser = await ownerOfHiddenGroupUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'hidden-group', + name: 'Investigative Journalism Group', + about: 'We will change all.', + description: 'We research …' + descriptionAdditional100, + groupType: 'hidden', + actionRadius: 'global', + categoryIds, + }, + }) + // 'JoinGroup' mutation does not work in hidden groups so we join them by 'ChangeGroupMemberRole' through the owner + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'pending-user', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'current-user', + roleInGroup: 'usual', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'owner-of-closed-group', + roleInGroup: 'admin', + }, + }) + + authenticatedUser = null + }) + + describe('public group', () => { + beforeEach(async () => { + variables = { + id: 'public-group', + } + }) + + describe('query group members', () => { + describe('by owner "current-user"', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'owner', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'usual', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(3) + }) + }) + + describe('by usual member "owner-of-closed-group"', () => { + beforeEach(async () => { + authenticatedUser = await ownerOfClosedGroupUser.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'owner', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'usual', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(3) + }) + }) + + describe('by none member "other-user"', () => { + beforeEach(async () => { + authenticatedUser = await otherUser.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'owner', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'usual', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(3) + }) + }) + }) + }) + + describe('closed group', () => { + beforeEach(async () => { + variables = { + id: 'closed-group', + } + }) + + describe('query group members', () => { + describe('by owner "owner-of-closed-group"', () => { + beforeEach(async () => { + authenticatedUser = await ownerOfClosedGroupUser.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'pending', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'owner', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(3) + }) + }) + + describe('by usual member "owner-of-hidden-group"', () => { + beforeEach(async () => { + authenticatedUser = await ownerOfHiddenGroupUser.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'pending', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'owner', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'usual', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(3) + }) + }) + + describe('by pending member "current-user"', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await query({ query: groupMembersQuery(), variables }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('by none member "other-user"', () => { + beforeEach(async () => { + authenticatedUser = await otherUser.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await query({ query: groupMembersQuery(), variables }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + + describe('hidden group', () => { + beforeEach(async () => { + variables = { + id: 'hidden-group', + } + }) + + describe('query group members', () => { + describe('by owner "owner-of-hidden-group"', () => { + beforeEach(async () => { + authenticatedUser = await ownerOfHiddenGroupUser.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'pending-user', + myRoleInGroup: 'pending', + }), + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'usual', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'admin', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'owner', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(4) + }) + }) + + describe('by usual member "current-user"', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'pending-user', + myRoleInGroup: 'pending', + }), + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'usual', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'admin', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'owner', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(4) + }) + }) + + describe('by admin member "owner-of-closed-group"', () => { + beforeEach(async () => { + authenticatedUser = await ownerOfClosedGroupUser.toJson() + }) + + it('finds all members', async () => { + const result = await query({ + query: groupMembersQuery(), + variables, + }) + expect(result).toMatchObject({ + data: { + GroupMembers: expect.arrayContaining([ + expect.objectContaining({ + id: 'pending-user', + myRoleInGroup: 'pending', + }), + expect.objectContaining({ + id: 'current-user', + myRoleInGroup: 'usual', + }), + expect.objectContaining({ + id: 'owner-of-closed-group', + myRoleInGroup: 'admin', + }), + expect.objectContaining({ + id: 'owner-of-hidden-group', + myRoleInGroup: 'owner', + }), + ]), + }, + errors: undefined, + }) + expect(result.data?.GroupMembers.length).toBe(4) + }) + }) + + describe('by pending member "pending-user"', () => { + beforeEach(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await query({ query: groupMembersQuery(), variables }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('by none member "other-user"', () => { + beforeEach(async () => { + authenticatedUser = await otherUser.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await query({ query: groupMembersQuery(), variables }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + }) + }) + + describe('ChangeGroupMemberRole', () => { + beforeAll(async () => { + await seedComplexScenarioAndClearAuthentication() + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'not-existing-group', + userId: 'current-user', + roleInGroup: 'pending', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + describe('in all group types – here "closed-group" for example', () => { + beforeEach(async () => { + variables = { + groupId: 'closed-group', + } + }) + + describe('join the members and give them their prospective roles', () => { + describe('by owner "owner-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await ownerMemberUser.toJson() + }) + + describe('for "usual-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'usual-member-user', + } + }) + + describe('as usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('has role usual', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'usual-member-user', + myRoleInGroup: 'usual', + }, + }, + errors: undefined, + }) + }) + + // the GQL mutation needs this fields in the result for testing + it.todo('has "updatedAt" newer as "createdAt"') + }) + }) + + describe('for "admin-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'admin-member-user', + } + }) + + describe('as admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('has role admin', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'admin-member-user', + myRoleInGroup: 'admin', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('for "second-owner-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'second-owner-member-user', + } + }) + + describe('as owner', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'owner', + } + }) + + it('has role owner', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'second-owner-member-user', + myRoleInGroup: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + }) + }) + + describe('switch role', () => { + describe('of owner "owner-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'owner-member-user', + } + }) + + describe('by owner themself "owner-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await ownerMemberUser.toJson() + }) + + describe('to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + // shall this be possible in the future? + // or shall only an owner who gave the second owner the owner role downgrade themself for savety? + // otherwise the first owner who downgrades the other one has the victory over the group! + describe('by second owner "second-owner-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await secondOwnerMemberUser.toJson() + }) + + describe('to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('to same role owner', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'owner', + } + }) + + it('has role owner still', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'owner-member-user', + myRoleInGroup: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('by admin "admin-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await adminMemberUser.toJson() + }) + + describe('to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by usual member "usual-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await usualMemberUser.toJson() + }) + + describe('to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by still pending member "pending-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await pendingMemberUser.toJson() + }) + + describe('to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + + describe('of admin "admin-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'admin-member-user', + } + }) + + describe('by owner "owner-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await ownerMemberUser.toJson() + }) + + describe('to owner', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'owner', + } + }) + + it('has role owner', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'admin-member-user', + myRoleInGroup: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('back to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by usual member "usual-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await usualMemberUser.toJson() + }) + + describe('upgrade to owner', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'owner', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('degrade to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by still pending member "pending-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await pendingMemberUser.toJson() + }) + + describe('upgrade to owner', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'owner', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('degrade to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by none member "current-user"', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('upgrade to owner', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'owner', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('degrade to pending again', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'pending', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + + describe('of usual member "usual-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'usual-member-user', + } + }) + + describe('by owner "owner-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await ownerMemberUser.toJson() + }) + + describe('to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('has role admin', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'usual-member-user', + myRoleInGroup: 'admin', + }, + }, + errors: undefined, + }) + }) + }) + + describe('back to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('has role usual again', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'usual-member-user', + myRoleInGroup: 'usual', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('by usual member "usual-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await usualMemberUser.toJson() + }) + + describe('upgrade to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('degrade to pending', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'pending', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by still pending member "pending-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await pendingMemberUser.toJson() + }) + + describe('upgrade to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('degrade to pending', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'pending', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by none member "current-user"', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('upgrade to admin', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'admin', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('degrade to pending again', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'pending', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + + describe('of still pending member "pending-member-user"', () => { + beforeEach(async () => { + variables = { + ...variables, + userId: 'pending-member-user', + } + }) + + describe('by owner "owner-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await ownerMemberUser.toJson() + }) + + describe('to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('has role usual', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'pending-member-user', + myRoleInGroup: 'usual', + }, + }, + errors: undefined, + }) + }) + }) + + describe('back to pending', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'pending', + } + }) + + it('has role usual again', async () => { + await expect( + mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }), + ).resolves.toMatchObject({ + data: { + ChangeGroupMemberRole: { + id: 'pending-member-user', + myRoleInGroup: 'pending', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('by usual member "usual-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await usualMemberUser.toJson() + }) + + describe('upgrade to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by still pending member "pending-member-user"', () => { + beforeEach(async () => { + authenticatedUser = await pendingMemberUser.toJson() + }) + + describe('upgrade to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('by none member "current-user"', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('upgrade to usual', () => { + beforeEach(async () => { + variables = { + ...variables, + roleInGroup: 'usual', + } + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + }) + }) + }) + }) + + describe('LeaveGroup', () => { + beforeAll(async () => { + await seedComplexScenarioAndClearAuthentication() + // closed-group + authenticatedUser = await ownerMemberUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'pending-member-user', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'usual-member-user', + roleInGroup: 'usual', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'admin-member-user', + roleInGroup: 'admin', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'second-owner-member-user', + roleInGroup: 'owner', + }, + }) + + authenticatedUser = null + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: leaveGroupMutation(), + variables: { + groupId: 'not-existing-group', + userId: 'current-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + describe('in all group types', () => { + describe('here "closed-group" for example', () => { + const memberInGroup = async (userId, groupId) => { + const result = await query({ + query: groupMembersQuery(), + variables: { + id: groupId, + }, + }) + return result.data && result.data.GroupMembers + ? !!result.data.GroupMembers.find((member) => member.id === userId) + : null + } + + beforeEach(async () => { + authenticatedUser = null + variables = { + groupId: 'closed-group', + } + }) + + describe('left by "pending-member-user"', () => { + it('has "null" as membership role, was in the group, and left the group', async () => { + authenticatedUser = await ownerMemberUser.toJson() + expect(await memberInGroup('pending-member-user', 'closed-group')).toBe(true) + authenticatedUser = await pendingMemberUser.toJson() + await expect( + mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'pending-member-user', + }, + }), + ).resolves.toMatchObject({ + data: { + LeaveGroup: { + id: 'pending-member-user', + myRoleInGroup: null, + }, + }, + errors: undefined, + }) + authenticatedUser = await ownerMemberUser.toJson() + expect(await memberInGroup('pending-member-user', 'closed-group')).toBe(false) + }) + }) + + describe('left by "usual-member-user"', () => { + it('has "null" as membership role, was in the group, and left the group', async () => { + authenticatedUser = await ownerMemberUser.toJson() + expect(await memberInGroup('usual-member-user', 'closed-group')).toBe(true) + authenticatedUser = await usualMemberUser.toJson() + await expect( + mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'usual-member-user', + }, + }), + ).resolves.toMatchObject({ + data: { + LeaveGroup: { + id: 'usual-member-user', + myRoleInGroup: null, + }, + }, + errors: undefined, + }) + authenticatedUser = await ownerMemberUser.toJson() + expect(await memberInGroup('usual-member-user', 'closed-group')).toBe(false) + }) + }) + + describe('left by "admin-member-user"', () => { + it('has "null" as membership role, was in the group, and left the group', async () => { + authenticatedUser = await ownerMemberUser.toJson() + expect(await memberInGroup('admin-member-user', 'closed-group')).toBe(true) + authenticatedUser = await adminMemberUser.toJson() + await expect( + mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'admin-member-user', + }, + }), + ).resolves.toMatchObject({ + data: { + LeaveGroup: { + id: 'admin-member-user', + myRoleInGroup: null, + }, + }, + errors: undefined, + }) + authenticatedUser = await ownerMemberUser.toJson() + expect(await memberInGroup('admin-member-user', 'closed-group')).toBe(false) + }) + }) + + describe('left by "owner-member-user"', () => { + it('throws authorization error', async () => { + authenticatedUser = await ownerMemberUser.toJson() + const { errors } = await mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'owner-member-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('left by "second-owner-member-user"', () => { + it('throws authorization error', async () => { + authenticatedUser = await secondOwnerMemberUser.toJson() + const { errors } = await mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'second-owner-member-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('left by "none-member-user"', () => { + it('throws authorization error', async () => { + authenticatedUser = await noMemberUser.toJson() + const { errors } = await mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'none-member-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('as "owner-member-user" try to leave member "usual-member-user"', () => { + it('throws authorization error', async () => { + authenticatedUser = await ownerMemberUser.toJson() + const { errors } = await mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'usual-member-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('as "usual-member-user" try to leave member "admin-member-user"', () => { + it('throws authorization error', async () => { + authenticatedUser = await usualMemberUser.toJson() + const { errors } = await mutate({ + mutation: leaveGroupMutation(), + variables: { + ...variables, + userId: 'admin-member-user', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + }) + }) + + describe('UpdateGroup', () => { + beforeAll(async () => { + await seedBasicsAndClearAuthentication() + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + slug: 'my-best-group', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + let noMemberUser + + beforeAll(async () => { + noMemberUser = await Factory.build( + 'user', + { + id: 'none-member-user', + name: 'None Member TestUser', + }, + { + email: 'none-member-user@example.org', + password: '1234', + }, + ) + usualMemberUser = await Factory.build( + 'user', + { + id: 'usual-member-user', + name: 'Usual Member TestUser', + }, + { + email: 'usual-member-user@example.org', + password: '1234', + }, + ) + authenticatedUser = await noMemberUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'others-group', + name: 'Uninteresting Group', + about: 'We will change nothing!', + description: 'We love it like it is!?' + descriptionAdditional100, + groupType: 'closed', + actionRadius: 'global', + categoryIds, + }, + }) + authenticatedUser = await user.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'my-group', + name: 'The Best Group', + about: 'We will change the world!', + description: 'Some description' + descriptionAdditional100, + groupType: 'public', + actionRadius: 'regional', + categoryIds, + locationName: 'Berlin, Germany', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'my-group', + userId: 'usual-member-user', + roleInGroup: 'usual', + }, + }) + }) + + describe('change group settings', () => { + describe('as owner', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('all standard settings – excluding location', () => { + it('has updated the settings', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + name: 'The New Group For Our Country', + about: 'We will change the land!', + description: 'Some country relevant description' + descriptionAdditional100, + actionRadius: 'national', + // avatar, // test this as result + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + name: 'The New Group For Our Country', + slug: 'the-best-group', // changing the slug is tested in the slugifyMiddleware + about: 'We will change the land!', + description: 'Some country relevant description' + descriptionAdditional100, + descriptionExcerpt: + 'Some country relevant description' + descriptionAdditional100, + actionRadius: 'national', + // avatar, // test this as result + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('location', () => { + describe('"locationName" is undefined – shall not change location', () => { + it('has left locaton unchanged as "Berlin"', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + locationName: 'Berlin, Germany', + location: expect.objectContaining({ + name: 'Berlin', + nameDE: 'Berlin', + nameEN: 'Berlin', + }), + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('"locationName" is null – shall change location "Berlin" to unset location', () => { + it('has updated the location to unset location', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + locationName: null, + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + locationName: null, + location: null, + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('change unset location to "Paris"', () => { + it('has updated the location to "Paris"', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + locationName: 'Paris, France', + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + locationName: 'Paris, France', + location: expect.objectContaining({ + name: 'Paris', + nameDE: 'Paris', + nameEN: 'Paris', + }), + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('change location "Paris" to "Hamburg"', () => { + it('has updated the location to "Hamburg"', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + locationName: 'Hamburg, Germany', + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + locationName: 'Hamburg, Germany', + location: expect.objectContaining({ + name: 'Hamburg', + nameDE: 'Hamburg', + nameEN: 'Hamburg', + }), + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('"locationName" is empty string – shall change location "Hamburg" to unset location ', () => { + it('has updated the location to unset', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + locationName: '', // empty string '' sets it to null + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + locationName: null, + location: null, + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('description', () => { + describe('length without HTML', () => { + describe('less then 100 chars', () => { + it('throws error: "Description too short!"', async () => { + const { errors } = await mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + description: + '0123456789' + + '0123456789', + }, + }) + expect(errors![0]).toHaveProperty('message', 'Description too short!') + }) + }) + }) + }) + + describe('categories', () => { + beforeEach(async () => { + CONFIG.CATEGORIES_ACTIVE = true + }) + + describe('with matching amount of categories', () => { + it('has new categories', async () => { + await expect( + mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + categoryIds: ['cat4', 'cat27'], + }, + }), + ).resolves.toMatchObject({ + data: { + UpdateGroup: { + id: 'my-group', + categories: expect.arrayContaining([ + expect.objectContaining({ id: 'cat4' }), + expect.objectContaining({ id: 'cat27' }), + ]), + myRole: 'owner', + }, + }, + errors: undefined, + }) + }) + }) + + describe('not even one', () => { + describe('by "categoryIds: []"', () => { + it('throws error: "Too view categories!"', async () => { + const { errors } = await mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + categoryIds: [], + }, + }) + expect(errors![0]).toHaveProperty('message', 'Too view categories!') + }) + }) + }) + + describe('four', () => { + it('throws error: "Too many categories!"', async () => { + const { errors } = await mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + categoryIds: ['cat9', 'cat4', 'cat15', 'cat27'], + }, + }) + expect(errors![0]).toHaveProperty('message', 'Too many categories!') + }) + }) + }) + }) + + describe('as "usual-member-user" member, no(!) owner', () => { + it('throws authorization error', async () => { + authenticatedUser = await usualMemberUser.toJson() + const { errors } = await mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + name: 'The New Group For Our Country', + about: 'We will change the land!', + description: 'Some country relevant description' + descriptionAdditional100, + actionRadius: 'national', + categoryIds: ['cat4', 'cat27'], + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('as "none-member-user"', () => { + it('throws authorization error', async () => { + authenticatedUser = await noMemberUser.toJson() + const { errors } = await mutate({ + mutation: updateGroupMutation(), + variables: { + id: 'my-group', + name: 'The New Group For Our Country', + about: 'We will change the land!', + description: 'Some country relevant description' + descriptionAdditional100, + actionRadius: 'national', + categoryIds: ['cat4', 'cat27'], + }, + }) + expect(errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + }) + }) + }) + + describe('RemoveUserFromGroup', () => { + beforeAll(async () => { + await seedComplexScenarioAndClearAuthentication() + }) + + afterAll(async () => { + await cleanDatabase() + }) + + describe('unauthenticated', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'usual-member-user', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ]), + }) + }) + }) + + describe('authenticated', () => { + describe('as usual member', () => { + it('throws an error', async () => { + authenticatedUser = await usualMemberUser.toJson() + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'admin-member-user', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ]), + }) + }) + }) + + describe('as owner', () => { + beforeEach(async () => { + authenticatedUser = await ownerMemberUser.toJson() + }) + + it('removes the user from the group', async () => { + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'usual-member-user', + }, + }), + ).resolves.toMatchObject({ + data: { + RemoveUserFromGroup: expect.objectContaining({ + id: 'usual-member-user', + myRoleInGroup: null, + }), + }, + errors: undefined, + }) + }) + + it('cannot remove self', async () => { + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'owner-member-user', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ]), + }) + }) + }) + + describe('as admin', () => { + beforeEach(async () => { + authenticatedUser = await adminMemberUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'usual-member-user', + roleInGroup: 'usual', + }, + }) + }) + + it('throws an error', async () => { + authenticatedUser = await usualMemberUser.toJson() + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'admin-member-user', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ]), + }) + }) + + /* + it('removes the user from the group', async () => { + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'usual-member-user', + }, + }), + ).resolves.toMatchObject({ + data: { + RemoveUserFromGroup: expect.objectContaining({ + id: 'usual-member-user', + myRoleInGroup: null, + }), + }, + errors: undefined, + }) + }) + + it('cannot remove self', async () => { + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'admin-member-user', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ]), + }) + }) + + it('cannot remove owner', async () => { + await expect( + mutate({ + mutation: removeUserFromGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'owner-member-user', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ]), + }) + }) + */ + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/groups.ts b/docs/backend/src/schema/resolvers/groups.ts new file mode 100644 index 000000000..cd1eb8db3 --- /dev/null +++ b/docs/backend/src/schema/resolvers/groups.ts @@ -0,0 +1,407 @@ +import { v4 as uuid } from 'uuid' +import { UserInputError } from 'apollo-server' +import CONFIG from '../../config' +import { CATEGORIES_MIN, CATEGORIES_MAX } from '../../constants/categories' +import { DESCRIPTION_WITHOUT_HTML_LENGTH_MIN } from '../../constants/groups' +import { removeHtmlTags } from '../../middleware/helpers/cleanHtml' +import Resolver, { + removeUndefinedNullValuesFromObject, + convertObjectToCypherMapLiteral, +} from './helpers/Resolver' +import { mergeImage } from './images/images' +import { createOrUpdateLocations } from './users/location' + +export default { + Query: { + Group: async (_object, params, context, _resolveInfo) => { + const { isMember, id, slug, first, offset } = params + let pagination = '' + const orderBy = 'ORDER BY group.createdAt DESC' + if (first !== undefined && offset !== undefined) pagination = `SKIP ${offset} LIMIT ${first}` + const matchParams = { id, slug } + removeUndefinedNullValuesFromObject(matchParams) + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (txc) => { + const groupMatchParamsCypher = convertObjectToCypherMapLiteral(matchParams, true) + let groupCypher + if (isMember === true) { + groupCypher = ` + MATCH (:User {id: $userId})-[membership:MEMBER_OF]->(group:Group${groupMatchParamsCypher}) + WITH group, membership + WHERE (group.groupType IN ['public', 'closed']) OR (group.groupType = 'hidden' AND membership.role IN ['usual', 'admin', 'owner']) + RETURN group {.*, myRole: membership.role} + ${orderBy} + ${pagination} + ` + } else { + if (isMember === false) { + groupCypher = ` + MATCH (group:Group${groupMatchParamsCypher}) + WHERE (NOT (:User {id: $userId})-[:MEMBER_OF]->(group)) + WITH group + WHERE group.groupType IN ['public', 'closed'] + RETURN group {.*, myRole: NULL} + ${orderBy} + ${pagination} + ` + } else { + groupCypher = ` + MATCH (group:Group${groupMatchParamsCypher}) + OPTIONAL MATCH (:User {id: $userId})-[membership:MEMBER_OF]->(group) + WITH group, membership + WHERE (group.groupType IN ['public', 'closed']) OR (group.groupType = 'hidden' AND membership.role IN ['usual', 'admin', 'owner']) + RETURN group {.*, myRole: membership.role} + ${orderBy} + ${pagination} + ` + } + } + const transactionResponse = await txc.run(groupCypher, { + userId: context.user.id, + }) + return transactionResponse.records.map((record) => record.get('group')) + }) + try { + return await readTxResultPromise + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + GroupMembers: async (_object, params, context, _resolveInfo) => { + const { id: groupId } = params + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (txc) => { + const groupMemberCypher = ` + MATCH (user:User)-[membership:MEMBER_OF]->(:Group {id: $groupId}) + RETURN user {.*, myRoleInGroup: membership.role} + ` + const transactionResponse = await txc.run(groupMemberCypher, { + groupId, + }) + return transactionResponse.records.map((record) => record.get('user')) + }) + try { + return await readTxResultPromise + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + GroupCount: async (_object, params, context, _resolveInfo) => { + const { isMember } = params + const { + user: { id: userId }, + } = context + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (txc) => { + let cypher + if (isMember) { + cypher = `MATCH (user:User)-[membership:MEMBER_OF]->(group:Group) + WHERE user.id = $userId + AND membership.role IN ['usual', 'admin', 'owner', 'pending'] + RETURN toString(count(group)) AS count` + } else { + cypher = `MATCH (group:Group) + OPTIONAL MATCH (user:User)-[membership:MEMBER_OF]->(group) + WHERE user.id = $userId + WITH group, membership + WHERE group.groupType IN ['public', 'closed'] + OR membership.role IN ['usual', 'admin', 'owner'] + RETURN toString(count(group)) AS count` + } + const transactionResponse = await txc.run(cypher, { userId }) + return transactionResponse.records.map((record) => record.get('count')) + }) + try { + return parseInt(await readTxResultPromise) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + }, + Mutation: { + CreateGroup: async (_parent, params, context, _resolveInfo) => { + const { categoryIds } = params + delete params.categoryIds + params.locationName = params.locationName === '' ? null : params.locationName + if (CONFIG.CATEGORIES_ACTIVE && (!categoryIds || categoryIds.length < CATEGORIES_MIN)) { + throw new UserInputError('Too view categories!') + } + if (CONFIG.CATEGORIES_ACTIVE && categoryIds && categoryIds.length > CATEGORIES_MAX) { + throw new UserInputError('Too many categories!') + } + if ( + params.description === undefined || + params.description === null || + removeHtmlTags(params.description).length < DESCRIPTION_WITHOUT_HTML_LENGTH_MIN + ) { + throw new UserInputError('Description too short!') + } + params.id = params.id || uuid() + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const categoriesCypher = + CONFIG.CATEGORIES_ACTIVE && categoryIds + ? ` + WITH group, membership + UNWIND $categoryIds AS categoryId + MATCH (category:Category {id: categoryId}) + MERGE (group)-[:CATEGORIZED]->(category) + ` + : '' + const ownerCreateGroupTransactionResponse = await transaction.run( + ` + CREATE (group:Group) + SET group += $params + SET group.createdAt = toString(datetime()) + SET group.updatedAt = toString(datetime()) + WITH group + MATCH (owner:User {id: $userId}) + MERGE (owner)-[:CREATED]->(group) + MERGE (owner)-[membership:MEMBER_OF]->(group) + SET + membership.createdAt = toString(datetime()), + membership.updatedAt = null, + membership.role = 'owner' + ${categoriesCypher} + RETURN group {.*, myRole: membership.role} + `, + { userId: context.user.id, categoryIds, params }, + ) + const [group] = await ownerCreateGroupTransactionResponse.records.map((record) => + record.get('group'), + ) + return group + }) + try { + const group = await writeTxResultPromise + // TODO: put in a middleware, see "UpdateGroup", "UpdateUser" + await createOrUpdateLocations('Group', params.id, params.locationName, session) + return group + } catch (error) { + if (error.code === 'Neo.ClientError.Schema.ConstraintValidationFailed') + throw new UserInputError('Group with this slug already exists!') + throw new Error(error) + } finally { + session.close() + } + }, + UpdateGroup: async (_parent, params, context, _resolveInfo) => { + const { categoryIds } = params + delete params.categoryIds + const { id: groupId, avatar: avatarInput } = params + delete params.avatar + params.locationName = params.locationName === '' ? null : params.locationName + + if (CONFIG.CATEGORIES_ACTIVE && categoryIds) { + if (categoryIds.length < CATEGORIES_MIN) { + throw new UserInputError('Too view categories!') + } + if (categoryIds.length > CATEGORIES_MAX) { + throw new UserInputError('Too many categories!') + } + } + if ( + params.description && + removeHtmlTags(params.description).length < DESCRIPTION_WITHOUT_HTML_LENGTH_MIN + ) { + throw new UserInputError('Description too short!') + } + const session = context.driver.session() + if (CONFIG.CATEGORIES_ACTIVE && categoryIds && categoryIds.length) { + const cypherDeletePreviousRelations = ` + MATCH (group:Group {id: $groupId})-[previousRelations:CATEGORIZED]->(category:Category) + DELETE previousRelations + RETURN group, category + ` + await session.writeTransaction((transaction) => { + return transaction.run(cypherDeletePreviousRelations, { groupId }) + }) + } + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + let updateGroupCypher = ` + MATCH (group:Group {id: $groupId}) + SET group += $params + SET group.updatedAt = toString(datetime()) + WITH group + ` + if (CONFIG.CATEGORIES_ACTIVE && categoryIds && categoryIds.length) { + updateGroupCypher += ` + UNWIND $categoryIds AS categoryId + MATCH (category:Category {id: categoryId}) + MERGE (group)-[:CATEGORIZED]->(category) + WITH group + ` + } + updateGroupCypher += ` + OPTIONAL MATCH (:User {id: $userId})-[membership:MEMBER_OF]->(group) + RETURN group {.*, myRole: membership.role} + ` + const transactionResponse = await transaction.run(updateGroupCypher, { + groupId, + userId: context.user.id, + categoryIds, + params, + }) + const [group] = await transactionResponse.records.map((record) => record.get('group')) + if (avatarInput) { + await mergeImage(group, 'AVATAR_IMAGE', avatarInput, { transaction }) + } + return group + }) + try { + const group = await writeTxResultPromise + // TODO: put in a middleware, see "CreateGroup", "UpdateUser" + await createOrUpdateLocations('Group', params.id, params.locationName, session) + return group + } catch (error) { + if (error.code === 'Neo.ClientError.Schema.ConstraintValidationFailed') + throw new UserInputError('Group with this slug already exists!') + throw new Error(error) + } finally { + session.close() + } + }, + JoinGroup: async (_parent, params, context, _resolveInfo) => { + const { groupId, userId } = params + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const joinGroupCypher = ` + MATCH (member:User {id: $userId}), (group:Group {id: $groupId}) + MERGE (member)-[membership:MEMBER_OF]->(group) + ON CREATE SET + membership.createdAt = toString(datetime()), + membership.updatedAt = null, + membership.role = + CASE WHEN group.groupType = 'public' + THEN 'usual' + ELSE 'pending' + END + RETURN member {.*, myRoleInGroup: membership.role} + ` + const transactionResponse = await transaction.run(joinGroupCypher, { groupId, userId }) + const [member] = await transactionResponse.records.map((record) => record.get('member')) + return member + }) + try { + return await writeTxResultPromise + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + LeaveGroup: async (_parent, params, context, _resolveInfo) => { + const { groupId, userId } = params + const session = context.driver.session() + try { + return await removeUserFromGroupWriteTxResultPromise(session, groupId, userId) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + ChangeGroupMemberRole: async (_parent, params, context, _resolveInfo) => { + const { groupId, userId, roleInGroup } = params + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + let postRestrictionCypher = '' + if (['usual', 'admin', 'owner'].includes(roleInGroup)) { + postRestrictionCypher = ` + WITH group, member, membership + FOREACH (restriction IN [(member)-[r:CANNOT_SEE]->(:Post)-[:IN]->(group) | r] | + DELETE restriction)` + } else { + postRestrictionCypher = ` + WITH group, member, membership + FOREACH (post IN [(p:Post)-[:IN]->(group) | p] | + MERGE (member)-[:CANNOT_SEE]->(post))` + } + + const joinGroupCypher = ` + MATCH (member:User {id: $userId}) + MATCH (group:Group {id: $groupId}) + MERGE (member)-[membership:MEMBER_OF]->(group) + ON CREATE SET + membership.createdAt = toString(datetime()), + membership.updatedAt = null, + membership.role = $roleInGroup + ON MATCH SET + membership.updatedAt = toString(datetime()), + membership.role = $roleInGroup + ${postRestrictionCypher} + RETURN member {.*, myRoleInGroup: membership.role} + ` + + const transactionResponse = await transaction.run(joinGroupCypher, { + groupId, + userId, + roleInGroup, + }) + const [member] = await transactionResponse.records.map((record) => record.get('member')) + return member + }) + try { + return await writeTxResultPromise + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + RemoveUserFromGroup: async (_parent, params, context, _resolveInfo) => { + const { groupId, userId } = params + const session = context.driver.session() + try { + return await removeUserFromGroupWriteTxResultPromise(session, groupId, userId) + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + }, + Group: { + ...Resolver('Group', { + undefinedToNull: ['deleted', 'disabled', 'locationName', 'about'], + hasMany: { + categories: '-[:CATEGORIZED]->(related:Category)', + posts: '<-[:IN]-(related:Post)', + }, + hasOne: { + avatar: '-[:AVATAR_IMAGE]->(related:Image)', + location: '-[:IS_IN]->(related:Location)', + }, + }), + }, +} + +const removeUserFromGroupWriteTxResultPromise = async (session, groupId, userId) => { + return session.writeTransaction(async (transaction) => { + const removeUserFromGroupCypher = ` + MATCH (user:User {id: $userId})-[membership:MEMBER_OF]->(group:Group {id: $groupId}) + DELETE membership + WITH user, group + OPTIONAL MATCH (author:User)-[:WROTE]->(p:Post)-[:IN]->(group) + WHERE NOT group.groupType = 'public' + AND NOT author.id = $userId + WITH user, collect(p) AS posts + FOREACH (post IN posts | + MERGE (user)-[:CANNOT_SEE]->(post)) + RETURN user {.*, myRoleInGroup: NULL} + ` + + const transactionResponse = await transaction.run(removeUserFromGroupCypher, { + groupId, + userId, + }) + const [user] = await transactionResponse.records.map((record) => record.get('user')) + return user + }) +} diff --git a/docs/backend/src/schema/resolvers/helpers/Resolver.ts b/docs/backend/src/schema/resolvers/helpers/Resolver.ts new file mode 100644 index 000000000..58d1512d7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/Resolver.ts @@ -0,0 +1,145 @@ +import log from './databaseLogger' + +export const undefinedToNullResolver = (list) => { + const resolvers = {} + list.forEach((key) => { + resolvers[key] = async (parent) => { + return typeof parent[key] === 'undefined' ? null : parent[key] + } + }) + return resolvers +} + +export default function Resolver(type, options: any = {}) { + const { + idAttribute = 'id', + undefinedToNull = [], + boolean = {}, + count = {}, + hasOne = {}, + hasMany = {}, + } = options + + const _hasResolver = (resolvers, { key, connection }, { returnType }) => { + return async (parent, params, { driver, cypherParams }, resolveInfo) => { + if (typeof parent[key] !== 'undefined') return parent[key] + const id = parent[idAttribute] + const session = driver.session() + 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')) + }) + try { + let response = await readTxResultPromise + if (returnType === 'object') response = response[0] || null + return response + } finally { + session.close() + } + } + } + + const booleanResolver = (obj: any[]) => { + 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 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)) + return response + }) + try { + return await readTxResultPromise + } finally { + session.close() + } + } + } + return resolvers + } + + 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 id = parent[idAttribute] + const cypher = ` + MATCH(u:${type} {${idAttribute}: $id})${connection} + RETURN COUNT(DISTINCT(related)) as count + ` + const result = await txc.run(cypher, { id, cypherParams }) + log(result) + const [response] = result.records.map((r) => r.get('count').toNumber()) + return response + }) + try { + return await readTxResultPromise + } finally { + session.close() + } + } + } + return resolvers + } + + const hasManyResolver = (obj) => { + const resolvers = {} + for (const [key, connection] of Object.entries(obj)) { + resolvers[key] = _hasResolver(resolvers, { key, connection }, { returnType: 'iterable' }) + } + return resolvers + } + + const hasOneResolver = (obj) => { + const resolvers = {} + for (const [key, connection] of Object.entries(obj)) { + resolvers[key] = _hasResolver(resolvers, { key, connection }, { returnType: 'object' }) + } + return resolvers + } + + const result = { + ...undefinedToNullResolver(undefinedToNull), + ...booleanResolver(boolean), + ...countResolver(count), + ...hasOneResolver(hasOne), + ...hasManyResolver(hasMany), + } + return result +} + +export const removeUndefinedNullValuesFromObject = (obj) => { + Object.keys(obj).forEach((key) => { + if ([undefined, null].includes(obj[key])) { + delete obj[key] + } + }) +} + +export const convertObjectToCypherMapLiteral = (params, addSpaceInfrontIfMapIsNotEmpty = false) => { + // I have found no other way yet. maybe "apoc.convert.fromJsonMap(key)" can help, but couldn't get it how, see: https://stackoverflow.com/questions/43217823/neo4j-cypher-inline-conversion-of-string-to-a-map + // result looks like: '{id: "g0", slug: "yoga"}' + const paramsEntries = Object.entries(params) + let mapLiteral = '' + paramsEntries.forEach((ele, index) => { + mapLiteral += index === 0 ? '{' : '' + mapLiteral += `${ele[0]}: "${ele[1]}"` + mapLiteral += index < paramsEntries.length - 1 ? ', ' : '}' + }) + mapLiteral = (addSpaceInfrontIfMapIsNotEmpty && mapLiteral.length > 0 ? ' ' : '') + mapLiteral + return mapLiteral +} diff --git a/docs/backend/src/schema/resolvers/helpers/createPasswordReset.ts b/docs/backend/src/schema/resolvers/helpers/createPasswordReset.ts new file mode 100644 index 000000000..ec0349c18 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/createPasswordReset.ts @@ -0,0 +1,34 @@ +import normalizeEmail from './normalizeEmail' + +export default async function createPasswordReset(options) { + const { driver, nonce, email, issuedAt = new Date() } = options + const normalizedEmail = normalizeEmail(email) + const session = driver.session() + try { + const createPasswordResetTxPromise = session.writeTransaction(async (transaction) => { + const createPasswordResetTransactionResponse = await transaction.run( + ` + MATCH (user:User)-[:PRIMARY_EMAIL]->(email:EmailAddress {email:$email}) + CREATE(passwordReset:PasswordReset {nonce: $nonce, issuedAt: datetime($issuedAt), usedAt: NULL}) + MERGE (user)-[:REQUESTED]->(passwordReset) + RETURN email, passwordReset, user + `, + { + issuedAt: issuedAt.toISOString(), + nonce, + email: normalizedEmail, + }, + ) + return createPasswordResetTransactionResponse.records.map((record) => { + const { email } = record.get('email').properties + const { nonce } = record.get('passwordReset').properties + const { name } = record.get('user').properties + return { email, nonce, name } + }) + }) + const [records] = await createPasswordResetTxPromise + return records || {} + } finally { + session.close() + } +} diff --git a/docs/backend/src/schema/resolvers/helpers/databaseLogger.ts b/docs/backend/src/schema/resolvers/helpers/databaseLogger.ts new file mode 100644 index 000000000..fac1a5c4a --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/databaseLogger.ts @@ -0,0 +1,15 @@ +import Debug from 'debug' +const debugCypher = Debug('human-connection:neo4j:cypher') +const debugStats = Debug('human-connection:neo4j:stats') + +export default function log(response) { + const { counters, resultConsumedAfter, resultAvailableAfter, query } = response.summary + const { text, parameters } = query + debugCypher('%s', text) + debugCypher('%o', parameters) + debugStats('%o', counters) + debugStats('%o', { + resultConsumedAfter: resultConsumedAfter.toNumber(), + resultAvailableAfter: resultAvailableAfter.toNumber(), + }) +} diff --git a/docs/backend/src/schema/resolvers/helpers/events.ts b/docs/backend/src/schema/resolvers/helpers/events.ts new file mode 100644 index 000000000..835088d8c --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/events.ts @@ -0,0 +1,50 @@ +import { UserInputError } from 'apollo-server' + +export const validateEventParams = (params) => { + let locationName = null + if (params.postType && params.postType === 'Event') { + const { eventInput } = params + validateEventDate(eventInput.eventStart) + params.eventStart = eventInput.eventStart + + if (eventInput.eventEnd) { + validateEventEnd(eventInput.eventStart, eventInput.eventEnd) + params.eventEnd = eventInput.eventEnd + } else { + params.eventEnd = null + } + + if (eventInput.eventLocationName && !eventInput.eventVenue) { + throw new UserInputError('Event venue must be present if event location is given!') + } + params.eventVenue = eventInput.eventVenue + params.eventLocationName = eventInput.eventLocationName && eventInput.eventLocationName.trim() + if (params.eventLocationName) { + locationName = params.eventLocationName + } else { + params.eventLocationName = null + } + params.eventIsOnline = !!eventInput.eventIsOnline + } + delete params.eventInput + return locationName +} + +const validateEventDate = (dateString) => { + const date = new Date(dateString) + if (date.toString() === 'Invalid Date') + throw new UserInputError('Event start date must be a valid date!') + const now = new Date() + if (date.getTime() < now.getTime()) { + throw new UserInputError('Event start date must be in the future!') + } +} + +const validateEventEnd = (start, end) => { + const endDate = new Date(end) + if (endDate.toString() === 'Invalid Date') + throw new UserInputError('Event end date must be a valid date!') + const startDate = new Date(start) + if (endDate < startDate) + throw new UserInputError('Event end date must be a after event start date!') +} diff --git a/docs/backend/src/schema/resolvers/helpers/existingEmailAddress.ts b/docs/backend/src/schema/resolvers/helpers/existingEmailAddress.ts new file mode 100644 index 000000000..288a14a6d --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/existingEmailAddress.ts @@ -0,0 +1,29 @@ +export default async function alreadyExistingMail({ args, context }) { + const session = context.driver.session() + try { + const existingEmailAddressTxPromise = session.writeTransaction(async (transaction) => { + const existingEmailAddressTransactionResponse = await transaction.run( + ` + MATCH (email:EmailAddress {email: $email}) + OPTIONAL MATCH (email)-[:BELONGS_TO]-(user) + RETURN email, user + `, + { email: args.email }, + ) + return existingEmailAddressTransactionResponse.records.map((record) => { + return { + alreadyExistingEmail: record.get('email').properties, + user: record.get('user') && record.get('user').properties, + } + }) + }) + const [emailBelongsToUser] = await existingEmailAddressTxPromise + /* + const { alreadyExistingEmail, user } = + if (user) throw new UserInputError('A user account with this email already exists.') + */ + return emailBelongsToUser || {} + } finally { + session.close() + } +} diff --git a/docs/backend/src/schema/resolvers/helpers/filterForMutedUsers.ts b/docs/backend/src/schema/resolvers/helpers/filterForMutedUsers.ts new file mode 100644 index 000000000..1d1369e0d --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/filterForMutedUsers.ts @@ -0,0 +1,22 @@ +import { getMutedUsers } from '../users' +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)] + if (!mutedUsersIds.length) return params + + params.filter = mergeWith( + params.filter, + { + author_not: { id_in: mutedUsersIds }, + }, + (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue) + } + }, + ) + return params +} diff --git a/docs/backend/src/schema/resolvers/helpers/filterInvisiblePosts.ts b/docs/backend/src/schema/resolvers/helpers/filterInvisiblePosts.ts new file mode 100644 index 000000000..73dfaad91 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/filterInvisiblePosts.ts @@ -0,0 +1,47 @@ +import { mergeWith, isArray } from 'lodash' + +const getInvisiblePosts = async (context) => { + const session = context.driver.session() + const readTxResultPromise = await session.readTransaction(async (transaction) => { + let cypher = '' + const { user } = context + if (user && user.id) { + cypher = ` + MATCH (post:Post)<-[:CANNOT_SEE]-(user:User { id: $userId }) + RETURN collect(post.id) AS invisiblePostIds` + } else { + cypher = ` + MATCH (post:Post)-[:IN]->(group:Group) + WHERE NOT group.groupType = 'public' + RETURN collect(post.id) AS invisiblePostIds` + } + const invisiblePostIdsResponse = await transaction.run(cypher, { + userId: user ? user.id : null, + }) + return invisiblePostIdsResponse.records.map((record) => record.get('invisiblePostIds')) + }) + try { + const [invisiblePostIds] = readTxResultPromise + return invisiblePostIds + } finally { + session.close() + } +} + +export const filterInvisiblePosts = async (params, context) => { + const invisiblePostIds = await getInvisiblePosts(context) + if (!invisiblePostIds.length) return params + + params.filter = mergeWith( + params.filter, + { + id_not_in: invisiblePostIds, + }, + (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue) + } + }, + ) + return params +} diff --git a/docs/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.ts b/docs/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.ts new file mode 100644 index 000000000..a808a5582 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.ts @@ -0,0 +1,40 @@ +import { mergeWith, isArray } from 'lodash' + +const getMyGroupIds = async (context) => { + const { user } = context + if (!(user && user.id)) return [] + const session = context.driver.session() + + const readTxResultPromise = await session.readTransaction(async (transaction) => { + const cypher = ` + MATCH (group:Group)<-[membership:MEMBER_OF]-(:User { id: $userId }) + WHERE membership.role IN ['usual', 'admin', 'owner'] + RETURN collect(group.id) AS myGroupIds` + const getMyGroupIdsResponse = await transaction.run(cypher, { userId: user.id }) + return getMyGroupIdsResponse.records.map((record) => record.get('myGroupIds')) + }) + try { + const [myGroupIds] = readTxResultPromise + return myGroupIds + } finally { + session.close() + } +} + +export const filterPostsOfMyGroups = async (params, context) => { + if (!(params.filter && params.filter.postsInMyGroups)) return params + delete params.filter.postsInMyGroups + const myGroupIds = await getMyGroupIds(context) + params.filter = mergeWith( + params.filter, + { + group: { id_in: myGroupIds }, + }, + (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue) + } + }, + ) + return params +} diff --git a/docs/backend/src/schema/resolvers/helpers/generateInviteCode.ts b/docs/backend/src/schema/resolvers/helpers/generateInviteCode.ts new file mode 100644 index 000000000..5a123ff88 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/generateInviteCode.ts @@ -0,0 +1,13 @@ +import CONSTANTS_REGISTRATION from './../../../constants/registration' + +export default function generateInviteCode() { + // 6 random numbers in [ 0, 35 ] are 36 possible numbers (10 [0-9] + 26 [A-Z]) + return Array.from( + { length: CONSTANTS_REGISTRATION.INVITE_CODE_LENGTH }, + (n: number = Math.floor(Math.random() * 36)) => { + // n > 9: it is a letter (ASCII 65 is A) -> 10 + 55 = 65 + // else: it is a number (ASCII 48 is 0) -> 0 + 48 = 48 + return String.fromCharCode(n > 9 ? n + 55 : n + 48) + }, + ).join('') +} diff --git a/docs/backend/src/schema/resolvers/helpers/generateNonce.ts b/docs/backend/src/schema/resolvers/helpers/generateNonce.ts new file mode 100644 index 000000000..f08b3ccd6 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/generateNonce.ts @@ -0,0 +1,11 @@ +import CONSTANTS_REGISTRATION from './../../../constants/registration' + +// TODO: why this is not used in resolver 'requestPasswordReset'? +export default function generateNonce() { + return Array.from( + { length: CONSTANTS_REGISTRATION.NONCE_LENGTH }, + (n: number = Math.floor(Math.random() * 10)) => { + return String.fromCharCode(n + 48) + }, + ).join('') +} diff --git a/docs/backend/src/schema/resolvers/helpers/normalizeEmail.ts b/docs/backend/src/schema/resolvers/helpers/normalizeEmail.ts new file mode 100644 index 000000000..bc13467c3 --- /dev/null +++ b/docs/backend/src/schema/resolvers/helpers/normalizeEmail.ts @@ -0,0 +1,11 @@ +import { normalizeEmail } from 'validator' + +export default (email) => + normalizeEmail(email, { + // gmail_remove_dots: true, default + gmail_remove_subaddress: false, + // gmail_convert_googlemaildotcom: true, default + outlookdotcom_remove_subaddress: false, + yahoo_remove_subaddress: false, + icloud_remove_subaddress: false, + }) diff --git a/docs/backend/src/schema/resolvers/images.ts b/docs/backend/src/schema/resolvers/images.ts new file mode 100644 index 000000000..111f84888 --- /dev/null +++ b/docs/backend/src/schema/resolvers/images.ts @@ -0,0 +1,8 @@ +import Resolver from './helpers/Resolver' +export default { + Image: { + ...Resolver('Image', { + undefinedToNull: ['sensitive', 'alt', 'aspectRatio', 'type'], + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/images/images.spec.ts b/docs/backend/src/schema/resolvers/images/images.spec.ts new file mode 100644 index 000000000..d46972ce0 --- /dev/null +++ b/docs/backend/src/schema/resolvers/images/images.spec.ts @@ -0,0 +1,356 @@ +import { deleteImage, mergeImage } from './images' +import { getNeode, getDriver } from '../../../db/neo4j' +import Factory, { cleanDatabase } from '../../../db/factories' +import { UserInputError } from 'apollo-server' + +const driver = getDriver() +const neode = getNeode() +const uuid = '[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}' +let uploadCallback +let deleteCallback + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + uploadCallback = jest.fn(({ uniqueFilename }) => `/uploads/${uniqueFilename}`) + deleteCallback = jest.fn() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('deleteImage', () => { + describe('given a resource with an image', () => { + let user + beforeEach(async () => { + user = await Factory.build( + 'user', + {}, + { + avatar: Factory.build('image', { + url: '/some/avatar/url/', + alt: 'This is the avatar image of a user', + }), + }, + ) + user = await user.toJson() + }) + + it('soft deletes `Image` node', async () => { + await expect(neode.all('Image')).resolves.toHaveLength(1) + await deleteImage(user, 'AVATAR_IMAGE', { deleteCallback }) + await expect(neode.all('Image')).resolves.toHaveLength(0) + }) + + it('calls deleteCallback', async () => { + user = await Factory.build('user') + user = await user.toJson() + await deleteImage(user, 'AVATAR_IMAGE', { deleteCallback }) + expect(deleteCallback).toHaveBeenCalled() + }) + + describe('given a transaction parameter', () => { + it('executes cypher statements within the transaction', async () => { + const session = driver.session() + let someString + try { + 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')) + return result + }) + } finally { + session.close() + } + await expect(neode.all('Image')).resolves.toHaveLength(0) + await expect(someString).toEqual('Hello') + }) + + it('rolls back the transaction in case of errors', async () => { + await expect(neode.all('Image')).resolves.toHaveLength(1) + const session = driver.session() + try { + await session.writeTransaction(async (transaction) => { + await deleteImage(user, 'AVATAR_IMAGE', { + deleteCallback, + transaction, + }) + throw new Error('Ouch!') + }) + } catch (err) { + // nothing has been deleted + await expect(neode.all('Image')).resolves.toHaveLength(1) + // all good + } finally { + session.close() + } + }) + }) + }) +}) + +describe('mergeImage', () => { + let imageInput + let post + beforeEach(() => { + imageInput = { + alt: 'A description of the new image', + } + }) + + 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 () => { + await expect( + mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }), + ).resolves.toMatchObject({ + url: expect.any(String), + alt: 'A description of the new image', + }) + }) + + it('calls upload callback', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + expect(uploadCallback).toHaveBeenCalled() + }) + + it('creates `:Image` node', async () => { + await expect(neode.all('Image')).resolves.toHaveLength(0) + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + await expect(neode.all('Image')).resolves.toHaveLength(1) + }) + + it('creates a url safe name', async () => { + imageInput.upload.filename = '/path/to/awkward?/ file-location/?foo- bar-avatar.jpg' + await expect( + mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }), + ).resolves.toMatchObject({ + url: expect.stringMatching(new RegExp(`^/uploads/${uuid}-foo-bar-avatar.jpg`)), + }) + }) + + // eslint-disable-next-line jest/no-disabled-tests + it.skip('automatically creates different image sizes', async () => { + await expect( + mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }), + ).resolves.toEqual({ + url: expect.any(String), + alt: expect.any(String), + urlW34: expect.stringMatching(new RegExp(`^/uploads/W34/${uuid}-image.jpg`)), + urlW160: expect.stringMatching(new RegExp(`^/uploads/W160/${uuid}-image.jpg`)), + urlW320: expect.stringMatching(new RegExp(`^/uploads/W320/${uuid}-image.jpg`)), + urlW640: expect.stringMatching(new RegExp(`^/uploads/W640/${uuid}-image.jpg`)), + urlW1024: expect.stringMatching(new RegExp(`^/uploads/W1024/${uuid}-image.jpg`)), + }) + }) + + it('connects resource with image via given image type', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + const result = await neode.cypher(` + MATCH(p:Post {id: "p99"})-[:HERO_IMAGE]->(i:Image) RETURN i,p + `) + post = neode.hydrateFirst(result, 'p', neode.model('Post')) + const image = neode.hydrateFirst(result, 'i', neode.model('Image')) + expect(post).toBeTruthy() + expect(image).toBeTruthy() + }) + + it('whitelists relationship types', async () => { + await expect( + mergeImage(post, 'WHATEVER', imageInput, { uploadCallback, deleteCallback }), + ).rejects.toEqual(new Error('Unknown relationship type WHATEVER')) + }) + + it('sets metadata', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + const image = await neode.first('Image', {}) + await expect(image.toJson()).resolves.toMatchObject({ + alt: 'A description of the new image', + createdAt: expect.any(String), + url: expect.any(String), + }) + }) + + describe('given a transaction parameter', () => { + it('executes cypher statements within the transaction', async () => { + const session = driver.session() + try { + await session.writeTransaction(async (transaction) => { + const image = await mergeImage(post, 'HERO_IMAGE', imageInput, { + uploadCallback, + deleteCallback, + transaction, + }) + return transaction.run( + ` + MATCH(image:Image {url: $image.url}) + SET image.alt = 'This alt text gets overwritten' + RETURN image {.*} + `, + { image }, + ) + }) + } finally { + session.close() + } + const image = await neode.first('Image', { alt: 'This alt text gets overwritten' }) + await expect(image.toJson()).resolves.toMatchObject({ + alt: 'This alt text gets overwritten', + }) + }) + + it('rolls back the transaction in case of errors', async () => { + const session = driver.session() + try { + await session.writeTransaction(async (transaction) => { + const image = await mergeImage(post, 'HERO_IMAGE', imageInput, { + uploadCallback, + deleteCallback, + transaction, + }) + return transaction.run('Ooops invalid cypher!', { image }) + }) + } catch (err) { + // nothing has been created + await expect(neode.all('Image')).resolves.toHaveLength(0) + // all good + } finally { + session.close() + } + }) + }) + + describe('if resource has an image already', () => { + beforeEach(async () => { + const [post, image] = await Promise.all([ + neode.find('Post', 'p99'), + Factory.build('image'), + ]) + await post.relateTo(image, 'image') + }) + + it('calls deleteCallback', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + expect(deleteCallback).toHaveBeenCalled() + }) + + it('calls uploadCallback', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + expect(uploadCallback).toHaveBeenCalled() + }) + + it('updates metadata of existing image node', async () => { + await expect(neode.all('Image')).resolves.toHaveLength(1) + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + await expect(neode.all('Image')).resolves.toHaveLength(1) + const image = await neode.first('Image', {}) + await expect(image.toJson()).resolves.toMatchObject({ + alt: 'A description of the new image', + createdAt: expect.any(String), + url: expect.any(String), + // TODO + // width: + // height: + }) + }) + }) + }) + }) + + describe('without image.upload', () => { + it('throws UserInputError', async () => { + post = await Factory.build('post', { id: 'p99' }, { image: null }) + post = await post.toJson() + await expect(mergeImage(post, 'HERO_IMAGE', imageInput)).rejects.toEqual( + new UserInputError('Cannot find image for given resource'), + ) + }) + + describe('if resource has an image already', () => { + beforeEach(async () => { + post = await Factory.build( + 'post', + { + id: 'p99', + }, + { + author: Factory.build( + 'user', + {}, + { + avatar: null, + }, + ), + image: Factory.build('image', { + alt: 'This is the previous, not updated image', + url: '/some/original/url', + }), + }, + ) + post = await post.toJson() + }) + + it('does not call deleteCallback', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + expect(deleteCallback).not.toHaveBeenCalled() + }) + + it('does not call uploadCallback', async () => { + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) + expect(uploadCallback).not.toHaveBeenCalled() + }) + + it('updates metadata', async () => { + 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({ + createdAt: expect.any(String), + url: expect.any(String), + alt: 'A description of the new image', + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/images/images.ts b/docs/backend/src/schema/resolvers/images/images.ts new file mode 100644 index 000000000..b99b13a10 --- /dev/null +++ b/docs/backend/src/schema/resolvers/images/images.ts @@ -0,0 +1,154 @@ +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 { UserInputError } from 'apollo-server' +import { getDriver } from '../../../db/neo4j' +import CONFIG from '../../../config' + +// const widths = [34, 160, 320, 640, 1024] +const { AWS_ENDPOINT: endpoint, AWS_REGION: region, AWS_BUCKET: Bucket, S3_CONFIGURED } = CONFIG + +export async function deleteImage(resource, relationshipType, opts: any = {}) { + sanitizeRelationshipType(relationshipType) + const { transaction, deleteCallback } = opts + if (!transaction) return wrapTransaction(deleteImage, [resource, relationshipType], opts) + const txResult = await transaction.run( + ` + MATCH (resource {id: $resource.id})-[rel:${relationshipType}]->(image:Image) + WITH image, image {.*} as imageProps + DETACH DELETE image + RETURN imageProps + `, + { resource }, + ) + 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 + // could very well be that there is no image for the resource. + if (image) deleteImageFile(image, deleteCallback) + return image +} + +export async function mergeImage(resource, relationshipType, imageInput, opts: any = {}) { + if (typeof imageInput === 'undefined') return + if (imageInput === null) return deleteImage(resource, relationshipType, opts) + sanitizeRelationshipType(relationshipType) + const { transaction, uploadCallback, deleteCallback } = opts + if (!transaction) + return wrapTransaction(mergeImage, [resource, relationshipType, imageInput], opts) + + let txResult + txResult = await transaction.run( + ` + MATCH (resource {id: $resource.id})-[:${relationshipType}]->(image:Image) + RETURN image {.*} + `, + { resource }, + ) + 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) + const url = await uploadImageFile(upload, uploadCallback) + const { alt, sensitive, aspectRatio, type } = imageInput + const image = { alt, sensitive, aspectRatio, url, type } + txResult = await transaction.run( + ` + MATCH (resource {id: $resource.id}) + MERGE (resource)-[:${relationshipType}]->(image:Image) + ON CREATE SET image.createdAt = toString(datetime()) + ON MATCH SET image.updatedAt = toString(datetime()) + SET image += $image + RETURN image {.*} + `, + { resource, 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) => { + return wrappedCallback(...args, { ...opts, transaction }) + }) + return result + } finally { + session.close() + } +} + +const deleteImageFile = (image, deleteCallback) => { + if (!deleteCallback) { + deleteCallback = S3_CONFIGURED ? s3Delete : localFileDelete + } + const { url } = image + deleteCallback(url) + return url +} + +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, uniqueFilename, mimetype }) +} + +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)) { + throw new Error(`Unknown relationship type ${relationshipType}`) + } +} + +const localFileUpload = ({ createReadStream, uniqueFilename }) => { + const destination = `/uploads/${uniqueFilename}` + return new Promise((resolve, reject) => + createReadStream().pipe( + createWriteStream(`public${destination}`) + .on('finish', () => resolve(destination)) + .on('error', (error) => reject(error)), + ), + ) +} + +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/docs/backend/src/schema/resolvers/index.ts b/docs/backend/src/schema/resolvers/index.ts new file mode 100644 index 000000000..1aeadbea2 --- /dev/null +++ b/docs/backend/src/schema/resolvers/index.ts @@ -0,0 +1,6 @@ +import path from 'path' +import { fileLoader, mergeResolvers } from 'merge-graphql-schemas' + +// the files must be correctly evaluated in built and dev state - therefore accept both js & ts files +const resolversArray = fileLoader(path.join(__dirname, './!(*.spec).(ts|js)')) +export default mergeResolvers(resolversArray) diff --git a/docs/backend/src/schema/resolvers/inviteCodes.spec.ts b/docs/backend/src/schema/resolvers/inviteCodes.spec.ts new file mode 100644 index 000000000..1df791ba6 --- /dev/null +++ b/docs/backend/src/schema/resolvers/inviteCodes.spec.ts @@ -0,0 +1,209 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import { getDriver } from '../../db/neo4j' +import gql from 'graphql-tag' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' +import CONSTANTS_REGISTRATION from './../../constants/registration' + +let user +let query +let mutate + +const driver = getDriver() + +const generateInviteCodeMutation = gql` + mutation ($expiresAt: String = null) { + GenerateInviteCode(expiresAt: $expiresAt) { + code + createdAt + expiresAt + } + } +` +const myInviteCodesQuery = gql` + query { + MyInviteCodes { + code + createdAt + expiresAt + } + } +` +const isValidInviteCodeQuery = gql` + query ($code: ID!) { + isValidInviteCode(code: $code) + } +` + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + user, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('inviteCodes', () => { + describe('as unauthenticated user', () => { + it('cannot generate invite codes', async () => { + await expect(mutate({ mutation: generateInviteCodeMutation })).resolves.toEqual( + expect.objectContaining({ + errors: expect.arrayContaining([ + expect.objectContaining({ + extensions: { code: 'INTERNAL_SERVER_ERROR' }, + }), + ]), + data: { + GenerateInviteCode: null, + }, + }), + ) + }) + + it('cannot query invite codes', async () => { + await expect(query({ query: myInviteCodesQuery })).resolves.toEqual( + expect.objectContaining({ + errors: expect.arrayContaining([ + expect.objectContaining({ + extensions: { code: 'INTERNAL_SERVER_ERROR' }, + }), + ]), + data: { + MyInviteCodes: null, + }, + }), + ) + }) + }) + + describe('as authenticated user', () => { + beforeAll(async () => { + const authenticatedUser = await Factory.build( + 'user', + { + role: 'user', + }, + { + email: 'user@example.org', + password: '1234', + }, + ) + user = await authenticatedUser.toJson() + }) + + it('generates an invite code without expiresAt', async () => { + await expect(mutate({ mutation: generateInviteCodeMutation })).resolves.toEqual( + expect.objectContaining({ + errors: undefined, + data: { + GenerateInviteCode: { + code: expect.stringMatching( + new RegExp( + `^[0-9A-Z]{${CONSTANTS_REGISTRATION.INVITE_CODE_LENGTH},${CONSTANTS_REGISTRATION.INVITE_CODE_LENGTH}}$`, + ), + ), + expiresAt: null, + createdAt: expect.any(String), + }, + }, + }), + ) + }) + + it('generates an invite code with expiresAt', async () => { + const nextWeek = new Date() + nextWeek.setDate(nextWeek.getDate() + 7) + await expect( + mutate({ + mutation: generateInviteCodeMutation, + variables: { expiresAt: nextWeek.toISOString() }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: undefined, + data: { + GenerateInviteCode: { + code: expect.stringMatching( + new RegExp( + `^[0-9A-Z]{${CONSTANTS_REGISTRATION.INVITE_CODE_LENGTH},${CONSTANTS_REGISTRATION.INVITE_CODE_LENGTH}}$`, + ), + ), + expiresAt: nextWeek.toISOString(), + createdAt: expect.any(String), + }, + }, + }), + ) + }) + + let inviteCodes + + it('returns the created invite codes when queried', async () => { + const response = await query({ query: myInviteCodesQuery }) + inviteCodes = response.data.MyInviteCodes + expect(inviteCodes).toHaveLength(2) + }) + + it('does not return the created invite codes of other users when queried', async () => { + await Factory.build('inviteCode') + const response = await query({ query: myInviteCodesQuery }) + inviteCodes = response.data.MyInviteCodes + expect(inviteCodes).toHaveLength(2) + }) + + it('validates an invite code without expiresAt', async () => { + const unExpiringInviteCode = inviteCodes.filter((ic) => ic.expiresAt === null)[0].code + const result = await query({ + query: isValidInviteCodeQuery, + variables: { code: unExpiringInviteCode }, + }) + expect(result.data.isValidInviteCode).toBeTruthy() + }) + + it('validates an invite code in lower case', async () => { + const unExpiringInviteCode = inviteCodes.filter((ic) => ic.expiresAt === null)[0].code + const result = await query({ + query: isValidInviteCodeQuery, + variables: { code: unExpiringInviteCode.toLowerCase() }, + }) + expect(result.data.isValidInviteCode).toBeTruthy() + }) + + it('validates an invite code with expiresAt in the future', async () => { + const expiringInviteCode = inviteCodes.filter((ic) => ic.expiresAt !== null)[0].code + const result = await query({ + query: isValidInviteCodeQuery, + variables: { code: expiringInviteCode }, + }) + expect(result.data.isValidInviteCode).toBeTruthy() + }) + + it('does not validate an invite code which expired in the past', async () => { + const lastWeek = new Date() + lastWeek.setDate(lastWeek.getDate() - 7) + const inviteCode = await Factory.build('inviteCode', { + expiresAt: lastWeek.toISOString(), + }) + const code = inviteCode.get('code') + const result = await query({ query: isValidInviteCodeQuery, variables: { code } }) + expect(result.data.isValidInviteCode).toBeFalsy() + }) + + it('does not validate an invite code which does not exits', async () => { + const result = await query({ query: isValidInviteCodeQuery, variables: { code: 'AAA' } }) + expect(result.data.isValidInviteCode).toBeFalsy() + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/inviteCodes.ts b/docs/backend/src/schema/resolvers/inviteCodes.ts new file mode 100644 index 000000000..442ff17b1 --- /dev/null +++ b/docs/backend/src/schema/resolvers/inviteCodes.ts @@ -0,0 +1,137 @@ +import generateInviteCode from './helpers/generateInviteCode' +import Resolver from './helpers/Resolver' +import { validateInviteCode } from './transactions/inviteCodes' + +const uniqueInviteCode = async (session, code) => { + return session.readTransaction(async (txc) => { + const result = await txc.run(`MATCH (ic:InviteCode { id: $code }) RETURN count(ic) AS count`, { + code, + }) + return parseInt(String(result.records[0].get('count'))) === 0 + }) +} + +export default { + Query: { + getInviteCode: async (_parent, args, context, _resolveInfo) => { + const { + user: { id: userId }, + } = context + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (txc) => { + const result = await txc.run( + `MATCH (user:User {id: $userId})-[:GENERATED]->(ic:InviteCode) + WHERE ic.expiresAt IS NULL + OR datetime(ic.expiresAt) >= datetime() + RETURN properties(ic) AS inviteCodes`, + { + userId, + }, + ) + return result.records.map((record) => record.get('inviteCodes')) + }) + try { + const inviteCode = await readTxResultPromise + if (inviteCode && inviteCode.length > 0) return inviteCode[0] + let code = generateInviteCode() + while (!(await uniqueInviteCode(session, code))) { + code = generateInviteCode() + } + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const result = await txc.run( + `MATCH (user:User {id: $userId}) + MERGE (user)-[:GENERATED]->(ic:InviteCode { code: $code }) + ON CREATE SET + ic.createdAt = toString(datetime()), + ic.expiresAt = $expiresAt + RETURN ic AS inviteCode`, + { + userId, + code, + expiresAt: null, + }, + ) + return result.records.map((record) => record.get('inviteCode').properties) + }) + const txResult = await writeTxResultPromise + return txResult[0] + } finally { + session.close() + } + }, + MyInviteCodes: async (_parent, args, context, _resolveInfo) => { + const { + user: { id: userId }, + } = context + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (txc) => { + const result = await txc.run( + `MATCH (user:User {id: $userId})-[:GENERATED]->(ic:InviteCode) + RETURN properties(ic) AS inviteCodes`, + { + userId, + }, + ) + return result.records.map((record) => record.get('inviteCodes')) + }) + try { + const txResult = await readTxResultPromise + return txResult + } finally { + session.close() + } + }, + isValidInviteCode: async (_parent, args, context, _resolveInfo) => { + const { code } = args + const session = context.driver.session() + if (!code) return false + return validateInviteCode(session, code) + }, + }, + Mutation: { + GenerateInviteCode: async (_parent, args, context, _resolveInfo) => { + const { + user: { id: userId }, + } = context + const session = context.driver.session() + let code = generateInviteCode() + while (!(await uniqueInviteCode(session, code))) { + code = generateInviteCode() + } + const writeTxResultPromise = session.writeTransaction(async (txc) => { + const result = await txc.run( + `MATCH (user:User {id: $userId}) + MERGE (user)-[:GENERATED]->(ic:InviteCode { code: $code }) + ON CREATE SET + ic.createdAt = toString(datetime()), + ic.expiresAt = $expiresAt + RETURN ic AS inviteCode`, + { + userId, + code, + expiresAt: args.expiresAt, + }, + ) + return result.records.map((record) => record.get('inviteCode').properties) + }) + try { + const txResult = await writeTxResultPromise + return txResult[0] + } finally { + session.close() + } + }, + }, + InviteCode: { + ...Resolver('InviteCode', { + idAttribute: 'code', + undefinedToNull: ['expiresAt'], + hasOne: { + generatedBy: '<-[:GENERATED]-(related:User)', + }, + hasMany: { + redeemedBy: '<-[:REDEEMED]-(related:User)', + }, + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/locations.spec.ts b/docs/backend/src/schema/resolvers/locations.spec.ts new file mode 100644 index 000000000..82aebd441 --- /dev/null +++ b/docs/backend/src/schema/resolvers/locations.spec.ts @@ -0,0 +1,91 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +let mutate, authenticatedUser + +const driver = getDriver() +const neode = getNeode() + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('resolvers', () => { + describe('Location', () => { + describe('custom mutation, not handled by neo4j-graphql-js', () => { + let variables + const updateUserMutation = gql` + mutation ($id: ID!, $name: String) { + UpdateUser(id: $id, name: $name) { + name + location { + name: nameRU + nameEN + } + } + } + ` + + beforeEach(async () => { + variables = { + id: 'u47', + name: 'John Doughnut', + } + const Paris = await Factory.build('location', { + id: 'region.9397217726497330', + name: 'Paris', + type: 'region', + lng: 2.35183, + lat: 48.85658, + nameEN: 'Paris', + }) + + const user = await Factory.build('user', { + id: 'u47', + name: 'John Doe', + }) + await user.relateTo(Paris, 'isIn') + authenticatedUser = await user.toJson() + }) + + it('returns `null` if location translation is not available', async () => { + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject({ + data: { + UpdateUser: { + name: 'John Doughnut', + location: { + name: null, + nameEN: 'Paris', + }, + }, + }, + errors: undefined, + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/locations.ts b/docs/backend/src/schema/resolvers/locations.ts new file mode 100644 index 000000000..fa0feafa1 --- /dev/null +++ b/docs/backend/src/schema/resolvers/locations.ts @@ -0,0 +1,30 @@ +import { UserInputError } from 'apollo-server' +import Resolver from './helpers/Resolver' +import { queryLocations } from './users/location' + +export default { + Location: { + ...Resolver('Location', { + undefinedToNull: [ + 'nameEN', + 'nameDE', + 'nameFR', + 'nameNL', + 'nameIT', + 'nameES', + 'namePT', + 'namePL', + 'nameRU', + ], + }), + }, + Query: { + queryLocations: async (object, args, context, resolveInfo) => { + try { + return queryLocations(args) + } catch (e) { + throw new UserInputError(e.message) + } + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/messages.spec.ts b/docs/backend/src/schema/resolvers/messages.spec.ts new file mode 100644 index 000000000..83d9fdc6b --- /dev/null +++ b/docs/backend/src/schema/resolvers/messages.spec.ts @@ -0,0 +1,553 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import { getNeode, getDriver } from '../../db/neo4j' +import { createRoomMutation, roomQuery } from '../../graphql/rooms' +import { createMessageMutation, messageQuery, markMessagesAsSeen } from '../../graphql/messages' +import createServer, { pubsub } from '../../server' + +const driver = getDriver() +const neode = getNeode() + +const pubsubSpy = jest.spyOn(pubsub, 'publish') + +let query +let mutate +let authenticatedUser +let chattingUser, otherChattingUser, notChattingUser + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + cypherParams: { + currentUserId: authenticatedUser ? authenticatedUser.id : null, + }, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('Message', () => { + let roomId: string + + beforeAll(async () => { + ;[chattingUser, otherChattingUser, notChattingUser] = await Promise.all([ + Factory.build('user', { + id: 'chatting-user', + name: 'Chatting User', + }), + Factory.build('user', { + id: 'other-chatting-user', + name: 'Other Chatting User', + }), + Factory.build('user', { + id: 'not-chatting-user', + name: 'Not Chatting User', + }), + ]) + }) + + describe('create message', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId: 'some-id', + content: 'Some bla bla bla', + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + authenticatedUser = await chattingUser.toJson() + }) + + describe('room does not exist', () => { + it('returns null and does not publish subscription', async () => { + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId: 'some-id', + content: 'Some bla bla bla', + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateMessage: null, + }, + }) + expect(pubsubSpy).not.toBeCalled() + }) + }) + + describe('room exists', () => { + beforeAll(async () => { + const room = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'other-chatting-user', + }, + }) + roomId = room.data.CreateRoom.id + }) + + describe('user chats in room', () => { + it('returns the message and publishes subscriptions', async () => { + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: 'Some nice message to other chatting user', + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateMessage: { + id: expect.any(String), + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: false, + seen: false, + }, + }, + }) + expect(pubsubSpy).toBeCalledWith('ROOM_COUNT_UPDATED', { + roomCountUpdated: '1', + userId: 'other-chatting-user', + }) + expect(pubsubSpy).toBeCalledWith('CHAT_MESSAGE_ADDED', { + chatMessageAdded: expect.objectContaining({ + id: expect.any(String), + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: false, + seen: false, + }), + userId: 'other-chatting-user', + }) + }) + + describe('room is updated as well', () => { + it('has last message set', async () => { + const result = await query({ query: roomQuery() }) + await expect(result).toMatchObject({ + errors: undefined, + data: { + Room: [ + expect.objectContaining({ + lastMessageAt: expect.any(String), + unreadCount: 0, + lastMessage: expect.objectContaining({ + _id: result.data.Room[0].lastMessage.id, + id: expect.any(String), + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: false, + seen: false, + }), + }), + ], + }, + }) + }) + }) + + describe('unread count for other user', () => { + it('has unread count = 1', async () => { + authenticatedUser = await otherChattingUser.toJson() + await expect(query({ query: roomQuery() })).resolves.toMatchObject({ + errors: undefined, + data: { + Room: [ + expect.objectContaining({ + lastMessageAt: expect.any(String), + unreadCount: 1, + lastMessage: expect.objectContaining({ + _id: expect.any(String), + id: expect.any(String), + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: false, + seen: false, + }), + }), + ], + }, + }) + }) + }) + }) + + describe('user does not chat in room', () => { + beforeAll(async () => { + authenticatedUser = await notChattingUser.toJson() + }) + + it('returns null', async () => { + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: 'I have no access to this room!', + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateMessage: null, + }, + }) + }) + }) + }) + }) + }) + + describe('message query', () => { + describe('unauthenticated', () => { + beforeAll(() => { + authenticatedUser = null + }) + + it('throws authorization error', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId: 'some-id', + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + authenticatedUser = await otherChattingUser.toJson() + }) + + describe('room does not exists', () => { + it('returns null', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId: 'some-id', + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Message: [], + }, + }) + }) + }) + + describe('room exists with authenticated user chatting', () => { + it('returns the messages', async () => { + const result = await query({ + query: messageQuery(), + variables: { + roomId, + }, + }) + expect(result).toMatchObject({ + errors: undefined, + data: { + Message: [ + { + id: expect.any(String), + _id: result.data.Message[0].id, + indexId: 0, + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: true, + seen: false, + }, + ], + }, + }) + }) + + describe('more messages', () => { + beforeAll(async () => { + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: 'A nice response message to chatting user', + }, + }) + authenticatedUser = await chattingUser.toJson() + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: 'And another nice message to other chatting user', + }, + }) + }) + + it('returns the messages', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Message: [ + expect.objectContaining({ + id: expect.any(String), + indexId: 0, + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: true, + seen: false, + }), + expect.objectContaining({ + id: expect.any(String), + indexId: 1, + content: 'A nice response message to chatting user', + senderId: 'other-chatting-user', + username: 'Other Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: true, + seen: false, + }), + expect.objectContaining({ + id: expect.any(String), + indexId: 2, + content: 'And another nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: false, + seen: false, + }), + ], + }, + }) + }) + + it('returns the messages paginated', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + first: 2, + offset: 0, + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Message: [ + expect.objectContaining({ + id: expect.any(String), + indexId: 1, + content: 'A nice response message to chatting user', + senderId: 'other-chatting-user', + username: 'Other Chatting User', + avatar: expect.any(String), + date: expect.any(String), + }), + expect.objectContaining({ + id: expect.any(String), + indexId: 2, + content: 'And another nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + }), + ], + }, + }) + + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + first: 2, + offset: 2, + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Message: [ + expect.objectContaining({ + id: expect.any(String), + indexId: 0, + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + }), + ], + }, + }) + }) + }) + }) + + describe('room exists, authenticated user not in room', () => { + beforeAll(async () => { + authenticatedUser = await notChattingUser.toJson() + }) + + it('returns null', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Message: [], + }, + }) + }) + }) + }) + }) + + describe('marks massges as seen', () => { + describe('unauthenticated', () => { + beforeAll(() => { + authenticatedUser = null + }) + + it('throws authorization error', async () => { + await expect( + mutate({ + mutation: markMessagesAsSeen(), + variables: { + messageIds: ['some-id'], + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + const messageIds: string[] = [] + beforeAll(async () => { + authenticatedUser = await otherChattingUser.toJson() + const msgs = await query({ + query: messageQuery(), + variables: { + roomId, + }, + }) + msgs.data.Message.forEach((m) => messageIds.push(m.id)) + }) + + it('returns true', async () => { + await expect( + mutate({ + mutation: markMessagesAsSeen(), + variables: { + messageIds, + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + MarkMessagesAsSeen: true, + }, + }) + }) + + it('has seen prop set to true', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + }, + }), + ).resolves.toMatchObject({ + data: { + Message: [ + expect.objectContaining({ seen: true }), + expect.objectContaining({ seen: false }), + expect.objectContaining({ seen: true }), + ], + }, + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/messages.ts b/docs/backend/src/schema/resolvers/messages.ts new file mode 100644 index 000000000..c1381045f --- /dev/null +++ b/docs/backend/src/schema/resolvers/messages.ts @@ -0,0 +1,170 @@ +import { neo4jgraphql } from 'neo4j-graphql-js' +import Resolver from './helpers/Resolver' + +import { getUnreadRoomsCount } from './rooms' +import { pubsub, ROOM_COUNT_UPDATED, CHAT_MESSAGE_ADDED } from '../../server' +import { withFilter } from 'graphql-subscriptions' + +const setMessagesAsDistributed = async (undistributedMessagesIds, session) => { + return session.writeTransaction(async (transaction) => { + const setDistributedCypher = ` + MATCH (m:Message) WHERE m.id IN $undistributedMessagesIds + SET m.distributed = true + RETURN m { .* } + ` + const setDistributedTxResponse = await transaction.run(setDistributedCypher, { + undistributedMessagesIds, + }) + const messages = await setDistributedTxResponse.records.map((record) => record.get('m')) + return messages + }) +} + +export default { + Subscription: { + chatMessageAdded: { + subscribe: withFilter( + () => pubsub.asyncIterator(CHAT_MESSAGE_ADDED), + (payload, variables, context) => { + return payload.userId === context.user?.id + }, + ), + }, + }, + Query: { + Message: async (object, params, context, resolveInfo) => { + const { roomId } = params + delete params.roomId + if (!params.filter) params.filter = {} + params.filter.room = { + id: roomId, + users_some: { + id: context.user.id, + }, + } + + const resolved = await neo4jgraphql(object, params, context, resolveInfo) + + if (resolved) { + const undistributedMessagesIds = resolved + .filter((msg) => !msg.distributed && msg.senderId !== context.user.id) + .map((msg) => msg.id) + const session = context.driver.session() + try { + if (undistributedMessagesIds.length > 0) { + await setMessagesAsDistributed(undistributedMessagesIds, session) + } + } finally { + session.close() + } + // send subscription to author to updated the messages + } + return resolved.reverse() + }, + }, + Mutation: { + CreateMessage: async (_parent, params, context, _resolveInfo) => { + const { roomId, content } = params + const { + user: { id: currentUserId }, + } = context + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const createMessageCypher = ` + MATCH (currentUser:User { id: $currentUserId })-[:CHATS_IN]->(room:Room { id: $roomId }) + OPTIONAL MATCH (currentUser)-[:AVATAR_IMAGE]->(image:Image) + OPTIONAL MATCH (m:Message)-[:INSIDE]->(room) + OPTIONAL MATCH (room)<-[:CHATS_IN]-(recipientUser:User) + WHERE NOT recipientUser.id = $currentUserId + WITH MAX(m.indexId) as maxIndex, room, currentUser, image, recipientUser + CREATE (currentUser)-[:CREATED]->(message:Message { + createdAt: toString(datetime()), + id: apoc.create.uuid(), + indexId: CASE WHEN maxIndex IS NOT NULL THEN maxIndex + 1 ELSE 0 END, + content: LEFT($content,2000), + saved: true, + distributed: false, + seen: false + })-[:INSIDE]->(room) + SET room.lastMessageAt = toString(datetime()) + RETURN message { + .*, + indexId: toString(message.indexId), + recipientId: recipientUser.id, + senderId: currentUser.id, + username: currentUser.name, + avatar: image.url, + date: message.createdAt + } + ` + const createMessageTxResponse = await transaction.run(createMessageCypher, { + currentUserId, + roomId, + content, + }) + + const [message] = await createMessageTxResponse.records.map((record) => + record.get('message'), + ) + + return message + }) + try { + const message = await writeTxResultPromise + if (message) { + const roomCountUpdated = await getUnreadRoomsCount(message.recipientId, session) + + // send subscriptions + void pubsub.publish(ROOM_COUNT_UPDATED, { + roomCountUpdated, + userId: message.recipientId, + }) + void pubsub.publish(CHAT_MESSAGE_ADDED, { + chatMessageAdded: message, + userId: message.recipientId, + }) + } + + return message + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + MarkMessagesAsSeen: async (_parent, params, context, _resolveInfo) => { + const { messageIds } = params + const currentUserId = context.user.id + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const setSeenCypher = ` + MATCH (m:Message)<-[:CREATED]-(user:User) + WHERE m.id IN $messageIds AND NOT user.id = $currentUserId + SET m.seen = true + RETURN m { .* } + ` + const setSeenTxResponse = await transaction.run(setSeenCypher, { + messageIds, + currentUserId, + }) + const messages = await setSeenTxResponse.records.map((record) => record.get('m')) + return messages + }) + try { + await writeTxResultPromise + // send subscription to author to updated the messages + return true + } finally { + session.close() + } + }, + }, + Message: { + ...Resolver('Message', { + hasOne: { + author: '<-[:CREATED]-(related:User)', + room: '-[:INSIDE]->(related:Room)', + }, + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/moderation.spec.ts b/docs/backend/src/schema/resolvers/moderation.spec.ts new file mode 100644 index 000000000..1665e9446 --- /dev/null +++ b/docs/backend/src/schema/resolvers/moderation.spec.ts @@ -0,0 +1,716 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +const neode = getNeode() +const driver = getDriver() + +let mutate, + authenticatedUser, + disableVariables, + enableVariables, + moderator, + nonModerator, + closeReportVariables + +const reviewMutation = gql` + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + review(resourceId: $resourceId, disable: $disable, closed: $closed) { + createdAt + updatedAt + resource { + __typename + ... on User { + id + disabled + } + ... on Post { + id + disabled + } + ... on Comment { + id + disabled + } + } + report { + id + createdAt + updatedAt + closed + reviewed { + createdAt + moderator { + id + } + } + } + } + } +` + +describe('moderate resources', () => { + beforeAll(async () => { + await cleanDatabase() + + authenticatedUser = undefined + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + }) + + afterAll(async () => { + await cleanDatabase() + driver.close() + }) + + beforeEach(async () => { + disableVariables = { + resourceId: 'undefined-resource', + disable: true, + closed: false, + } + enableVariables = { + resourceId: 'undefined-resource', + disable: false, + closed: false, + } + authenticatedUser = null + moderator = await Factory.build( + 'user', + { + id: 'moderator-id', + name: 'Moderator', + role: 'moderator', + }, + { + email: 'moderator@example.org', + password: '1234', + }, + ) + nonModerator = await Factory.build( + 'user', + { + id: 'non-moderator', + name: 'Non Moderator', + }, + { + email: 'non.moderator@example.org', + password: '1234', + }, + ) + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('review to close report, leaving resource enabled', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await nonModerator.toJson() + }) + + it('non-moderator receives an authorization error', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + const questionablePost = await Factory.build('post', { + id: 'should-i-be-disabled', + }) + const reportAgainstQuestionablePost = await Factory.build('report') + await Promise.all([ + reportAgainstQuestionablePost.relateTo(nonModerator, 'filed', { + resourceId: 'should-i-be-disabled', + reasonCategory: 'doxing', + reasonDescription: "This shouldn't be shown to anybody else! It's my private thing!", + }), + reportAgainstQuestionablePost.relateTo(questionablePost, 'belongsTo'), + ]) + closeReportVariables = { + resourceId: 'should-i-be-disabled', + disable: false, + closed: true, + } + }) + + it('report can be closed without disabling resource', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: closeReportVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Post', id: 'should-i-be-disabled', disabled: false }, + report: { id: expect.any(String), closed: true }, + }, + }, + errors: undefined, + }) + }) + + it('creates only one review for multiple reviews by the same moderator on same resource', async () => { + await Promise.all([ + mutate({ + mutation: reviewMutation, + variables: { ...disableVariables, resourceId: 'should-i-be-disabled' }, + }), + mutate({ + mutation: reviewMutation, + variables: { ...enableVariables, resourceId: 'should-i-be-disabled' }, + }), + ]) + const cypher = + 'MATCH (:Report)<-[review:REVIEWED]-(moderator:User {id: "moderator-id"}) RETURN review' + const reviews = await neode.cypher(cypher) + expect(reviews.records).toHaveLength(1) + }) + + it('updates the updatedAt attribute', async () => { + const [firstReview, secondReview] = await Promise.all([ + mutate({ + mutation: reviewMutation, + variables: { ...disableVariables, resourceId: 'should-i-be-disabled' }, + }), + mutate({ + mutation: reviewMutation, + variables: { ...enableVariables, resourceId: 'should-i-be-disabled' }, + }), + ]) + expect(firstReview.data.review.updatedAt).toBeTruthy() + expect(Date.parse(firstReview.data.review.updatedAt)).toEqual(expect.any(Number)) + expect(secondReview.data.review.updatedAt).toBeTruthy() + expect(Date.parse(secondReview.data.review.updatedAt)).toEqual(expect.any(Number)) + expect(firstReview.data.review.updatedAt).not.toEqual(secondReview.data.review.updatedAt) + }) + }) + }) + + describe('review to disable', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await nonModerator.toJson() + }) + + it('non-moderator receives an authorization error', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + describe('moderate a comment', () => { + beforeEach(async () => { + const trollingComment = await Factory.build('comment', { + id: 'comment-id', + }) + const reportAgainstTrollingComment = await Factory.build('report') + await Promise.all([ + reportAgainstTrollingComment.relateTo(nonModerator, 'filed', { + resourceId: 'comment-id', + reasonCategory: 'other', + reasonDescription: 'This comment is bigoted', + }), + reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo'), + ]) + disableVariables = { + ...disableVariables, + resourceId: 'comment-id', + } + }) + + it('returns disabled resource id', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'Comment', id: 'comment-id' } } }, + errors: undefined, + }) + }) + + it('returns .reviewed', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Comment', id: 'comment-id' }, + report: { + id: expect.any(String), + reviewed: expect.arrayContaining([ + { createdAt: expect.any(String), moderator: { id: 'moderator-id' } }, + ]), + }, + }, + }, + errors: undefined, + }) + }) + + it('updates .disabled on comment', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { + review: { resource: { __typename: 'Comment', id: 'comment-id', disabled: true } }, + }, + errors: undefined, + }) + }) + + it('can be closed with one review', async () => { + closeReportVariables = { + ...disableVariables, + closed: true, + } + await expect( + mutate({ mutation: reviewMutation, variables: closeReportVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Comment', id: 'comment-id' }, + report: { id: expect.any(String), closed: true }, + }, + }, + errors: undefined, + }) + }) + }) + + describe('moderate a post', () => { + beforeEach(async () => { + const trollingPost = await Factory.build('post', { + id: 'post-id', + }) + const reportAgainstTrollingPost = await Factory.build('report') + await Promise.all([ + reportAgainstTrollingPost.relateTo(nonModerator, 'filed', { + resourceId: 'post-id', + reasonCategory: 'doxing', + reasonDescription: "This shouldn't be shown to anybody else! It's my private thing!", + }), + reportAgainstTrollingPost.relateTo(trollingPost, 'belongsTo'), + ]) + disableVariables = { + ...disableVariables, + resourceId: 'post-id', + } + }) + + it('returns disabled resource id', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Post', id: 'post-id' }, + }, + }, + errors: undefined, + }) + }) + + it('returns .reviewed', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Post', id: 'post-id' }, + report: { + id: expect.any(String), + reviewed: expect.arrayContaining([ + { createdAt: expect.any(String), moderator: { id: 'moderator-id' } }, + ]), + }, + }, + }, + errors: undefined, + }) + }) + + it('updates .disabled on post', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'Post', id: 'post-id', disabled: true } } }, + errors: undefined, + }) + }) + + it('can be closed with one review', async () => { + closeReportVariables = { + ...disableVariables, + closed: true, + } + await expect( + mutate({ mutation: reviewMutation, variables: closeReportVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Post', id: 'post-id' }, + report: { id: expect.any(String), closed: true }, + }, + }, + errors: undefined, + }) + }) + }) + + describe('moderate a user', () => { + beforeEach(async () => { + const troll = await Factory.build('user', { + id: 'user-id', + }) + const reportAgainstTroll = await Factory.build('report') + await Promise.all([ + reportAgainstTroll.relateTo(nonModerator, 'filed', { + resourceId: 'user-id', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This user is harassing me with bigoted remarks!', + }), + reportAgainstTroll.relateTo(troll, 'belongsTo'), + ]) + disableVariables = { + ...disableVariables, + resourceId: 'user-id', + } + }) + + it('returns disabled resource id', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'User', id: 'user-id' } } }, + errors: undefined, + }) + }) + + it('returns .reviewed', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'User', id: 'user-id' }, + report: { + id: expect.any(String), + reviewed: expect.arrayContaining([ + { createdAt: expect.any(String), moderator: { id: 'moderator-id' } }, + ]), + }, + }, + }, + errors: undefined, + }) + }) + + it('updates .disabled on user', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: disableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'User', id: 'user-id', disabled: true } } }, + errors: undefined, + }) + }) + + it('can be closed with one review', async () => { + closeReportVariables = { + ...disableVariables, + closed: true, + } + await expect( + mutate({ mutation: reviewMutation, variables: closeReportVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'User', id: 'user-id' }, + report: { id: expect.any(String), closed: true }, + }, + }, + errors: undefined, + }) + }) + }) + }) + }) + + describe('review to re-enable after disabled', () => { + describe('unautenticated user', () => { + it('throws authorization error', async () => { + enableVariables = { + ...enableVariables, + resourceId: 'post-id', + } + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated user', () => { + describe('non moderator', () => { + beforeEach(async () => { + authenticatedUser = await nonModerator.toJson() + }) + + it('throws authorization error', async () => { + enableVariables = { + ...enableVariables, + resourceId: 'post-id', + } + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + describe('moderate a comment', () => { + beforeEach(async () => { + const trollingComment = await Factory.build('comment', { + id: 'comment-id', + }) + const reportAgainstTrollingComment = await Factory.build('report') + await Promise.all([ + reportAgainstTrollingComment.relateTo(nonModerator, 'filed', { + resourceId: 'comment-id', + reasonCategory: 'other', + reasonDescription: 'This comment is bigoted', + }), + reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo'), + ]) + await Promise.all([ + reportAgainstTrollingComment.relateTo(moderator, 'reviewed', { + ...disableVariables, + resourceId: 'comment-id', + }), + trollingComment.update({ disabled: true, updatedAt: new Date().toISOString() }), + ]) + enableVariables = { + ...enableVariables, + resourceId: 'comment-id', + } + }) + + it('returns enabled resource id', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'Comment', id: 'comment-id' } } }, + }) + }) + + it('returns .reviewed', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Comment', id: 'comment-id' }, + report: { + id: expect.any(String), + reviewed: expect.arrayContaining([ + { createdAt: expect.any(String), moderator: { id: 'moderator-id' } }, + ]), + }, + }, + }, + }) + }) + + it('updates .disabled on comment', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { + review: { resource: { __typename: 'Comment', id: 'comment-id', disabled: false } }, + }, + }) + }) + }) + + describe('moderate a post', () => { + beforeEach(async () => { + const trollingPost = await Factory.build('post', { + id: 'post-id', + }) + const reportAgainstTrollingPost = await Factory.build('report') + await Promise.all([ + reportAgainstTrollingPost.relateTo(nonModerator, 'filed', { + resourceId: 'post-id', + reasonCategory: 'doxing', + reasonDescription: + "This shouldn't be shown to anybody else! It's my private thing!", + }), + reportAgainstTrollingPost.relateTo(trollingPost, 'belongsTo'), + ]) + await Promise.all([ + reportAgainstTrollingPost.relateTo(moderator, 'reviewed', { + ...disableVariables, + resourceId: 'comment-id', + }), + trollingPost.update({ disabled: true, updatedAt: new Date().toISOString() }), + ]) + enableVariables = { + ...enableVariables, + resourceId: 'post-id', + } + }) + + it('returns enabled resource id', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'Post', id: 'post-id' } } }, + }) + }) + + it('returns .reviewed', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'Post', id: 'post-id' }, + report: { + id: expect.any(String), + reviewed: expect.arrayContaining([ + { createdAt: expect.any(String), moderator: { id: 'moderator-id' } }, + ]), + }, + }, + }, + }) + }) + + it('updates .disabled on post', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { + review: { resource: { __typename: 'Post', id: 'post-id', disabled: false } }, + }, + }) + }) + }) + + describe('moderate a user', () => { + beforeEach(async () => { + const troll = await Factory.build('user', { + id: 'user-id', + }) + const reportAgainstTroll = await Factory.build('report') + await Promise.all([ + reportAgainstTroll.relateTo(nonModerator, 'filed', { + resourceId: 'user-id', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This user is harassing me with bigoted remarks!', + }), + reportAgainstTroll.relateTo(troll, 'belongsTo'), + ]) + await Promise.all([ + reportAgainstTroll.relateTo(moderator, 'reviewed', { + ...disableVariables, + resourceId: 'comment-id', + }), + troll.update({ disabled: true, updatedAt: new Date().toISOString() }), + ]) + enableVariables = { + ...enableVariables, + resourceId: 'user-id', + } + }) + + it('returns enabled resource id', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { review: { resource: { __typename: 'User', id: 'user-id' } } }, + }) + }) + + it('returns .reviewed', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { + review: { + resource: { __typename: 'User', id: 'user-id' }, + report: { + id: expect.any(String), + reviewed: expect.arrayContaining([ + { createdAt: expect.any(String), moderator: { id: 'moderator-id' } }, + ]), + }, + }, + }, + }) + }) + + it('updates .disabled on user', async () => { + await expect( + mutate({ mutation: reviewMutation, variables: enableVariables }), + ).resolves.toMatchObject({ + data: { + review: { resource: { __typename: 'User', id: 'user-id', disabled: false } }, + }, + }) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/moderation.ts b/docs/backend/src/schema/resolvers/moderation.ts new file mode 100644 index 000000000..a29a411aa --- /dev/null +++ b/docs/backend/src/schema/resolvers/moderation.ts @@ -0,0 +1,40 @@ +import log from './helpers/databaseLogger' + +export default { + Mutation: { + review: async (_object, params, context, _resolveInfo) => { + const { user: moderator, driver } = context + + const session = driver.session() + try { + const cypher = ` + MATCH (moderator:User {id: $moderatorId}) + MATCH (resource {id: $params.resourceId})<-[:BELONGS_TO]-(report:Report {closed: false}) + WHERE resource:User OR resource:Post OR resource:Comment + MERGE (report)<-[review:REVIEWED]-(moderator) + ON CREATE SET review.createdAt = $dateTime, review.updatedAt = $dateTime + ON MATCH SET review.updatedAt = $dateTime + SET review.disable = $params.disable + SET report.updatedAt = $dateTime, report.disable = review.disable, report.closed = $params.closed + SET resource.disabled = report.disable + + WITH review, report, resource {.*, __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'User']][0]} AS finalResource + RETURN review {.*, report: properties(report), resource: properties(finalResource)} + ` + 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')) + }) + const [reviewed] = await reviewWriteTxResultPromise + return reviewed || null + } finally { + session.close() + } + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/notifications.spec.ts b/docs/backend/src/schema/resolvers/notifications.spec.ts new file mode 100644 index 000000000..60539d77f --- /dev/null +++ b/docs/backend/src/schema/resolvers/notifications.spec.ts @@ -0,0 +1,419 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getDriver } from '../../db/neo4j' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../.././server' +import { + markAsReadMutation, + markAllAsReadMutation, + notificationQuery, +} from '../../graphql/notifications' + +const driver = getDriver() +let authenticatedUser +let user +let author +let variables +let query +let mutate + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + authenticatedUser = null + variables = { orderBy: 'createdAt_asc' } +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('given some notifications', () => { + beforeEach(async () => { + const categoryIds = ['cat1'] + author = await Factory.build('user', { id: 'author' }) + user = await Factory.build('user', { id: 'you' }) + const [neighbor] = await Promise.all([ + Factory.build('user', { id: 'neighbor' }), + Factory.build('category', { id: 'cat1' }), + ]) + const [post1, post2, post3] = await Promise.all([ + Factory.build('post', { id: 'p1', content: 'Not for you' }, { author, categoryIds }), + Factory.build( + 'post', + { + id: 'p2', + content: 'Already seen post mention', + }, + { + author, + categoryIds, + }, + ), + Factory.build( + 'post', + { + id: 'p3', + content: 'You have been mentioned in a post', + }, + { + author, + categoryIds, + }, + ), + ]) + const [comment1, comment2, comment3] = await Promise.all([ + Factory.build( + 'comment', + { + id: 'c1', + content: 'You have seen this comment mentioning already', + }, + { + author, + postId: 'p3', + }, + ), + Factory.build( + 'comment', + { + id: 'c2', + content: 'You have been mentioned in a comment', + }, + { + author, + postId: 'p3', + }, + ), + Factory.build( + 'comment', + { + id: 'c3', + content: 'Somebody else was mentioned in a comment', + }, + { + author, + postId: 'p3', + }, + ), + ]) + await Promise.all([ + post1.relateTo(neighbor, 'notified', { + createdAt: '2019-08-29T17:33:48.651Z', + read: false, + reason: 'mentioned_in_post', + }), + post2.relateTo(user, 'notified', { + createdAt: '2019-08-30T17:33:48.651Z', + read: true, + reason: 'mentioned_in_post', + }), + post3.relateTo(user, 'notified', { + createdAt: '2019-08-31T17:33:48.651Z', + read: false, + reason: 'mentioned_in_post', + }), + comment1.relateTo(user, 'notified', { + createdAt: '2019-08-30T15:33:48.651Z', + read: true, + reason: 'mentioned_in_comment', + }), + comment2.relateTo(user, 'notified', { + createdAt: '2019-08-30T19:33:48.651Z', + read: false, + reason: 'mentioned_in_comment', + }), + comment3.relateTo(neighbor, 'notified', { + createdAt: '2019-09-01T17:33:48.651Z', + read: false, + reason: 'mentioned_in_comment', + }), + ]) + }) + + describe('notifications', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await query({ query: notificationQuery() }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('no filters', () => { + it('returns all notifications of current user', async () => { + const expected = [ + { + from: { + __typename: 'Comment', + content: 'You have seen this comment mentioning already', + }, + read: true, + createdAt: '2019-08-30T15:33:48.651Z', + }, + { + from: { + __typename: 'Post', + content: 'Already seen post mention', + }, + read: true, + createdAt: '2019-08-30T17:33:48.651Z', + }, + { + from: { + __typename: 'Comment', + content: 'You have been mentioned in a comment', + }, + read: false, + createdAt: '2019-08-30T19:33:48.651Z', + }, + { + from: { + __typename: 'Post', + content: 'You have been mentioned in a post', + }, + read: false, + createdAt: '2019-08-31T17:33:48.651Z', + }, + ] + + await expect(query({ query: notificationQuery(), variables })).resolves.toMatchObject({ + data: { + notifications: expect.arrayContaining(expected), + }, + errors: undefined, + }) + }) + }) + + describe('filter for read: false', () => { + it('returns only unread notifications of current user', async () => { + const expected = expect.objectContaining({ + data: { + notifications: expect.arrayContaining([ + { + from: { + __typename: 'Comment', + content: 'You have been mentioned in a comment', + }, + read: false, + createdAt: '2019-08-30T19:33:48.651Z', + }, + { + from: { + __typename: 'Post', + content: 'You have been mentioned in a post', + }, + read: false, + createdAt: '2019-08-31T17:33:48.651Z', + }, + ]), + }, + }) + const response = await query({ + query: notificationQuery(), + variables: { ...variables, read: false }, + }) + await expect(response).toMatchObject(expected) + await expect(response.data.notifications).toHaveLength(2) // double-check + }) + + describe('if a resource gets deleted', () => { + const deletePostAction = async () => { + authenticatedUser = await author.toJson() + const deletePostMutation = gql` + mutation ($id: ID!) { + DeletePost(id: $id) { + id + deleted + } + } + ` + await expect( + mutate({ mutation: deletePostMutation, variables: { id: 'p3' } }), + ).resolves.toMatchObject({ + data: { DeletePost: { id: 'p3', deleted: true } }, + errors: undefined, + }) + authenticatedUser = await user.toJson() + } + + it('reduces notifications list', async () => { + await expect( + query({ query: notificationQuery(), variables: { ...variables, read: false } }), + ).resolves.toMatchObject({ + data: { notifications: [expect.any(Object), expect.any(Object)] }, + errors: undefined, + }) + await deletePostAction() + await expect( + query({ query: notificationQuery(), variables: { ...variables, read: false } }), + ).resolves.toMatchObject({ data: { notifications: [] }, errors: undefined }) + }) + }) + }) + }) + }) + + describe('markAsRead', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const result = await mutate({ + mutation: markAsReadMutation(), + variables: { ...variables, id: 'p1' }, + }) + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('not being notified at all', () => { + beforeEach(async () => { + variables = { + ...variables, + id: 'p1', + } + }) + + it('returns null', async () => { + const response = await mutate({ mutation: markAsReadMutation(), variables }) + expect(response.data.markAsRead).toEqual(null) + expect(response.errors).toBeUndefined() + }) + }) + + describe('being notified', () => { + describe('on a post', () => { + beforeEach(async () => { + variables = { + ...variables, + id: 'p3', + } + }) + + it('updates `read` attribute and returns NOTIFIED relationship', async () => { + const { data } = await mutate({ mutation: markAsReadMutation(), variables }) + expect(data).toEqual({ + markAsRead: { + from: { + __typename: 'Post', + content: 'You have been mentioned in a post', + }, + read: true, + createdAt: '2019-08-31T17:33:48.651Z', + }, + }) + }) + + describe('but notification was already marked as read', () => { + beforeEach(async () => { + variables = { + ...variables, + id: 'p2', + } + }) + it('returns null', async () => { + const response = await mutate({ mutation: markAsReadMutation(), variables }) + expect(response.data.markAsRead).toEqual(null) + expect(response.errors).toBeUndefined() + }) + }) + }) + + describe('on a comment', () => { + beforeEach(async () => { + variables = { + ...variables, + id: 'c2', + } + }) + + it('updates `read` attribute and returns NOTIFIED relationship', async () => { + const { data } = await mutate({ mutation: markAsReadMutation(), variables }) + expect(data).toEqual({ + markAsRead: { + from: { + __typename: 'Comment', + content: 'You have been mentioned in a comment', + }, + read: true, + createdAt: '2019-08-30T19:33:48.651Z', + }, + }) + }) + }) + }) + }) + }) + + describe('markAllAsRead', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const result = await mutate({ + mutation: markAllAsReadMutation(), + }) + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + describe('not being notified at all', () => { + beforeEach(async () => { + variables = { + ...variables, + } + }) + + it('returns all as read', async () => { + const response = await mutate({ mutation: markAllAsReadMutation(), variables }) + expect(response.data.markAllAsRead).toEqual( + expect.arrayContaining([ + { + createdAt: '2019-08-30T19:33:48.651Z', + from: { __typename: 'Comment', content: 'You have been mentioned in a comment' }, + read: true, + }, + { + createdAt: '2019-08-31T17:33:48.651Z', + from: { __typename: 'Post', content: 'You have been mentioned in a post' }, + read: true, + }, + ]), + ) + expect(response.errors).toBeUndefined() + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/notifications.ts b/docs/backend/src/schema/resolvers/notifications.ts new file mode 100644 index 000000000..6a3e232cc --- /dev/null +++ b/docs/backend/src/schema/resolvers/notifications.ts @@ -0,0 +1,150 @@ +import log from './helpers/databaseLogger' +import { withFilter } from 'graphql-subscriptions' +import { pubsub, NOTIFICATION_ADDED } from '../../server' + +export default { + Subscription: { + notificationAdded: { + subscribe: withFilter( + () => pubsub.asyncIterator(NOTIFICATION_ADDED), + (payload, variables, context) => { + return payload.notificationAdded.to.id === context.user?.id + }, + ), + }, + }, + Query: { + notifications: async (_parent, args, context, _resolveInfo) => { + const { user: currentUser } = context + const session = context.driver.session() + let whereClause, orderByClause + + switch (args.read) { + case true: + whereClause = 'WHERE notification.read = TRUE' + break + case false: + whereClause = 'WHERE notification.read = FALSE' + break + default: + whereClause = '' + } + switch (args.orderBy) { + case 'updatedAt_asc': + orderByClause = 'ORDER BY notification.updatedAt ASC' + break + case 'updatedAt_desc': + orderByClause = 'ORDER BY notification.updatedAt DESC' + break + default: + orderByClause = '' + } + 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 notificationsTransactionResponse = await transaction.run( + ` + MATCH (resource {deleted: false, disabled: false})-[notification:NOTIFIED]->(user:User {id:$id}) + ${whereClause} + OPTIONAL MATCH (relatedUser:User { id: notification.relatedUserId }) + OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(relatedUser) + WITH user, notification, resource, membership, relatedUser, + [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, + [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author), postType: [l IN labels(post) WHERE NOT l = 'Post']} ] AS posts + WITH resource, user, notification, authors, posts, relatedUser, membership, + resource {.*, + __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'Group']][0], + author: authors[0], + post: posts[0], + myRole: membership.role } AS finalResource + RETURN notification {.*, + from: finalResource, + to: properties(user), + relatedUser: properties(relatedUser) + } + ${orderByClause} + ${offset} ${limit} + `, + { id: currentUser.id }, + ) + log(notificationsTransactionResponse) + return notificationsTransactionResponse.records.map((record) => record.get('notification')) + }) + try { + const notifications = await readTxResultPromise + return notifications + } finally { + session.close() + } + }, + }, + Mutation: { + markAsRead: async (parent, args, context, resolveInfo) => { + const { user: currentUser } = context + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const markNotificationAsReadTransactionResponse = await transaction.run( + ` + MATCH (resource {id: $resourceId})-[notification:NOTIFIED {read: FALSE}]->(user:User {id:$id}) + SET notification.read = TRUE + WITH user, notification, resource, + [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, + [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author), postType: [l IN labels(post) WHERE NOT l = 'Post']} ] AS posts + OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user) + WITH resource, user, notification, authors, posts, membership, + resource {.*, __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'Group']][0], author: authors[0], post: posts[0], myRole: membership.role } AS finalResource + RETURN notification {.*, from: finalResource, to: properties(user)} + `, + { resourceId: args.id, id: currentUser.id }, + ) + log(markNotificationAsReadTransactionResponse) + return markNotificationAsReadTransactionResponse.records.map((record) => + record.get('notification'), + ) + }) + try { + const [notifications] = await writeTxResultPromise + return notifications + } finally { + session.close() + } + }, + markAllAsRead: async (parent, args, context, resolveInfo) => { + const { user: currentUser } = context + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const markAllNotificationAsReadTransactionResponse = await transaction.run( + ` + MATCH (resource)-[notification:NOTIFIED {read: FALSE}]->(user:User {id:$id}) + SET notification.read = TRUE + WITH user, notification, resource, + [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, + [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author), postType: [l IN labels(post) WHERE NOT l = 'Post']} ] AS posts + OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user) + WITH resource, user, notification, authors, posts, membership, + resource {.*, __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'Group']][0], author: authors[0], post: posts[0], myRole: membership.role} AS finalResource + RETURN notification {.*, from: finalResource, to: properties(user)} + `, + { id: currentUser.id }, + ) + log(markAllNotificationAsReadTransactionResponse) + return markAllNotificationAsReadTransactionResponse.records.map((record) => + record.get('notification'), + ) + }) + try { + const notifications = await writeTxResultPromise + return notifications + } finally { + session.close() + } + }, + }, + NOTIFIED: { + 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/docs/backend/src/schema/resolvers/passwordReset.spec.ts b/docs/backend/src/schema/resolvers/passwordReset.spec.ts new file mode 100644 index 000000000..3d17ff481 --- /dev/null +++ b/docs/backend/src/schema/resolvers/passwordReset.spec.ts @@ -0,0 +1,243 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import CONSTANTS_REGISTRATION from './../../constants/registration' +import createPasswordReset from './helpers/createPasswordReset' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +const neode = getNeode() +const driver = getDriver() + +let mutate +let authenticatedUser +let variables + +const getAllPasswordResets = async () => { + const passwordResetQuery = await neode.cypher( + 'MATCH (passwordReset:PasswordReset) RETURN passwordReset', + ) + const resets = passwordResetQuery.records.map((record) => record.get('passwordReset')) + return resets +} + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(() => { + variables = {} +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('passwordReset', () => { + describe('given a user', () => { + beforeEach(async () => { + await Factory.build( + 'user', + {}, + { + email: 'user@example.org', + }, + ) + }) + + describe('requestPasswordReset', () => { + const mutation = gql` + mutation ($email: String!) { + requestPasswordReset(email: $email) + } + ` + + describe('with invalid email', () => { + beforeEach(() => { + variables = { ...variables, email: 'non-existent@example.org' } + }) + + it('resolves anyways', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { requestPasswordReset: true }, + }) + }) + + it('creates no node', async () => { + await mutate({ mutation, variables }) + const resets = await getAllPasswordResets() + expect(resets).toHaveLength(0) + }) + }) + + describe('with a valid email', () => { + beforeEach(() => { + variables = { ...variables, email: 'user@example.org' } + }) + + it('resolves', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { requestPasswordReset: true }, + }) + }) + + it('creates node with label `PasswordReset`', async () => { + let resets = await getAllPasswordResets() + expect(resets).toHaveLength(0) + await mutate({ mutation, variables }) + resets = await getAllPasswordResets() + expect(resets).toHaveLength(1) + }) + + it('creates a reset nonce', async () => { + await mutate({ mutation, variables }) + const resets = await getAllPasswordResets() + const [reset] = resets + const { nonce } = reset.properties + expect(nonce).toHaveLength(CONSTANTS_REGISTRATION.NONCE_LENGTH) + }) + }) + }) + }) +}) + +describe('resetPassword', () => { + const setup = async (options: any = {}) => { + const { email = 'user@example.org', issuedAt = new Date(), nonce = '12345' } = options + await createPasswordReset({ driver, email, issuedAt, nonce }) + } + + const mutation = gql` + mutation ($nonce: String!, $email: String!, $newPassword: String!) { + resetPassword(nonce: $nonce, email: $email, newPassword: $newPassword) + } + ` + beforeEach(() => { + variables = { ...variables, newPassword: 'supersecret' } + }) + + describe('given a user', () => { + beforeEach(async () => { + await Factory.build( + 'user', + { + role: 'user', + }, + { + email: 'user@example.org', + password: '1234', + }, + ) + }) + + describe('invalid email', () => { + it('resolves to false', async () => { + await setup() + variables = { ...variables, email: 'non-existent@example.org', nonce: '12345' } + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { resetPassword: false }, + }) + }) + }) + + describe('valid email', () => { + beforeEach(() => { + variables = { ...variables, email: 'user@example.org' } + }) + + describe('but invalid nonce', () => { + beforeEach(() => { + variables = { ...variables, nonce: 'slkdj' } + }) + + it('resolves to false', async () => { + await setup() + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { resetPassword: false }, + }) + }) + }) + + describe('and valid nonce', () => { + beforeEach(() => { + variables = { + ...variables, + nonce: '12345', + } + }) + + describe('and nonce not expired', () => { + beforeEach(async () => { + await setup() + }) + + it('resolves to true', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { resetPassword: true }, + }) + }) + + it('updates PasswordReset `usedAt` property', async () => { + await mutate({ mutation, variables }) + const requests = await getAllPasswordResets() + const [request] = requests + const { usedAt } = request.properties + expect(usedAt).not.toBeFalsy() + }) + + it('updates password of the user', async () => { + await mutate({ mutation, variables }) + const checkLoginMutation = gql` + mutation ($email: String!, $password: String!) { + login(email: $email, password: $password) + } + ` + variables = { ...variables, email: 'user@example.org', password: 'supersecret' } + await expect( + mutate({ mutation: checkLoginMutation, variables }), + ).resolves.toMatchObject({ data: { login: expect.any(String) } }) + }) + }) + + describe('but expired nonce', () => { + beforeEach(async () => { + const issuedAt = new Date() + issuedAt.setDate(issuedAt.getDate() - 1) + await setup({ issuedAt }) + }) + + it('resolves to false', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { resetPassword: false }, + }) + }) + + it('does not update PasswordReset `usedAt` property', async () => { + await mutate({ mutation, variables }) + const requests = await getAllPasswordResets() + const [request] = requests + const { usedAt } = request.properties + expect(usedAt).toBeUndefined() + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/passwordReset.ts b/docs/backend/src/schema/resolvers/passwordReset.ts new file mode 100644 index 000000000..6fea020dd --- /dev/null +++ b/docs/backend/src/schema/resolvers/passwordReset.ts @@ -0,0 +1,48 @@ +import { v4 as uuid } from 'uuid' +import bcrypt from 'bcryptjs' +import CONSTANTS_REGISTRATION from './../../constants/registration' +import createPasswordReset from './helpers/createPasswordReset' + +export default { + Mutation: { + requestPasswordReset: async (_parent, { email }, { driver }) => { + // TODO: why this is generated differntly from 'backend/src/schema/resolvers/helpers/generateNonce.js'? + const nonce = uuid().substring(0, CONSTANTS_REGISTRATION.NONCE_LENGTH) + return createPasswordReset({ driver, nonce, email }) + }, + resetPassword: async (_parent, { email, nonce, newPassword }, { driver }) => { + const stillValid = new Date() + stillValid.setDate(stillValid.getDate() - 1) + const encryptedNewPassword = await bcrypt.hashSync(newPassword, 10) + const session = driver.session() + try { + const passwordResetTxPromise = session.writeTransaction(async (transaction) => { + const passwordResetTransactionResponse = await transaction.run( + ` + MATCH (passwordReset:PasswordReset {nonce: $nonce}) + MATCH (email:EmailAddress {email: $email})<-[:PRIMARY_EMAIL]-(user:User)-[:REQUESTED]->(passwordReset) + WHERE duration.between(passwordReset.issuedAt, datetime()).days <= 0 AND passwordReset.usedAt IS NULL + SET passwordReset.usedAt = datetime() + SET user.encryptedPassword = $encryptedNewPassword + SET user.updatedAt = toString(datetime()) + RETURN passwordReset + `, + { + stillValid, + email, + nonce, + encryptedNewPassword, + }, + ) + return passwordResetTransactionResponse.records.map((record) => + record.get('passwordReset'), + ) + }) + const [reset] = await passwordResetTxPromise + return !!(reset && reset.properties.usedAt) + } finally { + session.close() + } + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/posts.spec.ts b/docs/backend/src/schema/resolvers/posts.spec.ts new file mode 100644 index 000000000..7a549449f --- /dev/null +++ b/docs/backend/src/schema/resolvers/posts.spec.ts @@ -0,0 +1,1813 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createPostMutation } from '../../graphql/posts' +import CONFIG from '../../config' + +CONFIG.CATEGORIES_ACTIVE = true + +const driver = getDriver() +const neode = getNeode() + +let query +let mutate +let authenticatedUser +let user + +const categoryIds = ['cat9', 'cat4', 'cat15'] +let variables + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + variables = {} + user = await Factory.build( + 'user', + { + id: 'current-user', + name: 'TestUser', + }, + { + email: 'test@example.org', + password: '1234', + }, + ) + await Promise.all([ + neode.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }), + neode.create('Category', { + id: 'cat4', + name: 'Environment & Nature', + icon: 'tree', + }), + neode.create('Category', { + id: 'cat15', + name: 'Consumption & Sustainability', + icon: 'shopping-cart', + }), + neode.create('Category', { + id: 'cat27', + name: 'Animal Protection', + icon: 'paw', + }), + ]) + authenticatedUser = null +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('Post', () => { + describe('can be filtered', () => { + let followedUser, happyPost, cryPost + beforeEach(async () => { + ;[followedUser] = await Promise.all([ + Factory.build( + 'user', + { + id: 'followed-by-me', + name: 'Followed User', + }, + { + email: 'followed@example.org', + password: '1234', + }, + ), + ]) + ;[happyPost, cryPost] = await Promise.all([ + Factory.build('post', { id: 'happy-post' }, { categoryIds: ['cat4'] }), + Factory.build('post', { id: 'cry-post' }, { categoryIds: ['cat15'] }), + Factory.build( + 'post', + { + id: 'post-by-followed-user', + }, + { + categoryIds: ['cat9'], + author: followedUser, + }, + ), + ]) + }) + + describe('no filter', () => { + it('returns all posts', async () => { + const postQueryNoFilters = gql` + query Post($filter: _PostFilter) { + Post(filter: $filter) { + id + } + } + ` + const expected = [{ id: 'happy-post' }, { id: 'cry-post' }, { id: 'post-by-followed-user' }] + variables = { filter: {} } + await expect(query({ query: postQueryNoFilters, variables })).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining(expected), + }, + }) + }) + }) + + /* it('by categories', async () => { + const postQueryFilteredByCategories = gql` + query Post($filter: _PostFilter) { + Post(filter: $filter) { + id + categories { + id + } + } + } + ` + const expected = { + data: { + Post: [ + { + id: 'post-by-followed-user', + categories: [{ id: 'cat9' }], + }, + ], + }, + } + variables = { ...variables, filter: { categories_some: { id_in: ['cat9'] } } } + await expect( + query({ query: postQueryFilteredByCategories, variables }), + ).resolves.toMatchObject(expected) + }) */ + + describe('by emotions', () => { + const postQueryFilteredByEmotions = gql` + query Post($filter: _PostFilter) { + Post(filter: $filter) { + id + emotions { + emotion + } + } + } + ` + + it('filters by single emotion', async () => { + const expected = { + data: { + Post: [ + { + id: 'happy-post', + emotions: [{ emotion: 'happy' }], + }, + ], + }, + } + await user.relateTo(happyPost, 'emoted', { emotion: 'happy' }) + variables = { ...variables, filter: { emotions_some: { emotion_in: ['happy'] } } } + await expect( + query({ query: postQueryFilteredByEmotions, variables }), + ).resolves.toMatchObject(expected) + }) + + it('filters by multiple emotions', async () => { + const expected = [ + { + id: 'happy-post', + emotions: [{ emotion: 'happy' }], + }, + { + id: 'cry-post', + emotions: [{ emotion: 'cry' }], + }, + ] + await user.relateTo(happyPost, 'emoted', { emotion: 'happy' }) + await user.relateTo(cryPost, 'emoted', { emotion: 'cry' }) + variables = { ...variables, filter: { emotions_some: { emotion_in: ['happy', 'cry'] } } } + await expect( + query({ query: postQueryFilteredByEmotions, variables }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining(expected), + }, + errors: undefined, + }) + }) + }) + + it('by followed-by', async () => { + const postQueryFilteredByUsersFollowed = gql` + query Post($filter: _PostFilter) { + Post(filter: $filter) { + id + author { + id + name + } + } + } + ` + + await user.relateTo(followedUser, 'following') + variables = { filter: { author: { followedBy_some: { id: 'current-user' } } } } + await expect( + query({ query: postQueryFilteredByUsersFollowed, variables }), + ).resolves.toMatchObject({ + data: { + Post: [ + { + id: 'post-by-followed-user', + author: { id: 'followed-by-me', name: 'Followed User' }, + }, + ], + }, + errors: undefined, + }) + }) + }) +}) + +describe('CreatePost', () => { + beforeEach(() => { + variables = { + ...variables, + id: 'p3589', + title: 'I am a title', + content: 'Some content', + categoryIds, + } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: createPostMutation(), variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('creates a post', async () => { + const expected = { + data: { CreatePost: { title: 'I am a title', content: 'Some content' } }, + errors: undefined, + } + await expect(mutate({ mutation: createPostMutation(), variables })).resolves.toMatchObject( + expected, + ) + }) + + it('assigns the authenticated user as author', async () => { + const expected = { + data: { + CreatePost: { + title: 'I am a title', + author: { + name: 'TestUser', + }, + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: createPostMutation(), variables })).resolves.toMatchObject( + expected, + ) + }) + + it('`disabled` and `deleted` default to `false`', async () => { + const expected = { data: { CreatePost: { disabled: false, deleted: false } } } + await expect(mutate({ mutation: createPostMutation(), variables })).resolves.toMatchObject( + expected, + ) + }) + + it('has label "Article" as default', async () => { + await expect(mutate({ mutation: createPostMutation(), variables })).resolves.toMatchObject({ + data: { CreatePost: { postType: ['Article'] } }, + }) + }) + + describe('with invalid post type', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { ...variables, postType: 'not-valid' }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: + 'Variable "$postType" got invalid value "not-valid"; Expected type PostType.', + }, + ], + }) + }) + }) + + describe('with post type "Event"', () => { + describe('without event start date', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: "Cannot read properties of undefined (reading 'eventStart')", + }, + ], + }) + }) + }) + + describe('with invalid event start date', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: 'no date', + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event start date must be a valid date!', + }, + ], + }) + }) + }) + + describe('with event start date in the past', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() - 1).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event start date must be in the future!', + }, + ], + }) + }) + }) + + describe('with valid start date and invalid end date', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventEnd: 'not-valid', + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event end date must be a valid date!', + }, + ], + }) + }) + }) + + describe('with valid start date and end date before start date', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 2).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event end date must be a after event start date!', + }, + ], + }) + }) + }) + + describe('with valid start date and valid end date', () => { + it('creates the event', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth() + 2).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth() + 2).toISOString(), + eventIsOnline: false, + }, + }, + errors: undefined, + }) + }) + }) + + describe('with valid start date and event is online', () => { + it('creates the event', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventIsOnline: true, + }, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventIsOnline: true, + }, + }, + errors: undefined, + }) + }) + }) + + describe('event location name is given but event venue is missing', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventLocationName: 'Berlin', + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event venue must be present if event location is given!', + }, + ], + }) + }) + }) + + describe('valid event input without location', () => { + it('has label "Event" set', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventIsOnline: false, + }, + }, + errors: undefined, + }) + }) + }) + + describe('valid event input with location name', () => { + it('has label "Event" set', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventLocationName: 'Leipzig', + eventVenue: 'Connewitzer Kreuz', + }, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventLocationName: 'Leipzig', + eventVenue: 'Connewitzer Kreuz', + eventLocation: { + lng: 12.374733, + lat: 51.340632, + }, + }, + }, + errors: undefined, + }) + }) + }) + }) + }) +}) + +describe('UpdatePost', () => { + let author, newlyCreatedPost + const updatePostMutation = gql` + mutation ( + $id: ID! + $title: String! + $content: String! + $image: ImageInput + $categoryIds: [ID] + $postType: PostType + $eventInput: _EventInput + ) { + UpdatePost( + id: $id + title: $title + content: $content + image: $image + categoryIds: $categoryIds + postType: $postType + eventInput: $eventInput + ) { + id + title + content + author { + name + slug + } + createdAt + updatedAt + categories { + id + } + postType + eventStart + eventLocationName + eventVenue + eventLocation { + lng + lat + } + } + } + ` + beforeEach(async () => { + author = await Factory.build('user', { slug: 'the-author' }) + authenticatedUser = await author.toJson() + const { data } = await mutate({ + mutation: createPostMutation(), + variables: { + title: 'Old title', + content: 'Old content', + categoryIds, + }, + }) + newlyCreatedPost = data.CreatePost + variables = { + id: newlyCreatedPost.id, + title: 'New title', + content: 'New content', + } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: updatePostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { UpdatePost: null }, + }) + }) + }) + + describe('authenticated but not the author', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: updatePostMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + authenticatedUser = await author.toJson() + }) + + it('updates a post', async () => { + const expected = { + data: { UpdatePost: { id: newlyCreatedPost.id, content: 'New content' } }, + errors: undefined, + } + await expect(mutate({ mutation: updatePostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('updates a post, but maintains non-updated attributes', async () => { + const expected = { + data: { + UpdatePost: { + id: newlyCreatedPost.id, + content: 'New content', + createdAt: expect.any(String), + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: updatePostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('updates the updatedAt attribute', async () => { + const { + data: { UpdatePost }, + } = await mutate({ mutation: updatePostMutation, variables }) + expect(UpdatePost.updatedAt).toBeTruthy() + expect(Date.parse(UpdatePost.updatedAt)).toEqual(expect.any(Number)) + expect(newlyCreatedPost.updatedAt).not.toEqual(UpdatePost.updatedAt) + }) + + describe('no new category ids provided for update', () => { + it('resolves and keeps current categories', async () => { + const expected = { + data: { + UpdatePost: { + id: newlyCreatedPost.id, + categories: expect.arrayContaining([{ id: 'cat9' }, { id: 'cat4' }, { id: 'cat15' }]), + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: updatePostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('given category ids', () => { + beforeEach(() => { + variables = { ...variables, categoryIds: ['cat27'] } + }) + + it('updates categories of a post', async () => { + const expected = { + data: { + UpdatePost: { + id: newlyCreatedPost.id, + categories: expect.arrayContaining([{ id: 'cat27' }]), + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: updatePostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('change post type to event', () => { + describe('with missing event start date', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: updatePostMutation, + variables: { ...variables, postType: 'Event' }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: "Cannot read properties of undefined (reading 'eventStart')", + }, + ], + }) + }) + }) + + describe('with invalid event start date', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: updatePostMutation, + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: 'no-date', + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event start date must be a valid date!', + }, + ], + }) + }) + }) + + describe('with event start date in the past', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: updatePostMutation, + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() - 1).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event start date must be in the future!', + }, + ], + }) + }) + }) + + describe('event location name is given but event venue is missing', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: updatePostMutation, + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventLocationName: 'Berlin', + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event venue must be present if event location is given!', + }, + ], + }) + }) + }) + + describe('valid event input without location name', () => { + it('has label "Event" set', async () => { + const now = new Date() + await expect( + mutate({ + mutation: updatePostMutation, + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + data: { + UpdatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }, + }, + errors: undefined, + }) + }) + }) + + describe('valid event input with location name', () => { + it('has label "Event" set', async () => { + const now = new Date() + await expect( + mutate({ + mutation: updatePostMutation, + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventLocationName: 'Leipzig', + eventVenue: 'Connewitzer Kreuz', + }, + }, + }), + ).resolves.toMatchObject({ + data: { + UpdatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventLocationName: 'Leipzig', + eventVenue: 'Connewitzer Kreuz', + eventLocation: { + lng: 12.374733, + lat: 51.340632, + }, + }, + }, + errors: undefined, + }) + }) + }) + }) + + // eslint-disable-next-line jest/no-disabled-tests + describe.skip('params.image', () => { + describe('is object', () => { + beforeEach(() => { + variables = { ...variables, image: { sensitive: true } } + }) + it('updates the image', async () => { + await expect(neode.first('Image', { sensitive: true })).resolves.toBeFalsy() + await mutate({ mutation: updatePostMutation, variables }) + await expect(neode.first('Image', { sensitive: true })).resolves.toBeTruthy() + }) + }) + + describe('is null', () => { + beforeEach(() => { + variables = { ...variables, image: null } + }) + it('deletes the image', async () => { + await expect(neode.all('Image')).resolves.toHaveLength(6) + await mutate({ mutation: updatePostMutation, variables }) + await expect(neode.all('Image')).resolves.toHaveLength(5) + }) + }) + + describe('is undefined', () => { + beforeEach(() => { + delete variables.image + }) + it('keeps the image unchanged', async () => { + await expect(neode.first('Image', { sensitive: true })).resolves.toBeFalsy() + await mutate({ mutation: updatePostMutation, variables }) + await expect(neode.first('Image', { sensitive: true })).resolves.toBeFalsy() + }) + }) + }) + }) +}) + +describe('pin posts', () => { + let author + const pinPostMutation = gql` + mutation ($id: ID!) { + pinPost(id: $id) { + id + title + content + author { + name + slug + } + pinnedBy { + id + name + role + } + createdAt + updatedAt + pinnedAt + pinned + } + } + ` + beforeEach(async () => { + author = await Factory.build('user', { slug: 'the-author' }) + await Factory.build( + 'post', + { + id: 'p9876', + title: 'Old title', + content: 'Old content', + }, + { + author, + categoryIds, + }, + ) + variables = { + id: 'p9876', + } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { pinPost: null }, + }) + }) + }) + + describe('ordinary users', () => { + it('throws authorization error', async () => { + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { pinPost: null }, + }) + }) + }) + + describe('moderators', () => { + let moderator + beforeEach(async () => { + moderator = await user.update({ role: 'moderator', updatedAt: new Date().toISOString() }) + authenticatedUser = await moderator.toJson() + }) + + it('throws authorization error', async () => { + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { pinPost: null }, + }) + }) + }) + + describe('admins', () => { + let admin + beforeEach(async () => { + admin = await user.update({ + role: 'admin', + name: 'Admin', + updatedAt: new Date().toISOString(), + }) + authenticatedUser = await admin.toJson() + }) + + describe('are allowed to pin posts', () => { + beforeEach(async () => { + await Factory.build( + 'post', + { + id: 'created-and-pinned-by-same-admin', + }, + { + author: admin, + }, + ) + variables = { ...variables, id: 'created-and-pinned-by-same-admin' } + }) + + it('responds with the updated Post', async () => { + const expected = { + data: { + pinPost: { + id: 'created-and-pinned-by-same-admin', + author: { + name: 'Admin', + }, + pinnedBy: { + id: 'current-user', + name: 'Admin', + role: 'admin', + }, + }, + }, + errors: undefined, + } + + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('sets createdAt date for PINNED', async () => { + const expected = { + data: { + pinPost: { + id: 'created-and-pinned-by-same-admin', + pinnedAt: expect.any(String), + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('sets redundant `pinned` property for performant ordering', async () => { + variables = { ...variables, id: 'created-and-pinned-by-same-admin' } + const expected = { + data: { pinPost: { pinned: true } }, + errors: undefined, + } + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('post created by another admin', () => { + let otherAdmin + beforeEach(async () => { + otherAdmin = await Factory.build('user', { + role: 'admin', + name: 'otherAdmin', + }) + authenticatedUser = await otherAdmin.toJson() + await Factory.build( + 'post', + { + id: 'created-by-one-admin-pinned-by-different-one', + }, + { + author: otherAdmin, + }, + ) + }) + + it('responds with the updated Post', async () => { + authenticatedUser = await admin.toJson() + variables = { ...variables, id: 'created-by-one-admin-pinned-by-different-one' } + const expected = { + data: { + pinPost: { + id: 'created-by-one-admin-pinned-by-different-one', + author: { + name: 'otherAdmin', + }, + pinnedBy: { + id: 'current-user', + name: 'Admin', + role: 'admin', + }, + }, + }, + errors: undefined, + } + + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('post created by another user', () => { + it('responds with the updated Post', async () => { + const expected = { + data: { + pinPost: { + id: 'p9876', + author: { + slug: 'the-author', + }, + pinnedBy: { + id: 'current-user', + name: 'Admin', + role: 'admin', + }, + }, + }, + errors: undefined, + } + + await expect(mutate({ mutation: pinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('pinned post already exists', () => { + let pinnedPost + beforeEach(async () => { + await Factory.build( + 'post', + { + id: 'only-pinned-post', + }, + { + author: admin, + }, + ) + await mutate({ mutation: pinPostMutation, variables }) + }) + + it('removes previous `pinned` attribute', async () => { + const cypher = 'MATCH (post:Post) WHERE post.pinned IS NOT NULL RETURN post' + pinnedPost = await neode.cypher(cypher) + expect(pinnedPost.records).toHaveLength(1) + variables = { ...variables, id: 'only-pinned-post' } + await mutate({ mutation: pinPostMutation, variables }) + pinnedPost = await neode.cypher(cypher) + expect(pinnedPost.records).toHaveLength(1) + }) + + it('removes previous PINNED relationship', async () => { + variables = { ...variables, id: 'only-pinned-post' } + await mutate({ mutation: pinPostMutation, variables }) + pinnedPost = await neode.cypher( + `MATCH (:User)-[pinned:PINNED]->(post:Post) RETURN post, pinned`, + ) + expect(pinnedPost.records).toHaveLength(1) + }) + }) + + describe('PostOrdering', () => { + beforeEach(async () => { + await Factory.build('post', { + id: 'im-a-pinned-post', + createdAt: '2019-11-22T17:26:29.070Z', + pinned: true, + }) + await Factory.build('post', { + id: 'i-was-created-before-pinned-post', + // fairly old, so this should be 3rd + createdAt: '2019-10-22T17:26:29.070Z', + }) + }) + + describe('order by `pinned_asc` and `createdAt_desc`', () => { + beforeEach(() => { + // this is the ordering in the frontend + variables = { orderBy: ['pinned_asc', 'createdAt_desc'] } + }) + + it('pinned post appear first even when created before other posts', async () => { + const postOrderingQuery = gql` + query ($orderBy: [_PostOrdering]) { + Post(orderBy: $orderBy) { + id + pinned + createdAt + pinnedAt + } + } + ` + await expect(query({ query: postOrderingQuery, variables })).resolves.toMatchObject({ + data: { + Post: [ + { + id: 'im-a-pinned-post', + pinned: true, + createdAt: '2019-11-22T17:26:29.070Z', + pinnedAt: expect.any(String), + }, + { + id: 'p9876', + pinned: null, + createdAt: expect.any(String), + pinnedAt: null, + }, + { + id: 'i-was-created-before-pinned-post', + pinned: null, + createdAt: '2019-10-22T17:26:29.070Z', + pinnedAt: null, + }, + ], + }, + errors: undefined, + }) + }) + }) + }) + }) +}) + +describe('unpin posts', () => { + let pinnedPost + const unpinPostMutation = gql` + mutation ($id: ID!) { + unpinPost(id: $id) { + id + title + content + author { + name + slug + } + pinnedBy { + id + name + role + } + createdAt + updatedAt + pinned + pinnedAt + } + } + ` + beforeEach(async () => { + pinnedPost = await Factory.build('post', { id: 'post-to-be-unpinned' }) + variables = { + id: 'post-to-be-unpinned', + } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: unpinPostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { unpinPost: null }, + }) + }) + }) + + describe('users cannot unpin posts', () => { + it('throws authorization error', async () => { + await expect(mutate({ mutation: unpinPostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { unpinPost: null }, + }) + }) + }) + + describe('moderators cannot unpin posts', () => { + let moderator + beforeEach(async () => { + moderator = await user.update({ role: 'moderator', updatedAt: new Date().toISOString() }) + authenticatedUser = await moderator.toJson() + }) + + it('throws authorization error', async () => { + await expect(mutate({ mutation: unpinPostMutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + data: { unpinPost: null }, + }) + }) + }) + + describe('admin can unpin posts', () => { + let admin + beforeEach(async () => { + admin = await user.update({ + role: 'admin', + name: 'Admin', + updatedAt: new Date().toISOString(), + }) + authenticatedUser = await admin.toJson() + await admin.relateTo(pinnedPost, 'pinned', { createdAt: new Date().toISOString() }) + }) + + it('responds with the unpinned Post', async () => { + authenticatedUser = await admin.toJson() + const expected = { + data: { + unpinPost: { + id: 'post-to-be-unpinned', + pinnedBy: null, + pinnedAt: null, + }, + }, + errors: undefined, + } + + await expect(mutate({ mutation: unpinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('unsets `pinned` property', async () => { + const expected = { + data: { + unpinPost: { + id: 'post-to-be-unpinned', + pinned: null, + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: unpinPostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) +}) + +describe('DeletePost', () => { + let author + const deletePostMutation = gql` + mutation ($id: ID!) { + DeletePost(id: $id) { + id + deleted + content + contentExcerpt + image { + url + } + comments { + deleted + content + contentExcerpt + } + } + } + ` + + beforeEach(async () => { + author = await Factory.build('user') + await Factory.build( + 'post', + { + id: 'p4711', + title: 'I will be deleted', + content: 'To be deleted', + }, + { + image: Factory.build('image', { + url: 'path/to/some/image', + }), + author, + categoryIds, + }, + ) + variables = { ...variables, id: 'p4711' } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: deletePostMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated but not the author', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('throws authorization error', async () => { + const { errors } = await mutate({ mutation: deletePostMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + authenticatedUser = await author.toJson() + }) + + it('marks the post as deleted and blacks out attributes', async () => { + const expected = { + data: { + DeletePost: { + id: 'p4711', + deleted: true, + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + image: null, + comments: [], + }, + }, + } + await expect(mutate({ mutation: deletePostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + describe('if there are comments on the post', () => { + beforeEach(async () => { + await Factory.build( + 'comment', + { + content: 'to be deleted comment content', + contentExcerpt: 'to be deleted comment content', + }, + { + postId: 'p4711', + }, + ) + }) + + it('marks the comments as deleted', async () => { + const expected = { + data: { + DeletePost: { + id: 'p4711', + deleted: true, + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + image: null, + comments: [ + { + deleted: true, + // Should we black out the comment content in the database, too? + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + }, + ], + }, + }, + } + await expect(mutate({ mutation: deletePostMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + }) +}) + +describe('emotions', () => { + let author, postToEmote + const PostsEmotionsCountQuery = gql` + query ($id: ID!) { + Post(id: $id) { + emotionsCount + } + } + ` + const PostsEmotionsQuery = gql` + query ($id: ID!) { + Post(id: $id) { + emotions { + emotion + User { + id + } + } + } + } + ` + + beforeEach(async () => { + author = await neode.create('User', { id: 'u257' }) + postToEmote = await Factory.build( + 'post', + { + id: 'p1376', + }, + { + author, + categoryIds, + }, + ) + + variables = { + ...variables, + to: { id: 'p1376' }, + data: { emotion: 'happy' }, + } + }) + + describe('AddPostEmotions', () => { + const addPostEmotionsMutation = gql` + mutation ($to: _PostInput!, $data: _EMOTEDInput!) { + AddPostEmotions(to: $to, data: $data) { + from { + id + } + to { + id + } + emotion + } + } + ` + let postsEmotionsQueryVariables + + beforeEach(async () => { + postsEmotionsQueryVariables = { id: 'p1376' } + }) + + describe('unauthenticated', () => { + beforeEach(() => { + authenticatedUser = null + }) + + it('throws authorization error', async () => { + const addPostEmotions = await mutate({ + mutation: addPostEmotionsMutation, + variables, + }) + + expect(addPostEmotions.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated and not the author', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('adds an emotion to the post', async () => { + const expected = { + data: { + AddPostEmotions: { + from: { id: 'current-user' }, + to: { id: 'p1376' }, + emotion: 'happy', + }, + }, + } + await expect(mutate({ mutation: addPostEmotionsMutation, variables })).resolves.toEqual( + expect.objectContaining(expected), + ) + }) + + it('limits the addition of the same emotion to 1', async () => { + const expected = { + data: { + Post: [ + { + emotionsCount: 1, + }, + ], + }, + } + await mutate({ mutation: addPostEmotionsMutation, variables }) + await mutate({ mutation: addPostEmotionsMutation, variables }) + await expect( + query({ query: PostsEmotionsCountQuery, variables: postsEmotionsQueryVariables }), + ).resolves.toEqual(expect.objectContaining(expected)) + }) + + it('allows a user to add more than one emotion', async () => { + const expected = { + data: { + Post: [ + { + emotions: expect.arrayContaining([ + { emotion: 'happy', User: { id: 'current-user' } }, + { emotion: 'surprised', User: { id: 'current-user' } }, + ]), + }, + ], + }, + } + await mutate({ mutation: addPostEmotionsMutation, variables }) + variables = { ...variables, data: { emotion: 'surprised' } } + await mutate({ mutation: addPostEmotionsMutation, variables }) + await expect( + query({ query: PostsEmotionsQuery, variables: postsEmotionsQueryVariables }), + ).resolves.toEqual(expect.objectContaining(expected)) + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + authenticatedUser = await author.toJson() + }) + + it('adds an emotion to the post', async () => { + const expected = { + data: { + AddPostEmotions: { + from: { id: 'u257' }, + to: { id: 'p1376' }, + emotion: 'happy', + }, + }, + } + await expect(mutate({ mutation: addPostEmotionsMutation, variables })).resolves.toEqual( + expect.objectContaining(expected), + ) + }) + }) + }) + + describe('RemovePostEmotions', () => { + let removePostEmotionsVariables, postsEmotionsQueryVariables + const removePostEmotionsMutation = gql` + mutation ($to: _PostInput!, $data: _EMOTEDInput!) { + RemovePostEmotions(to: $to, data: $data) { + from { + id + } + to { + id + } + emotion + } + } + ` + beforeEach(async () => { + await author.relateTo(postToEmote, 'emoted', { emotion: 'happy' }) + await user.relateTo(postToEmote, 'emoted', { emotion: 'cry' }) + + postsEmotionsQueryVariables = { id: 'p1376' } + removePostEmotionsVariables = { + to: { id: 'p1376' }, + data: { emotion: 'cry' }, + } + }) + + describe('unauthenticated', () => { + beforeEach(() => { + authenticatedUser = null + }) + + it('throws authorization error', async () => { + const removePostEmotions = await mutate({ + mutation: removePostEmotionsMutation, + variables: removePostEmotionsVariables, + }) + expect(removePostEmotions.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + describe('but not the emoter', () => { + beforeEach(async () => { + authenticatedUser = await author.toJson() + }) + + it('returns null if the emotion could not be found', async () => { + const removePostEmotions = await mutate({ + mutation: removePostEmotionsMutation, + variables: removePostEmotionsVariables, + }) + expect(removePostEmotions).toEqual( + expect.objectContaining({ data: { RemovePostEmotions: null } }), + ) + }) + }) + + describe('as the emoter', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('removes an emotion from a post', async () => { + const expected = { + data: { + RemovePostEmotions: { + to: { id: 'p1376' }, + from: { id: 'current-user' }, + emotion: 'cry', + }, + }, + } + await expect( + mutate({ + mutation: removePostEmotionsMutation, + variables: removePostEmotionsVariables, + }), + ).resolves.toEqual(expect.objectContaining(expected)) + }) + + it('removes only the requested emotion, not all emotions', async () => { + const expectedEmotions = [{ emotion: 'happy', User: { id: 'u257' } }] + const expectedResponse = { + data: { Post: [{ emotions: expect.arrayContaining(expectedEmotions) }] }, + } + await mutate({ + mutation: removePostEmotionsMutation, + variables: removePostEmotionsVariables, + }) + await expect( + query({ query: PostsEmotionsQuery, variables: postsEmotionsQueryVariables }), + ).resolves.toEqual(expect.objectContaining(expectedResponse)) + }) + }) + }) + }) + + describe('posts emotions count', () => { + let PostsEmotionsCountByEmotionVariables + let PostsEmotionsByCurrentUserVariables + + const PostsEmotionsCountByEmotionQuery = gql` + query ($postId: ID!, $data: _EMOTEDInput!) { + PostsEmotionsCountByEmotion(postId: $postId, data: $data) + } + ` + + const PostsEmotionsByCurrentUserQuery = gql` + query ($postId: ID!) { + PostsEmotionsByCurrentUser(postId: $postId) + } + ` + beforeEach(async () => { + await user.relateTo(postToEmote, 'emoted', { emotion: 'cry' }) + + PostsEmotionsCountByEmotionVariables = { + postId: 'p1376', + data: { emotion: 'cry' }, + } + PostsEmotionsByCurrentUserVariables = { postId: 'p1376' } + }) + + describe('PostsEmotionsCountByEmotion', () => { + it("returns a post's emotions count", async () => { + const expectedResponse = { data: { PostsEmotionsCountByEmotion: 1 } } + await expect( + query({ + query: PostsEmotionsCountByEmotionQuery, + variables: PostsEmotionsCountByEmotionVariables, + }), + ).resolves.toEqual(expect.objectContaining(expectedResponse)) + }) + }) + + describe('PostsEmotionsByCurrentUser', () => { + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it("returns a currentUser's emotions on a post", async () => { + const expectedResponse = { data: { PostsEmotionsByCurrentUser: ['cry'] } } + await expect( + query({ + query: PostsEmotionsByCurrentUserQuery, + variables: PostsEmotionsByCurrentUserVariables, + }), + ).resolves.toEqual(expect.objectContaining(expectedResponse)) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/posts.ts b/docs/backend/src/schema/resolvers/posts.ts new file mode 100644 index 000000000..0bd4507b5 --- /dev/null +++ b/docs/backend/src/schema/resolvers/posts.ts @@ -0,0 +1,490 @@ +import { v4 as uuid } from 'uuid' +import { neo4jgraphql } from 'neo4j-graphql-js' +import { isEmpty } from 'lodash' +import { UserInputError } from 'apollo-server' +import { mergeImage, deleteImage } from './images/images' +import Resolver from './helpers/Resolver' +import { filterForMutedUsers } from './helpers/filterForMutedUsers' +import { filterInvisiblePosts } from './helpers/filterInvisiblePosts' +import { filterPostsOfMyGroups } from './helpers/filterPostsOfMyGroups' +import { validateEventParams } from './helpers/events' +import { createOrUpdateLocations } from './users/location' +import CONFIG from '../../config' + +const maintainPinnedPosts = (params) => { + const pinnedPostFilter = { pinned: true } + if (isEmpty(params.filter)) { + params.filter = { OR: [pinnedPostFilter, {}] } + } else { + params.filter = { OR: [pinnedPostFilter, { ...params.filter }] } + } + return params +} + +const filterEventDates = (params) => { + if (params.filter?.eventStart_gte) { + const date = params.filter.eventStart_gte + delete params.filter.eventStart_gte + params.filter = { ...params.filter, OR: [{ eventStart_gte: date }, { eventEnd_gte: date }] } + } + return params +} + +export default { + Query: { + Post: async (object, params, context, resolveInfo) => { + params = await filterPostsOfMyGroups(params, context) + params = await filterInvisiblePosts(params, context) + params = await filterForMutedUsers(params, context) + params = filterEventDates(params) + params = await maintainPinnedPosts(params) + return neo4jgraphql(object, params, context, resolveInfo) + }, + profilePagePosts: async (object, params, context, resolveInfo) => { + params = await filterPostsOfMyGroups(params, context) + params = await filterInvisiblePosts(params, context) + params = await filterForMutedUsers(params, context) + return neo4jgraphql(object, params, context, resolveInfo) + }, + PostsEmotionsCountByEmotion: async (object, params, context, resolveInfo) => { + const { postId, data } = params + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (transaction) => { + const emotionsCountTransactionResponse = await transaction.run( + ` + MATCH (post:Post {id: $postId})<-[emoted:EMOTED {emotion: $data.emotion}]-() + RETURN COUNT(DISTINCT emoted) as emotionsCount + `, + { postId, data }, + ) + return emotionsCountTransactionResponse.records.map( + (record) => record.get('emotionsCount').low, + ) + }) + try { + const [emotionsCount] = await readTxResultPromise + return emotionsCount + } finally { + session.close() + } + }, + PostsEmotionsByCurrentUser: async (object, params, context, resolveInfo) => { + const { postId } = params + const session = context.driver.session() + const readTxResultPromise = session.readTransaction(async (transaction) => { + const emotionsTransactionResponse = await transaction.run( + ` + MATCH (user:User {id: $userId})-[emoted:EMOTED]->(post:Post {id: $postId}) + RETURN collect(emoted.emotion) as emotion + `, + { userId: context.user.id, postId }, + ) + return emotionsTransactionResponse.records.map((record) => record.get('emotion')) + }) + try { + const [emotions] = await readTxResultPromise + return emotions + } finally { + session.close() + } + }, + }, + Mutation: { + CreatePost: async (_parent, params, context, _resolveInfo) => { + const { categoryIds, groupId } = params + const { image: imageInput } = params + + const locationName = validateEventParams(params) + + delete params.categoryIds + delete params.image + delete params.groupId + params.id = params.id || uuid() + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + let groupCypher = '' + if (groupId) { + groupCypher = ` + WITH post MATCH (group:Group { id: $groupId }) + MERGE (post)-[:IN]->(group)` + const groupTypeResponse = await transaction.run( + ` + MATCH (group:Group { id: $groupId }) RETURN group.groupType AS groupType`, + { groupId }, + ) + const [groupType] = groupTypeResponse.records.map((record) => record.get('groupType')) + if (groupType !== 'public') + groupCypher += ` + WITH post, group + MATCH (user:User)-[membership:MEMBER_OF]->(group) + WHERE group.groupType IN ['closed', 'hidden'] + AND membership.role IN ['usual', 'admin', 'owner'] + WITH post, collect(user.id) AS userIds + OPTIONAL MATCH path =(restricted:User) WHERE NOT restricted.id IN userIds + FOREACH (user IN nodes(path) | + MERGE (user)-[:CANNOT_SEE]->(post) + )` + } + const categoriesCypher = + CONFIG.CATEGORIES_ACTIVE && categoryIds + ? `WITH post + UNWIND $categoryIds AS categoryId + MATCH (category:Category {id: categoryId}) + MERGE (post)-[:CATEGORIZED]->(category)` + : '' + const createPostTransactionResponse = await transaction.run( + ` + CREATE (post:Post) + SET post += $params + SET post.createdAt = toString(datetime()) + SET post.updatedAt = toString(datetime()) + SET post.clickedCount = 0 + SET post.viewedTeaserCount = 0 + SET post:${params.postType} + WITH post + MATCH (author:User {id: $userId}) + MERGE (post)<-[:WROTE]-(author) + ${categoriesCypher} + ${groupCypher} + RETURN post {.*, postType: [l IN labels(post) WHERE NOT l = 'Post'] } + `, + { userId: context.user.id, categoryIds, groupId, params }, + ) + const [post] = createPostTransactionResponse.records.map((record) => record.get('post')) + if (imageInput) { + await mergeImage(post, 'HERO_IMAGE', imageInput, { transaction }) + } + return post + }) + try { + const post = await writeTxResultPromise + if (locationName) { + await createOrUpdateLocations('Post', post.id, locationName, session) + } + return post + } catch (e) { + if (e.code === 'Neo.ClientError.Schema.ConstraintValidationFailed') + throw new UserInputError('Post with this slug already exists!') + throw new Error(e) + } finally { + session.close() + } + }, + UpdatePost: async (_parent, params, context, _resolveInfo) => { + const { categoryIds } = params + const { image: imageInput } = params + + const locationName = validateEventParams(params) + + delete params.categoryIds + delete params.image + const session = context.driver.session() + let updatePostCypher = ` + MATCH (post:Post {id: $params.id}) + SET post += $params + SET post.updatedAt = toString(datetime()) + WITH post + ` + + if (CONFIG.CATEGORIES_ACTIVE && categoryIds && categoryIds.length) { + const cypherDeletePreviousRelations = ` + MATCH (post:Post { id: $params.id })-[previousRelations:CATEGORIZED]->(category:Category) + DELETE previousRelations + RETURN post, category + ` + + await session.writeTransaction((transaction) => { + return transaction.run(cypherDeletePreviousRelations, { params }) + }) + + updatePostCypher += ` + UNWIND $categoryIds AS categoryId + MATCH (category:Category {id: categoryId}) + MERGE (post)-[:CATEGORIZED]->(category) + WITH post + ` + } + + if (params.postType) { + updatePostCypher += ` + REMOVE post:Article + REMOVE post:Event + SET post:${params.postType} + WITH post + ` + } + + updatePostCypher += `RETURN post {.*, postType: [l IN labels(post) WHERE NOT l = 'Post']}` + const updatePostVariables = { categoryIds, params } + try { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const updatePostTransactionResponse = await transaction.run( + updatePostCypher, + updatePostVariables, + ) + const [post] = updatePostTransactionResponse.records.map((record) => record.get('post')) + await mergeImage(post, 'HERO_IMAGE', imageInput, { transaction }) + return post + }) + const post = await writeTxResultPromise + if (locationName) { + await createOrUpdateLocations('Post', post.id, locationName, session) + } + return post + } finally { + session.close() + } + }, + + DeletePost: async (object, args, context, resolveInfo) => { + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const deletePostTransactionResponse = await transaction.run( + ` + MATCH (post:Post {id: $postId}) + OPTIONAL MATCH (post)<-[:COMMENTS]-(comment:Comment) + SET post.deleted = TRUE + SET post.content = 'UNAVAILABLE' + SET post.contentExcerpt = 'UNAVAILABLE' + SET post.title = 'UNAVAILABLE' + SET comment.deleted = TRUE + RETURN post {.*} + `, + { postId: args.id }, + ) + const [post] = deletePostTransactionResponse.records.map((record) => record.get('post')) + await deleteImage(post, 'HERO_IMAGE', { transaction }) + return post + }) + try { + const post = await writeTxResultPromise + return post + } finally { + session.close() + } + }, + AddPostEmotions: async (object, params, context, resolveInfo) => { + const { to, data } = params + const { user } = context + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const addPostEmotionsTransactionResponse = await transaction.run( + ` + MATCH (userFrom:User {id: $user.id}), (postTo:Post {id: $to.id}) + MERGE (userFrom)-[emotedRelation:EMOTED {emotion: $data.emotion}]->(postTo) + RETURN userFrom, postTo, emotedRelation`, + { user, to, data }, + ) + return addPostEmotionsTransactionResponse.records.map((record) => { + return { + from: { ...record.get('userFrom').properties }, + to: { ...record.get('postTo').properties }, + ...record.get('emotedRelation').properties, + } + }) + }) + try { + const [emoted] = await writeTxResultPromise + return emoted + } finally { + session.close() + } + }, + RemovePostEmotions: async (object, params, context, resolveInfo) => { + const { to, data } = params + const { id: from } = context.user + const session = context.driver.session() + 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}) + DELETE emotedRelation + RETURN userFrom, postTo + `, + { from, to, data }, + ) + return removePostEmotionsTransactionResponse.records.map((record) => { + return { + from: { ...record.get('userFrom').properties }, + to: { ...record.get('postTo').properties }, + emotion: data.emotion, + } + }) + }) + try { + const [emoted] = await writeTxResultPromise + return emoted + } finally { + session.close() + } + }, + pinPost: async (_parent, params, context, _resolveInfo) => { + let pinnedPostWithNestedAttributes + const { driver, user } = context + const session = driver.session() + const { id: userId } = user + let writeTxResultPromise = session.writeTransaction(async (transaction) => { + const deletePreviousRelationsResponse = await transaction.run( + ` + MATCH (:User)-[previousRelations:PINNED]->(post:Post) + REMOVE post.pinned + DELETE previousRelations + RETURN post + `, + ) + return deletePreviousRelationsResponse.records.map( + (record) => record.get('post').properties, + ) + }) + try { + await writeTxResultPromise + + writeTxResultPromise = session.writeTransaction(async (transaction) => { + const pinPostTransactionResponse = await transaction.run( + ` + MATCH (user:User {id: $userId}) WHERE user.role = 'admin' + MATCH (post:Post {id: $params.id}) + WHERE NOT((post)-[:IN]->(:Group)) + MERGE (user)-[pinned:PINNED {createdAt: toString(datetime())}]->(post) + SET post.pinned = true + RETURN post, pinned.createdAt as pinnedAt + `, + { userId, params }, + ) + return pinPostTransactionResponse.records.map((record) => ({ + pinnedPost: record.get('post').properties, + pinnedAt: record.get('pinnedAt'), + })) + }) + const [transactionResult] = await writeTxResultPromise + if (transactionResult) { + const { pinnedPost, pinnedAt } = transactionResult + pinnedPostWithNestedAttributes = { + ...pinnedPost, + pinnedAt, + } + } + } finally { + session.close() + } + return pinnedPostWithNestedAttributes + }, + unpinPost: async (_parent, params, context, _resolveInfo) => { + let unpinnedPost + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const unpinPostTransactionResponse = await transaction.run( + ` + MATCH (:User)-[previousRelations:PINNED]->(post:Post {id: $params.id}) + REMOVE post.pinned + DELETE previousRelations + RETURN post + `, + { params }, + ) + return unpinPostTransactionResponse.records.map((record) => record.get('post').properties) + }) + try { + ;[unpinnedPost] = await writeTxResultPromise + } finally { + session.close() + } + return unpinnedPost + }, + markTeaserAsViewed: async (_parent, params, context, _resolveInfo) => { + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const transactionResponse = await transaction.run( + ` + MATCH (post:Post { id: $params.id }) + MATCH (user:User { id: $userId }) + MERGE (user)-[relation:VIEWED_TEASER { }]->(post) + ON CREATE + SET relation.createdAt = toString(datetime()), + post.viewedTeaserCount = post.viewedTeaserCount + 1 + RETURN post + `, + { userId: context.user.id, params }, + ) + return transactionResponse.records.map((record) => record.get('post').properties) + }) + try { + const [post] = await writeTxResultPromise + post.viewedTeaserCount = post.viewedTeaserCount.low + return post + } finally { + session.close() + } + }, + }, + Post: { + ...Resolver('Post', { + undefinedToNull: [ + 'activityId', + 'objectId', + 'language', + 'pinnedAt', + 'pinned', + 'eventVenue', + 'eventLocation', + 'eventLocationName', + 'eventStart', + 'eventEnd', + 'eventIsOnline', + ], + hasMany: { + tags: '-[:TAGGED]->(related:Tag)', + categories: '-[:CATEGORIZED]->(related:Category)', + comments: '<-[:COMMENTS]-(related:Comment)', + shoutedBy: '<-[:SHOUTED]-(related:User)', + emotions: '<-[related:EMOTED]', + }, + hasOne: { + author: '<-[:WROTE]-(related:User)', + pinnedBy: '<-[:PINNED]-(related:User)', + image: '-[:HERO_IMAGE]->(related:Image)', + group: '-[:IN]->(related:Group)', + eventLocation: '-[:IS_IN]->(related:Location)', + }, + count: { + commentsCount: + '<-[:COMMENTS]-(related:Comment) WHERE NOT related.deleted = true AND NOT related.disabled = true', + shoutedCount: + '<-[:SHOUTED]-(related:User) WHERE NOT related.deleted = true AND NOT related.disabled = true', + emotionsCount: '<-[related:EMOTED]-(:User)', + }, + boolean: { + shoutedByCurrentUser: + 'MATCH(this)<-[:SHOUTED]-(related:User {id: $cypherParams.currentUserId}) RETURN COUNT(related) >= 1', + viewedTeaserByCurrentUser: + 'MATCH (this)<-[:VIEWED_TEASER]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', + }, + }), + relatedContributions: async (parent, params, context, resolveInfo) => { + if (typeof parent.relatedContributions !== 'undefined') return parent.relatedContributions + const { id } = parent + const session = context.driver.session() + + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const relatedContributionsTransactionResponse = await transaction.run( + ` + MATCH (p:Post {id: $id})-[:TAGGED|CATEGORIZED]->(categoryOrTag)<-[:TAGGED|CATEGORIZED]-(post:Post) + WHERE NOT post.deleted AND NOT post.disabled + RETURN DISTINCT post + LIMIT 10 + `, + { id }, + ) + return relatedContributionsTransactionResponse.records.map( + (record) => record.get('post').properties, + ) + }) + try { + const relatedContributions = await writeTxResultPromise + return relatedContributions + } finally { + session.close() + } + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/postsInGroups.spec.ts b/docs/backend/src/schema/resolvers/postsInGroups.spec.ts new file mode 100644 index 000000000..ba9041090 --- /dev/null +++ b/docs/backend/src/schema/resolvers/postsInGroups.spec.ts @@ -0,0 +1,1802 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { + createGroupMutation, + changeGroupMemberRoleMutation, + leaveGroupMutation, +} from '../../graphql/groups' +import { + createPostMutation, + postQuery, + filterPosts, + profilePagePosts, + searchPosts, +} from '../../graphql/posts' +import { createCommentMutation } from '../../graphql/comments' +// eslint-disable-next-line no-unused-vars +import { DESCRIPTION_WITHOUT_HTML_LENGTH_MIN } from '../../constants/groups' +import CONFIG from '../../config' +import { signupVerificationMutation } from '../../graphql/authentications' + +CONFIG.CATEGORIES_ACTIVE = false + +jest.mock('../../constants/groups', () => { + return { + __esModule: true, + DESCRIPTION_WITHOUT_HTML_LENGTH_MIN: 5, + } +}) + +const driver = getDriver() +const neode = getNeode() + +let query +let mutate +let anyUser +let allGroupsUser +let pendingUser +let publicUser +let closedUser +let hiddenUser +let authenticatedUser +let newUser + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('Posts in Groups', () => { + beforeAll(async () => { + anyUser = await Factory.build('user', { + id: 'any-user', + name: 'Any User', + about: 'I am just an ordinary user and do not belong to any group.', + }) + + allGroupsUser = await Factory.build('user', { + id: 'all-groups-user', + name: 'All Groups User', + about: 'I am a member of all groups.', + }) + pendingUser = await Factory.build('user', { + id: 'pending-user', + name: 'Pending User', + about: 'I am a pending member of all groups.', + }) + publicUser = await Factory.build('user', { + id: 'public-user', + name: 'Public User', + about: 'I am the owner of the public group.', + }) + + closedUser = await Factory.build('user', { + id: 'closed-user', + name: 'Private User', + about: 'I am the owner of the closed group.', + }) + + hiddenUser = await Factory.build('user', { + id: 'hidden-user', + name: 'Secret User', + about: 'I am the owner of the hidden group.', + }) + + authenticatedUser = await publicUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'public-group', + name: 'The Public Group', + about: 'The public group!', + description: 'Anyone can see the posts of this group.', + groupType: 'public', + actionRadius: 'regional', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'public-group', + userId: 'pending-user', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'public-group', + userId: 'all-groups-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await closedUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'closed-group', + name: 'The Closed Group', + about: 'The closed group!', + description: 'Only members of this group can see the posts of this group.', + groupType: 'closed', + actionRadius: 'regional', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'pending-user', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'all-groups-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await hiddenUser.toJson() + await mutate({ + mutation: createGroupMutation(), + variables: { + id: 'hidden-group', + name: 'The Hidden Group', + about: 'The hidden group!', + description: 'Only members of this group can see the posts of this group.', + groupType: 'hidden', + actionRadius: 'regional', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'pending-user', + roleInGroup: 'pending', + }, + }) + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'all-groups-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await anyUser.toJson() + await mutate({ + mutation: createPostMutation(), + variables: { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + }) + }) + + describe('creating posts in groups', () => { + describe('without membership of group', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('throws an error for public groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: 'A post to a pubic group', + content: 'I am posting into a public group without being a member of the group', + groupId: 'public-group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for closed groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: 'A post to a closed group', + content: 'I am posting into a closed group without being a member of the group', + groupId: 'closed-group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for hidden groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: 'A post to a closed group', + content: 'I am posting into a hidden group without being a member of the group', + groupId: 'hidden-group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + }) + + describe('as a pending member of group', () => { + beforeAll(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('throws an error for public groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: 'A post to a pubic group', + content: 'I am posting into a public group with a pending membership', + groupId: 'public-group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for closed groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: 'A post to a closed group', + content: 'I am posting into a closed group with a pending membership', + groupId: 'closed-group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for hidden groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'p2', + title: 'A post to a closed group', + content: 'I am posting into a hidden group with a pending membership', + groupId: 'hidden-group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + }) + + describe('as a member of group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + }) + + it('creates a post for public groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + groupId: 'public-group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + }, + errors: undefined, + }) + }) + + it('creates a post for closed groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + groupId: 'closed-group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + }, + }, + errors: undefined, + }) + }) + + it('creates a post for hidden groups', async () => { + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + groupId: 'hidden-group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('commenting posts in groups', () => { + describe('without membership of group', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('throws an error for public groups', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-public-group', + content: + 'I am commenting a post in a public group without being a member of the group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for closed groups', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-closed-group', + content: + 'I am commenting a post in a closed group without being a member of the group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for hidden groups', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-hidden-group', + content: + 'I am commenting a post in a hidden group without being a member of the group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + }) + + describe('as a pending member of group', () => { + beforeAll(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('throws an error for public groups', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-public-group', + content: 'I am commenting a post in a public group as a pending member of the group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for closed groups', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-closed-group', + content: 'I am commenting a post in a closed group as a pending member of the group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + + it('throws an error for hidden groups', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-hidden-group', + content: 'I am commenting a post in a hidden group as a pending member of the group', + }, + }), + ).resolves.toMatchObject({ + errors: expect.arrayContaining([expect.objectContaining({ message: 'Not Authorized!' })]), + }) + }) + }) + + describe('as a member of group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + }) + + it('comments a post in a public group', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-public-group', + content: 'I am commenting a post in a public group as a member of the group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreateComment: { + id: expect.any(String), + }, + }, + errors: undefined, + }) + }) + + it('comments a post in a closed group', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-closed-group', + content: 'I am commenting a post in a closed group as a member of the group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreateComment: { + id: expect.any(String), + }, + }, + errors: undefined, + }) + }) + + it('comments a post in a hidden group', async () => { + await expect( + mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post-to-hidden-group', + content: 'I am commenting a post in a hidden group as a member of the group', + }, + }), + ).resolves.toMatchObject({ + data: { + CreateComment: { + id: expect.any(String), + }, + }, + errors: undefined, + }) + }) + }) + }) + + describe('visibility of posts', () => { + describe('query post by ID', () => { + describe('without authentication', () => { + beforeAll(async () => { + authenticatedUser = null + }) + + it('shows a post of the public group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-public-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + + it('does not show a post of a closed group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-closed-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + + it('does not show a post of a hidden group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-hidden-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + }) + + describe('as new user', () => { + beforeAll(async () => { + await Factory.build('emailAddress', { + email: 'new-user@example.org', + nonce: '12345', + verifiedAt: null, + }) + const result = await mutate({ + mutation: signupVerificationMutation, + variables: { + name: 'New User', + slug: 'new-user', + nonce: '12345', + password: '1234', + about: 'I am a new user!', + email: 'new-user@example.org', + termsAndConditionsAgreedVersion: '0.0.1', + }, + }) + newUser = result.data.SignupVerification + authenticatedUser = newUser + }) + + it('shows a post of the public group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-public-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + + it('does not show a post of a closed group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-closed-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + + it('does not show a post of a hidden group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-hidden-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + }) + + describe('without membership of group', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('shows a post of the public group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-public-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + + it('does not show a post of a closed group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-closed-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + + it('does not show a post of a hidden group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-hidden-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + }) + + describe('with pending membership of group', () => { + beforeAll(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('shows a post of the public group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-public-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + + it('does not show a post of a closed group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-closed-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + + it('does not show a post of a hidden group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-hidden-group' } }), + ).resolves.toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + }) + + describe('as member of group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + }) + + it('shows post of the public group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-public-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + + it('shows post of a closed group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-closed-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + + it('shows post of a hidden group', async () => { + await expect( + query({ query: postQuery(), variables: { id: 'post-to-hidden-group' } }), + ).resolves.toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('filter posts', () => { + describe('without authentication', () => { + beforeAll(async () => { + authenticatedUser = null + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('as new user', () => { + beforeAll(async () => { + authenticatedUser = newUser + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('without membership of group', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('with pending membership of group', () => { + beforeAll(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('as member of group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + }) + + it('shows all posts', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('profile page posts', () => { + describe('without authentication', () => { + beforeAll(async () => { + authenticatedUser = null + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: profilePagePosts(), variables: {} }) + expect(result.data.profilePagePosts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + profilePagePosts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('as new user', () => { + beforeAll(async () => { + authenticatedUser = newUser + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: profilePagePosts(), variables: {} }) + expect(result.data.profilePagePosts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + profilePagePosts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('without membership of group', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: profilePagePosts(), variables: {} }) + expect(result.data.profilePagePosts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + profilePagePosts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('with pending membership of group', () => { + beforeAll(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('shows the post of the public group and the post without group', async () => { + const result = await query({ query: profilePagePosts(), variables: {} }) + expect(result.data.profilePagePosts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + profilePagePosts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('as member of group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + }) + + it('shows all posts', async () => { + const result = await query({ query: profilePagePosts(), variables: {} }) + expect(result.data.profilePagePosts).toHaveLength(4) + expect(result).toMatchObject({ + data: { + profilePagePosts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('searchPosts', () => { + describe('without authentication', () => { + beforeAll(async () => { + authenticatedUser = null + }) + + it('finds nothing', async () => { + const result = await query({ + query: searchPosts(), + variables: { + query: 'post', + postsOffset: 0, + firstPosts: 25, + }, + }) + expect(result.data.searchPosts.posts).toHaveLength(0) + expect(result).toMatchObject({ + data: { + searchPosts: { + postCount: 0, + posts: [], + }, + }, + }) + }) + }) + + describe('as new user', () => { + beforeAll(async () => { + authenticatedUser = newUser + }) + + it('finds the post of the public group and the post without group', async () => { + const result = await query({ + query: searchPosts(), + variables: { + query: 'post', + postsOffset: 0, + firstPosts: 25, + }, + }) + expect(result.data.searchPosts.posts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + searchPosts: { + postCount: 2, + posts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + }, + }) + }) + }) + + describe('without membership of group', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('finds the post of the public group and the post without group', async () => { + const result = await query({ + query: searchPosts(), + variables: { + query: 'post', + postsOffset: 0, + firstPosts: 25, + }, + }) + expect(result.data.searchPosts.posts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + searchPosts: { + postCount: 2, + posts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + }, + }) + }) + }) + + describe('with pending membership of group', () => { + beforeAll(async () => { + authenticatedUser = await pendingUser.toJson() + }) + + it('finds the post of the public group and the post without group', async () => { + const result = await query({ + query: searchPosts(), + variables: { + query: 'post', + postsOffset: 0, + firstPosts: 25, + }, + }) + expect(result.data.searchPosts.posts).toHaveLength(2) + expect(result).toMatchObject({ + data: { + searchPosts: { + postCount: 2, + posts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + ]), + }, + }, + }) + }) + }) + + describe('as member of group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + }) + + it('finds all posts', async () => { + const result = await query({ + query: searchPosts(), + variables: { + query: 'post', + postsOffset: 0, + firstPosts: 25, + }, + }) + expect(result.data.searchPosts.posts).toHaveLength(4) + expect(result).toMatchObject({ + data: { + searchPosts: { + postCount: 4, + posts: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + }, + ]), + }, + }, + }) + }) + }) + }) + }) + + describe('changes of group membership', () => { + describe('pending member becomes usual member', () => { + describe('of closed group', () => { + beforeAll(async () => { + authenticatedUser = await closedUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'pending-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await pendingUser.toJson() + }) + + it('shows the posts of the closed group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(3) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('of hidden group', () => { + beforeAll(async () => { + authenticatedUser = await hiddenUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'pending-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await pendingUser.toJson() + }) + + it('shows all the posts', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('usual member becomes pending', () => { + describe('of closed group', () => { + beforeAll(async () => { + authenticatedUser = await closedUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'pending-user', + roleInGroup: 'pending', + }, + }) + authenticatedUser = await pendingUser.toJson() + }) + + it('does not show the posts of the closed group anymore', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(3) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('of hidden group', () => { + beforeAll(async () => { + authenticatedUser = await hiddenUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'pending-user', + roleInGroup: 'pending', + }, + }) + authenticatedUser = await pendingUser.toJson() + }) + + it('shows only the public posts', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('usual member leaves', () => { + describe('public group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + await mutate({ + mutation: leaveGroupMutation(), + variables: { + groupId: 'public-group', + userId: 'all-groups-user', + }, + }) + }) + + it('still shows the posts of the public group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('closed group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + await mutate({ + mutation: leaveGroupMutation(), + variables: { + groupId: 'closed-group', + userId: 'all-groups-user', + }, + }) + }) + + it('stil shows the posts of the closed group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('hidden group', () => { + beforeAll(async () => { + authenticatedUser = await allGroupsUser.toJson() + await mutate({ + mutation: leaveGroupMutation(), + variables: { + groupId: 'hidden-group', + userId: 'all-groups-user', + }, + }) + }) + + it('still shows the post of the hidden group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('any user joins', () => { + describe('closed group', () => { + beforeAll(async () => { + authenticatedUser = await closedUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'closed-group', + userId: 'all-groups-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await allGroupsUser.toJson() + }) + + it('shows the posts of the closed group', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('hidden group', () => { + beforeAll(async () => { + authenticatedUser = await hiddenUser.toJson() + await mutate({ + mutation: changeGroupMemberRoleMutation(), + variables: { + groupId: 'hidden-group', + userId: 'all-groups-user', + roleInGroup: 'usual', + }, + }) + authenticatedUser = await allGroupsUser.toJson() + }) + + it('shows all posts', async () => { + const result = await query({ query: filterPosts(), variables: {} }) + expect(result.data.Post).toHaveLength(4) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-public-group', + title: 'A post to a public group', + content: 'I am posting into a public group as a member of the group', + eventStart: null, + }, + { + id: 'post-without-group', + title: 'A post without a group', + content: 'I am a user who does not belong to a group yet.', + eventStart: null, + }, + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('filter posts in my groups', () => { + describe('without any posts in groups', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('finds no posts', async () => { + const result = await query({ + query: filterPosts(), + variables: { filter: { postsInMyGroups: true } }, + }) + expect(result.data.Post).toHaveLength(0) + expect(result).toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + }) + + describe('with posts in groups', () => { + beforeAll(async () => { + // member of hidden-group and closed-group + authenticatedUser = await allGroupsUser.toJson() + }) + + it('finds two posts', async () => { + const result = await query({ + query: filterPosts(), + variables: { filter: { postsInMyGroups: true } }, + }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + eventStart: null, + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + eventStart: null, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/registration.spec.ts b/docs/backend/src/schema/resolvers/registration.spec.ts new file mode 100644 index 000000000..54e7f1ba7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/registration.spec.ts @@ -0,0 +1,346 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getDriver, getNeode } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' +import CONFIG from '../../config' + +const neode = getNeode() + +let mutate +let authenticatedUser +let variables +const driver = getDriver() + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(async () => { + variables = {} +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('Signup', () => { + const mutation = gql` + mutation ($email: String!, $inviteCode: String) { + Signup(email: $email, inviteCode: $inviteCode) { + email + } + } + ` + beforeEach(() => { + variables = { ...variables, email: 'someuser@example.org' } + }) + + describe('unauthenticated', () => { + beforeEach(() => { + authenticatedUser = null + }) + + it('throws AuthorizationError', async () => { + CONFIG.INVITE_REGISTRATION = false + CONFIG.PUBLIC_REGISTRATION = false + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + + describe('as admin', () => { + beforeEach(async () => { + const admin = await Factory.build( + 'user', + { + role: 'admin', + }, + { + email: 'admin@example.org', + password: '1234', + }, + ) + authenticatedUser = await admin.toJson() + }) + + it('is allowed to signup users by email', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { Signup: { email: 'someuser@example.org' } }, + errors: undefined, + }) + }) + + describe('creates a EmailAddress node', () => { + it('with `createdAt` attribute', async () => { + await mutate({ mutation, variables }) + let emailAddress = await neode.first('EmailAddress', { email: 'someuser@example.org' }) + emailAddress = await emailAddress.toJson() + expect(emailAddress.createdAt).toBeTruthy() + expect(Date.parse(emailAddress.createdAt)).toEqual(expect.any(Number)) + }) + + it('with a cryptographic `nonce`', async () => { + await mutate({ mutation, variables }) + let emailAddress = await neode.first('EmailAddress', { email: 'someuser@example.org' }) + emailAddress = await emailAddress.toJson() + expect(emailAddress.nonce).toEqual(expect.any(String)) + }) + + describe('if the email already exists', () => { + let emailAddress + beforeEach(async () => { + emailAddress = await Factory.build('emailAddress', { + email: 'someuser@example.org', + verifiedAt: null, + }) + }) + + describe('and the user has registered already', () => { + beforeEach(async () => { + const user = await Factory.build('userWithoutEmailAddress') + await emailAddress.relateTo(user, 'belongsTo') + }) + + it('does not throw UserInputError error', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { Signup: { email: 'someuser@example.org' } }, + }) + }) + }) + + describe('but the user has not yet registered', () => { + it('resolves with the already existing email', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { Signup: { email: 'someuser@example.org' } }, + errors: undefined, + }) + }) + + it('creates no additional `EmailAddress` node', async () => { + // admin account and the already existing user + await expect(neode.all('EmailAddress')).resolves.toHaveLength(2) + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { Signup: { email: 'someuser@example.org' } }, + errors: undefined, + }) + await expect(neode.all('EmailAddress')).resolves.toHaveLength(2) + }) + }) + }) + }) + }) + }) +}) + +describe('SignupVerification', () => { + const mutation = gql` + mutation ( + $name: String! + $password: String! + $email: String! + $nonce: String! + $about: String + $termsAndConditionsAgreedVersion: String! + $locale: String + ) { + SignupVerification( + name: $name + password: $password + email: $email + nonce: $nonce + about: $about + termsAndConditionsAgreedVersion: $termsAndConditionsAgreedVersion + locale: $locale + ) { + id + termsAndConditionsAgreedVersion + termsAndConditionsAgreedAt + } + } + ` + describe('given valid password and email', () => { + beforeEach(async () => { + variables = { + ...variables, + nonce: '12345', + name: 'John Doe', + password: '123', + email: 'john@example.org', + termsAndConditionsAgreedVersion: '0.1.0', + locale: 'en', + } + }) + + describe('unauthenticated', () => { + beforeEach(async () => { + authenticatedUser = null + }) + + describe('EmailAddress exists, but is already related to a user account', () => { + beforeEach(async () => { + const { email, nonce } = variables + const [emailAddress, user] = await Promise.all([ + neode.model('EmailAddress').create({ email, nonce }), + neode + .model('User') + .create({ name: 'Somebody', password: '1234', email: 'john@example.org' }), + ]) + await emailAddress.relateTo(user, 'belongsTo') + }) + + describe('sending a valid nonce', () => { + beforeEach(() => { + variables = { ...variables, nonce: '12345' } + }) + + it('rejects', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Invalid email or nonce' }], + }) + }) + }) + }) + + describe('disconnected EmailAddress exists', () => { + beforeEach(async () => { + const args = { + email: 'john@example.org', + nonce: '12345', + } + await neode.model('EmailAddress').create(args) + }) + + describe('sending a valid nonce', () => { + it('creates a user account', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + SignupVerification: expect.objectContaining({ + id: expect.any(String), + }), + }, + }) + }) + + it('sets `verifiedAt` attribute of EmailAddress', async () => { + await mutate({ mutation, variables }) + const email = await neode.first('EmailAddress', { email: 'john@example.org' }) + await expect(email.toJson()).resolves.toEqual( + expect.objectContaining({ + verifiedAt: expect.any(String), + }), + ) + }) + + it('connects User with EmailAddress', async () => { + const cypher = ` + MATCH(email:EmailAddress)-[:BELONGS_TO]->(u:User {name: $name}) + RETURN email + ` + await mutate({ mutation, variables }) + const { records: emails } = await neode.cypher(cypher, { name: 'John Doe' }) + expect(emails).toHaveLength(1) + }) + + it('sets `about` attribute of User', async () => { + variables = { ...variables, about: 'Find this description in the user profile' } + await mutate({ mutation, variables }) + const user = await neode.first('User', { name: 'John Doe' }) + await expect(user.toJson()).resolves.toMatchObject({ + about: 'Find this description in the user profile', + }) + }) + + it('allowing the about field to be an empty string', async () => { + variables = { ...variables, about: '' } + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + SignupVerification: expect.objectContaining({ + id: expect.any(String), + }), + }, + }) + }) + + it('marks the EmailAddress as primary', async () => { + const cypher = ` + MATCH(email:EmailAddress)<-[:PRIMARY_EMAIL]-(u:User {name: $name}) + RETURN email + ` + await mutate({ mutation, variables }) + const { records: emails } = await neode.cypher(cypher, { name: 'John Doe' }) + expect(emails).toHaveLength(1) + }) + + it('updates termsAndConditionsAgreedVersion', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + SignupVerification: expect.objectContaining({ + termsAndConditionsAgreedVersion: '0.1.0', + }), + }, + }) + }) + + it('updates termsAndConditionsAgreedAt', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + data: { + SignupVerification: expect.objectContaining({ + termsAndConditionsAgreedAt: expect.any(String), + }), + }, + }) + }) + + it('rejects if version of terms and conditions is missing', async () => { + variables = { ...variables, termsAndConditionsAgreedVersion: null } + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + errors: [ + { + message: + 'Variable "$termsAndConditionsAgreedVersion" of non-null type "String!" must not be null.', + }, + ], + }) + }) + + it('rejects if version of terms and conditions has wrong format', async () => { + variables = { ...variables, termsAndConditionsAgreedVersion: 'invalid version format' } + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Invalid version format!' }], + }) + }) + }) + + describe('sending invalid nonce', () => { + beforeEach(() => { + variables = { ...variables, nonce: 'wut2' } + }) + + it('rejects', async () => { + await expect(mutate({ mutation, variables })).resolves.toMatchObject({ + errors: [{ message: 'Invalid email or nonce' }], + }) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/registration.ts b/docs/backend/src/schema/resolvers/registration.ts new file mode 100644 index 000000000..8d5aac346 --- /dev/null +++ b/docs/backend/src/schema/resolvers/registration.ts @@ -0,0 +1,113 @@ +import { UserInputError } from 'apollo-server' +import { getNeode } from '../../db/neo4j' +import encryptPassword from '../../helpers/encryptPassword' +import generateNonce from './helpers/generateNonce' +import existingEmailAddress from './helpers/existingEmailAddress' +import normalizeEmail from './helpers/normalizeEmail' + +const neode = getNeode() + +export default { + Mutation: { + Signup: async (_parent, args, context) => { + args.nonce = generateNonce() + args.email = normalizeEmail(args.email) + let emailAddress = await existingEmailAddress({ args, context }) + /* + if (emailAddress.user) { + // what to do? + } + */ + if (emailAddress.alreadyExistingEmail) return emailAddress.alreadyExistingEmail + try { + emailAddress = await neode.create('EmailAddress', args) + return emailAddress.toJson() + } catch (e) { + throw new UserInputError(e.message) + } + }, + SignupVerification: async (_parent, args, context) => { + const { termsAndConditionsAgreedVersion } = args + const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g + if (!regEx.test(termsAndConditionsAgreedVersion)) { + throw new UserInputError('Invalid version format!') + } + args.termsAndConditionsAgreedAt = new Date().toISOString() + + let { nonce, email, inviteCode } = args + email = normalizeEmail(email) + delete args.nonce + delete args.email + delete args.inviteCode + args = encryptPassword(args) + + const { driver } = context + const session = driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const createUserTransactionResponse = await transaction.run(signupCypher(inviteCode), { + args, + nonce, + email, + inviteCode, + }) + const [user] = createUserTransactionResponse.records.map((record) => record.get('user')) + if (!user) throw new UserInputError('Invalid email or nonce') + return user + }) + try { + const user = await writeTxResultPromise + return user + } catch (e) { + if (e.code === 'Neo.ClientError.Schema.ConstraintValidationFailed') + throw new UserInputError('User with this slug already exists!') + throw new UserInputError(e.message) + } finally { + session.close() + } + }, + }, +} + +const signupCypher = (inviteCode) => { + let optionalMatch = '' + let optionalMerge = '' + if (inviteCode) { + optionalMatch = ` + OPTIONAL MATCH + (inviteCode:InviteCode {code: $inviteCode})<-[:GENERATED]-(host:User) + ` + optionalMerge = ` + MERGE (user)-[:REDEEMED { createdAt: toString(datetime()) }]->(inviteCode) + MERGE (host)-[:INVITED { createdAt: toString(datetime()) }]->(user) + MERGE (user)-[:FOLLOWS { createdAt: toString(datetime()) }]->(host) + MERGE (host)-[:FOLLOWS { createdAt: toString(datetime()) }]->(user) + ` + } + const cypher = ` + MATCH (email:EmailAddress {nonce: $nonce, email: $email}) + WHERE NOT (email)-[:BELONGS_TO]->() + ${optionalMatch} + CREATE (user:User) + MERGE (user)-[:PRIMARY_EMAIL]->(email) + MERGE (user)<-[:BELONGS_TO]-(email) + ${optionalMerge} + SET user += $args + SET user.id = randomUUID() + SET user.role = 'user' + SET user.createdAt = toString(datetime()) + SET user.updatedAt = toString(datetime()) + SET user.allowEmbedIframes = false + SET user.showShoutsPublicly = false + SET user.sendNotificationEmails = true + SET email.verifiedAt = toString(datetime()) + WITH user + OPTIONAL MATCH (post:Post)-[:IN]->(group:Group) + WHERE NOT group.groupType = 'public' + WITH user, collect(post) AS invisiblePosts + FOREACH (invisiblePost IN invisiblePosts | + MERGE (user)-[:CANNOT_SEE]->(invisiblePost) + ) + RETURN user {.*} + ` + return cypher +} diff --git a/docs/backend/src/schema/resolvers/reports.spec.ts b/docs/backend/src/schema/resolvers/reports.spec.ts new file mode 100644 index 000000000..bc47778c1 --- /dev/null +++ b/docs/backend/src/schema/resolvers/reports.spec.ts @@ -0,0 +1,818 @@ +import { createTestClient } from 'apollo-server-testing' +import createServer from '../.././server' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getDriver, getNeode } from '../../db/neo4j' + +const instance = getNeode() +const driver = getDriver() + +describe('file a report on a resource', () => { + let authenticatedUser, currentUser, mutate, query, moderator, abusiveUser, otherReportingUser + const categoryIds = ['cat9'] + const fileReportMutation = gql` + mutation ($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + fileReport( + resourceId: $resourceId + reasonCategory: $reasonCategory + reasonDescription: $reasonDescription + ) { + createdAt + reasonCategory + reasonDescription + reportId + resource { + __typename + ... on User { + name + } + ... on Post { + title + } + ... on Comment { + content + } + } + } + } + ` + const variables = { + resourceId: 'invalid', + reasonCategory: 'other', + reasonDescription: 'Violates code of conduct !!!', + } + const reportsQuery = gql` + query ($closed: Boolean) { + reports(orderBy: createdAt_desc, closed: $closed) { + id + createdAt + updatedAt + rule + disable + closed + resource { + __typename + ... on User { + id + } + ... on Post { + id + } + ... on Comment { + id + } + } + filed { + submitter { + id + } + createdAt + reasonCategory + reasonDescription + } + } + } + ` + const reviewMutation = gql` + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + review(resourceId: $resourceId, disable: $disable, closed: $closed) { + createdAt + resource { + __typename + ... on User { + id + disabled + } + ... on Post { + id + disabled + } + ... on Comment { + id + disabled + } + } + report { + disable + } + } + } + ` + + beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode: instance, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + query = createTestClient(server).query + }) + + afterAll(async () => { + await cleanDatabase() + driver.close() + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('report a resource', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: fileReportMutation, variables })).resolves.toMatchObject({ + data: { fileReport: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + currentUser = await Factory.build( + 'user', + { + id: 'current-user-id', + role: 'user', + }, + { + email: 'test@example.org', + password: '1234', + }, + ) + moderator = await Factory.build( + 'user', + { + id: 'moderator-id', + role: 'moderator', + }, + { + email: 'moderator@example.org', + password: '1234', + }, + ) + otherReportingUser = await Factory.build( + 'user', + { + id: 'other-reporting-user-id', + role: 'user', + }, + { + email: 'reporting@example.org', + password: '1234', + }, + ) + await Factory.build( + 'user', + { + id: 'abusive-user-id', + role: 'user', + name: 'abusive-user', + }, + { + email: 'abusive-user@example.org', + }, + ) + await instance.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) + + authenticatedUser = await currentUser.toJson() + }) + + describe('invalid resource id', () => { + it('returns null', async () => { + await expect(mutate({ mutation: fileReportMutation, variables })).resolves.toMatchObject({ + data: { fileReport: null }, + errors: undefined, + }) + }) + }) + + describe('valid resource', () => { + describe('creates report', () => { + it('which belongs to resource', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + reportId: expect.any(String), + resource: { + name: 'abusive-user', + }, + }, + }, + errors: undefined, + }) + }) + + it('only one report for multiple reports on the same resource', async () => { + const firstReport = await mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }) + authenticatedUser = await otherReportingUser.toJson() + const secondReport = await mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }) + + expect(firstReport.data.fileReport.reportId).toEqual( + secondReport.data.fileReport.reportId, + ) + }) + + describe('report properties are set correctly', () => { + const reportsCypherQuery = + 'MATCH (resource:User {id: $resourceId})<-[:BELONGS_TO]-(report:Report {closed: false})<-[filed:FILED]-(user:User {id: $currentUserId}) RETURN report' + + it('with the rule for how the report will be decided', async () => { + await mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }) + + const reportsCypherQueryResponse = await instance.cypher(reportsCypherQuery, { + resourceId: 'abusive-user-id', + currentUserId: authenticatedUser.id, + }) + expect(reportsCypherQueryResponse.records).toHaveLength(1) + const [reportProperties] = reportsCypherQueryResponse.records.map( + (record) => record.get('report').properties, + ) + expect(reportProperties).toMatchObject({ rule: 'latestReviewUpdatedAtRules' }) + }) + + describe('with overtaken disabled from resource in disable property', () => { + it('disable is false', async () => { + await mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }) + + const reportsCypherQueryResponse = await instance.cypher(reportsCypherQuery, { + resourceId: 'abusive-user-id', + currentUserId: authenticatedUser.id, + }) + expect(reportsCypherQueryResponse.records).toHaveLength(1) + const [reportProperties] = reportsCypherQueryResponse.records.map( + (record) => record.get('report').properties, + ) + expect(reportProperties).toMatchObject({ disable: false }) + }) + + it('disable is true', async () => { + // first time filling a report to enable a moderator the disable the resource + await mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }) + authenticatedUser = await moderator.toJson() + await mutate({ + mutation: reviewMutation, + variables: { + resourceId: 'abusive-user-id', + disable: true, + closed: true, + }, + }) + authenticatedUser = await currentUser.toJson() + // second time filling a report to see if the "disable is true" of the resource is overtaken + await mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }) + + const reportsCypherQueryResponse = await instance.cypher(reportsCypherQuery, { + resourceId: 'abusive-user-id', + currentUserId: authenticatedUser.id, + }) + expect(reportsCypherQueryResponse.records).toHaveLength(1) + const [reportProperties] = reportsCypherQueryResponse.records.map( + (record) => record.get('report').properties, + ) + expect(reportProperties).toMatchObject({ disable: true }) + }) + }) + }) + + it.todo('creates multiple filed reports') + }) + + describe('reported resource is a user', () => { + it('returns __typename "User"', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + resource: { + __typename: 'User', + }, + }, + }, + errors: undefined, + }) + }) + + it('returns user attribute info', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + resource: { + __typename: 'User', + name: 'abusive-user', + }, + }, + }, + errors: undefined, + }) + }) + + it('returns a createdAt', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { ...variables, resourceId: 'abusive-user-id' }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + createdAt: expect.any(String), + }, + }, + errors: undefined, + }) + }) + + it('returns the reason category', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'abusive-user-id', + reasonCategory: 'criminal_behavior_violation_german_law', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + reasonCategory: 'criminal_behavior_violation_german_law', + }, + }, + errors: undefined, + }) + }) + + it('gives an error if the reason category is not in enum "ReasonCategory"', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'abusive-user-id', + reasonCategory: 'category_missing_from_enum_reason_category', + }, + }), + ).resolves.toMatchObject({ + data: undefined, + errors: [ + { + message: + 'Variable "$reasonCategory" got invalid value "category_missing_from_enum_reason_category"; Expected type ReasonCategory.', + }, + ], + }) + }) + + it('returns the reason description', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'abusive-user-id', + reasonDescription: 'My reason!', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + reasonDescription: 'My reason!', + }, + }, + errors: undefined, + }) + }) + + it('sanitizes the reason description', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'abusive-user-id', + reasonDescription: 'My reason !', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + reasonDescription: 'My reason !', + }, + }, + errors: undefined, + }) + }) + }) + + describe('reported resource is a post', () => { + beforeEach(async () => { + await Factory.build( + 'post', + { + id: 'post-to-report-id', + title: 'This is a post that is going to be reported', + }, + { + author: currentUser, + categoryIds, + }, + ) + }) + + it('returns type "Post"', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'post-to-report-id', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + resource: { + __typename: 'Post', + }, + }, + }, + errors: undefined, + }) + }) + + it('returns resource in post attribute', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'post-to-report-id', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + resource: { + __typename: 'Post', + title: 'This is a post that is going to be reported', + }, + }, + }, + errors: undefined, + }) + }) + }) + + describe('reported resource is a comment', () => { + beforeEach(async () => { + await Factory.build( + 'post', + { + id: 'p1', + title: 'post to comment on', + content: 'please comment on me', + }, + { + categoryIds, + author: currentUser, + }, + ) + await Factory.build( + 'comment', + { + id: 'comment-to-report-id', + content: 'Post comment to be reported.', + }, + { + author: currentUser, + postId: 'p1', + }, + ) + }) + + it('returns type "Comment"', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'comment-to-report-id', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + resource: { + __typename: 'Comment', + }, + }, + }, + errors: undefined, + }) + }) + + it('returns resource in comment attribute', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'comment-to-report-id', + }, + }), + ).resolves.toMatchObject({ + data: { + fileReport: { + resource: { + __typename: 'Comment', + content: 'Post comment to be reported.', + }, + }, + }, + errors: undefined, + }) + }) + }) + + describe('reported resource is a tag', () => { + beforeEach(async () => { + await Factory.build('tag', { + id: 'tag-to-report-id', + }) + }) + + it('returns null', async () => { + await expect( + mutate({ + mutation: fileReportMutation, + variables: { + ...variables, + resourceId: 'tag-to-report-id', + }, + }), + ).resolves.toMatchObject({ + data: { fileReport: null }, + errors: undefined, + }) + }) + }) + }) + }) + }) + + describe('query for reported resource', () => { + beforeEach(async () => { + authenticatedUser = null + moderator = await Factory.build( + 'user', + { + id: 'moderator-1', + role: 'moderator', + }, + { + email: 'moderator@example.org', + password: '1234', + }, + ) + currentUser = await Factory.build( + 'user', + { + id: 'current-user-id', + role: 'user', + }, + { + email: 'current.user@example.org', + password: '1234', + }, + ) + abusiveUser = await Factory.build( + 'user', + { + id: 'abusive-user-1', + role: 'user', + name: 'abusive-user', + }, + { + email: 'abusive-user@example.org', + }, + ) + await instance.create('Category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) + + await Promise.all([ + Factory.build( + 'post', + { + id: 'abusive-post-1', + content: 'Interesting Knowledge', + }, + { + categoryIds, + author: abusiveUser, + }, + ), + Factory.build( + 'post', + { + id: 'post-2', + content: 'More things to do …', + }, + { + author: moderator, + categoryIds, + }, + ), + Factory.build( + 'post', + { + id: 'post-3', + content: 'I am at school …', + }, + { + categoryIds, + author: currentUser, + }, + ), + ]) + await Promise.all([ + Factory.build( + 'comment', + { + id: 'abusive-comment-1', + }, + { + postId: 'post-2', + author: currentUser, + }, + ), + ]) + authenticatedUser = await currentUser.toJson() + await Promise.all([ + mutate({ + mutation: fileReportMutation, + variables: { + resourceId: 'abusive-post-1', + reasonCategory: 'other', + reasonDescription: 'This comment is bigoted', + }, + }), + mutate({ + mutation: fileReportMutation, + variables: { + resourceId: 'abusive-comment-1', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This post is bigoted', + }, + }), + mutate({ + mutation: fileReportMutation, + variables: { + resourceId: 'abusive-user-1', + reasonCategory: 'doxing', + reasonDescription: 'This user is harassing me with bigoted remarks', + }, + }), + ]) + authenticatedUser = null + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(query({ query: reportsQuery })).resolves.toMatchObject({ + data: { reports: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + it('role "user" gets no reports', async () => { + authenticatedUser = await currentUser.toJson() + await expect(query({ query: reportsQuery })).resolves.toMatchObject({ + data: { reports: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + + it('role "moderator" gets reports', async () => { + const expected = { + reports: expect.arrayContaining([ + expect.objectContaining({ + id: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String), + closed: false, + resource: { + __typename: 'User', + id: 'abusive-user-1', + }, + filed: expect.arrayContaining([ + expect.objectContaining({ + submitter: expect.objectContaining({ + id: 'current-user-id', + }), + createdAt: expect.any(String), + reasonCategory: 'doxing', + reasonDescription: 'This user is harassing me with bigoted remarks', + }), + ]), + }), + expect.objectContaining({ + id: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String), + closed: false, + resource: { + __typename: 'Post', + id: 'abusive-post-1', + }, + filed: expect.arrayContaining([ + expect.objectContaining({ + submitter: expect.objectContaining({ + id: 'current-user-id', + }), + createdAt: expect.any(String), + reasonCategory: 'other', + reasonDescription: 'This comment is bigoted', + }), + ]), + }), + expect.objectContaining({ + id: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String), + closed: false, + resource: { + __typename: 'Comment', + id: 'abusive-comment-1', + }, + filed: expect.arrayContaining([ + expect.objectContaining({ + submitter: expect.objectContaining({ + id: 'current-user-id', + }), + createdAt: expect.any(String), + reasonCategory: 'discrimination_etc', + reasonDescription: 'This post is bigoted', + }), + ]), + }), + ]), + } + authenticatedUser = await moderator.toJson() + const { data } = await query({ query: reportsQuery }) + expect(data).toEqual(expected) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/reports.ts b/docs/backend/src/schema/resolvers/reports.ts new file mode 100644 index 000000000..f7945e060 --- /dev/null +++ b/docs/backend/src/schema/resolvers/reports.ts @@ -0,0 +1,186 @@ +import log from './helpers/databaseLogger' + +export default { + Mutation: { + fileReport: async (_parent, params, context, _resolveInfo) => { + const { resourceId, reasonCategory, reasonDescription } = params + const { driver, user } = context + const session = driver.session() + const fileReportWriteTxResultPromise = session.writeTransaction(async (transaction) => { + const fileReportTransactionResponse = await transaction.run( + ` + MATCH (submitter:User {id: $submitterId}) + MATCH (resource {id: $resourceId}) + WHERE resource:User OR resource:Post OR resource:Comment + MERGE (resource)<-[:BELONGS_TO]-(report:Report {closed: false}) + ON CREATE SET report.id = randomUUID(), report.createdAt = $createdAt, report.updatedAt = $createdAt, report.rule = 'latestReviewUpdatedAtRules', report.disable = resource.disabled, report.closed = false + WITH submitter, resource, report + CREATE (report)<-[filed:FILED {createdAt: $createdAt, reasonCategory: $reasonCategory, reasonDescription: $reasonDescription}]-(submitter) + + WITH filed, report, resource {.*, __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'User']][0]} AS finalResource + RETURN filed {.*, reportId: report.id, resource: properties(finalResource)} AS filedReport + `, + { + resourceId, + submitterId: user.id, + createdAt: new Date().toISOString(), + reasonCategory, + reasonDescription, + }, + ) + log(fileReportTransactionResponse) + return fileReportTransactionResponse.records.map((record) => record.get('filedReport')) + }) + try { + const [filedReport] = await fileReportWriteTxResultPromise + return filedReport || null + } finally { + session.close() + } + }, + }, + Query: { + reports: async (_parent, params, context, _resolveInfo) => { + const { driver } = context + const session = driver.session() + let orderByClause, filterClause + switch (params.orderBy) { + case 'createdAt_asc': + orderByClause = 'ORDER BY report.createdAt ASC' + break + case 'createdAt_desc': + orderByClause = 'ORDER BY report.createdAt DESC' + break + default: + orderByClause = '' + } + + switch (params.reviewed) { + case true: + filterClause = 'AND ((report)<-[:REVIEWED]-(:User))' + break + case false: + filterClause = 'AND NOT ((report)<-[:REVIEWED]-(:User))' + break + default: + filterClause = '' + } + + switch (params.closed) { + case true: + filterClause = 'AND report.closed = true' + break + case false: + filterClause = 'AND report.closed = false' + break + default: + break + } + + const offset = + 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 reportsTransactionResponse = await transaction.run( + // !!! this Cypher query returns multiple reports on the same resource! i will create an issue for refactoring (bug fixing) + ` + MATCH (report:Report)-[:BELONGS_TO]->(resource) + WHERE (resource:User OR resource:Post OR resource:Comment) + ${filterClause} + WITH report, resource, + [(submitter:User)-[filed:FILED]->(report) | filed {.*, submitter: properties(submitter)} ] as filed, + [(moderator:User)-[reviewed:REVIEWED]->(report) | reviewed {.*, moderator: properties(moderator)} ] as reviewed, + [(resource)<-[:WROTE]-(author:User) | author {.*} ] as optionalAuthors, + [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author), postType: [l IN labels(post) WHERE NOT l = 'Post']} ] as optionalCommentedPosts, + resource {.*, __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'User']][0] } as resourceWithType + WITH report, optionalAuthors, optionalCommentedPosts, reviewed, filed, + resourceWithType {.*, post: optionalCommentedPosts[0], author: optionalAuthors[0] } as finalResource + RETURN report {.*, resource: finalResource, filed: filed, reviewed: reviewed } + ${orderByClause} + ${offset} ${limit} + `, + ) + log(reportsTransactionResponse) + return reportsTransactionResponse.records.map((record) => record.get('report')) + }) + try { + const reports = await reportsReadTxPromise + return reports || [] + } finally { + session.close() + } + }, + }, + Report: { + filed: async (parent, _params, context, _resolveInfo) => { + if (typeof parent.filed !== 'undefined') return parent.filed + const session = context.driver.session() + const { id } = parent + let filed + const readTxPromise = session.readTransaction(async (transaction) => { + const filedReportsTransactionResponse = await transaction.run( + ` + MATCH (submitter:User)-[filed:FILED]->(report:Report {id: $id}) + RETURN filed, submitter + `, + { id }, + ) + log(filedReportsTransactionResponse) + return filedReportsTransactionResponse.records.map((record) => ({ + submitter: record.get('submitter').properties, + filed: record.get('filed').properties, + })) + }) + try { + const filedReports = await readTxPromise + filed = filedReports.map((reportedRecord) => { + const { submitter, filed } = reportedRecord + const relationshipWithNestedAttributes = { + ...filed, + submitter, + } + return relationshipWithNestedAttributes + }) + } finally { + session.close() + } + return filed + }, + reviewed: async (parent, _params, context, _resolveInfo) => { + if (typeof parent.reviewed !== 'undefined') return parent.reviewed + const session = context.driver.session() + const { id } = parent + let reviewed + const readTxPromise = session.readTransaction(async (transaction) => { + const reviewedReportsTransactionResponse = await transaction.run( + ` + MATCH (resource)<-[:BELONGS_TO]-(report:Report {id: $id})<-[review:REVIEWED]-(moderator:User) + RETURN moderator, review + ORDER BY report.updatedAt DESC, review.updatedAt DESC + `, + { id }, + ) + log(reviewedReportsTransactionResponse) + return reviewedReportsTransactionResponse.records.map((record) => ({ + review: record.get('review').properties, + moderator: record.get('moderator').properties, + })) + }) + try { + const reviewedReports = await readTxPromise + reviewed = reviewedReports.map((reportedRecord) => { + const { review, moderator } = reportedRecord + const relationshipWithNestedAttributes = { + ...review, + moderator, + } + return relationshipWithNestedAttributes + }) + } finally { + session.close() + } + return reviewed + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/rewards.spec.ts b/docs/backend/src/schema/resolvers/rewards.spec.ts new file mode 100644 index 000000000..06fe87ec0 --- /dev/null +++ b/docs/backend/src/schema/resolvers/rewards.spec.ts @@ -0,0 +1,351 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +const driver = getDriver() +const instance = getNeode() + +let authenticatedUser, regularUser, administrator, moderator, badge, query, mutate + +describe('rewards', () => { + const variables = { + from: 'indiegogo_en_rhino', + to: 'regular-user-id', + } + + beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode: instance, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate + }) + + afterAll(async () => { + await cleanDatabase() + driver.close() + }) + + beforeEach(async () => { + regularUser = await Factory.build( + 'user', + { + id: 'regular-user-id', + role: 'user', + }, + { + email: 'user@example.org', + password: '1234', + }, + ) + moderator = await Factory.build( + 'user', + { + id: 'moderator-id', + role: 'moderator', + }, + { + email: 'moderator@example.org', + }, + ) + administrator = await Factory.build( + 'user', + { + id: 'admin-id', + role: 'admin', + }, + { + email: 'admin@example.org', + }, + ) + badge = await Factory.build('badge', { + id: 'indiegogo_en_rhino', + type: 'crowdfunding', + status: 'permanent', + icon: '/img/badges/indiegogo_en_rhino.svg', + }) + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('reward', () => { + const rewardMutation = gql` + mutation ($from: ID!, $to: ID!) { + reward(badgeKey: $from, userId: $to) { + id + badges { + id + } + } + } + ` + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: rewardMutation, variables })).resolves.toMatchObject({ + data: { reward: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated admin', () => { + beforeEach(async () => { + authenticatedUser = await administrator.toJson() + }) + + describe('badge for id does not exist', () => { + it('rejects with an informative error message', async () => { + await expect( + mutate({ + mutation: rewardMutation, + variables: { to: 'regular-user-id', from: 'non-existent-badge-id' }, + }), + ).resolves.toMatchObject({ + data: { reward: null }, + errors: [{ message: "Couldn't find a badge with that id" }], + }) + }) + }) + + describe('non-existent user', () => { + it('rejects with a telling error message', async () => { + await expect( + mutate({ + mutation: rewardMutation, + variables: { to: 'non-existent-user-id', from: 'indiegogo_en_rhino' }, + }), + ).resolves.toMatchObject({ + data: { reward: null }, + errors: [{ message: "Couldn't find a user with that id" }], + }) + }) + }) + + it('rewards a badge to user', async () => { + const expected = { + data: { + reward: { + id: 'regular-user-id', + badges: [{ id: 'indiegogo_en_rhino' }], + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: rewardMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('rewards a second different badge to same user', async () => { + await Factory.build('badge', { + id: 'indiegogo_en_racoon', + icon: '/img/badges/indiegogo_en_racoon.svg', + }) + const badges = [{ id: 'indiegogo_en_racoon' }, { id: 'indiegogo_en_rhino' }] + const expected = { + data: { + reward: { + id: 'regular-user-id', + badges: expect.arrayContaining(badges), + }, + }, + errors: undefined, + } + await mutate({ + mutation: rewardMutation, + variables: { + to: 'regular-user-id', + from: 'indiegogo_en_rhino', + }, + }) + await expect( + mutate({ + mutation: rewardMutation, + variables: { + to: 'regular-user-id', + from: 'indiegogo_en_racoon', + }, + }), + ).resolves.toMatchObject(expected) + }) + + it('rewards the same badge as well to another user', async () => { + const expected = { + data: { + reward: { + id: 'regular-user-2-id', + badges: [{ id: 'indiegogo_en_rhino' }], + }, + }, + errors: undefined, + } + await Factory.build( + 'user', + { + id: 'regular-user-2-id', + }, + { + email: 'regular2@email.com', + }, + ) + await mutate({ + mutation: rewardMutation, + variables, + }) + await expect( + mutate({ + mutation: rewardMutation, + variables: { + to: 'regular-user-2-id', + from: 'indiegogo_en_rhino', + }, + }), + ).resolves.toMatchObject(expected) + }) + + it('creates no duplicate reward relationships', async () => { + await mutate({ + mutation: rewardMutation, + variables, + }) + await mutate({ + mutation: rewardMutation, + variables, + }) + + const userQuery = gql` + { + User(id: "regular-user-id") { + badgesCount + badges { + id + } + } + } + ` + const expected = { + data: { User: [{ badgesCount: 1, badges: [{ id: 'indiegogo_en_rhino' }] }] }, + errors: undefined, + } + + await expect(query({ query: userQuery })).resolves.toMatchObject(expected) + }) + }) + + describe('authenticated moderator', () => { + beforeEach(async () => { + authenticatedUser = moderator.toJson() + }) + + describe('rewards badge to user', () => { + it('throws authorization error', async () => { + await expect(mutate({ mutation: rewardMutation, variables })).resolves.toMatchObject({ + data: { reward: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + }) + }) + + describe('unreward', () => { + beforeEach(async () => { + await regularUser.relateTo(badge, 'rewarded') + }) + const expected = { + data: { unreward: { id: 'regular-user-id', badges: [] } }, + errors: undefined, + } + + const unrewardMutation = gql` + mutation ($from: ID!, $to: ID!) { + unreward(badgeKey: $from, userId: $to) { + id + badges { + id + } + } + } + ` + + describe('check test setup', () => { + it('user has one badge', async () => { + authenticatedUser = regularUser.toJson() + const userQuery = gql` + { + User(id: "regular-user-id") { + badgesCount + badges { + id + } + } + } + ` + const expected = { + data: { User: [{ badgesCount: 1, badges: [{ id: 'indiegogo_en_rhino' }] }] }, + errors: undefined, + } + await expect(query({ query: userQuery })).resolves.toMatchObject(expected) + }) + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect(mutate({ mutation: unrewardMutation, variables })).resolves.toMatchObject({ + data: { unreward: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated admin', () => { + beforeEach(async () => { + authenticatedUser = await administrator.toJson() + }) + + it('removes a badge from user', async () => { + await expect(mutate({ mutation: unrewardMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + it('does not crash when unrewarding multiple times', async () => { + await mutate({ mutation: unrewardMutation, variables }) + await expect(mutate({ mutation: unrewardMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('authenticated moderator', () => { + beforeEach(async () => { + authenticatedUser = await moderator.toJson() + }) + + describe('removes bage from user', () => { + it('throws authorization error', async () => { + await expect(mutate({ mutation: unrewardMutation, variables })).resolves.toMatchObject({ + data: { unreward: null }, + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/rewards.ts b/docs/backend/src/schema/resolvers/rewards.ts new file mode 100644 index 000000000..c271ca8f8 --- /dev/null +++ b/docs/backend/src/schema/resolvers/rewards.ts @@ -0,0 +1,46 @@ +import { getNeode } from '../../db/neo4j' +import { UserInputError } from 'apollo-server' + +const neode = getNeode() + +const getUserAndBadge = async ({ badgeKey, userId }) => { + const user = await neode.first('User', 'id', userId) + const badge = await neode.first('Badge', 'id', badgeKey) + if (!user) throw new UserInputError("Couldn't find a user with that id") + if (!badge) throw new UserInputError("Couldn't find a badge with that id") + return { user, badge } +} + +export default { + Mutation: { + reward: async (_object, params, context, _resolveInfo) => { + const { user, badge } = await getUserAndBadge(params) + await user.relateTo(badge, 'rewarded') + return user.toJson() + }, + + unreward: async (_object, params, context, _resolveInfo) => { + const { badgeKey, userId } = params + const { user } = await getUserAndBadge(params) + const session = context.driver.session() + try { + await session.writeTransaction((transaction) => { + return transaction.run( + ` + MATCH (badge:Badge {id: $badgeKey})-[reward:REWARDED]->(rewardedUser:User {id: $userId}) + DELETE reward + RETURN rewardedUser + `, + { + badgeKey, + userId, + }, + ) + }) + } finally { + session.close() + } + return user.toJson() + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/roles.ts b/docs/backend/src/schema/resolvers/roles.ts new file mode 100644 index 000000000..be9861e08 --- /dev/null +++ b/docs/backend/src/schema/resolvers/roles.ts @@ -0,0 +1,7 @@ +export default { + Query: { + availableRoles: async (_parent, args, context, _resolveInfo) => { + return ['admin', 'moderator', 'user'] + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/rooms.spec.ts b/docs/backend/src/schema/resolvers/rooms.spec.ts new file mode 100644 index 000000000..2e26dc1e3 --- /dev/null +++ b/docs/backend/src/schema/resolvers/rooms.spec.ts @@ -0,0 +1,611 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import { getNeode, getDriver } from '../../db/neo4j' +import { createRoomMutation, roomQuery, unreadRoomsQuery } from '../../graphql/rooms' +import { createMessageMutation } from '../../graphql/messages' +import createServer from '../../server' + +const driver = getDriver() +const neode = getNeode() + +let query +let mutate +let authenticatedUser +let chattingUser, otherChattingUser, notChattingUser + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + cypherParams: { + currentUserId: authenticatedUser ? authenticatedUser.id : null, + }, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('Room', () => { + let roomId: string + + beforeAll(async () => { + ;[chattingUser, otherChattingUser, notChattingUser] = await Promise.all([ + Factory.build('user', { + id: 'chatting-user', + name: 'Chatting User', + }), + Factory.build('user', { + id: 'other-chatting-user', + name: 'Other Chatting User', + }), + Factory.build('user', { + id: 'not-chatting-user', + name: 'Not Chatting User', + }), + Factory.build('user', { + id: 'second-chatting-user', + name: 'Second Chatting User', + }), + Factory.build('user', { + id: 'third-chatting-user', + name: 'Third Chatting User', + }), + ]) + }) + + describe('create room', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'some-id', + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + authenticatedUser = await chattingUser.toJson() + }) + + describe('user id does not exist', () => { + it('returns null', async () => { + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'not-existing-user', + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateRoom: null, + }, + }) + }) + }) + + describe('user id is self', () => { + it('throws error', async () => { + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'chatting-user', + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Cannot create a room with self' }], + }) + }) + }) + + describe('user id exists', () => { + it('returns the id of the room', async () => { + const result = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'other-chatting-user', + }, + }) + roomId = result.data.CreateRoom.id + expect(result).toMatchObject({ + errors: undefined, + data: { + CreateRoom: { + id: expect.any(String), + roomId: result.data.CreateRoom.id, + roomName: 'Other Chatting User', + unreadCount: 0, + users: expect.arrayContaining([ + { + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }, + { + _id: 'other-chatting-user', + id: 'other-chatting-user', + name: 'Other Chatting User', + avatar: { + url: expect.any(String), + }, + }, + ]), + }, + }, + }) + }) + }) + + describe('create room with same user id', () => { + it('returns the id of the room', async () => { + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'other-chatting-user', + }, + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateRoom: { + id: roomId, + }, + }, + }) + }) + }) + }) + }) + + describe('query room', () => { + describe('unauthenticated', () => { + beforeAll(() => { + authenticatedUser = null + }) + + it('throws authorization error', async () => { + await expect(query({ query: roomQuery() })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + describe('as creator of room', () => { + beforeAll(async () => { + authenticatedUser = await chattingUser.toJson() + }) + + it('returns the room', async () => { + const result = await query({ query: roomQuery() }) + expect(result).toMatchObject({ + errors: undefined, + data: { + Room: [ + { + id: expect.any(String), + roomId: result.data.Room[0].id, + roomName: 'Other Chatting User', + users: expect.arrayContaining([ + { + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }, + { + _id: 'other-chatting-user', + id: 'other-chatting-user', + name: 'Other Chatting User', + avatar: { + url: expect.any(String), + }, + }, + ]), + }, + ], + }, + }) + }) + }) + + describe('as chatter of room', () => { + beforeAll(async () => { + authenticatedUser = await otherChattingUser.toJson() + }) + + it('returns the room', async () => { + const result = await query({ query: roomQuery() }) + expect(result).toMatchObject({ + errors: undefined, + data: { + Room: [ + { + id: expect.any(String), + roomId: result.data.Room[0].id, + roomName: 'Chatting User', + unreadCount: 0, + users: expect.arrayContaining([ + { + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }, + { + _id: 'other-chatting-user', + id: 'other-chatting-user', + name: 'Other Chatting User', + avatar: { + url: expect.any(String), + }, + }, + ]), + }, + ], + }, + }) + }) + }) + + describe('as not chatter of room', () => { + beforeAll(async () => { + authenticatedUser = await notChattingUser.toJson() + }) + + it('returns no rooms', async () => { + await expect(query({ query: roomQuery() })).resolves.toMatchObject({ + errors: undefined, + data: { + Room: [], + }, + }) + }) + }) + }) + }) + + describe('unread rooms query', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = null + await expect( + query({ + query: unreadRoomsQuery(), + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + let otherRoomId: string + + beforeAll(async () => { + authenticatedUser = await chattingUser.toJson() + const result = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'not-chatting-user', + }, + }) + otherRoomId = result.data.CreateRoom.roomId + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: otherRoomId, + content: 'Message to not chatting user', + }, + }) + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: '1st message to other chatting user', + }, + }) + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: '2nd message to other chatting user', + }, + }) + authenticatedUser = await otherChattingUser.toJson() + const result2 = await mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'not-chatting-user', + }, + }) + otherRoomId = result2.data.CreateRoom.roomId + await mutate({ + mutation: createMessageMutation(), + variables: { + roomId: otherRoomId, + content: 'Other message to not chatting user', + }, + }) + }) + + describe('as chatting user', () => { + it('has 0 unread rooms', async () => { + authenticatedUser = await chattingUser.toJson() + await expect( + query({ + query: unreadRoomsQuery(), + }), + ).resolves.toMatchObject({ + data: { + UnreadRooms: 0, + }, + }) + }) + }) + + describe('as other chatting user', () => { + it('has 1 unread rooms', async () => { + authenticatedUser = await otherChattingUser.toJson() + await expect( + query({ + query: unreadRoomsQuery(), + }), + ).resolves.toMatchObject({ + data: { + UnreadRooms: 1, + }, + }) + }) + }) + + describe('as not chatting user', () => { + it('has 2 unread rooms', async () => { + authenticatedUser = await notChattingUser.toJson() + await expect( + query({ + query: unreadRoomsQuery(), + }), + ).resolves.toMatchObject({ + data: { + UnreadRooms: 2, + }, + }) + }) + }) + }) + }) + + describe('query several rooms', () => { + beforeAll(async () => { + authenticatedUser = await chattingUser.toJson() + await mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'second-chatting-user', + }, + }) + await mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'third-chatting-user', + }, + }) + }) + + it('returns the rooms paginated', async () => { + await expect( + query({ query: roomQuery(), variables: { first: 3, offset: 0 } }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Room: expect.arrayContaining([ + expect.objectContaining({ + id: expect.any(String), + roomId: expect.any(String), + roomName: 'Third Chatting User', + lastMessageAt: null, + unreadCount: 0, + lastMessage: null, + users: expect.arrayContaining([ + expect.objectContaining({ + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }), + expect.objectContaining({ + _id: 'third-chatting-user', + id: 'third-chatting-user', + name: 'Third Chatting User', + avatar: { + url: expect.any(String), + }, + }), + ]), + }), + expect.objectContaining({ + id: expect.any(String), + roomId: expect.any(String), + roomName: 'Second Chatting User', + lastMessageAt: null, + unreadCount: 0, + lastMessage: null, + users: expect.arrayContaining([ + expect.objectContaining({ + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }), + expect.objectContaining({ + _id: 'second-chatting-user', + id: 'second-chatting-user', + name: 'Second Chatting User', + avatar: { + url: expect.any(String), + }, + }), + ]), + }), + expect.objectContaining({ + id: expect.any(String), + roomId: expect.any(String), + roomName: 'Other Chatting User', + lastMessageAt: expect.any(String), + unreadCount: 0, + lastMessage: { + _id: expect.any(String), + id: expect.any(String), + content: '2nd message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + saved: true, + distributed: false, + seen: false, + }, + users: expect.arrayContaining([ + expect.objectContaining({ + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }), + expect.objectContaining({ + _id: 'other-chatting-user', + id: 'other-chatting-user', + name: 'Other Chatting User', + avatar: { + url: expect.any(String), + }, + }), + ]), + }), + ]), + }, + }) + await expect( + query({ query: roomQuery(), variables: { first: 3, offset: 3 } }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + Room: [ + expect.objectContaining({ + id: expect.any(String), + roomId: expect.any(String), + roomName: 'Not Chatting User', + users: expect.arrayContaining([ + { + _id: 'chatting-user', + id: 'chatting-user', + name: 'Chatting User', + avatar: { + url: expect.any(String), + }, + }, + { + _id: 'not-chatting-user', + id: 'not-chatting-user', + name: 'Not Chatting User', + avatar: { + url: expect.any(String), + }, + }, + ]), + }), + ], + }, + }) + }) + }) + + describe('query single room', () => { + let result: any = null + + beforeAll(async () => { + authenticatedUser = await chattingUser.toJson() + result = await query({ query: roomQuery() }) + }) + + describe('as chatter of room', () => { + it('returns the room', async () => { + expect( + await query({ + query: roomQuery(), + variables: { first: 2, offset: 0, id: result.data.Room[0].id }, + }), + ).toMatchObject({ + errors: undefined, + data: { + Room: [ + { + id: expect.any(String), + roomId: expect.any(String), + roomName: result.data.Room[0].roomName, + users: expect.any(Array), + }, + ], + }, + }) + }) + + describe('as not chatter of room', () => { + beforeAll(async () => { + authenticatedUser = await notChattingUser.toJson() + }) + + it('returns no room', async () => { + authenticatedUser = await notChattingUser.toJson() + expect( + await query({ + query: roomQuery(), + variables: { first: 2, offset: 0, id: result.data.Room[0].id }, + }), + ).toMatchObject({ + errors: undefined, + data: { + Room: [], + }, + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/rooms.ts b/docs/backend/src/schema/resolvers/rooms.ts new file mode 100644 index 000000000..5382c5ee7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/rooms.ts @@ -0,0 +1,108 @@ +import { neo4jgraphql } from 'neo4j-graphql-js' +import Resolver from './helpers/Resolver' +import { pubsub, ROOM_COUNT_UPDATED } from '../../server' +import { withFilter } from 'graphql-subscriptions' + +export const getUnreadRoomsCount = async (userId, session) => { + return session.readTransaction(async (transaction) => { + const unreadRoomsCypher = ` + MATCH (:User { id: $userId })-[:CHATS_IN]->(room:Room)<-[:INSIDE]-(message:Message)<-[:CREATED]-(sender:User) + WHERE NOT sender.id = $userId AND NOT message.seen + RETURN toString(COUNT(DISTINCT room)) AS count + ` + const unreadRoomsTxResponse = await transaction.run(unreadRoomsCypher, { userId }) + return unreadRoomsTxResponse.records.map((record) => record.get('count'))[0] + }) +} + +export default { + Subscription: { + roomCountUpdated: { + subscribe: withFilter( + () => pubsub.asyncIterator(ROOM_COUNT_UPDATED), + (payload, variables, context) => { + return payload.userId === context.user?.id + }, + ), + }, + }, + Query: { + Room: async (object, params, context, resolveInfo) => { + if (!params.filter) params.filter = {} + params.filter.users_some = { + id: context.user.id, + } + return neo4jgraphql(object, params, context, resolveInfo) + }, + UnreadRooms: async (object, params, context, resolveInfo) => { + const { + user: { id: currentUserId }, + } = context + const session = context.driver.session() + try { + const count = await getUnreadRoomsCount(currentUserId, session) + return count + } finally { + session.close() + } + }, + }, + Mutation: { + CreateRoom: async (_parent, params, context, _resolveInfo) => { + const { userId } = params + const { + user: { id: currentUserId }, + } = context + if (userId === currentUserId) { + throw new Error('Cannot create a room with self') + } + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const createRoomCypher = ` + MATCH (currentUser:User { id: $currentUserId }) + MATCH (user:User { id: $userId }) + MERGE (currentUser)-[:CHATS_IN]->(room:Room)<-[:CHATS_IN]-(user) + ON CREATE SET + room.createdAt = toString(datetime()), + room.id = apoc.create.uuid() + WITH room, user, currentUser + OPTIONAL MATCH (room)<-[:INSIDE]-(message:Message)<-[:CREATED]-(sender:User) + WHERE NOT sender.id = $currentUserId AND NOT message.seen + WITH room, user, currentUser, message, + user.name AS roomName + RETURN room { + .*, + users: [properties(currentUser), properties(user)], + roomName: roomName, + unreadCount: toString(COUNT(DISTINCT message)) + } + ` + const createRommTxResponse = await transaction.run(createRoomCypher, { + userId, + currentUserId, + }) + const [room] = await createRommTxResponse.records.map((record) => record.get('room')) + return room + }) + try { + const room = await writeTxResultPromise + if (room) { + room.roomId = room.id + } + return room + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + }, + Room: { + ...Resolver('Room', { + undefinedToNull: ['lastMessageAt'], + hasMany: { + users: '<-[:CHATS_IN]-(related:User)', + }, + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/searches.spec.ts b/docs/backend/src/schema/resolvers/searches.spec.ts new file mode 100644 index 000000000..f889c2ac8 --- /dev/null +++ b/docs/backend/src/schema/resolvers/searches.spec.ts @@ -0,0 +1,646 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +let query, authenticatedUser, user + +const driver = getDriver() +const neode = getNeode() + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() + neode.close() +}) + +const searchQuery = gql` + query ($query: String!) { + searchResults(query: $query, limit: 5) { + __typename + ... on Post { + id + title + content + } + ... on User { + id + slug + name + } + ... on Tag { + id + } + } + } +` + +const searchPostQuery = gql` + query ($query: String!, $firstPosts: Int, $postsOffset: Int) { + searchPosts(query: $query, firstPosts: $firstPosts, postsOffset: $postsOffset) { + postCount + posts { + __typename + id + title + content + } + } + } +` + +describe('resolvers/searches', () => { + let variables + + describe('given one user', () => { + beforeAll(async () => { + user = await Factory.build('user', { + id: 'a-user', + name: 'John Doe', + slug: 'john-doe', + }) + authenticatedUser = await user.toJson() + }) + + describe('query contains first name of user', () => { + it('finds the user', async () => { + variables = { query: 'John' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + id: 'a-user', + name: 'John Doe', + slug: 'john-doe', + }, + ], + }, + }) + }) + }) + + describe('adding one post', () => { + beforeAll(async () => { + await Factory.build( + 'post', + { + id: 'a-post', + title: 'Beitrag', + content: 'Ein erster Beitrag', + }, + { authorId: 'a-user' }, + ) + }) + + describe('query contains title of post', () => { + it('finds the post', async () => { + variables = { query: 'beitrag' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'a-post', + title: 'Beitrag', + content: 'Ein erster Beitrag', + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('casing', () => { + it('does not matter', async () => { + variables = { query: 'BEITRAG' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'a-post', + title: 'Beitrag', + content: 'Ein erster Beitrag', + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('query consists of words not present in the corpus', () => { + it('returns empty search results', async () => { + await expect( + query({ query: searchQuery, variables: { query: 'Unfug' } }), + ).resolves.toMatchObject({ data: { searchResults: [] } }) + }) + }) + + describe('testing different post content', () => { + beforeAll(async () => { + return Promise.all([ + Factory.build( + 'post', + { + id: 'b-post', + title: 'Aufruf', + content: 'Jeder sollte seinen Beitrag leisten.', + }, + { authorId: 'a-user' }, + ), + Factory.build( + 'post', + { + id: 'g-post', + title: 'Zusammengesetzte Wörter', + content: `Ein Bindestrich kann zwischen zwei Substantiven auch dann gesetzt werden, wenn drei gleichlautende Buchstaben aufeinandertreffen. Das ist etwa bei einem „Teeei“ der Fall, das so korrekt geschrieben ist. Möglich ist hier auch die Schreibweise mit Bindestrich: Tee-Ei.`, + }, + { authorId: 'a-user' }, + ), + Factory.build( + 'post', + { + id: 'c-post', + title: 'Die binomischen Formeln', + content: `1. binomische Formel: (a + b)² = a² + 2ab + b² +2. binomische Formel: (a - b)² = a² - 2ab + b² +3. binomische Formel: (a + b)(a - b) = a² - b²`, + }, + { authorId: 'a-user' }, + ), + Factory.build( + 'post', + { + id: 'd-post', + title: 'Der Panther', + content: `Sein Blick ist vom Vorübergehn der Stäbe +so müd geworden, daß er nichts mehr hält. +Ihm ist, als ob es tausend Stäbe gäbe +und hinter tausend Stäben keine Welt.`, + }, + { authorId: 'a-user' }, + ), + ]) + }) + + describe('a post which content contains the title of the first post', () => { + describe('query contains the title of the first post', () => { + it('finds both posts', async () => { + variables = { query: 'beitrag' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.arrayContaining([ + { + __typename: 'Post', + id: 'a-post', + title: 'Beitrag', + content: 'Ein erster Beitrag', + }, + { + __typename: 'Post', + id: 'b-post', + title: 'Aufruf', + content: 'Jeder sollte seinen Beitrag leisten.', + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('a post that contains a hyphen between two words and German quotation marks', () => { + describe('hyphens in query', () => { + it('will be treated as ordinary characters', async () => { + variables = { query: 'tee-ei' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'g-post', + title: 'Zusammengesetzte Wörter', + content: `Ein Bindestrich kann zwischen zwei Substantiven auch dann gesetzt werden, wenn drei gleichlautende Buchstaben aufeinandertreffen. Das ist etwa bei einem „Teeei“ der Fall, das so korrekt geschrieben ist. Möglich ist hier auch die Schreibweise mit Bindestrich: Tee-Ei.`, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('German quotation marks in query to test unicode characters (\u201E ... \u201C)', () => { + it('will be treated as ordinary characters', async () => { + variables = { query: '„teeei“' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'g-post', + title: 'Zusammengesetzte Wörter', + content: `Ein Bindestrich kann zwischen zwei Substantiven auch dann gesetzt werden, wenn drei gleichlautende Buchstaben aufeinandertreffen. Das ist etwa bei einem „Teeei“ der Fall, das so korrekt geschrieben ist. Möglich ist hier auch die Schreibweise mit Bindestrich: Tee-Ei.`, + }, + ], + }, + errors: undefined, + }) + }) + }) + }) + + describe('a post that contains a simple mathematical exprssion and line breaks', () => { + describe('query a part of the mathematical expression', () => { + it('finds that post', async () => { + variables = { query: '(a - b)²' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'c-post', + title: 'Die binomischen Formeln', + content: `1. binomische Formel: (a + b)² = a² + 2ab + b²
                +2. binomische Formel: (a - b)² = a² - 2ab + b²
                +3. binomische Formel: (a + b)(a - b) = a² - b²`, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('query the same part of the mathematical expression without spaces', () => { + it('finds that post', async () => { + variables = { query: '(a-b)²' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'c-post', + title: 'Die binomischen Formeln', + content: `1. binomische Formel: (a + b)² = a² + 2ab + b²
                +2. binomische Formel: (a - b)² = a² - 2ab + b²
                +3. binomische Formel: (a + b)(a - b) = a² - b²`, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('query the mathematical expression over line break', () => { + it('finds that post', async () => { + variables = { query: '+ b² 2.' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'c-post', + title: 'Die binomischen Formeln', + content: `1. binomische Formel: (a + b)² = a² + 2ab + b²
                +2. binomische Formel: (a - b)² = a² - 2ab + b²
                +3. binomische Formel: (a + b)(a - b) = a² - b²`, + }, + ], + }, + errors: undefined, + }) + }) + }) + }) + + describe('a post that contains a poem', () => { + describe('query for more than one word, e.g. the title of the poem', () => { + it('finds the poem and another post that contains only one word but with lower score', async () => { + variables = { query: 'der panther' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Post', + id: 'd-post', + title: 'Der Panther', + content: `Sein Blick ist vom Vorübergehn der Stäbe
                +so müd geworden, daß er nichts mehr hält.
                +Ihm ist, als ob es tausend Stäbe gäbe
                +und hinter tausend Stäben keine Welt.`, + }, + { + __typename: 'Post', + id: 'g-post', + title: 'Zusammengesetzte Wörter', + content: `Ein Bindestrich kann zwischen zwei Substantiven auch dann gesetzt werden, wenn drei gleichlautende Buchstaben aufeinandertreffen. Das ist etwa bei einem „Teeei“ der Fall, das so korrekt geschrieben ist. Möglich ist hier auch die Schreibweise mit Bindestrich: Tee-Ei.`, + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('query for the first four letters of two longer words', () => { + it('finds the posts that contain words starting with these four letters', async () => { + variables = { query: 'Vorü Subs' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.arrayContaining([ + { + __typename: 'Post', + id: 'd-post', + title: 'Der Panther', + content: `Sein Blick ist vom Vorübergehn der Stäbe
                +so müd geworden, daß er nichts mehr hält.
                +Ihm ist, als ob es tausend Stäbe gäbe
                +und hinter tausend Stäben keine Welt.`, + }, + { + __typename: 'Post', + id: 'g-post', + title: 'Zusammengesetzte Wörter', + content: `Ein Bindestrich kann zwischen zwei Substantiven auch dann gesetzt werden, wenn drei gleichlautende Buchstaben aufeinandertreffen. Das ist etwa bei einem „Teeei“ der Fall, das so korrekt geschrieben ist. Möglich ist hier auch die Schreibweise mit Bindestrich: Tee-Ei.`, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + }) + + describe('adding two users that have the same word in their slugs', () => { + beforeAll(async () => { + await Promise.all([ + Factory.build('user', { + id: 'c-user', + name: 'Rainer Maria Rilke', + slug: 'rainer-maria-rilke', + }), + Factory.build('user', { + id: 'd-user', + name: 'Erich Maria Remarque', + slug: 'erich-maria-remarque', + }), + ]) + }) + + describe('query the word that both slugs contain', () => { + it('finds both users', async () => { + variables = { query: '-maria-' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.arrayContaining([ + { + __typename: 'User', + id: 'c-user', + name: 'Rainer Maria Rilke', + slug: 'rainer-maria-rilke', + }, + { + __typename: 'User', + id: 'd-user', + name: 'Erich Maria Remarque', + slug: 'erich-maria-remarque', + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('adding a user and a hashtag with a name that is content of a post', () => { + beforeAll(async () => { + await Promise.all([ + Factory.build('user', { + id: 'f-user', + name: 'Peter Panther', + slug: 'peter-panther', + }), + await Factory.build('tag', { id: 'Panther' }), + ]) + }) + + describe('query the word that contains the post, the hashtag and the name of the user', () => { + it('finds the user, the post and the hashtag', async () => { + variables = { query: 'panther' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.arrayContaining([ + { + __typename: 'User', + id: 'f-user', + name: 'Peter Panther', + slug: 'peter-panther', + }, + { + __typename: 'Post', + id: 'd-post', + title: 'Der Panther', + content: `Sein Blick ist vom Vorübergehn der Stäbe
                +so müd geworden, daß er nichts mehr hält.
                +Ihm ist, als ob es tausend Stäbe gäbe
                +und hinter tausend Stäben keine Welt.`, + }, + { + __typename: 'Tag', + id: 'Panther', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('@query the word that contains the post, the hashtag and the name of the user', () => { + it('only finds the user', async () => { + variables = { query: '@panther' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.not.arrayContaining([ + { + __typename: 'Post', + id: 'd-post', + title: 'Der Panther', + content: `Sein Blick ist vom Vorübergehn der Stäbe
                +so müd geworden, daß er nichts mehr hält.
                +Ihm ist, als ob es tausend Stäbe gäbe
                +und hinter tausend Stäben keine Welt.`, + }, + { + __typename: 'Tag', + id: 'Panther', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('!query the word that contains the post, the hashtag and the name of the user', () => { + it('only finds the post', async () => { + variables = { query: '!panther' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.not.arrayContaining([ + { + __typename: 'User', + id: 'f-user', + name: 'Peter Panther', + slug: 'peter-panther', + }, + { + __typename: 'Tag', + id: 'Panther', + }, + ]), + }, + errors: undefined, + }) + }) + }) + + describe('#query the word that contains the post, the hashtag and the name of the user', () => { + it('only finds the hashtag', async () => { + variables = { query: '#panther' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.not.arrayContaining([ + { + __typename: 'User', + id: 'f-user', + name: 'Peter Panther', + slug: 'peter-panther', + }, + { + __typename: 'Post', + id: 'd-post', + title: 'Der Panther', + content: `Sein Blick ist vom Vorübergehn der Stäbe
                +so müd geworden, daß er nichts mehr hält.
                +Ihm ist, als ob es tausend Stäbe gäbe
                +und hinter tausend Stäben keine Welt.`, + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('adding a post, written by a user who is muted by the authenticated user', () => { + beforeAll(async () => { + const mutedUser = await Factory.build('user', { + id: 'muted-user', + name: 'Muted', + slug: 'muted', + }) + await user.relateTo(mutedUser, 'muted') + await Factory.build( + 'post', + { + id: 'muted-post', + title: 'Beleidigender Beitrag', + content: 'Dieser Beitrag stammt von einem bleidigendem Nutzer.', + }, + { authorId: 'muted-user' }, + ) + }) + + describe('query for text in a post written by a muted user', () => { + it('does not include the post of the muted user in the results', async () => { + variables = { query: 'beitrag' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: expect.not.arrayContaining([ + { + __typename: 'Post', + id: 'muted-post', + title: 'Beleidigender Beitrag', + content: 'Dieser Beitrag stammt von einem bleidigendem Nutzer.', + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) + + describe('adding a tag', () => { + beforeAll(async () => { + await Factory.build('tag', { id: 'myHashtag' }) + }) + + describe('query the first four characters of the tag', () => { + it('finds the tag', async () => { + variables = { query: 'myha' } + await expect(query({ query: searchQuery, variables })).resolves.toMatchObject({ + data: { + searchResults: [ + { + __typename: 'Tag', + id: 'myHashtag', + }, + ], + }, + errors: undefined, + }) + }) + }) + }) + + describe('searchPostQuery', () => { + describe('query with limit 1', () => { + it('has a count greater than 1', async () => { + variables = { query: 'beitrag', firstPosts: 1, postsOffset: 0 } + await expect(query({ query: searchPostQuery, variables })).resolves.toMatchObject({ + data: { + searchPosts: { + postCount: 2, + posts: [ + { + __typename: 'Post', + id: 'a-post', + title: 'Beitrag', + content: 'Ein erster Beitrag', + }, + ], + }, + }, + errors: undefined, + }) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/searches.ts b/docs/backend/src/schema/resolvers/searches.ts new file mode 100644 index 000000000..fba74ecc7 --- /dev/null +++ b/docs/backend/src/schema/resolvers/searches.ts @@ -0,0 +1,251 @@ +import log from './helpers/databaseLogger' +import { queryString } from './searches/queryString' + +// see http://lucene.apache.org/core/8_3_1/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description + +const cypherTemplate = (setup) => ` + CALL db.index.fulltext.queryNodes('${setup.fulltextIndex}', $query) + YIELD node AS resource, score + ${setup.match} + ${setup.whereClause} + ${setup.withClause} + RETURN + ${setup.returnClause} + AS result + SKIP toInteger($skip) + ${setup.limit} +` + +const simpleWhereClause = + 'WHERE score >= 0.0 AND NOT (resource.deleted = true OR resource.disabled = true)' + +const postWhereClause = `WHERE score >= 0.0 + AND NOT ( + author.deleted = true OR author.disabled = true + OR resource.deleted = true OR resource.disabled = true + ) AND block IS NULL AND restriction IS NULL` + +const searchPostsSetup = { + fulltextIndex: 'post_fulltext_search', + match: `MATCH (resource:Post)<-[:WROTE]-(author:User) + MATCH (user:User {id: $userId}) + OPTIONAL MATCH (user)-[block:MUTED]->(author) + OPTIONAL MATCH (user)-[restriction:CANNOT_SEE]->(resource) + WITH user, resource, author, block, restriction`, + whereClause: postWhereClause, + withClause: `WITH resource, author, + [(resource)<-[:COMMENTS]-(comment:Comment) | comment] AS comments, + [(resource)<-[:SHOUTED]-(user:User) | user] AS shouter`, + returnClause: `resource { + .*, + __typename: 'Post', + author: properties(author), + commentsCount: toString(size(comments)), + shoutedCount: toString(size(shouter)), + clickedCount: toString(resource.clickedCount), + viewedTeaserCount: toString(resource.viewedTeaserCount) + }`, + limit: 'LIMIT toInteger($limit)', +} + +const searchUsersSetup = { + fulltextIndex: 'user_fulltext_search', + match: 'MATCH (resource:User)', + whereClause: simpleWhereClause, + withClause: '', + returnClause: `resource {.*, __typename: 'User'}`, + limit: 'LIMIT toInteger($limit)', +} + +const searchHashtagsSetup = { + fulltextIndex: 'tag_fulltext_search', + match: 'MATCH (resource:Tag)', + whereClause: simpleWhereClause, + withClause: '', + returnClause: `resource {.*, __typename: 'Tag'}`, + limit: 'LIMIT toInteger($limit)', +} + +const searchGroupsSetup = { + fulltextIndex: 'group_fulltext_search', + match: `MATCH (resource:Group) + MATCH (user:User {id: $userId}) + OPTIONAL MATCH (user)-[membership:MEMBER_OF]->(resource) + WITH user, resource, membership`, + whereClause: `WHERE score >= 0.0 + AND NOT (resource.deleted = true OR resource.disabled = true) + AND (resource.groupType IN ['public', 'closed'] + OR membership.role IN ['usual', 'admin', 'owner'])`, + withClause: 'WITH resource, membership', + returnClause: `resource { .*, myRole: membership.role, __typename: 'Group' }`, + limit: 'LIMIT toInteger($limit)', +} + +const countSetup = { + returnClause: 'toString(size(collect(resource)))', + limit: '', +} + +const countUsersSetup = { + ...searchUsersSetup, + ...countSetup, +} +const countPostsSetup = { + ...searchPostsSetup, + ...countSetup, +} +const countHashtagsSetup = { + ...searchHashtagsSetup, + ...countSetup, +} +const countGroupsSetup = { + ...searchGroupsSetup, + ...countSetup, +} + +const searchResultPromise = async (session, setup, params) => { + return session.readTransaction(async (transaction) => { + return transaction.run(cypherTemplate(setup), params) + }) +} + +const searchResultCallback = (result) => { + return result.records.map((r) => r.get('result')) +} + +const countResultCallback = (result) => { + return result.records[0].get('result') +} + +const getSearchResults = async (context, setup, params, resultCallback = searchResultCallback) => { + const session = context.driver.session() + try { + const results = await searchResultPromise(session, setup, params) + log(results) + return resultCallback(results) + } finally { + session.close() + } +} + +const multiSearchMap = [ + { symbol: '!', setup: searchPostsSetup, resultName: 'posts' }, + { symbol: '@', setup: searchUsersSetup, resultName: 'users' }, + { symbol: '#', setup: searchHashtagsSetup, resultName: 'hashtags' }, + { symbol: '&', setup: searchGroupsSetup, resultName: 'groups' }, +] + +export default { + Query: { + searchPosts: async (_parent, args, context, _resolveInfo) => { + const { query, postsOffset, firstPosts } = args + let userId = null + if (context.user) userId = context.user.id + return { + postCount: getSearchResults( + context, + countPostsSetup, + { + query: queryString(query), + skip: 0, + userId, + }, + countResultCallback, + ), + posts: getSearchResults(context, searchPostsSetup, { + query: queryString(query), + skip: postsOffset, + limit: firstPosts, + userId, + }), + } + }, + searchUsers: async (_parent, args, context, _resolveInfo) => { + const { query, usersOffset, firstUsers } = args + return { + userCount: getSearchResults( + context, + countUsersSetup, + { + query: queryString(query), + skip: 0, + }, + countResultCallback, + ), + users: getSearchResults(context, searchUsersSetup, { + query: queryString(query), + skip: usersOffset, + limit: firstUsers, + }), + } + }, + searchHashtags: async (_parent, args, context, _resolveInfo) => { + const { query, hashtagsOffset, firstHashtags } = args + return { + hashtagCount: getSearchResults( + context, + countHashtagsSetup, + { + query: queryString(query), + skip: 0, + }, + countResultCallback, + ), + hashtags: getSearchResults(context, searchHashtagsSetup, { + query: queryString(query), + skip: hashtagsOffset, + limit: firstHashtags, + }), + } + }, + searchGroups: async (_parent, args, context, _resolveInfo) => { + const { query, groupsOffset, firstGroups } = args + let userId = null + if (context.user) userId = context.user.id + return { + groupCount: getSearchResults( + context, + countGroupsSetup, + { + query: queryString(query), + skip: 0, + userId, + }, + countResultCallback, + ), + groups: getSearchResults(context, searchGroupsSetup, { + query: queryString(query), + skip: groupsOffset, + limit: firstGroups, + userId, + }), + } + }, + searchResults: async (_parent, args, context, _resolveInfo) => { + const { query, limit } = args + const userId = context.user?.id || null + + const searchType = query.replace(/^([!@#&]?).*$/, '$1') + const searchString = query.replace(/^([!@#&])/, '') + + const params = { + query: queryString(searchString), + skip: 0, + limit, + userId, + } + + if (searchType === '') + return [ + ...(await getSearchResults(context, searchPostsSetup, params)), + ...(await getSearchResults(context, searchUsersSetup, params)), + ...(await getSearchResults(context, searchGroupsSetup, params)), + ...(await getSearchResults(context, searchHashtagsSetup, params)), + ] + + params.limit = 15 + const type: any = multiSearchMap.find((obj) => obj.symbol === searchType) + return getSearchResults(context, type.setup, params) + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/searches/queryString.spec.ts b/docs/backend/src/schema/resolvers/searches/queryString.spec.ts new file mode 100644 index 000000000..fe3c91d3c --- /dev/null +++ b/docs/backend/src/schema/resolvers/searches/queryString.spec.ts @@ -0,0 +1,43 @@ +import { queryString, escapeSpecialCharacters, normalizeWhitespace } from './queryString' + +describe('queryString', () => { + describe('special characters', () => { + it('does escaping correctly', () => { + expect(escapeSpecialCharacters('+ - && || ! ( ) { } [ ] ^ " ~ * ? : \\ / ')).toEqual( + '\\+ \\- \\&\\& \\|\\| \\! \\( \\) \\{ \\} \\[ \\] \\^ \\" \\~ \\* \\? \\: \\\\ \\/ ', + ) + }) + }) + + describe('whitespace', () => { + it('normalizes correctly', () => { + expect(normalizeWhitespace(' a \t \n b \n ')).toEqual('a b') + }) + }) + + describe('exact match', () => { + it('boosts score by factor 8', () => { + expect(queryString('a couple of words')).toContain('"a couple of words"^8') + }) + }) + + describe('match all words exactly', () => { + it('boosts score by factor 4', () => { + expect(queryString('a couple of words')).toContain( + '("a" AND "couple" AND "of" AND "words")^4', + ) + }) + }) + + describe('match at least one word exactly', () => { + it('boosts score by factor 2', () => { + expect(queryString('a couple of words')).toContain('"a"^2 "couple"^2 "of"^2 "words"^2') + }) + }) + + describe('globbing for longer words', () => { + it('globs words with more than three characters', () => { + expect(queryString('a couple of words')).toContain('couple* of* words*') + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/searches/queryString.ts b/docs/backend/src/schema/resolvers/searches/queryString.ts new file mode 100644 index 000000000..8f415c5e6 --- /dev/null +++ b/docs/backend/src/schema/resolvers/searches/queryString.ts @@ -0,0 +1,51 @@ +export function queryString(str) { + const normalizedString = normalizeWhitespace(str) + const escapedString = escapeSpecialCharacters(normalizedString) + return ` +${matchWholeText(escapedString)} +${matchEachWordExactly(escapedString)} +${matchSomeWordsExactly(escapedString)} +${matchBeginningOfWords(escapedString)} +` +} + +const matchWholeText = (str, boost = 8) => { + return `"${str}"^${boost}` +} + +const matchEachWordExactly = (str, boost = 4) => { + if (!str.includes(' ')) return '' + const tmp = str + .split(' ') + .map((s, i) => (i === 0 ? `"${s}"` : `AND "${s}"`)) + .join(' ') + return `(${tmp})^${boost}` +} + +const matchSomeWordsExactly = (str, boost = 2) => { + if (!str.includes(' ')) return '' + return str + .split(' ') + .map((s) => `"${s}"^${boost}`) + .join(' ') +} + +const matchBeginningOfWords = (str) => { + return str + .split(' ') + .filter((s) => s.length >= 2) + .map((s) => s + '*') + .join(' ') +} + +export function normalizeWhitespace(str) { + // delete the first character if it is !, @ or # + return str + .replace(/^([!@#])/, '') + .replace(/\s+/g, ' ') + .trim() +} + +export function escapeSpecialCharacters(str) { + return str.replace(/(["[\]&|\\{}+!()^~*?:/-])/g, '\\$1') +} diff --git a/docs/backend/src/schema/resolvers/shout.spec.ts b/docs/backend/src/schema/resolvers/shout.spec.ts new file mode 100644 index 000000000..294a28a76 --- /dev/null +++ b/docs/backend/src/schema/resolvers/shout.spec.ts @@ -0,0 +1,205 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +let mutate, query, authenticatedUser, variables +const instance = getNeode() +const driver = getDriver() + +const mutationShoutPost = gql` + mutation ($id: ID!) { + shout(id: $id, type: Post) + } +` +const mutationUnshoutPost = gql` + mutation ($id: ID!) { + unshout(id: $id, type: Post) + } +` +const queryPost = gql` + query ($id: ID!) { + Post(id: $id) { + id + shoutedBy { + id + } + } + } +` + +describe('shout and unshout posts', () => { + let currentUser, postAuthor + + beforeAll(async () => { + await cleanDatabase() + + authenticatedUser = undefined + const { server } = createServer({ + context: () => { + return { + driver, + neode: instance, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + query = createTestClient(server).query + }) + + afterAll(async () => { + await cleanDatabase() + driver.close() + }) + + beforeEach(async () => { + currentUser = await Factory.build( + 'user', + { + id: 'current-user-id', + name: 'Current User', + }, + { + email: 'current.user@example.org', + password: '1234', + }, + ) + + postAuthor = await Factory.build( + 'user', + { + id: 'id-of-another-user', + name: 'Another User', + }, + { + email: 'another.user@example.org', + password: '1234', + }, + ) + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('shout', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + variables = { id: 'post-to-shout-id' } + authenticatedUser = undefined + await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await currentUser.toJson() + await Factory.build( + 'post', + { + name: 'Other user post', + id: 'another-user-post-id', + }, + { + author: postAuthor, + }, + ) + await Factory.build( + 'post', + { + name: 'current user post', + id: 'current-user-post-id', + }, + { + author: currentUser, + }, + ) + variables = {} + }) + + it("can shout another user's post", async () => { + variables = { id: 'another-user-post-id' } + await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ + data: { shout: true }, + }) + await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ + data: { Post: [{ id: 'another-user-post-id', shoutedBy: [{ id: 'current-user-id' }] }] }, + errors: undefined, + }) + }) + + it('adds `createdAt` to `SHOUT` relationship', async () => { + variables = { id: 'another-user-post-id' } + await mutate({ mutation: mutationShoutPost, variables }) + const relation = await instance.cypher( + 'MATCH (user:User {id: $userId1})-[relationship:SHOUTED]->(node {id: $userId2}) WHERE relationship.createdAt IS NOT NULL RETURN relationship', + { + userId1: 'current-user-id', + userId2: 'another-user-post-id', + }, + ) + const relationshipProperties = relation.records.map( + (record) => record.get('relationship').properties.createdAt, + ) + expect(relationshipProperties[0]).toEqual(expect.any(String)) + }) + + it('can not shout my own post', async () => { + variables = { id: 'current-user-post-id' } + await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ + data: { shout: false }, + }) + await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ + data: { Post: [{ id: 'current-user-post-id', shoutedBy: [] }] }, + errors: undefined, + }) + }) + }) + }) + describe('unshout', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = undefined + variables = { id: 'post-to-shout-id' } + await expect(mutate({ mutation: mutationUnshoutPost, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await currentUser.toJson() + await Factory.build( + 'post', + { + name: 'Posted By Another User', + id: 'posted-by-another-user', + }, + { + author: postAuthor, + }, + ) + await mutate({ + mutation: mutationShoutPost, + variables: { id: 'posted-by-another-user' }, + }) + }) + + it("can unshout another user's post", async () => { + variables = { id: 'posted-by-another-user' } + await expect(mutate({ mutation: mutationUnshoutPost, variables })).resolves.toMatchObject({ + data: { unshout: true }, + }) + await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ + data: { Post: [{ id: 'posted-by-another-user', shoutedBy: [] }] }, + errors: undefined, + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/shout.ts b/docs/backend/src/schema/resolvers/shout.ts new file mode 100644 index 000000000..8c330cd67 --- /dev/null +++ b/docs/backend/src/schema/resolvers/shout.ts @@ -0,0 +1,62 @@ +import log from './helpers/databaseLogger' + +export default { + Mutation: { + shout: async (_object, params, context, _resolveInfo) => { + const { id, type } = params + + const session = context.driver.session() + try { + const shoutWriteTxResultPromise = session.writeTransaction(async (transaction) => { + const shoutTransactionResponse = await transaction.run( + ` + MATCH (node {id: $id})<-[:WROTE]-(userWritten:User), (user:User {id: $userId}) + WHERE $type IN labels(node) AND NOT userWritten.id = $userId + MERGE (user)-[relation:SHOUTED{createdAt:toString(datetime())}]->(node) + RETURN COUNT(relation) > 0 as isShouted + `, + { + id, + type, + userId: context.user.id, + }, + ) + log(shoutTransactionResponse) + return shoutTransactionResponse.records.map((record) => record.get('isShouted')) + }) + const [isShouted] = await shoutWriteTxResultPromise + return isShouted + } finally { + session.close() + } + }, + + unshout: async (_object, params, context, _resolveInfo) => { + const { id, type } = params + const session = context.driver.session() + try { + const unshoutWriteTxResultPromise = session.writeTransaction(async (transaction) => { + const unshoutTransactionResponse = await transaction.run( + ` + MATCH (user:User {id: $userId})-[relation:SHOUTED]->(node {id: $id}) + WHERE $type IN labels(node) + DELETE relation + RETURN COUNT(relation) > 0 as isShouted + `, + { + id, + type, + userId: context.user.id, + }, + ) + log(unshoutTransactionResponse) + return unshoutTransactionResponse.records.map((record) => record.get('isShouted')) + }) + const [isShouted] = await unshoutWriteTxResultPromise + return isShouted + } finally { + session.close() + } + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/socialMedia.spec.ts b/docs/backend/src/schema/resolvers/socialMedia.spec.ts new file mode 100644 index 000000000..8265e8376 --- /dev/null +++ b/docs/backend/src/schema/resolvers/socialMedia.spec.ts @@ -0,0 +1,289 @@ +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../server' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getDriver } from '../../db/neo4j' + +const driver = getDriver() + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('SocialMedia', () => { + let socialMediaAction, someUser, ownerNode, owner + + const url = 'https://twitter.com/pippi-langstrumpf' + const newUrl = 'https://twitter.com/bullerby' + + const setUpSocialMedia = async () => { + const socialMediaNode = await Factory.build('socialMedia', { url }) + await socialMediaNode.relateTo(ownerNode, 'ownedBy') + return socialMediaNode.toJson() + } + + beforeEach(async () => { + const someUserNode = await Factory.build( + 'user', + { + name: 'Kalle Blomqvist', + }, + { + email: 'kalle@example.com', + password: 'abcd', + }, + ) + + someUser = await someUserNode.toJson() + ownerNode = await Factory.build( + 'user', + { + name: 'Pippi Langstrumpf', + }, + { + email: 'pippi@example.com', + password: '1234', + }, + ) + owner = await ownerNode.toJson() + + socialMediaAction = async (user, mutation, variables) => { + const { server } = createServer({ + context: () => { + return { + user, + driver, + } + }, + }) + const { mutate } = createTestClient(server) + + return mutate({ + mutation, + variables, + }) + } + }) + + // TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 + afterEach(async () => { + await cleanDatabase() + }) + + describe('create social media', () => { + let mutation, variables + + beforeEach(() => { + mutation = gql` + mutation ($url: String!) { + CreateSocialMedia(url: $url) { + id + url + } + } + ` + variables = { url } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const user = null + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated', () => { + let user + + beforeEach(() => { + user = owner + }) + + it('creates social media with the given url', async () => { + await expect(socialMediaAction(user, mutation, variables)).resolves.toEqual( + expect.objectContaining({ + data: { + CreateSocialMedia: { + id: expect.any(String), + url, + }, + }, + }), + ) + }) + + it('rejects an empty string as url', async () => { + variables = { url: '' } + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0].message).toEqual( + expect.stringContaining('"url" is not allowed to be empty'), + ) + }) + + it('rejects invalid urls', async () => { + variables = { url: 'not-a-url' } + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0].message).toEqual( + expect.stringContaining('"url" must be a valid uri'), + ) + }) + }) + + describe('ownedBy', () => { + beforeEach(() => { + mutation = gql` + mutation ($url: String!) { + CreateSocialMedia(url: $url) { + url + ownedBy { + name + } + } + } + ` + }) + + it('resolves', async () => { + const user = someUser + await expect(socialMediaAction(user, mutation, variables)).resolves.toEqual( + expect.objectContaining({ + data: { + CreateSocialMedia: { url, ownedBy: { name: 'Kalle Blomqvist' } }, + }, + }), + ) + }) + }) + }) + + describe('update social media', () => { + let mutation, variables + + beforeEach(async () => { + const socialMedia = await setUpSocialMedia() + + mutation = gql` + mutation ($id: ID!, $url: String!) { + UpdateSocialMedia(id: $id, url: $url) { + id + url + } + } + ` + variables = { url: newUrl, id: socialMedia.id } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const user = null + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as other user', () => { + it('throws authorization error', async () => { + const user = someUser + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as owner', () => { + let user + + beforeEach(() => { + user = owner + }) + + it('updates social media with the given id', async () => { + const expected = { + data: { + UpdateSocialMedia: { ...variables }, + }, + } + + await expect(socialMediaAction(user, mutation, variables)).resolves.toEqual( + expect.objectContaining(expected), + ) + }) + + it('does not update if the the given id does not exist', async () => { + variables.id = 'some-id' + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + }) + + describe('delete social media', () => { + let mutation, variables + + beforeEach(async () => { + const socialMedia = await setUpSocialMedia() + + mutation = gql` + mutation ($id: ID!) { + DeleteSocialMedia(id: $id) { + id + url + } + } + ` + variables = { url: newUrl, id: socialMedia.id } + }) + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + const user = null + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as other user', () => { + it('throws authorization error', async () => { + const user = someUser + const result = await socialMediaAction(user, mutation, variables) + + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('authenticated as owner', () => { + let user + + beforeEach(async () => { + user = owner + }) + + it('deletes social media with the given id', async () => { + const expected = { + data: { + DeleteSocialMedia: { + id: variables.id, + url, + }, + }, + } + + await expect(socialMediaAction(user, mutation, variables)).resolves.toEqual( + expect.objectContaining(expected), + ) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/socialMedia.ts b/docs/backend/src/schema/resolvers/socialMedia.ts new file mode 100644 index 000000000..c5b9dcd91 --- /dev/null +++ b/docs/backend/src/schema/resolvers/socialMedia.ts @@ -0,0 +1,38 @@ +import { getNeode } from '../../db/neo4j' +import Resolver from './helpers/Resolver' + +const neode = getNeode() + +export default { + Mutation: { + CreateSocialMedia: async (object, params, context, resolveInfo) => { + const [user, socialMedia] = await Promise.all([ + neode.find('User', context.user.id), + neode.create('SocialMedia', params), + ]) + await socialMedia.relateTo(user, 'ownedBy') + const response = await socialMedia.toJson() + + return response + }, + UpdateSocialMedia: async (object, params, context, resolveInfo) => { + const socialMedia = await neode.find('SocialMedia', params.id) + await socialMedia.update({ url: params.url }) + const response = await socialMedia.toJson() + + return response + }, + DeleteSocialMedia: async (object, { id }, context, resolveInfo) => { + const socialMedia = await neode.find('SocialMedia', id) + if (!socialMedia) return null + await socialMedia.delete() + return socialMedia.toJson() + }, + }, + SocialMedia: Resolver('SocialMedia', { + idAttribute: 'url', + hasOne: { + ownedBy: '-[:OWNED_BY]->(related:User)', + }, + }), +} diff --git a/docs/backend/src/schema/resolvers/statistics.spec.ts b/docs/backend/src/schema/resolvers/statistics.spec.ts new file mode 100644 index 000000000..15aa2d449 --- /dev/null +++ b/docs/backend/src/schema/resolvers/statistics.spec.ts @@ -0,0 +1,147 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +let query, authenticatedUser +const instance = getNeode() +const driver = getDriver() + +const statisticsQuery = gql` + query { + statistics { + countUsers + countPosts + countComments + countNotifications + countInvites + countFollows + countShouts + } + } +` +beforeAll(async () => { + await cleanDatabase() + + authenticatedUser = undefined + const { server } = createServer({ + context: () => { + return { + driver, + neode: instance, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('statistics', () => { + describe('countUsers', () => { + beforeEach(async () => { + await Promise.all( + [...Array(6).keys()].map(() => { + return Factory.build('user') + }), + ) + }) + + it('returns the count of all users', async () => { + await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ + data: { statistics: { countUsers: 6 } }, + errors: undefined, + }) + }) + }) + + describe('countPosts', () => { + beforeEach(async () => { + await Promise.all( + [...Array(3).keys()].map(() => { + return Factory.build('post') + }), + ) + }) + + it('returns the count of all posts', async () => { + await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ + data: { statistics: { countPosts: 3 } }, + errors: undefined, + }) + }) + }) + + describe('countComments', () => { + beforeEach(async () => { + await Promise.all( + [...Array(2).keys()].map(() => { + return Factory.build('comment') + }), + ) + }) + + it('returns the count of all comments', async () => { + await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ + data: { statistics: { countComments: 2 } }, + errors: undefined, + }) + }) + }) + + describe('countFollows', () => { + let users + beforeEach(async () => { + users = await Promise.all( + [...Array(2).keys()].map(() => { + return Factory.build('user') + }), + ) + await users[0].relateTo(users[1], 'following') + }) + + it('returns the count of all follows', async () => { + await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ + data: { statistics: { countFollows: 1 } }, + errors: undefined, + }) + }) + }) + + describe('countShouts', () => { + let users, posts + beforeEach(async () => { + users = await Promise.all( + [...Array(2).keys()].map(() => { + return Factory.build('user') + }), + ) + posts = await Promise.all( + [...Array(3).keys()].map(() => { + return Factory.build('post') + }), + ) + await Promise.all([ + users[0].relateTo(posts[1], 'shouted'), + users[1].relateTo(posts[0], 'shouted'), + ]) + }) + + it('returns the count of all shouts', async () => { + await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ + data: { statistics: { countShouts: 2 } }, + errors: undefined, + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/statistics.ts b/docs/backend/src/schema/resolvers/statistics.ts new file mode 100644 index 000000000..b454ce8f4 --- /dev/null +++ b/docs/backend/src/schema/resolvers/statistics.ts @@ -0,0 +1,45 @@ +import log from './helpers/databaseLogger' + +export default { + Query: { + statistics: async (_parent, _args, { driver }) => { + const session = driver.session() + const counts: any = {} + try { + const mapping = { + countUsers: 'User', + countPosts: 'Post', + countComments: 'Comment', + countNotifications: 'NOTIFIED', + countEmails: 'EmailAddress', + countFollows: 'FOLLOWS', + countShouts: 'SHOUTED', + } + const statisticsReadTxResultPromise = session.readTransaction(async (transaction) => { + const statisticsTransactionResponse = await transaction.run( + ` + CALL apoc.meta.stats() YIELD labels, relTypesCount + RETURN labels, relTypesCount + `, + ) + log(statisticsTransactionResponse) + return statisticsTransactionResponse.records.map((record) => { + return { + ...record.get('labels'), + ...record.get('relTypesCount'), + } + }) + }) + const [statistics] = await statisticsReadTxResultPromise + Object.keys(mapping).forEach((key) => { + const stat = statistics[mapping[key]] + counts[key] = stat ? stat.toNumber() : 0 + }) + counts.countInvites = counts.countEmails - counts.countUsers + return counts + } finally { + session.close() + } + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/transactions/inviteCodes.ts b/docs/backend/src/schema/resolvers/transactions/inviteCodes.ts new file mode 100644 index 000000000..554b15f86 --- /dev/null +++ b/docs/backend/src/schema/resolvers/transactions/inviteCodes.ts @@ -0,0 +1,22 @@ +export async function validateInviteCode(session, inviteCode) { + const readTxResultPromise = session.readTransaction(async (txc) => { + const result = await txc.run( + `MATCH (ic:InviteCode { code: toUpper($inviteCode) }) + RETURN + CASE + WHEN ic.expiresAt IS NULL THEN true + WHEN datetime(ic.expiresAt) >= datetime() THEN true + ELSE false END AS result`, + { + inviteCode, + }, + ) + return result.records.map((record) => record.get('result')) + }) + try { + const txResult = await readTxResultPromise + return !!txResult[0] + } finally { + session.close() + } +} diff --git a/docs/backend/src/schema/resolvers/userData.spec.ts b/docs/backend/src/schema/resolvers/userData.spec.ts new file mode 100644 index 000000000..3c521a4f1 --- /dev/null +++ b/docs/backend/src/schema/resolvers/userData.spec.ts @@ -0,0 +1,145 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +let query, authenticatedUser + +const driver = getDriver() +const neode = getNeode() + +const userDataQuery = gql` + query ($id: ID!) { + userData(id: $id) { + user { + id + name + slug + } + posts { + id + title + content + comments { + content + author { + slug + } + } + } + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + const user = await Factory.build('user', { + id: 'a-user', + name: 'John Doe', + slug: 'john-doe', + }) + await Factory.build('user', { + id: 'o-user', + name: 'Unauthenticated User', + slug: 'unauthenticated-user', + }) + authenticatedUser = await user.toJson() + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('resolvers/userData', () => { + let variables = { id: 'a-user' } + + describe('given one authenticated user who did not write anything so far', () => { + it("returns the user's data and no posts", async () => { + await expect(query({ query: userDataQuery, variables })).resolves.toMatchObject({ + data: { + userData: { + user: { + id: 'a-user', + name: 'John Doe', + slug: 'john-doe', + }, + posts: [], + }, + }, + }) + }) + + describe('the user writes a post', () => { + beforeAll(async () => { + await Factory.build( + 'post', + { + id: 'a-post', + title: 'A post', + content: 'A post', + }, + { authorId: 'a-user' }, + ) + }) + + it("returns the user's data and the post", async () => { + await expect(query({ query: userDataQuery, variables })).resolves.toMatchObject({ + data: { + userData: { + user: { + id: 'a-user', + name: 'John Doe', + slug: 'john-doe', + }, + posts: [ + { + id: 'a-post', + title: 'A post', + content: 'A post', + }, + ], + }, + }, + }) + }) + }) + }) + + describe('try to request data of another user', () => { + variables = { id: 'o-user' } + it('returns the data of the authenticated user', async () => { + await expect(query({ query: userDataQuery, variables })).resolves.toMatchObject({ + data: { + userData: { + user: { + id: 'a-user', + name: 'John Doe', + slug: 'john-doe', + }, + posts: expect.arrayContaining([ + { + id: 'a-post', + title: 'A post', + content: 'A post', + comments: [], + }, + ]), + }, + }, + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/userData.ts b/docs/backend/src/schema/resolvers/userData.ts new file mode 100644 index 000000000..3cd5f1c01 --- /dev/null +++ b/docs/backend/src/schema/resolvers/userData.ts @@ -0,0 +1,61 @@ +export default { + Query: { + userData: async (object, args, context, resolveInfo) => { + const id = context.user.id + const cypher = ` + MATCH (user:User { id: $id }) + WITH user + OPTIONAL MATCH (posts:Post) + WHERE (user)-[:WROTE]->(posts) + AND posts.deleted = FALSE + AND posts.disabled = FALSE + RETURN { user: properties(user), + posts: collect( + posts { + .*, + author: [ + (posts)<-[:WROTE]-(author:User) | + author { + .* + } + ][0], + comments: [ + (posts)<-[:COMMENTS]-(comment:Comment) + WHERE comment.disabled = FALSE + AND comment.deleted = FALSE | + comment { + .*, + author: [ (comment)<-[:WROTE]-(commentator:User) | + commentator { .name, .slug, .id } ][0] + } + ], + categories: [ (posts)-[:CATEGORIZED]->(category:Category) | + category { .name, .id } ] + }) + } AS result` + const session = context.driver.session() + const resultPromise = session.readTransaction(async (transaction) => { + const transactionResponse = transaction.run(cypher, { + id, + }) + return transactionResponse + }) + + try { + const result = await resultPromise + const userData = result.records[0].get('result') + userData.posts.sort(byCreationDate) + userData.posts.forEach((post) => post.comments.sort(byCreationDate)) + return userData + } finally { + session.close() + } + }, + }, +} + +const byCreationDate = (a, b) => { + if (a.createdAt < b.createdAt) return -1 + if (a.createdAt > b.createdAt) return 1 + return 0 +} diff --git a/docs/backend/src/schema/resolvers/user_management.spec.ts b/docs/backend/src/schema/resolvers/user_management.spec.ts new file mode 100644 index 000000000..546c7a748 --- /dev/null +++ b/docs/backend/src/schema/resolvers/user_management.spec.ts @@ -0,0 +1,414 @@ +import jwt from 'jsonwebtoken' +import CONFIG from './../../config' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { loginMutation } from '../../graphql/userManagement' +import { createTestClient } from 'apollo-server-testing' +import createServer, { context } from '../../server' +import encode from '../../jwt/encode' +import { getNeode, getDriver } from '../../db/neo4j' +import { categories } from '../../constants/categories' + +const neode = getNeode() +const driver = getDriver() + +let query, mutate, variables, req, user + +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') + await Promise.all([ + reportAgainstUser.relateTo(moderator, 'filed', { + resourceId: id, + reasonCategory: 'discrimination_etc', + reasonDescription: 'This user is harassing me with bigoted remarks!', + }), + reportAgainstUser.relateTo(user, 'belongsTo'), + ]) + const disableVariables = { resourceId: user.id, disable: true, closed: false } + await Promise.all([ + reportAgainstUser.relateTo(moderator, 'reviewed', disableVariables), + user.update({ disabled: true, updatedAt: new Date().toISOString() }), + ]) +} + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + // One of the rare occasions where we test + // the actual `context` implementation here + return context({ req }) + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(() => { + user = null + req = { headers: {} } +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('isLoggedIn', () => { + const isLoggedInQuery = gql` + { + isLoggedIn + } + ` + const respondsWith = async (expected) => { + await expect(query({ query: isLoggedInQuery })).resolves.toMatchObject(expected) + } + + describe('unauthenticated', () => { + it('returns false', async () => { + await respondsWith({ data: { isLoggedIn: false } }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + user = await Factory.build('user', { id: 'u3' }) + const userBearerToken = encode({ id: 'u3' }) + req = { headers: { authorization: `Bearer ${userBearerToken}` } } + }) + + it('returns true', async () => { + await respondsWith({ data: { isLoggedIn: true } }) + }) + + describe('but user is disabled', () => { + beforeEach(async () => { + await disable('u3') + }) + + it('returns false', async () => { + await respondsWith({ data: { isLoggedIn: false } }) + }) + }) + + describe('but user is deleted', () => { + beforeEach(async () => { + await user.update({ updatedAt: new Date().toISOString(), deleted: true }) + }) + + it('returns false', async () => { + await respondsWith({ data: { isLoggedIn: false } }) + }) + }) + }) +}) + +describe('currentUser', () => { + const currentUserQuery = gql` + { + currentUser { + id + slug + name + avatar { + url + } + email + role + activeCategories + } + } + ` + + const respondsWith = async (expected) => { + await expect(query({ query: currentUserQuery, variables })).resolves.toMatchObject(expected) + } + + describe('unauthenticated', () => { + it('returns null', async () => { + await respondsWith({ data: { currentUser: null } }) + }) + }) + + describe('authenticated', () => { + describe('and corresponding user in the database', () => { + let avatar + + beforeEach(async () => { + avatar = await Factory.build('image', { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg', + }) + await Factory.build( + 'user', + { + id: 'u3', + // the `id` is the only thing that has to match the decoded JWT bearer token + name: 'Matilde Hermiston', + slug: 'matilde-hermiston', + role: 'user', + }, + { + email: 'test@example.org', + avatar, + }, + ) + const userBearerToken = encode({ id: 'u3' }) + req = { headers: { authorization: `Bearer ${userBearerToken}` } } + }) + + it('returns the whole user object', async () => { + const expected = { + data: { + currentUser: { + id: 'u3', + avatar: { + url: expect.stringContaining( + 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg', + ), + }, + email: 'test@example.org', + name: 'Matilde Hermiston', + slug: 'matilde-hermiston', + role: 'user', + }, + }, + } + await respondsWith(expected) + }) + + describe('with categories in DB', () => { + beforeEach(async () => { + await Promise.all( + categories.map(async ({ icon, name }, index) => { + await Factory.build('category', { + id: `cat${index + 1}`, + slug: name, + name, + icon, + }) + }), + ) + }) + + it('returns empty array for all categories', async () => { + await respondsWith({ + data: { + currentUser: expect.objectContaining({ activeCategories: [] }), + }, + }) + }) + + describe('with categories saved for current user', () => { + const saveCategorySettings = gql` + mutation ($activeCategories: [String]) { + saveCategorySettings(activeCategories: $activeCategories) + } + ` + beforeEach(async () => { + await mutate({ + mutation: saveCategorySettings, + variables: { activeCategories: ['cat1', 'cat3', 'cat5', 'cat7'] }, + }) + }) + + it('returns only the saved active categories', async () => { + const result = await query({ query: currentUserQuery, variables }) + expect(result.data.currentUser.activeCategories).toHaveLength(4) + expect(result.data.currentUser.activeCategories).toContain('cat1') + expect(result.data.currentUser.activeCategories).toContain('cat3') + expect(result.data.currentUser.activeCategories).toContain('cat5') + expect(result.data.currentUser.activeCategories).toContain('cat7') + }) + }) + }) + }) + }) +}) + +describe('login', () => { + const respondsWith = async (expected) => { + await expect(mutate({ mutation: loginMutation, variables })).resolves.toMatchObject(expected) + } + + beforeEach(async () => { + variables = { email: 'test@example.org', password: '1234' } + user = await Factory.build( + 'user', + { + id: 'acb2d923-f3af-479e-9f00-61b12e864666', + }, + variables, + ) + }) + + describe('ask for a `token`', () => { + describe('with a valid email/password combination', () => { + it('responds with a JWT bearer token', async () => { + const { + data: { login: token }, + } = await mutate({ mutation: loginMutation, variables }) + jwt.verify(token, CONFIG.JWT_SECRET, (err, data) => { + expect(data).toMatchObject({ + id: 'acb2d923-f3af-479e-9f00-61b12e864666', + }) + expect(err).toBeNull() + }) + }) + + describe('but user account is deleted', () => { + beforeEach(async () => { + await user.update({ updatedAt: new Date().toISOString(), deleted: true }) + }) + + it('responds with "Incorrect email address or password."', async () => { + await respondsWith({ + data: null, + errors: [{ message: 'Incorrect email address or password.' }], + }) + }) + }) + + describe('but user account is disabled', () => { + beforeEach(async () => { + await disable('acb2d923-f3af-479e-9f00-61b12e864666') + }) + + it('responds with "Your account has been disabled."', async () => { + await respondsWith({ + data: null, + errors: [{ message: 'Your account has been disabled.' }], + }) + }) + }) + + describe('normalization', () => { + describe('email address is a gmail address ', () => { + beforeEach(async () => { + const email = await neode.first('EmailAddress', { email: 'test@example.org' }) + await email.update({ email: 'someuser@gmail.com' }) + }) + + describe('supplied email contains dots', () => { + beforeEach(() => { + variables = { ...variables, email: 'some.user@gmail.com' } + }) + + it('normalizes email, issue #2329', async () => { + await respondsWith({ + data: { login: expect.any(String) }, + errors: undefined, + }) + }) + }) + }) + }) + }) + + describe('with a valid email but incorrect password', () => { + beforeEach(() => { + variables = { ...variables, email: 'test@example.org', password: 'wrong' } + }) + + it('responds with "Incorrect email address or password."', async () => { + await respondsWith({ + errors: [{ message: 'Incorrect email address or password.' }], + }) + }) + }) + + describe('with a non-existing email', () => { + beforeEach(() => { + variables = { + ...variables, + email: 'non-existent@example.org', + password: '1234', + } + }) + + it('responds with "Incorrect email address or password."', async () => { + await respondsWith({ + errors: [{ message: 'Incorrect email address or password.' }], + }) + }) + }) + }) +}) + +describe('change password', () => { + const changePasswordMutation = gql` + mutation ($oldPassword: String!, $newPassword: String!) { + changePassword(oldPassword: $oldPassword, newPassword: $newPassword) + } + ` + + const respondsWith = async (expected) => { + await expect(mutate({ mutation: changePasswordMutation, variables })).resolves.toMatchObject( + expected, + ) + } + + beforeEach(async () => { + variables = { ...variables, oldPassword: 'what', newPassword: 'ever' } + }) + + describe('unauthenticated', () => { + it('throws "Not Authorized!"', async () => { + await respondsWith({ errors: [{ message: 'Not Authorized!' }] }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + await Factory.build('user', { id: 'u3' }) + const userBearerToken = encode({ id: 'u3' }) + req = { headers: { authorization: `Bearer ${userBearerToken}` } } + }) + describe('old password === new password', () => { + beforeEach(() => { + variables = { ...variables, oldPassword: '1234', newPassword: '1234' } + }) + + it('responds with "Old password and new password should be different"', async () => { + await respondsWith({ + errors: [{ message: 'Old password and new password should be different' }], + }) + }) + }) + + describe('incorrect old password', () => { + beforeEach(() => { + variables = { + ...variables, + oldPassword: 'notOldPassword', + newPassword: '12345', + } + }) + + it('responds with "Old password isn\'t valid"', async () => { + await respondsWith({ errors: [{ message: 'Old password is not correct' }] }) + }) + }) + + describe('correct password', () => { + beforeEach(() => { + variables = { + ...variables, + oldPassword: '1234', + newPassword: '12345', + } + }) + + it('changes the password if given correct credentials "', async () => { + await respondsWith({ data: { changePassword: expect.any(String) } }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/user_management.ts b/docs/backend/src/schema/resolvers/user_management.ts new file mode 100644 index 000000000..d88eafdae --- /dev/null +++ b/docs/backend/src/schema/resolvers/user_management.ts @@ -0,0 +1,102 @@ +import encode from '../../jwt/encode' +import bcrypt from 'bcryptjs' +import { AuthenticationError } from 'apollo-server' +import { getNeode } from '../../db/neo4j' +import normalizeEmail from './helpers/normalizeEmail' +import log from './helpers/databaseLogger' + +const neode = getNeode() + +export default { + Query: { + isLoggedIn: (_, args, { driver, user }) => { + return Boolean(user && user.id) + }, + currentUser: async (object, params, context, resolveInfo) => { + const { user, driver } = context + if (!user) return null + const session = driver.session() + const currentUserTransactionPromise = session.readTransaction(async (transaction) => { + const result = await transaction.run( + ` + MATCH (user:User {id: $id}) + OPTIONAL MATCH (category:Category) WHERE NOT ((user)-[:NOT_INTERESTED_IN]->(category)) + OPTIONAL MATCH (cats:Category) + WITH user, [(user)<-[:OWNED_BY]-(medium:SocialMedia) | properties(medium) ] AS media, category, toString(COUNT(cats)) AS categoryCount + RETURN user {.*, socialMedia: media, activeCategories: collect(category.id) } AS user, categoryCount + `, + { id: user.id }, + ) + const [categoryCount] = result.records.map((record) => record.get('categoryCount')) + const [currentUser] = result.records.map((record) => record.get('user')) + // frontend expects empty array when all categories are selected + if (currentUser.activeCategories.length === parseInt(categoryCount)) + currentUser.activeCategories = [] + return currentUser + }) + try { + const currentUser = await currentUserTransactionPromise + return currentUser + } finally { + session.close() + } + }, + }, + Mutation: { + login: async (_, { email, password }, { driver, req, user }) => { + // if (user && user.id) { + // throw new Error('Already logged in.') + // } + email = normalizeEmail(email) + const session = driver.session() + try { + const loginReadTxResultPromise = session.readTransaction(async (transaction) => { + const loginTransactionResponse = await transaction.run( + ` + MATCH (user:User {deleted: false})-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $userEmail}) + RETURN user {.id, .slug, .name, .encryptedPassword, .role, .disabled, email:e.email} as user LIMIT 1 + `, + { userEmail: email }, + ) + log(loginTransactionResponse) + return loginTransactionResponse.records.map((record) => record.get('user')) + }) + const [currentUser] = await loginReadTxResultPromise + if ( + currentUser && + (await bcrypt.compareSync(password, currentUser.encryptedPassword)) && + !currentUser.disabled + ) { + delete currentUser.encryptedPassword + return encode(currentUser) + } else if (currentUser && currentUser.disabled) { + throw new AuthenticationError('Your account has been disabled.') + } else { + throw new AuthenticationError('Incorrect email address or password.') + } + } finally { + session.close() + } + }, + changePassword: async (_, { oldPassword, newPassword }, { driver, user }) => { + const currentUser = await neode.find('User', user.id) + + const encryptedPassword = currentUser.get('encryptedPassword') + if (!(await bcrypt.compareSync(oldPassword, encryptedPassword))) { + throw new AuthenticationError('Old password is not correct') + } + + if (await bcrypt.compareSync(newPassword, encryptedPassword)) { + throw new AuthenticationError('Old password and new password should be different') + } + + const newEncryptedPassword = await bcrypt.hashSync(newPassword, 10) + await currentUser.update({ + encryptedPassword: newEncryptedPassword, + updatedAt: new Date().toISOString(), + }) + + return encode(await currentUser.toJson()) + }, + }, +} diff --git a/docs/backend/src/schema/resolvers/users.spec.ts b/docs/backend/src/schema/resolvers/users.spec.ts new file mode 100644 index 000000000..bc976fb24 --- /dev/null +++ b/docs/backend/src/schema/resolvers/users.spec.ts @@ -0,0 +1,724 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' +import { categories } from '../../constants/categories' + +const categoryIds = ['cat9'] +let user +let admin +let authenticatedUser + +let query +let mutate +let variables + +const driver = getDriver() +const neode = getNeode() + +const deleteUserMutation = gql` + mutation ($id: ID!, $resource: [Deletable]) { + DeleteUser(id: $id, resource: $resource) { + id + name + about + deleted + contributions { + id + content + contentExcerpt + deleted + comments { + id + content + contentExcerpt + deleted + } + } + comments { + id + content + contentExcerpt + deleted + } + } + } +` +const switchUserRoleMutation = gql` + mutation ($role: UserRole!, $id: ID!) { + switchUserRole(role: $role, id: $id) { + name + role + id + updatedAt + email + } + } +` + +const saveCategorySettings = gql` + mutation ($activeCategories: [String]) { + saveCategorySettings(activeCategories: $activeCategories) + } +` + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + query = createTestClient(server).query + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('User', () => { + describe('query by email address', () => { + let userQuery + + beforeEach(async () => { + userQuery = gql` + query ($email: String) { + User(email: $email) { + name + } + } + ` + variables = { + email: 'any-email-address@example.org', + } + await Factory.build('user', { name: 'Johnny' }, { email: 'any-email-address@example.org' }) + }) + + it('is forbidden', async () => { + await expect(query({ query: userQuery, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) + }) + + describe('as admin', () => { + beforeEach(async () => { + const admin = await Factory.build( + 'user', + { + role: 'admin', + }, + { + email: 'admin@example.org', + password: '1234', + }, + ) + authenticatedUser = await admin.toJson() + }) + + it('is permitted', async () => { + await expect(query({ query: userQuery, variables })).resolves.toMatchObject({ + data: { User: [{ name: 'Johnny' }] }, + errors: undefined, + }) + }) + + it('non-existing email address, issue #2294', async () => { + // see: https://github.com/Human-Connection/Human-Connection/issues/2294 + await expect( + query({ + query: userQuery, + variables: { + email: 'this-email-does-not-exist@example.org', + }, + }), + ).resolves.toMatchObject({ + data: { User: [] }, + errors: undefined, + }) + }) + }) + }) +}) + +describe('UpdateUser', () => { + let updateUserMutation + + beforeEach(async () => { + updateUserMutation = gql` + mutation ( + $id: ID! + $name: String + $termsAndConditionsAgreedVersion: String + $locationName: String # empty string '' sets it to null + ) { + UpdateUser( + id: $id + name: $name + termsAndConditionsAgreedVersion: $termsAndConditionsAgreedVersion + locationName: $locationName + ) { + id + name + termsAndConditionsAgreedVersion + termsAndConditionsAgreedAt + locationName + location { + name + nameDE + nameEN + } + } + } + ` + variables = { + id: 'u47', + name: 'John Doughnut', + } + + user = await Factory.build( + 'user', + { + id: 'u47', + name: 'John Doe', + termsAndConditionsAgreedVersion: null, + termsAndConditionsAgreedAt: null, + allowEmbedIframes: false, + }, + { + email: 'user@example.org', + }, + ) + }) + + describe('as another user', () => { + beforeEach(async () => { + const someoneElse = await Factory.build( + 'user', + { + name: 'James Doe', + }, + { + email: 'someone-else@example.org', + }, + ) + + authenticatedUser = await someoneElse.toJson() + }) + + it('is not allowed to change other user accounts', async () => { + const { errors } = await mutate({ mutation: updateUserMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + }) + + describe('as the same user', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + it('updates the name', async () => { + const expected = { + data: { + UpdateUser: { + id: 'u47', + name: 'John Doughnut', + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + + describe('given a new agreed version of terms and conditions', () => { + beforeEach(async () => { + variables = { ...variables, termsAndConditionsAgreedVersion: '0.0.2' } + }) + it('update termsAndConditionsAgreedVersion', async () => { + const expected = { + data: { + UpdateUser: expect.objectContaining({ + termsAndConditionsAgreedVersion: '0.0.2', + termsAndConditionsAgreedAt: expect.any(String), + }), + }, + errors: undefined, + } + + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + describe('given any attribute other than termsAndConditionsAgreedVersion', () => { + beforeEach(async () => { + variables = { ...variables, name: 'any name' } + }) + it('update termsAndConditionsAgreedVersion', async () => { + const expected = { + data: { + UpdateUser: expect.objectContaining({ + termsAndConditionsAgreedVersion: null, + termsAndConditionsAgreedAt: null, + }), + }, + errors: undefined, + } + + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject( + expected, + ) + }) + }) + + it('rejects if version of terms and conditions has wrong format', async () => { + variables = { + ...variables, + termsAndConditionsAgreedVersion: 'invalid version format', + } + const { errors } = await mutate({ mutation: updateUserMutation, variables }) + expect(errors[0]).toHaveProperty('message', 'Invalid version format!') + }) + + describe('supports updating location', () => { + describe('change location to "Hamburg, New Jersey, United States"', () => { + it('has updated location to "Hamburg, New Jersey, United States"', async () => { + variables = { ...variables, locationName: 'Hamburg, New Jersey, United States' } + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject({ + data: { + UpdateUser: { + locationName: 'Hamburg, New Jersey, United States', + location: expect.objectContaining({ + name: 'Hamburg', + nameDE: 'Hamburg', + nameEN: 'Hamburg', + }), + }, + }, + errors: undefined, + }) + }) + }) + + describe('change location to unset location', () => { + it('has updated location to unset location', async () => { + variables = { ...variables, locationName: '' } + await expect(mutate({ mutation: updateUserMutation, variables })).resolves.toMatchObject({ + data: { + UpdateUser: { + locationName: null, + location: null, + }, + }, + errors: undefined, + }) + }) + }) + }) + }) +}) + +describe('Delete a User as admin', () => { + beforeEach(async () => { + variables = { id: ' u343', resource: [] } + + user = await Factory.build('user', { + name: 'My name should be deleted', + about: 'along with my about', + id: 'u343', + }) + }) + + describe('authenticated as Admin', () => { + beforeEach(async () => { + admin = await Factory.build( + 'user', + { + role: 'admin', + }, + { + email: 'admin@example.org', + password: '1234', + }, + ) + authenticatedUser = await admin.toJson() + }) + + describe('deleting a user account', () => { + beforeEach(() => { + variables = { ...variables, id: 'u343' } + }) + + describe('given posts and comments', () => { + beforeEach(async () => { + await Factory.build('category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) + await Factory.build( + 'post', + { + id: 'p139', + content: 'Post by user u343', + }, + { + author: user, + categoryIds, + }, + ) + await Factory.build( + 'comment', + { + id: 'c155', + content: 'Comment by user u343', + }, + { + author: user, + }, + ) + await Factory.build( + 'comment', + { + id: 'c156', + content: "A comment by someone else on user u343's post", + }, + { + postId: 'p139', + }, + ) + }) + + it("deletes account, but doesn't delete posts or comments by default", async () => { + const expectedResponse = { + data: { + DeleteUser: { + id: 'u343', + name: 'UNAVAILABLE', + about: 'UNAVAILABLE', + deleted: true, + contributions: [ + { + id: 'p139', + content: 'Post by user u343', + contentExcerpt: 'Post by user u343', + deleted: false, + comments: [ + { + id: 'c156', + content: "A comment by someone else on user u343's post", + contentExcerpt: "A comment by someone else on user u343's post", + deleted: false, + }, + ], + }, + ], + comments: [ + { + id: 'c155', + content: 'Comment by user u343', + contentExcerpt: 'Comment by user u343', + deleted: false, + }, + ], + }, + }, + errors: undefined, + } + await expect(mutate({ mutation: deleteUserMutation, variables })).resolves.toMatchObject( + expectedResponse, + ) + }) + + describe('deletion of all posts and comments requested', () => { + beforeEach(() => { + variables = { ...variables, resource: ['Comment', 'Post'] } + }) + + it('marks posts and comments as deleted', async () => { + const expectedResponse = { + data: { + DeleteUser: { + id: 'u343', + name: 'UNAVAILABLE', + about: 'UNAVAILABLE', + deleted: true, + contributions: [ + { + id: 'p139', + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + deleted: true, + comments: [ + { + id: 'c156', + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + deleted: true, + }, + ], + }, + ], + comments: [ + { + id: 'c155', + content: 'UNAVAILABLE', + contentExcerpt: 'UNAVAILABLE', + deleted: true, + }, + ], + }, + }, + errors: undefined, + } + await expect( + mutate({ mutation: deleteUserMutation, variables }), + ).resolves.toMatchObject(expectedResponse) + }) + }) + }) + + describe('connected `EmailAddress` nodes', () => { + it('will be removed completely', async () => { + await expect(neode.all('EmailAddress')).resolves.toHaveLength(2) + await mutate({ mutation: deleteUserMutation, variables }) + + await expect(neode.all('EmailAddress')).resolves.toHaveLength(1) + }) + }) + + describe('connected `SocialMedia` nodes', () => { + beforeEach(async () => { + const socialMedia = await Factory.build('socialMedia') + await socialMedia.relateTo(user, 'ownedBy') + }) + + it('will be removed completely', async () => { + await expect(neode.all('SocialMedia')).resolves.toHaveLength(1) + await mutate({ mutation: deleteUserMutation, variables }) + await expect(neode.all('SocialMedia')).resolves.toHaveLength(0) + }) + }) + }) + }) +}) + +describe('switch user role', () => { + beforeEach(async () => { + user = await Factory.build('user', { + id: 'user', + role: 'user', + }) + admin = await Factory.build('user', { + role: 'admin', + id: 'admin', + }) + }) + + describe('as simple user', () => { + it('cannot change the role', async () => { + authenticatedUser = await user.toJson() + variables = { + id: 'user', + role: 'admin', + } + await expect(mutate({ mutation: switchUserRoleMutation, variables })).resolves.toEqual( + expect.objectContaining({ + errors: [ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ], + }), + ) + }) + }) + + describe('as admin', () => { + it('changes the role of other user', async () => { + authenticatedUser = await admin.toJson() + variables = { + id: 'user', + role: 'moderator', + } + await expect(mutate({ mutation: switchUserRoleMutation, variables })).resolves.toEqual( + expect.objectContaining({ + data: { + switchUserRole: expect.objectContaining({ + role: 'moderator', + }), + }, + }), + ) + }) + + it('cannot change own role', async () => { + authenticatedUser = await admin.toJson() + variables = { + id: 'admin', + role: 'moderator', + } + await expect(mutate({ mutation: switchUserRoleMutation, variables })).resolves.toEqual( + expect.objectContaining({ + errors: [ + expect.objectContaining({ + message: 'you-cannot-change-your-own-role', + }), + ], + }), + ) + }) + }) +}) + +describe('save category settings', () => { + beforeEach(async () => { + await Promise.all( + categories.map(({ icon, name }, index) => { + return Factory.build('category', { + id: `cat${index + 1}`, + slug: name, + name, + icon, + }) + }), + ) + }) + + beforeEach(async () => { + user = await Factory.build('user', { + id: 'user', + role: 'user', + }) + variables = { + activeCategories: ['cat1', 'cat3', 'cat5'], + } + }) + + describe('not authenticated', () => { + beforeEach(async () => { + authenticatedUser = undefined + }) + + it('throws an error', async () => { + await expect(mutate({ mutation: saveCategorySettings, variables })).resolves.toEqual( + expect.objectContaining({ + errors: [ + expect.objectContaining({ + message: 'Not Authorized!', + }), + ], + }), + ) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + authenticatedUser = await user.toJson() + }) + + const userQuery = gql` + query ($id: ID) { + User(id: $id) { + activeCategories + } + } + ` + + describe('no categories saved', () => { + it('returns true for active categories mutation', async () => { + await expect(mutate({ mutation: saveCategorySettings, variables })).resolves.toEqual( + expect.objectContaining({ + data: { saveCategorySettings: true }, + }), + ) + }) + + describe('query for user', () => { + beforeEach(async () => { + await mutate({ mutation: saveCategorySettings, variables }) + }) + + it('returns the active categories when user is queried', async () => { + await expect( + query({ query: userQuery, variables: { id: authenticatedUser.id } }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + User: [ + { + activeCategories: expect.arrayContaining(['cat1', 'cat3', 'cat5']), + }, + ], + }, + }), + ) + }) + }) + }) + + describe('categories already saved', () => { + beforeEach(async () => { + variables = { + activeCategories: ['cat1', 'cat3', 'cat5'], + } + await mutate({ mutation: saveCategorySettings, variables }) + variables = { + activeCategories: ['cat10', 'cat11', 'cat12', 'cat8', 'cat9'], + } + }) + + it('returns true', async () => { + await expect(mutate({ mutation: saveCategorySettings, variables })).resolves.toEqual( + expect.objectContaining({ + data: { saveCategorySettings: true }, + }), + ) + }) + + describe('query for user', () => { + beforeEach(async () => { + await mutate({ mutation: saveCategorySettings, variables }) + }) + + it('returns the new active categories when user is queried', async () => { + await expect( + query({ query: userQuery, variables: { id: authenticatedUser.id } }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + User: [ + { + activeCategories: expect.arrayContaining([ + 'cat10', + 'cat11', + 'cat12', + 'cat8', + 'cat9', + ]), + }, + ], + }, + }), + ) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/users.ts b/docs/backend/src/schema/resolvers/users.ts new file mode 100644 index 000000000..6f79a4ea9 --- /dev/null +++ b/docs/backend/src/schema/resolvers/users.ts @@ -0,0 +1,383 @@ +import { neo4jgraphql } from 'neo4j-graphql-js' +import { getNeode } from '../../db/neo4j' +import { UserInputError, ForbiddenError } from 'apollo-server' +import { mergeImage, deleteImage } from './images/images' +import Resolver from './helpers/Resolver' +import log from './helpers/databaseLogger' +import { createOrUpdateLocations } from './users/location' + +const neode = getNeode() + +export const getMutedUsers = async (context) => { + const { neode } = context + const userModel = neode.model('User') + let mutedUsers = neode + .query() + .match('user', userModel) + .where('user.id', context.user.id) + .relationship(userModel.relationships().get('muted')) + .to('muted', userModel) + .return('muted') + mutedUsers = await mutedUsers.execute() + mutedUsers = mutedUsers.records.map((r) => r.get('muted').properties) + return mutedUsers +} + +export const getBlockedUsers = async (context) => { + const { neode } = context + const userModel = neode.model('User') + let blockedUsers = neode + .query() + .match('user', userModel) + .where('user.id', context.user.id) + .relationship(userModel.relationships().get('blocked')) + .to('blocked', userModel) + .return('blocked') + blockedUsers = await blockedUsers.execute() + blockedUsers = blockedUsers.records.map((r) => r.get('blocked').properties) + return blockedUsers +} + +export default { + Query: { + mutedUsers: async (object, args, context, resolveInfo) => { + try { + return getMutedUsers(context) + } catch (e) { + throw new UserInputError(e.message) + } + }, + blockedUsers: async (object, args, context, resolveInfo) => { + try { + return getBlockedUsers(context) + } catch (e) { + throw new UserInputError(e.message) + } + }, + User: async (object, args, context, resolveInfo) => { + const { email } = args + if (email) { + let session + try { + session = context.driver.session() + const readTxResult = await session.readTransaction((txc) => { + const result = txc.run( + ` + MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $args.email}) + RETURN user`, + { args }, + ) + return result + }) + return readTxResult.records.map((r) => r.get('user').properties) + } finally { + session.close() + } + } + return neo4jgraphql(object, args, context, resolveInfo) + }, + }, + Mutation: { + muteUser: async (_parent, params, context, _resolveInfo) => { + const { user: currentUser } = context + if (currentUser.id === params.id) return null + await neode.writeCypher( + ` + MATCH(u:User {id: $currentUser.id})-[previousRelationship:FOLLOWS]->(b:User {id: $params.id}) + DELETE previousRelationship + `, + { currentUser, params }, + ) + const [user, mutedUser] = await Promise.all([ + neode.find('User', currentUser.id), + neode.find('User', params.id), + ]) + await user.relateTo(mutedUser, 'muted') + return mutedUser.toJson() + }, + unmuteUser: async (_parent, params, context, _resolveInfo) => { + const { user: currentUser } = context + if (currentUser.id === params.id) return null + await neode.writeCypher( + ` + MATCH(u:User {id: $currentUser.id})-[previousRelationship:MUTED]->(b:User {id: $params.id}) + DELETE previousRelationship + `, + { currentUser, params }, + ) + const unmutedUser = await neode.find('User', params.id) + return unmutedUser.toJson() + }, + blockUser: async (object, args, context, resolveInfo) => { + const { user: currentUser } = context + if (currentUser.id === args.id) return null + await neode.cypher( + ` + MATCH(u:User {id: $currentUser.id})-[r:FOLLOWS]->(b:User {id: $args.id}) + DELETE r + `, + { currentUser, args }, + ) + const [user, blockedUser] = await Promise.all([ + neode.find('User', currentUser.id), + neode.find('User', args.id), + ]) + await user.relateTo(blockedUser, 'blocked') + return blockedUser.toJson() + }, + unblockUser: async (object, args, context, resolveInfo) => { + const { user: currentUser } = context + if (currentUser.id === args.id) return null + await neode.cypher( + ` + MATCH(u:User {id: $currentUser.id})-[r:BLOCKED]->(b:User {id: $args.id}) + DELETE r + `, + { currentUser, args }, + ) + const blockedUser = await neode.find('User', args.id) + return blockedUser.toJson() + }, + UpdateUser: async (_parent, params, context, _resolveInfo) => { + const { avatar: avatarInput } = params + delete params.avatar + params.locationName = params.locationName === '' ? null : params.locationName + const { termsAndConditionsAgreedVersion } = params + if (termsAndConditionsAgreedVersion) { + const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g + if (!regEx.test(termsAndConditionsAgreedVersion)) { + throw new ForbiddenError('Invalid version format!') + } + params.termsAndConditionsAgreedAt = new Date().toISOString() + } + const session = context.driver.session() + + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const updateUserTransactionResponse = await transaction.run( + ` + MATCH (user:User {id: $params.id}) + SET user += $params + SET user.updatedAt = toString(datetime()) + RETURN user {.*} + `, + { params }, + ) + const [user] = updateUserTransactionResponse.records.map((record) => record.get('user')) + if (avatarInput) { + await mergeImage(user, 'AVATAR_IMAGE', avatarInput, { transaction }) + } + return user + }) + try { + const user = await writeTxResultPromise + // TODO: put in a middleware, see "CreateGroup", "UpdateGroup" + await createOrUpdateLocations('User', params.id, params.locationName, session) + return user + } catch (error) { + throw new UserInputError(error.message) + } finally { + session.close() + } + }, + DeleteUser: async (object, params, context, resolveInfo) => { + const { resource, id: userId } = params + const session = context.driver.session() + + const deleteUserTxResultPromise = session.writeTransaction(async (transaction) => { + if (resource && resource.length) { + await Promise.all( + resource.map(async (node) => { + const txResult = await transaction.run( + ` + MATCH (resource:${node})<-[:WROTE]-(author:User {id: $userId}) + OPTIONAL MATCH (resource)<-[:COMMENTS]-(comment:Comment) + SET resource.deleted = true + SET resource.content = 'UNAVAILABLE' + SET resource.contentExcerpt = 'UNAVAILABLE' + SET resource.language = 'UNAVAILABLE' + SET resource.createdAt = 'UNAVAILABLE' + SET resource.updatedAt = 'UNAVAILABLE' + SET comment.deleted = true + RETURN resource {.*} + `, + { + userId, + }, + ) + return Promise.all( + txResult.records + .map((record) => record.get('resource')) + .map((resource) => deleteImage(resource, 'HERO_IMAGE', { transaction })), + ) + }), + ) + } + + const deleteUserTransactionResponse = await transaction.run( + ` + MATCH (user:User {id: $userId}) + SET user.deleted = true + SET user.name = 'UNAVAILABLE' + SET user.about = 'UNAVAILABLE' + SET user.lastActiveAt = 'UNAVAILABLE' + SET user.createdAt = 'UNAVAILABLE' + SET user.updatedAt = 'UNAVAILABLE' + SET user.termsAndConditionsAgreedVersion = 'UNAVAILABLE' + SET user.encryptedPassword = null + WITH user + OPTIONAL MATCH (user)<-[:BELONGS_TO]-(email:EmailAddress) + DETACH DELETE email + WITH user + OPTIONAL MATCH (user)<-[:OWNED_BY]-(socialMedia:SocialMedia) + DETACH DELETE socialMedia + RETURN user {.*} + `, + { userId }, + ) + log(deleteUserTransactionResponse) + const [user] = deleteUserTransactionResponse.records.map((record) => record.get('user')) + await deleteImage(user, 'AVATAR_IMAGE', { transaction }) + return user + }) + try { + const user = await deleteUserTxResultPromise + return user + } finally { + session.close() + } + }, + switchUserRole: async (object, args, context, resolveInfo) => { + const { role, id } = args + + if (context.user.id === id) throw new Error('you-cannot-change-your-own-role') + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const switchUserRoleResponse = await transaction.run( + ` + MATCH (user:User {id: $id}) + SET user.role = $role + SET user.updatedAt = toString(datetime()) + RETURN user {.*} + `, + { id, role }, + ) + const [user] = switchUserRoleResponse.records.map((record) => record.get('user')) + return user + }) + try { + const user = await writeTxResultPromise + return user + } finally { + session.close() + } + }, + saveCategorySettings: async (object, args, context, resolveInfo) => { + const { activeCategories } = args + const { + user: { id }, + } = context + + const session = context.driver.session() + await session.writeTransaction((transaction) => { + return transaction.run( + ` + MATCH (user:User { id: $id })-[previousCategories:NOT_INTERESTED_IN]->(category:Category) + DELETE previousCategories + RETURN user, category + `, + { id }, + ) + }) + + // frontend gives [] when all categories are selected (default) + if (activeCategories.length === 0) return true + + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const saveCategorySettingsResponse = await transaction.run( + ` + MATCH (category:Category) WHERE NOT category.id IN $activeCategories + MATCH (user:User { id: $id }) + MERGE (user)-[r:NOT_INTERESTED_IN]->(category) + RETURN user, r, category + `, + { id, activeCategories }, + ) + const [user] = await saveCategorySettingsResponse.records.map((record) => + record.get('user'), + ) + return user + }) + try { + await writeTxResultPromise + return true + } finally { + session.close() + } + }, + }, + User: { + email: async (parent, params, context, resolveInfo) => { + if (typeof parent.email !== 'undefined') return parent.email + const { id } = parent + const statement = `MATCH(u:User {id: $id})-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e` + const result = await neode.cypher(statement, { id }) + const [{ email }] = result.records.map((r) => r.get('e').properties) + return email + }, + ...Resolver('User', { + undefinedToNull: [ + 'actorId', + 'deleted', + 'disabled', + 'locationName', + 'about', + 'termsAndConditionsAgreedVersion', + 'termsAndConditionsAgreedAt', + 'allowEmbedIframes', + 'showShoutsPublicly', + 'sendNotificationEmails', + 'locale', + ], + boolean: { + followedByCurrentUser: + 'MATCH (this)<-[:FOLLOWS]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', + isBlocked: + 'MATCH (this)<-[:BLOCKED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', + blocked: + 'MATCH (this)-[:BLOCKED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', + isMuted: + 'MATCH (this)<-[:MUTED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', + }, + count: { + contributionsCount: + '-[:WROTE]->(related:Post) WHERE NOT related.disabled = true AND NOT related.deleted = true', + friendsCount: '<-[:FRIENDS]->(related:User)', + followingCount: '-[:FOLLOWS]->(related:User)', + followedByCount: '<-[:FOLLOWS]-(related:User)', + commentedCount: + '-[:WROTE]->(c:Comment)-[:COMMENTS]->(related:Post) WHERE NOT related.disabled = true AND NOT related.deleted = true', + shoutedCount: + '-[:SHOUTED]->(related:Post) WHERE NOT related.disabled = true AND NOT related.deleted = true', + badgesCount: '<-[:REWARDED]-(related:Badge)', + }, + hasOne: { + avatar: '-[:AVATAR_IMAGE]->(related:Image)', + invitedBy: '<-[:INVITED]-(related:User)', + location: '-[:IS_IN]->(related:Location)', + redeemedInviteCode: '-[:REDEEMED]->(related:InviteCode)', + }, + hasMany: { + followedBy: '<-[:FOLLOWS]-(related:User)', + following: '-[:FOLLOWS]->(related:User)', + friends: '-[:FRIENDS]-(related:User)', + socialMedia: '<-[:OWNED_BY]-(related:SocialMedia)', + contributions: '-[:WROTE]->(related:Post)', + comments: '-[:WROTE]->(related:Comment)', + shouted: '-[:SHOUTED]->(related:Post)', + categories: '-[:CATEGORIZED]->(related:Category)', + badges: '<-[:REWARDED]-(related:Badge)', + inviteCodes: '-[:GENERATED]->(related:InviteCode)', + }, + }), + }, +} diff --git a/docs/backend/src/schema/resolvers/users/location.spec.ts b/docs/backend/src/schema/resolvers/users/location.spec.ts new file mode 100644 index 000000000..7097002da --- /dev/null +++ b/docs/backend/src/schema/resolvers/users/location.spec.ts @@ -0,0 +1,224 @@ +import gql from 'graphql-tag' +import Factory, { cleanDatabase } from '../../../db/factories' +import { getNeode, getDriver } from '../../../db/neo4j' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../../server' + +const neode = getNeode() +const driver = getDriver() +let authenticatedUser, mutate, query, variables + +const updateUserMutation = gql` + mutation ($id: ID!, $name: String!, $locationName: String) { + UpdateUser(id: $id, name: $name, locationName: $locationName) { + locationName + } + } +` +const queryLocations = gql` + query ($place: String!, $lang: String!) { + queryLocations(place: $place, lang: $lang) { + place_name + id + } + } +` +const newlyCreatedNodesWithLocales = [ + { + city: { + id: expect.stringContaining('place'), + type: 'place', + name: 'Welzheim', + nameEN: 'Welzheim', + nameDE: 'Welzheim', + namePT: 'Welzheim', + nameES: 'Welzheim', + nameFR: 'Welzheim', + nameIT: 'Welzheim', + nameRU: 'Вельцхайм', + nameNL: 'Welzheim', + namePL: 'Welzheim', + lng: 9.634741, + lat: 48.874924, + }, + state: { + id: expect.stringContaining('region'), + type: 'region', + name: 'Baden-Württemberg', + nameDE: 'Baden-Württemberg', + nameEN: 'Baden-Württemberg', + nameES: 'Baden-Wurtemberg', + nameFR: 'Bade-Wurtemberg', + nameIT: 'Baden-Württemberg', + nameNL: 'Baden-Württemberg', + namePL: 'Badenia-Wirtembergia', + namePT: 'Baden-Württemberg', + nameRU: 'Баден-Вюртемберг', + }, + country: { + id: expect.stringContaining('country'), + type: 'country', + name: 'Germany', + nameDE: 'Deutschland', + nameEN: 'Germany', + nameES: 'Alemania', + nameFR: 'Allemagne', + nameIT: 'Germania', + nameNL: 'Duitsland', + namePL: 'Niemcy', + namePT: 'Alemanha', + nameRU: 'Германия', + }, + }, +] + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + user: authenticatedUser, + neode, + driver, + } + }, + }) + mutate = createTestClient(server).mutate + query = createTestClient(server).query +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(() => { + variables = {} + authenticatedUser = null +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('Location Service', () => { + // Authentication + // TODO: unify, externalize, simplify, wtf? + let user + beforeEach(async () => { + user = await Factory.build('user', { + id: 'location-user', + }) + authenticatedUser = await user.toJson() + }) + + it('query Location existing', async () => { + variables = { + place: 'Berlin', + lang: 'en', + } + const result = await query({ query: queryLocations, variables }) + expect(result.data.queryLocations).toEqual( + expect.arrayContaining([ + { id: expect.stringMatching(/^place\.[0-9]+$/), place_name: 'Berlin, Germany' }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin, Maryland, United States', + }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin, Connecticut, United States', + }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin, New Jersey, United States', + }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin Heights, Ohio, United States', + }, + ]), + ) + }) + + it('query Location existing in different language', async () => { + variables = { + place: 'Berlin', + lang: 'de', + } + const result = await query({ query: queryLocations, variables }) + expect(result.data.queryLocations).toEqual([ + { id: expect.stringMatching(/^place\.[0-9]+$/), place_name: 'Berlin, Deutschland' }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin, Maryland, Vereinigte Staaten', + }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin, New Jersey, Vereinigte Staaten', + }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin Heights, Ohio, Vereinigte Staaten', + }, + { + id: expect.stringMatching(/^place\.[0-9]+$/), + place_name: 'Berlin, Massachusetts, Vereinigte Staaten', + }, + ]) + }) + + it('query Location not existing', async () => { + variables = { + place: 'GbHtsd4sdHa', + lang: 'en', + } + const result = await query({ query: queryLocations, variables }) + expect(result.data.queryLocations).toEqual([]) + }) + + it('query Location without a place name given', async () => { + variables = { + place: '', + lang: 'en', + } + const result = await query({ query: queryLocations, variables }) + expect(result.data.queryLocations).toEqual([]) + }) +}) + +describe('userMiddleware', () => { + describe('UpdateUser', () => { + let user + beforeEach(async () => { + user = await Factory.build('user', { + id: 'updating-user', + }) + authenticatedUser = await user.toJson() + }) + + it('creates a Location node with localized city/state/country names', async () => { + variables = { + ...variables, + id: 'updating-user', + name: 'Updating user', + locationName: 'Welzheim, Baden-Württemberg, Germany', + } + await mutate({ mutation: updateUserMutation, variables }) + const locations = await neode.cypher( + `MATCH (city:Location)-[:IS_IN]->(state:Location)-[:IS_IN]->(country:Location) return city {.*}, state {.*}, country {.*}`, + ) + expect( + locations.records.map((record) => { + return { + city: record.get('city'), + state: record.get('state'), + country: record.get('country'), + } + }), + ).toEqual(newlyCreatedNodesWithLocales) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/users/location.ts b/docs/backend/src/schema/resolvers/users/location.ts new file mode 100644 index 000000000..0c3f55595 --- /dev/null +++ b/docs/backend/src/schema/resolvers/users/location.ts @@ -0,0 +1,166 @@ +import request from 'request' +import { UserInputError } from 'apollo-server' +import Debug from 'debug' +import asyncForEach from '../../../helpers/asyncForEach' +import CONFIG from '../../../config' + +const debug = Debug('human-connection:location') + +const fetch = (url) => { + return new Promise((resolve, reject) => { + request(url, function (error, response, body) { + if (error) { + reject(error) + } else { + resolve(JSON.parse(body)) + } + }) + }) +} + +const locales = ['en', 'de', 'fr', 'nl', 'it', 'es', 'pt', 'pl', 'ru'] + +const createLocation = async (session, mapboxData) => { + const data = { + id: mapboxData.id + (mapboxData.address ? `-${mapboxData.address}` : ''), + nameEN: mapboxData.text_en, + nameDE: mapboxData.text_de, + nameFR: mapboxData.text_fr, + nameNL: mapboxData.text_nl, + nameIT: mapboxData.text_it, + nameES: mapboxData.text_es, + namePT: mapboxData.text_pt, + namePL: mapboxData.text_pl, + nameRU: mapboxData.text_ru, + type: mapboxData.id.split('.')[0].toLowerCase(), + address: mapboxData.address, + lng: mapboxData.center && mapboxData.center.length ? mapboxData.center[0] : null, + lat: mapboxData.center && mapboxData.center.length ? mapboxData.center[1] : null, + } + + let mutation = + 'MERGE (l:Location {id: $id}) ' + + 'SET l.name = $nameEN, ' + + 'l.nameEN = $nameEN, ' + + 'l.nameDE = $nameDE, ' + + 'l.nameFR = $nameFR, ' + + 'l.nameNL = $nameNL, ' + + 'l.nameIT = $nameIT, ' + + 'l.nameES = $nameES, ' + + 'l.namePT = $namePT, ' + + 'l.namePL = $namePL, ' + + 'l.nameRU = $nameRU, ' + + 'l.type = $type' + + if (data.lat && data.lng) { + mutation += ', l.lat = $lat, l.lng = $lng' + } + if (data.address) { + mutation += ', l.address = $address' + } + + mutation += ' RETURN l.id' + + await session.writeTransaction((transaction) => { + return transaction.run(mutation, data) + }) +} + +export const createOrUpdateLocations = async (nodeLabel, nodeId, locationName, session) => { + if (locationName === undefined) return + + let locationId + + if (locationName !== null) { + const res: any = await fetch( + `https://api.mapbox.com/geocoding/v5/mapbox.places/${encodeURIComponent( + locationName, + )}.json?access_token=${ + CONFIG.MAPBOX_TOKEN + }&types=region,place,country,address&language=${locales.join(',')}`, + ) + + debug(res) + + if (!res || !res.features || !res.features[0]) { + throw new UserInputError('locationName is invalid') + } + + let data + + res.features.forEach((item) => { + if (item.matching_place_name === locationName) { + data = item + } + }) + if (!data) { + data = res.features[0] + } + + if (!data || !data.place_type || !data.place_type.length) { + throw new UserInputError('locationName is invalid') + } + + if (data.place_type.length > 1) { + data.id = 'region.' + data.id.split('.')[1] + } + await createLocation(session, data) + + let parent = data + + if (parent.address) { + parent.id += `-${parent.address}` + } + + if (data.context) { + await asyncForEach(data.context, async (ctx) => { + await createLocation(session, ctx) + await session.writeTransaction((transaction) => { + return transaction.run( + ` + MATCH (parent:Location {id: $parentId}), (child:Location {id: $childId}) + MERGE (child)<-[:IS_IN]-(parent) + RETURN child.id, parent.id + `, + { + parentId: parent.id, + childId: ctx.id, + }, + ) + }) + parent = ctx + }) + } + + locationId = data.id + } else { + locationId = 'non-existent-id' + } + + // delete all current locations from node and add new location + await session.writeTransaction((transaction) => { + return transaction.run( + ` + MATCH (node:${nodeLabel} {id: $nodeId}) + OPTIONAL MATCH (node)-[relationship:IS_IN]->(:Location) + DELETE relationship + WITH node + MATCH (location:Location {id: $locationId}) + MERGE (node)-[:IS_IN]->(location) + RETURN location.id, node.id + `, + { nodeId, locationId }, + ) + }) +} + +export const queryLocations = async ({ place, lang }) => { + const res: any = await fetch( + `https://api.mapbox.com/geocoding/v5/mapbox.places/${place}.json?access_token=${CONFIG.MAPBOX_TOKEN}&types=region,place,country&language=${lang}`, + ) + // Return empty array if no location found or error occurred + if (!res || !res.features) { + return [] + } + return res.features +} diff --git a/docs/backend/src/schema/resolvers/users/mutedUsers.spec.ts b/docs/backend/src/schema/resolvers/users/mutedUsers.spec.ts new file mode 100644 index 000000000..762893af0 --- /dev/null +++ b/docs/backend/src/schema/resolvers/users/mutedUsers.spec.ts @@ -0,0 +1,419 @@ +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../../server' +import { cleanDatabase } from '../../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../../db/neo4j' + +const driver = getDriver() +const neode = getNeode() + +let currentUser +let mutedUser +let authenticatedUser +let server + +beforeAll(async () => { + await cleanDatabase() +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +beforeEach(() => { + authenticatedUser = undefined + ;({ server } = createServer({ + context: () => { + return { + user: authenticatedUser, + driver, + neode, + cypherParams: { + currentUserId: authenticatedUser ? authenticatedUser.id : null, + }, + } + }, + })) +}) + +// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 +afterEach(async () => { + await cleanDatabase() +}) + +describe('mutedUsers', () => { + let mutedUserQuery + beforeEach(() => { + mutedUserQuery = gql` + query { + mutedUsers { + id + name + isMuted + } + } + ` + }) + + it('throws permission error', async () => { + const { query } = createTestClient(server) + const result = await query({ query: mutedUserQuery }) + expect(result.errors![0]).toHaveProperty('message', 'Not Authorized!') + }) + + describe('authenticated and given a muted user', () => { + beforeEach(async () => { + currentUser = await neode.create('User', { + name: 'Current User', + id: 'u1', + }) + mutedUser = await neode.create('User', { + name: 'Muted User', + id: 'u2', + }) + await currentUser.relateTo(mutedUser, 'muted') + authenticatedUser = await currentUser.toJson() + }) + + it('returns a list of muted users', async () => { + const { query } = createTestClient(server) + await expect(query({ query: mutedUserQuery })).resolves.toEqual( + expect.objectContaining({ + data: { + mutedUsers: [ + { + name: 'Muted User', + id: 'u2', + isMuted: true, + }, + ], + }, + }), + ) + }) + }) +}) + +describe('muteUser', () => { + let muteAction + + beforeEach(() => { + currentUser = undefined + muteAction = (variables) => { + const { mutate } = createTestClient(server) + const muteUserMutation = gql` + mutation ($id: ID!) { + muteUser(id: $id) { + id + name + isMuted + } + } + ` + return mutate({ mutation: muteUserMutation, variables }) + } + }) + + it('throws permission error', async () => { + const result = await muteAction({ id: 'u2' }) + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + + describe('authenticated', () => { + beforeEach(async () => { + currentUser = await neode.create('User', { + name: 'Current User', + id: 'u1', + }) + authenticatedUser = await currentUser.toJson() + }) + + describe('mute yourself', () => { + it('returns null', async () => { + await expect(muteAction({ id: 'u1' })).resolves.toEqual( + expect.objectContaining({ data: { muteUser: null } }), + ) + }) + }) + + describe('mute not existing user', () => { + it('returns null', async () => { + await expect(muteAction({ id: 'u2' })).resolves.toEqual( + expect.objectContaining({ data: { muteUser: null } }), + ) + }) + }) + + describe('given a to-be-muted user', () => { + beforeEach(async () => { + mutedUser = await neode.create('User', { + name: 'Muted User', + id: 'u2', + }) + }) + + it('mutes a user', async () => { + await expect(muteAction({ id: 'u2' })).resolves.toEqual( + expect.objectContaining({ + data: { + muteUser: { id: 'u2', name: 'Muted User', isMuted: true }, + }, + }), + ) + }) + + it('unfollows the user', async () => { + await currentUser.relateTo(mutedUser, 'following') + const queryUser = gql` + query { + User(id: "u2") { + id + isMuted + followedByCurrentUser + } + } + ` + const { query } = createTestClient(server) + await expect(query({ query: queryUser })).resolves.toEqual( + expect.objectContaining({ + data: { User: [{ id: 'u2', isMuted: false, followedByCurrentUser: true }] }, + }), + ) + await muteAction({ id: 'u2' }) + await expect(query({ query: queryUser })).resolves.toEqual( + expect.objectContaining({ + data: { User: [{ id: 'u2', isMuted: true, followedByCurrentUser: false }] }, + }), + ) + }) + + describe('given both the current user and the to-be-muted user write a post', () => { + let postQuery + + beforeEach(async () => { + const post1 = await neode.create('Post', { + id: 'p12', + title: 'A post written by the current user', + }) + const post2 = await neode.create('Post', { + id: 'p23', + title: 'A post written by the muted user', + }) + await Promise.all([ + post1.relateTo(currentUser, 'author'), + post2.relateTo(mutedUser, 'author'), + ]) + postQuery = gql` + query { + Post(orderBy: createdAt_asc) { + id + title + author { + id + name + } + } + } + ` + }) + + const bothPostsAreInTheNewsfeed = async () => { + const { query } = createTestClient(server) + await expect(query({ query: postQuery })).resolves.toEqual( + expect.objectContaining({ + data: { + Post: [ + { + id: 'p12', + title: 'A post written by the current user', + author: { + name: 'Current User', + id: 'u1', + }, + }, + { + id: 'p23', + title: 'A post written by the muted user', + author: { + name: 'Muted User', + id: 'u2', + }, + }, + ], + }, + }), + ) + } + + describe('from the perspective of the current user', () => { + it('both posts are in the newsfeed', bothPostsAreInTheNewsfeed) + + describe('but if the current user mutes the other user', () => { + beforeEach(async () => { + await currentUser.relateTo(mutedUser, 'muted') + }) + + it("the muted user's post won't show up in the newsfeed of the current user", async () => { + const { query } = createTestClient(server) + await expect(query({ query: postQuery })).resolves.toEqual( + expect.objectContaining({ + data: { + Post: [ + { + id: 'p12', + title: 'A post written by the current user', + author: { name: 'Current User', id: 'u1' }, + }, + ], + }, + }), + ) + }) + }) + }) + + describe('from the perspective of the muted user', () => { + beforeEach(async () => { + authenticatedUser = await mutedUser.toJson() + }) + + it('both posts are in the newsfeed', bothPostsAreInTheNewsfeed) + describe('but if the current user mutes the other user', () => { + beforeEach(async () => { + await currentUser.relateTo(mutedUser, 'muted') + }) + + it("the current user's post will show up in the newsfeed of the muted user", async () => { + const { query } = createTestClient(server) + await expect(query({ query: postQuery })).resolves.toEqual( + expect.objectContaining({ + data: { + Post: expect.arrayContaining([ + { + id: 'p23', + title: 'A post written by the muted user', + author: { name: 'Muted User', id: 'u2' }, + }, + { + id: 'p12', + title: 'A post written by the current user', + author: { name: 'Current User', id: 'u1' }, + }, + ]), + }, + }), + ) + }) + }) + }) + }) + }) + }) +}) + +describe('unmuteUser', () => { + let unmuteAction + + beforeEach(() => { + currentUser = undefined + unmuteAction = (variables) => { + const { mutate } = createTestClient(server) + const unmuteUserMutation = gql` + mutation ($id: ID!) { + unmuteUser(id: $id) { + id + name + isMuted + } + } + ` + return mutate({ mutation: unmuteUserMutation, variables }) + } + }) + + it('throws permission error', async () => { + const result = await unmuteAction({ id: 'u2' }) + expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!') + }) + + describe('authenticated', () => { + beforeEach(async () => { + currentUser = await neode.create('User', { + name: 'Current User', + id: 'u1', + }) + authenticatedUser = await currentUser.toJson() + }) + + describe('unmute yourself', () => { + it('returns null', async () => { + await expect(unmuteAction({ id: 'u1' })).resolves.toEqual( + expect.objectContaining({ data: { unmuteUser: null } }), + ) + }) + }) + + describe('unmute not-existing user', () => { + it('returns null', async () => { + await expect(unmuteAction({ id: 'lksjdflksfdj' })).resolves.toEqual( + expect.objectContaining({ data: { unmuteUser: null } }), + ) + }) + }) + + describe('given another user', () => { + beforeEach(async () => { + mutedUser = await neode.create('User', { + name: 'Muted User', + id: 'u2', + }) + }) + + describe('unmuting a not yet muted user', () => { + it('does not hurt', async () => { + await expect(unmuteAction({ id: 'u2' })).resolves.toEqual( + expect.objectContaining({ + data: { + unmuteUser: { id: 'u2', name: 'Muted User', isMuted: false }, + }, + }), + ) + }) + }) + + describe('given a muted user', () => { + beforeEach(async () => { + await currentUser.relateTo(mutedUser, 'muted') + }) + + it('unmutes a user', async () => { + await expect(unmuteAction({ id: 'u2' })).resolves.toEqual( + expect.objectContaining({ + data: { + unmuteUser: { id: 'u2', name: 'Muted User', isMuted: false }, + }, + }), + ) + }) + + describe('unmuting twice', () => { + it('has no effect', async () => { + await unmuteAction({ id: 'u2' }) + await expect(unmuteAction({ id: 'u2' })).resolves.toEqual( + expect.objectContaining({ + data: { + unmuteUser: { + id: 'u2', + name: 'Muted User', + isMuted: false, + }, + }, + }), + ) + }) + }) + }) + }) + }) +}) diff --git a/docs/backend/src/schema/resolvers/viewedTeaserCount.spec.ts b/docs/backend/src/schema/resolvers/viewedTeaserCount.spec.ts new file mode 100644 index 000000000..ee90d1a08 --- /dev/null +++ b/docs/backend/src/schema/resolvers/viewedTeaserCount.spec.ts @@ -0,0 +1,85 @@ +import { createTestClient } from 'apollo-server-testing' +import Factory, { cleanDatabase } from '../../db/factories' +import gql from 'graphql-tag' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' + +const driver = getDriver() +const neode = getNeode() + +let mutate +let authenticatedUser +let variables + +beforeAll(async () => { + await cleanDatabase() + + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('count post teaser views', () => { + let aUser, bUser + const markTeaserAsViewed = gql` + mutation ($id: ID!) { + markTeaserAsViewed(id: $id) { + id + viewedTeaserCount + } + } + ` + + beforeAll(async () => { + Factory.build('post', { id: 'post-to-be-viewed' }) + aUser = await Factory.build('user', { id: 'a-user' }) + bUser = await Factory.build('user', { id: 'b-user' }) + variables = { + id: 'post-to-be-viewed', + } + authenticatedUser = await aUser.toJson() + }) + + it('marks the post as viewed and increases the viewedTeaserCount', async () => { + await expect(mutate({ mutation: markTeaserAsViewed, variables })).resolves.toMatchObject({ + data: { + markTeaserAsViewed: expect.objectContaining({ + viewedTeaserCount: 1, + }), + }, + }) + }) + + it('does not increase the viewedTeaserCount when accidently called again', async () => { + await expect(mutate({ mutation: markTeaserAsViewed, variables })).resolves.toMatchObject({ + data: { + markTeaserAsViewed: expect.objectContaining({ + viewedTeaserCount: 1, + }), + }, + }) + }) + + it('increases the viewedTeaserCount when viewed by another user', async () => { + authenticatedUser = await bUser.toJson() + await expect(mutate({ mutation: markTeaserAsViewed, variables })).resolves.toMatchObject({ + data: { + markTeaserAsViewed: expect.objectContaining({ + viewedTeaserCount: 2, + }), + }, + }) + }) +}) diff --git a/docs/backend/src/schema/types/embed.gql b/docs/backend/src/schema/types/embed.gql new file mode 100644 index 000000000..d59f696b2 --- /dev/null +++ b/docs/backend/src/schema/types/embed.gql @@ -0,0 +1,19 @@ +type Embed { + type: String + title: String + author: String + publisher: String + date: String + description: String + url: String + image: String + audio: String + video: String + lang: String + html: String + sources: [String] +} + +type Query { + embed(url: String!): Embed +} diff --git a/docs/backend/src/schema/types/enum/Emotion.gql b/docs/backend/src/schema/types/enum/Emotion.gql new file mode 100644 index 000000000..88a436f98 --- /dev/null +++ b/docs/backend/src/schema/types/enum/Emotion.gql @@ -0,0 +1,7 @@ +enum Emotion { + surprised + cry + happy + angry + funny +} \ No newline at end of file diff --git a/docs/backend/src/schema/types/enum/GroupActionRadius.gql b/docs/backend/src/schema/types/enum/GroupActionRadius.gql new file mode 100644 index 000000000..221ed7f87 --- /dev/null +++ b/docs/backend/src/schema/types/enum/GroupActionRadius.gql @@ -0,0 +1,7 @@ +enum GroupActionRadius { + regional + national + continental + global + interplanetary +} diff --git a/docs/backend/src/schema/types/enum/GroupMemberRole.gql b/docs/backend/src/schema/types/enum/GroupMemberRole.gql new file mode 100644 index 000000000..dacdd4b52 --- /dev/null +++ b/docs/backend/src/schema/types/enum/GroupMemberRole.gql @@ -0,0 +1,6 @@ +enum GroupMemberRole { + pending + usual + admin + owner +} diff --git a/docs/backend/src/schema/types/enum/GroupType.gql b/docs/backend/src/schema/types/enum/GroupType.gql new file mode 100644 index 000000000..2cf298474 --- /dev/null +++ b/docs/backend/src/schema/types/enum/GroupType.gql @@ -0,0 +1,5 @@ +enum GroupType { + public + closed + hidden +} diff --git a/docs/backend/src/schema/types/enum/PostType.gql b/docs/backend/src/schema/types/enum/PostType.gql new file mode 100644 index 000000000..eef80d6ba --- /dev/null +++ b/docs/backend/src/schema/types/enum/PostType.gql @@ -0,0 +1,4 @@ +enum PostType { + Article + Event +} diff --git a/docs/backend/src/schema/types/enum/UserRole.gql b/docs/backend/src/schema/types/enum/UserRole.gql new file mode 100644 index 000000000..846afde13 --- /dev/null +++ b/docs/backend/src/schema/types/enum/UserRole.gql @@ -0,0 +1,5 @@ +enum UserRole { + admin + moderator + user +} diff --git a/docs/backend/src/schema/types/enum/Visibility.gql b/docs/backend/src/schema/types/enum/Visibility.gql new file mode 100644 index 000000000..4f9d5591a --- /dev/null +++ b/docs/backend/src/schema/types/enum/Visibility.gql @@ -0,0 +1,5 @@ +enum Visibility { + public + friends + private +} \ No newline at end of file diff --git a/docs/backend/src/schema/types/index.ts b/docs/backend/src/schema/types/index.ts new file mode 100644 index 000000000..d49becffc --- /dev/null +++ b/docs/backend/src/schema/types/index.ts @@ -0,0 +1,5 @@ +import path from 'path' +import { mergeTypes, fileLoader } from 'merge-graphql-schemas' + +const typeDefs = fileLoader(path.join(__dirname, './**/*.gql')) +export default mergeTypes(typeDefs, { all: true }) diff --git a/docs/backend/src/schema/types/scalar/Upload.gql b/docs/backend/src/schema/types/scalar/Upload.gql new file mode 100644 index 000000000..cf3965846 --- /dev/null +++ b/docs/backend/src/schema/types/scalar/Upload.gql @@ -0,0 +1 @@ +scalar Upload diff --git a/docs/backend/src/schema/types/schema.gql b/docs/backend/src/schema/types/schema.gql new file mode 100644 index 000000000..9e2d00bca --- /dev/null +++ b/docs/backend/src/schema/types/schema.gql @@ -0,0 +1,16 @@ +enum ShoutTypeEnum { + Post +} + +type Reward { + id: ID! + user: User @relation(name: "REWARDED", direction: "IN") + rewarderId: ID + createdAt: String + badge: Badge @relation(name: "REWARDED", direction: "OUT") +} + +type SharedInboxEndpoint { + id: ID! + uri: String +} \ No newline at end of file diff --git a/docs/backend/src/schema/types/type/Badge.gql b/docs/backend/src/schema/types/type/Badge.gql new file mode 100644 index 000000000..dff1de89a --- /dev/null +++ b/docs/backend/src/schema/types/type/Badge.gql @@ -0,0 +1,29 @@ +type Badge { + id: ID! + type: BadgeType! + status: BadgeStatus! + icon: String! + createdAt: String + updatedAt: String + + rewarded: [User]! @relation(name: "REWARDED", direction: "OUT") +} + +enum BadgeStatus { + permanent + temporary +} + +enum BadgeType { + role + crowdfunding +} + +type Query { + Badge: [Badge] +} + +type Mutation { + reward(badgeKey: ID!, userId: ID!): User + unreward(badgeKey: ID!, userId: ID!): User +} diff --git a/docs/backend/src/schema/types/type/Category.gql b/docs/backend/src/schema/types/type/Category.gql new file mode 100644 index 000000000..39efeff9d --- /dev/null +++ b/docs/backend/src/schema/types/type/Category.gql @@ -0,0 +1,41 @@ +enum _CategoryOrdering { + id_asc + id_desc + name_asc + name_desc + slug_asc + slug_desc + icon_asc + icon_desc + createdAt_asc + createdAt_desc + updatedAt_asc + updatedAt_desc + postCount_asc + postCount_desc +} + +type Category { + id: ID! + name: String! + slug: String + icon: String! + createdAt: String + updatedAt: String + posts: [Post]! @relation(name: "CATEGORIZED", direction: "IN") + postCount: Int! @cypher(statement: "MATCH (this)<-[:CATEGORIZED]-(r:Post) RETURN COUNT(r)") +} + +type Query { + Category( + id: ID + name: String + slug: String + icon: String + createdAt: String + updatedAt: String + first: Int + offset: Int + orderBy: [_CategoryOrdering] + ): [Category] +} diff --git a/docs/backend/src/schema/types/type/Comment.gql b/docs/backend/src/schema/types/type/Comment.gql new file mode 100644 index 000000000..cf53df41d --- /dev/null +++ b/docs/backend/src/schema/types/type/Comment.gql @@ -0,0 +1,78 @@ +enum _CommentOrdering { + id_asc + id_desc + content_asc + content_desc + createdAt_asc + createdAt_desc + updatedAt_asc + updatedAt_desc +} + +input _CommentFilter { + AND: [_CommentFilter!] + OR: [_CommentFilter!] + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + author: _UserFilter + author_not: _UserFilter + author_in: [_UserFilter!] + author_not_in: [_UserFilter!] + content: String + content_not: String + content_in: [String!] + content_not_in: [String!] + content_contains: String + content_not_contains: String + content_starts_with: String + content_not_starts_with: String + content_ends_with: String + content_not_ends_with: String + post: _PostFilter + post_not: _PostFilter + post_in: [_PostFilter!] + post_not_in: [_PostFilter!] +} + +type Comment { + id: ID! + activityId: String + author: User @relation(name: "WROTE", direction: "IN") + content: String! + contentExcerpt: String + post: Post @relation(name: "COMMENTS", direction: "OUT") + createdAt: String + updatedAt: String + deleted: Boolean + disabled: Boolean +} + +type Query { + Comment( + id: ID + content: String + createdAt: String + updatedAt: String + first: Int + offset: Int + orderBy: [_CommentOrdering] + filter: _CommentFilter + ): [Comment] +} + +type Mutation { + CreateComment( + id: ID + postId: ID! + content: String! + contentExcerpt: String + ): Comment + UpdateComment( + id: ID! + content: String! + contentExcerpt: String + ): Comment + DeleteComment(id: ID!): Comment +} diff --git a/docs/backend/src/schema/types/type/Donations.gql b/docs/backend/src/schema/types/type/Donations.gql new file mode 100644 index 000000000..10fb8597c --- /dev/null +++ b/docs/backend/src/schema/types/type/Donations.gql @@ -0,0 +1,16 @@ +type Donations { + id: ID! + createdAt: String! + updatedAt: String! + showDonations: Boolean! + goal: Int! + progress: Int! +} + +type Query { + Donations: Donations +} + +type Mutation { + UpdateDonations(showDonations: Boolean, goal: Int, progress: Int): Donations +} \ No newline at end of file diff --git a/docs/backend/src/schema/types/type/EMOTED.gql b/docs/backend/src/schema/types/type/EMOTED.gql new file mode 100644 index 000000000..7a8b47b73 --- /dev/null +++ b/docs/backend/src/schema/types/type/EMOTED.gql @@ -0,0 +1,25 @@ +type EMOTED @relation(name: "EMOTED") { + from: User + to: Post + + emotion: Emotion + createdAt: String + updatedAt: String +} + +input _EMOTEDInput { + emotion: Emotion + createdAt: String + updatedAt: String +} + +input _PostEMOTEDFilter { + emotion_in: [Emotion] + createdAt: String + updatedAt: String +} + +type Mutation { + AddPostEmotions(to: _PostInput!, data: _EMOTEDInput!): EMOTED + RemovePostEmotions(to: _PostInput!, data: _EMOTEDInput!): EMOTED +} diff --git a/docs/backend/src/schema/types/type/EmailAddress.gql b/docs/backend/src/schema/types/type/EmailAddress.gql new file mode 100644 index 000000000..b2e65eafa --- /dev/null +++ b/docs/backend/src/schema/types/type/EmailAddress.gql @@ -0,0 +1,29 @@ +type EmailAddress { + email: ID! + verifiedAt: String + createdAt: String +} + +type Query { + VerifyNonce(email: String!, nonce: String!): Boolean! +} + +type Mutation { + Signup(email: String!, inviteCode: String = null): EmailAddress + SignupVerification( + nonce: String! + email: String! + inviteCode: String = null + name: String! + password: String! + slug: String + about: String + termsAndConditionsAgreedVersion: String! + locale: String + ): User + AddEmailAddress(email: String!): EmailAddress + VerifyEmailAddress( + nonce: String! + email: String! + ): EmailAddress +} diff --git a/docs/backend/src/schema/types/type/FILED.gql b/docs/backend/src/schema/types/type/FILED.gql new file mode 100644 index 000000000..85eca951e --- /dev/null +++ b/docs/backend/src/schema/types/type/FILED.gql @@ -0,0 +1,30 @@ +type FILED { + createdAt: String! + reasonCategory: ReasonCategory! + reasonDescription: String! + submitter: User +} + +# this list equals the strings of an array in file "webapp/constants/modals.js" +enum ReasonCategory { + other + discrimination_etc + pornographic_content_links + glorific_trivia_of_cruel_inhuman_acts + doxing + intentional_intimidation_stalking_persecution + advert_products_services_commercial + criminal_behavior_violation_german_law +} + +type FiledReport { + createdAt: String! + reasonCategory: ReasonCategory! + reasonDescription: String! + reportId: ID! + resource: ReportedResource! +} + +type Mutation { + fileReport(resourceId: ID!, reasonCategory: ReasonCategory!, reasonDescription: String!): FiledReport +} \ No newline at end of file diff --git a/docs/backend/src/schema/types/type/Group.gql b/docs/backend/src/schema/types/type/Group.gql new file mode 100644 index 000000000..acf585f71 --- /dev/null +++ b/docs/backend/src/schema/types/type/Group.gql @@ -0,0 +1,140 @@ +enum _GroupOrdering { + id_asc + id_desc + name_asc + name_desc + slug_asc + slug_desc + locationName_asc + locationName_desc + about_asc + about_desc + createdAt_asc + createdAt_desc + updatedAt_asc + updatedAt_desc +} + +type Group { + id: ID! + name: String! # title + slug: String! + + createdAt: String! + updatedAt: String! + deleted: Boolean + disabled: Boolean + + avatar: Image @relation(name: "AVATAR_IMAGE", direction: "OUT") + + about: String # goal + description: String! + descriptionExcerpt: String! + groupType: GroupType! + actionRadius: GroupActionRadius! + + locationName: String + location: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") + + categories: [Category] @relation(name: "CATEGORIZED", direction: "OUT") + + myRole: GroupMemberRole # if 'null' then the current user is no member + + posts: [Post] @relation(name: "IN", direction: "IN") +} + + +input _GroupFilter { + AND: [_GroupFilter!] + OR: [_GroupFilter!] + name_contains: String + slug_contains: String + about_contains: String + description_contains: String + groupType_in: [GroupType!] + actionRadius_in: [GroupActionRadius!] + myRole_in: [GroupMemberRole!] + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] +} + +type Query { + Group( + isMember: Boolean # if 'undefined' or 'null' then get all groups + id: ID + slug: String + first: Int + offset: Int + # orderBy: [_GroupOrdering] # not implemented yet + # filter: _GroupFilter # not implemented yet + ): [Group] + + GroupMembers( + id: ID! + # first: Int # not implemented yet + # offset: Int # not implemented yet + # orderBy: [_UserOrdering] # not implemented yet + # filter: _UserFilter # not implemented yet + ): [User] + + GroupCount(isMember: Boolean): Int + + # AvailableGroupTypes: [GroupType]! + + # AvailableGroupActionRadii: [GroupActionRadius]! + + # AvailableGroupMemberRoles: [GroupMemberRole]! +} + +type Mutation { + CreateGroup( + id: ID + name: String! + slug: String + about: String + description: String! + groupType: GroupType! + actionRadius: GroupActionRadius! + categoryIds: [ID] + # avatar: ImageInput # a group can not be created with an avatar + locationName: String # empty string '' sets it to null + ): Group + + UpdateGroup( + id: ID! + name: String + slug: String + about: String + description: String + # groupType: GroupType # is not possible at the moment and has to be discussed. may be in the stronger direction: public → closed → hidden + actionRadius: GroupActionRadius + categoryIds: [ID] + avatar: ImageInput # test this as result + locationName: String # empty string '' sets it to null + ): Group + + # DeleteGroup(id: ID!): Group + + JoinGroup( + groupId: ID! + userId: ID! + ): User + + LeaveGroup( + groupId: ID! + userId: ID! + ): User + + ChangeGroupMemberRole( + groupId: ID! + userId: ID! + roleInGroup: GroupMemberRole! + ): User + + RemoveUserFromGroup( + groupId: ID! + userId: ID! + ): User +} diff --git a/docs/backend/src/schema/types/type/Image.gql b/docs/backend/src/schema/types/type/Image.gql new file mode 100644 index 000000000..f171a4b77 --- /dev/null +++ b/docs/backend/src/schema/types/type/Image.gql @@ -0,0 +1,20 @@ +type Image { + url: ID!, + # urlW34: String, + # urlW160: String, + # urlW320: String, + # urlW640: String, + # urlW1024: String, + alt: String, + sensitive: Boolean, + aspectRatio: Float, + type: String, +} + +input ImageInput { + alt: String, + upload: Upload, + sensitive: Boolean, + aspectRatio: Float, + type: String, +} diff --git a/docs/backend/src/schema/types/type/InviteCode.gql b/docs/backend/src/schema/types/type/InviteCode.gql new file mode 100644 index 000000000..3293c735b --- /dev/null +++ b/docs/backend/src/schema/types/type/InviteCode.gql @@ -0,0 +1,18 @@ +type InviteCode { + code: ID! + createdAt: String! + generatedBy: User @relation(name: "GENERATED", direction: "IN") + redeemedBy: [User] @relation(name: "REDEEMED", direction: "IN") + expiresAt: String +} + + +type Mutation { + GenerateInviteCode(expiresAt: String = null): InviteCode +} + +type Query { + MyInviteCodes: [InviteCode] + isValidInviteCode(code: ID!): Boolean + getInviteCode: InviteCode +} diff --git a/docs/backend/src/schema/types/type/Location.gql b/docs/backend/src/schema/types/type/Location.gql new file mode 100644 index 000000000..9cb5c970a --- /dev/null +++ b/docs/backend/src/schema/types/type/Location.gql @@ -0,0 +1,27 @@ +type Location { + id: ID! + name: String! + nameEN: String + nameDE: String + nameFR: String + nameNL: String + nameIT: String + nameES: String + namePT: String + namePL: String + nameRU: String + type: String! + lat: Float + lng: Float + parent: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") +} + +# This is not smart - we need one location for everything - use the same type everywhere! +type LocationMapBox { + id: ID! + place_name: String! +} + +type Query { + queryLocations(place: String!, lang: String!): [LocationMapBox]! +} diff --git a/docs/backend/src/schema/types/type/MEMBER_OF.gql b/docs/backend/src/schema/types/type/MEMBER_OF.gql new file mode 100644 index 000000000..edda989f6 --- /dev/null +++ b/docs/backend/src/schema/types/type/MEMBER_OF.gql @@ -0,0 +1,5 @@ +type MEMBER_OF { + createdAt: String! + updatedAt: String! + role: GroupMemberRole! +} diff --git a/docs/backend/src/schema/types/type/Message.gql b/docs/backend/src/schema/types/type/Message.gql new file mode 100644 index 000000000..16e458151 --- /dev/null +++ b/docs/backend/src/schema/types/type/Message.gql @@ -0,0 +1,50 @@ +# input _MessageFilter { +# room: _RoomFilter +# } + +enum _MessageOrdering { + indexId_desc +} + +type Message { + id: ID! + indexId: Int! + createdAt: String + updatedAt: String + + content: String! + + author: User! @relation(name: "CREATED", direction: "IN") + room: Room! @relation(name: "INSIDE", direction: "OUT") + + senderId: String! @cypher(statement: "MATCH (this)<-[:CREATED]-(user:User) RETURN user.id") + username: String! @cypher(statement: "MATCH (this)<-[:CREATED]-(user:User) RETURN user.name") + avatar: String @cypher(statement: "MATCH (this)<-[:CREATED]-(:User)-[:AVATAR_IMAGE]->(image:Image) RETURN image.url") + date: String! @cypher(statement: "RETURN this.createdAt") + + saved: Boolean + distributed: Boolean + seen: Boolean +} + +type Mutation { + CreateMessage( + roomId: ID! + content: String! + ): Message + + MarkMessagesAsSeen(messageIds: [String!]): Boolean +} + +type Query { + Message( + roomId: ID!, + first: Int + offset: Int + orderBy: [_MessageOrdering] + ): [Message] +} + +type Subscription { + chatMessageAdded: Message +} diff --git a/docs/backend/src/schema/types/type/NOTIFIED.gql b/docs/backend/src/schema/types/type/NOTIFIED.gql new file mode 100644 index 000000000..1f825decc --- /dev/null +++ b/docs/backend/src/schema/types/type/NOTIFIED.gql @@ -0,0 +1,42 @@ +type NOTIFIED { + id: ID! + from: NotificationSource + to: User + createdAt: String! + updatedAt: String! + read: Boolean + reason: NotificationReason + relatedUser: User +} + +union NotificationSource = Post | Comment | Group + +enum NotificationOrdering { + createdAt_asc + createdAt_desc + updatedAt_asc + updatedAt_desc +} + +enum NotificationReason { + mentioned_in_post + mentioned_in_comment + commented_on_post + user_joined_group + user_left_group + changed_group_member_role + removed_user_from_group +} + +type Query { + notifications(read: Boolean, orderBy: NotificationOrdering, first: Int, offset: Int): [NOTIFIED] +} + +type Mutation { + markAsRead(id: ID!): NOTIFIED + markAllAsRead: [NOTIFIED] +} + +type Subscription { + notificationAdded: NOTIFIED +} diff --git a/docs/backend/src/schema/types/type/Post.gql b/docs/backend/src/schema/types/type/Post.gql new file mode 100644 index 000000000..7e6d1d0e7 --- /dev/null +++ b/docs/backend/src/schema/types/type/Post.gql @@ -0,0 +1,265 @@ +input _PostFilter { + AND: [_PostFilter!] + OR: [_PostFilter!] + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + author: _UserFilter + author_not: _UserFilter + author_in: [_UserFilter!] + author_not_in: [_UserFilter!] + title: String + title_not: String + title_in: [String!] + title_not_in: [String!] + title_contains: String + title_not_contains: String + title_starts_with: String + title_not_starts_with: String + title_ends_with: String + title_not_ends_with: String + shoutedBy_some: _UserFilter + slug: String + slug_not: String + slug_in: [String!] + slug_not_in: [String!] + slug_contains: String + slug_not_contains: String + slug_starts_with: String + slug_not_starts_with: String + slug_ends_with: String + slug_not_ends_with: String + content: String + content_not: String + content_in: [String!] + content_not_in: [String!] + content_contains: String + content_not_contains: String + content_starts_with: String + content_not_starts_with: String + content_ends_with: String + content_not_ends_with: String + visibility: Visibility + visibility_not: Visibility + visibility_in: [Visibility!] + visibility_not_in: [Visibility!] + language: String + language_not: String + language_in: [String!] + language_not_in: [String!] + pinned: Boolean # required for `maintainPinnedPost` + tags: _TagFilter + tags_not: _TagFilter + tags_in: [_TagFilter!] + tags_not_in: [_TagFilter!] + tags_some: _TagFilter + tags_none: _TagFilter + tags_single: _TagFilter + tags_every: _TagFilter + categories: _CategoryFilter + categories_not: _CategoryFilter + categories_in: [_CategoryFilter!] + categories_not_in: [_CategoryFilter!] + categories_some: _CategoryFilter + categories_none: _CategoryFilter + categories_single: _CategoryFilter + categories_every: _CategoryFilter + comments: _CommentFilter + comments_not: _CommentFilter + comments_in: [_CommentFilter!] + comments_not_in: [_CommentFilter!] + comments_some: _CommentFilter + comments_none: _CommentFilter + comments_single: _CommentFilter + comments_every: _CommentFilter + emotions: _PostEMOTEDFilter + emotions_not: _PostEMOTEDFilter + emotions_in: [_PostEMOTEDFilter!] + emotions_not_in: [_PostEMOTEDFilter!] + emotions_some: _PostEMOTEDFilter + emotions_none: _PostEMOTEDFilter + emotions_single: _PostEMOTEDFilter + emotions_every: _PostEMOTEDFilter + group: _GroupFilter + postsInMyGroups: Boolean + postType_in: [PostType] + eventStart_gte: String + eventEnd_gte: String +} + +enum _PostOrdering { + id_asc + id_desc + title_asc + title_desc + slug_asc + slug_desc + content_asc + content_desc + visibility_asc + visibility_desc + createdAt_asc + createdAt_desc + updatedAt_asc + updatedAt_desc + language_asc + language_desc + pinned_asc + pinned_desc + eventStart_asc + eventStart_desc +} + + +type Post { + id: ID! + activityId: String + objectId: String + author: User @relation(name: "WROTE", direction: "IN") + title: String! + slug: String! + content: String! + contentExcerpt: String + image: Image @relation(name: "HERO_IMAGE", direction: "OUT") + visibility: Visibility + deleted: Boolean + disabled: Boolean + pinned: Boolean + createdAt: String + updatedAt: String + language: String + pinnedAt: String @cypher( + statement: "MATCH (this)<-[pinned:PINNED]-(:User) WHERE NOT this.deleted = true AND NOT this.disabled = true RETURN pinned.createdAt" + ) + pinnedBy: User @relation(name:"PINNED", direction: "IN") + relatedContributions: [Post]! + @cypher( + statement: """ + MATCH (this)-[:TAGGED|CATEGORIZED]->(categoryOrTag)<-[:TAGGED|CATEGORIZED]-(post:Post) + WHERE NOT post.deleted AND NOT post.disabled + RETURN DISTINCT post + LIMIT 10 + """ + ) + tags: [Tag]! @relation(name: "TAGGED", direction: "OUT") + categories: [Category] @relation(name: "CATEGORIZED", direction: "OUT") + + comments: [Comment]! @relation(name: "COMMENTS", direction: "IN") + commentsCount: Int! + @cypher( + statement: "MATCH (this)<-[:COMMENTS]-(r:Comment) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)" + ) + + shoutedBy: [User]! @relation(name: "SHOUTED", direction: "IN") + shoutedCount: Int! + @cypher( + statement: "MATCH (this)<-[:SHOUTED]-(r:User) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)" + ) + + # Has the currently logged in user shouted that post? + shoutedByCurrentUser: Boolean! + @cypher( + statement: "MATCH (this)<-[:SHOUTED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1" + ) + + clickedCount: Int! + + viewedTeaserCount: Int! + viewedTeaserByCurrentUser: Boolean! + @cypher( + statement: "MATCH (this)<-[:VIEWED_TEASER]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1" + ) + + emotions: [EMOTED] + emotionsCount: Int! + @cypher(statement: "MATCH (this)<-[emoted:EMOTED]-(:User) RETURN COUNT(DISTINCT emoted)") + + group: Group @relation(name: "IN", direction: "OUT") + + postType: [PostType] + @cypher(statement: "RETURN [l IN labels(this) WHERE NOT l = 'Post']") + + eventLocationName: String + eventLocation: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") + eventVenue: String + eventStart: String + eventEnd: String + eventIsOnline: Boolean +} + +input _PostInput { + id: ID! +} + +input _EventInput { + eventStart: String! + eventEnd: String + eventVenue: String + eventLocationName: String + eventIsOnline: Boolean +} + +type Mutation { + CreatePost( + id: ID + title: String! + slug: String + content: String! + image: ImageInput, + visibility: Visibility + language: String + categoryIds: [ID] + contentExcerpt: String + groupId: ID + postType: PostType = Article + eventInput: _EventInput + ): Post + UpdatePost( + id: ID! + title: String! + slug: String + content: String! + contentExcerpt: String + image: ImageInput, + visibility: Visibility + language: String + categoryIds: [ID] + postType: PostType + eventInput: _EventInput + ): Post + DeletePost(id: ID!): Post + AddPostEmotions(to: _PostInput!, data: _EMOTEDInput!): EMOTED + RemovePostEmotions(to: _PostInput!, data: _EMOTEDInput!): EMOTED + pinPost(id: ID!): Post + unpinPost(id: ID!): Post + markTeaserAsViewed(id: ID!): Post + + # Shout the given Type and ID + shout(id: ID!, type: ShoutTypeEnum): Boolean! + # Unshout the given Type and ID + unshout(id: ID!, type: ShoutTypeEnum): Boolean! +} + +type Query { + Post( + id: ID + title: String + slug: String + content: String + visibility: Visibility + pinned: Boolean + createdAt: String + updatedAt: String + language: String + imageBlurred: Boolean + first: Int + offset: Int + orderBy: [_PostOrdering] + filter: _PostFilter + imageAspectRatio: Float + ): [Post] + PostsEmotionsCountByEmotion(postId: ID!, data: _EMOTEDInput!): Int! + PostsEmotionsByCurrentUser(postId: ID!): [String] + profilePagePosts(filter: _PostFilter, first: Int, offset: Int, orderBy: [_PostOrdering]): [Post] +} diff --git a/docs/backend/src/schema/types/type/REVIEWED.gql b/docs/backend/src/schema/types/type/REVIEWED.gql new file mode 100644 index 000000000..086d73815 --- /dev/null +++ b/docs/backend/src/schema/types/type/REVIEWED.gql @@ -0,0 +1,14 @@ +type REVIEWED { + createdAt: String! + updatedAt: String! + disable: Boolean! + closed: Boolean! + report: Report + moderator: User + resource: ReviewedResource +} +union ReviewedResource = User | Post | Comment + +type Mutation { + review(resourceId: ID!, disable: Boolean, closed: Boolean): REVIEWED +} diff --git a/docs/backend/src/schema/types/type/Report.gql b/docs/backend/src/schema/types/type/Report.gql new file mode 100644 index 000000000..9a4a48c4b --- /dev/null +++ b/docs/backend/src/schema/types/type/Report.gql @@ -0,0 +1,26 @@ +type Report { + id: ID! + createdAt: String! + updatedAt: String! + rule: ReportRule! + disable: Boolean! + closed: Boolean! + filed: [FILED]! + reviewed: [REVIEWED]! + resource: ReportedResource! +} + +union ReportedResource = User | Post | Comment + +enum ReportRule { + latestReviewUpdatedAtRules +} + +type Query { + reports(orderBy: ReportOrdering, first: Int, offset: Int, reviewed: Boolean, closed: Boolean): [Report] +} + +enum ReportOrdering { + createdAt_asc + createdAt_desc +} diff --git a/docs/backend/src/schema/types/type/Room.gql b/docs/backend/src/schema/types/type/Room.gql new file mode 100644 index 000000000..60d54192c --- /dev/null +++ b/docs/backend/src/schema/types/type/Room.gql @@ -0,0 +1,62 @@ +# input _RoomFilter { +# AND: [_RoomFilter!] +# OR: [_RoomFilter!] +# id: ID +# users_some: _UserFilter +# } + +# TODO change this to last message date +enum _RoomOrdering { + lastMessageAt_desc + createdAt_desc +} + +type Room { + id: ID! + createdAt: String + updatedAt: String + + users: [User]! @relation(name: "CHATS_IN", direction: "IN") + + roomId: String! @cypher(statement: "RETURN this.id") + roomName: String! @cypher(statement: "MATCH (this)<-[:CHATS_IN]-(user:User) WHERE NOT user.id = $cypherParams.currentUserId RETURN user.name") + avatar: String @cypher(statement: """ + MATCH (this)<-[:CHATS_IN]-(user:User) + WHERE NOT user.id = $cypherParams.currentUserId + OPTIONAL MATCH (user)-[:AVATAR_IMAGE]->(image:Image) + RETURN image.url + """) + + lastMessageAt: String + + lastMessage: Message @cypher(statement: """ + MATCH (this)<-[:INSIDE]-(message:Message) + WITH message ORDER BY message.indexId DESC LIMIT 1 + RETURN message + """) + + unreadCount: Int @cypher(statement: """ + MATCH (this)<-[:INSIDE]-(message:Message)<-[:CREATED]-(user:User) + WHERE NOT user.id = $cypherParams.currentUserId + AND NOT message.seen + RETURN count(message) + """) +} + +type Mutation { + CreateRoom( + userId: ID! + ): Room +} + +type Query { + Room( + id: ID + orderBy: [_RoomOrdering] + ): [Room] + UnreadRooms: Int +} + +type Subscription { + roomCountUpdated: Int +} diff --git a/docs/backend/src/schema/types/type/Search.gql b/docs/backend/src/schema/types/type/Search.gql new file mode 100644 index 000000000..5cb68e22d --- /dev/null +++ b/docs/backend/src/schema/types/type/Search.gql @@ -0,0 +1,29 @@ +union SearchResult = Post | User | Tag | Group + +type postSearchResults { + postCount: Int + posts: [Post]! +} + +type userSearchResults { + userCount: Int + users: [User]! +} + +type hashtagSearchResults { + hashtagCount: Int + hashtags: [Tag]! +} + +type groupSearchResults { + groupCount: Int + groups: [Group]! +} + +type Query { + searchPosts(query: String!, firstPosts: Int, postsOffset: Int): postSearchResults! + searchUsers(query: String!, firstUsers: Int, usersOffset: Int): userSearchResults! + searchGroups(query: String!, firstGroups: Int, groupsOffset: Int): groupSearchResults! + searchHashtags(query: String!, firstHashtags: Int, hashtagsOffset: Int): hashtagSearchResults! + searchResults(query: String!, limit: Int = 5): [SearchResult]! +} diff --git a/docs/backend/src/schema/types/type/SocialMedia.gql b/docs/backend/src/schema/types/type/SocialMedia.gql new file mode 100644 index 000000000..230938d95 --- /dev/null +++ b/docs/backend/src/schema/types/type/SocialMedia.gql @@ -0,0 +1,11 @@ +type SocialMedia { + id: ID! + url: String + ownedBy: User! @relation(name: "OWNED_BY", direction: "IN") +} + +type Mutation { + CreateSocialMedia(id: ID, url: String!): SocialMedia + UpdateSocialMedia(id: ID!, url: String!): SocialMedia + DeleteSocialMedia(id: ID!): SocialMedia +} diff --git a/docs/backend/src/schema/types/type/Statistics.gql b/docs/backend/src/schema/types/type/Statistics.gql new file mode 100644 index 000000000..3963a3e50 --- /dev/null +++ b/docs/backend/src/schema/types/type/Statistics.gql @@ -0,0 +1,14 @@ +type Query { + statistics: Statistics! +} + +type Statistics { + countUsers: Int! + countPosts: Int! + countComments: Int! + countNotifications: Int! + countInvites: Int! + countFollows: Int! + countShouts: Int! +} + diff --git a/docs/backend/src/schema/types/type/Tag.gql b/docs/backend/src/schema/types/type/Tag.gql new file mode 100644 index 000000000..41a772e4d --- /dev/null +++ b/docs/backend/src/schema/types/type/Tag.gql @@ -0,0 +1,44 @@ +input _TagFilter { + AND: [_TagFilter!] + OR: [_TagFilter!] + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + taggedPosts: _PostFilter + taggedPosts_not: _PostFilter + taggedPosts_in: [_PostFilter!] + taggedPosts_not_in: [_PostFilter!] + taggedPosts_some: _PostFilter + taggedPosts_none: _PostFilter + taggedPosts_single: _PostFilter + taggedPosts_every: _PostFilter +} + +type Tag { + id: ID! + taggedPosts: [Post]! @relation(name: "TAGGED", direction: "IN") + taggedCount: Int! @cypher(statement: "MATCH (this)<-[:TAGGED]-(p) RETURN COUNT(DISTINCT p)") + taggedCountUnique: Int! @cypher(statement: "MATCH (this)<-[:TAGGED]-(p)<-[:WROTE]-(u:User) RETURN COUNT(DISTINCT u)") + deleted: Boolean + disabled: Boolean +} + +enum _TagOrdering { + id_asc + id_desc + taggedCount_asc + taggedCount_desc + taggedCountUnique_asc + taggedCountUnique_desc +} + +type Query { + Tag( + id: ID + first: Int + offset: Int + orderBy: [_TagOrdering] + filter: _TagFilter + ): [Tag] +} diff --git a/docs/backend/src/schema/types/type/User.gql b/docs/backend/src/schema/types/type/User.gql new file mode 100644 index 000000000..f406e4e45 --- /dev/null +++ b/docs/backend/src/schema/types/type/User.gql @@ -0,0 +1,234 @@ +enum _UserOrdering { + id_asc + id_desc + name_asc + name_desc + slug_asc + slug_desc + role_asc + role_desc + locationName_asc + locationName_desc + about_asc + about_desc + createdAt_asc + createdAt_desc + updatedAt_asc + updatedAt_desc + locale_asc + locale_desc +} + +type User { + id: ID! + actorId: String + name: String + email: String! @cypher(statement: "MATCH (this)-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e.email") + slug: String! + avatar: Image @relation(name: "AVATAR_IMAGE", direction: "OUT") + deleted: Boolean + disabled: Boolean + role: UserRole! + publicKey: String + invitedBy: User @relation(name: "INVITED", direction: "IN") + invited: [User] @relation(name: "INVITED", direction: "OUT") + + locationName: String + location: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") + about: String + socialMedia: [SocialMedia]! @relation(name: "OWNED_BY", direction: "IN") + + createdAt: String + updatedAt: String + + termsAndConditionsAgreedVersion: String + termsAndConditionsAgreedAt: String + + allowEmbedIframes: Boolean + showShoutsPublicly: Boolean + sendNotificationEmails: Boolean + locale: String + friends: [User]! @relation(name: "FRIENDS", direction: "BOTH") + friendsCount: Int! @cypher(statement: "MATCH (this)<-[:FRIENDS]->(r:User) RETURN COUNT(DISTINCT r)") + + following: [User]! @relation(name: "FOLLOWS", direction: "OUT") + followingCount: Int! @cypher(statement: "MATCH (this)-[:FOLLOWS]->(r:User) RETURN COUNT(DISTINCT r)") + + followedBy: [User]! @relation(name: "FOLLOWS", direction: "IN") + followedByCount: Int! @cypher(statement: "MATCH (this)<-[:FOLLOWS]-(r:User) RETURN COUNT(DISTINCT r)") + + inviteCodes: [InviteCode] @relation(name: "GENERATED", direction: "OUT") + redeemedInviteCode: InviteCode @relation(name: "REDEEMED", direction: "OUT") + + # Is the currently logged in user following that user? + followedByCurrentUser: Boolean! @cypher( + statement: """ + MATCH (this)<-[:FOLLOWS]-(u:User { id: $cypherParams.currentUserId}) + RETURN COUNT(u) >= 1 + """ + ) + + isBlocked: Boolean! @cypher( + statement: """ + MATCH (this)<-[:BLOCKED]-(user:User {id: $cypherParams.currentUserId}) + RETURN COUNT(user) >= 1 + """ + ) + blocked: Boolean! @cypher( + statement: """ + MATCH (this)-[:BLOCKED]-(user:User {id: $cypherParams.currentUserId}) + RETURN COUNT(user) >= 1 + """ + ) + + isMuted: Boolean! @cypher( + statement: """ + MATCH (this)<-[:MUTED]-(user:User { id: $cypherParams.currentUserId}) + RETURN COUNT(user) >= 1 + """ + ) + + # contributions: [WrittenPost]! + # contributions2(first: Int = 10, offset: Int = 0): [WrittenPost2]! + # @cypher( + # statement: "MATCH (this)-[w:WROTE]->(p:Post) RETURN p as Post, w.timestamp as timestamp" + # ) + contributions: [Post]! @relation(name: "WROTE", direction: "OUT") + contributionsCount: Int! @cypher( + statement: """ + MATCH (this)-[:WROTE]->(r:Post) + WHERE NOT r.deleted = true AND NOT r.disabled = true + RETURN COUNT(r) + """ + ) + + comments: [Comment]! @relation(name: "WROTE", direction: "OUT") + commentedCount: Int! @cypher(statement: "MATCH (this)-[:WROTE]->(:Comment)-[:COMMENTS]->(p:Post) WHERE NOT p.deleted = true AND NOT p.disabled = true RETURN COUNT(DISTINCT(p))") + + shouted: [Post]! @relation(name: "SHOUTED", direction: "OUT") + shoutedCount: Int! @cypher(statement: "MATCH (this)-[:SHOUTED]->(r:Post) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)") + + categories: [Category] @relation(name: "CATEGORIZED", direction: "OUT") + + badges: [Badge]! @relation(name: "REWARDED", direction: "IN") + badgesCount: Int! @cypher(statement: "MATCH (this)<-[:REWARDED]-(r:Badge) RETURN COUNT(r)") + + emotions: [EMOTED] + + activeCategories: [String] @cypher( + statement: """ + MATCH (category:Category) + WHERE NOT ((this)-[:NOT_INTERESTED_IN]->(category)) + RETURN collect(category.id) + """ + ) + + myRoleInGroup: GroupMemberRole +} + + +input _UserFilter { + AND: [_UserFilter!] + OR: [_UserFilter!] + name_contains: String + about_contains: String + slug_contains: String + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + friends: _UserFilter + friends_not: _UserFilter + friends_in: [_UserFilter!] + friends_not_in: [_UserFilter!] + friends_some: _UserFilter + friends_none: _UserFilter + friends_single: _UserFilter + friends_every: _UserFilter + following: _UserFilter + following_not: _UserFilter + following_in: [_UserFilter!] + following_not_in: [_UserFilter!] + following_some: _UserFilter + following_none: _UserFilter + following_single: _UserFilter + following_every: _UserFilter + followedBy: _UserFilter + followedBy_not: _UserFilter + followedBy_in: [_UserFilter!] + followedBy_not_in: [_UserFilter!] + followedBy_some: _UserFilter + followedBy_none: _UserFilter + followedBy_single: _UserFilter + followedBy_every: _UserFilter + role_in: [UserRole!] +} + +type Query { + User( + id: ID + email: String # admins need to search for a user sometimes + name: String + slug: String + role: UserRole + locationName: String + about: String + createdAt: String + updatedAt: String + first: Int + offset: Int + orderBy: [_UserOrdering] + filter: _UserFilter + ): [User] + + availableRoles: [UserRole]! + mutedUsers: [User] + blockedUsers: [User] + isLoggedIn: Boolean! + currentUser: User +} + +enum Deletable { + Post + Comment +} + +type Mutation { + UpdateUser ( + id: ID! + name: String + email: String + slug: String + avatar: ImageInput + locationName: String # empty string '' sets it to null + about: String + termsAndConditionsAgreedVersion: String + termsAndConditionsAgreedAt: String + allowEmbedIframes: Boolean + showShoutsPublicly: Boolean + sendNotificationEmails: Boolean + locale: String + ): User + + DeleteUser(id: ID!, resource: [Deletable]): User + + muteUser(id: ID!): User + unmuteUser(id: ID!): User + + blockUser(id: ID!): User + unblockUser(id: ID!): User + + followUser(id: ID!): User + unfollowUser(id: ID!): User + + switchUserRole(role: UserRole!, id: ID!): User + + saveCategorySettings(activeCategories: [String]): Boolean + + requestPasswordReset(email: String!): Boolean! + resetPassword(email: String!, nonce: String!, newPassword: String!): Boolean! + changePassword(oldPassword: String!, newPassword: String!): String! + + # Get a JWT Token for the given Email and password + login(email: String!, password: String!): String! +} diff --git a/docs/backend/src/schema/types/type/UserData.gql b/docs/backend/src/schema/types/type/UserData.gql new file mode 100644 index 000000000..60ad5c12f --- /dev/null +++ b/docs/backend/src/schema/types/type/UserData.gql @@ -0,0 +1,10 @@ +type UserData { + user: User! + posts: [Post] +} + +type Query { + userData( + id: ID + ): UserData +} diff --git a/docs/backend/src/server.spec.ts b/docs/backend/src/server.spec.ts new file mode 100644 index 000000000..6d4ef546d --- /dev/null +++ b/docs/backend/src/server.spec.ts @@ -0,0 +1,43 @@ +import { createTestClient } from 'apollo-server-testing' +import createServer from './server' + +/** + * This file is for demonstration purposes. It does not really test the + * `isLoggedIn` query but demonstrates how we can use `apollo-server-testing`. + * All we need to do is to get an instance of `ApolloServer` and maybe we want + * stub out `context` as shown below. + * + */ + +let user +let action +describe('isLoggedIn', () => { + beforeEach(() => { + action = async () => { + const { server } = createServer({ + context: () => { + return { + user, + } + }, + }) + const { query } = createTestClient(server) + + const isLoggedIn = `{ isLoggedIn }` + return query({ query: isLoggedIn }) + } + }) + + it('returns false', async () => { + const expected = expect.objectContaining({ data: { isLoggedIn: false } }) + await expect(action()).resolves.toEqual(expected) + }) + + describe('when authenticated', () => { + it('returns true', async () => { + user = { id: '123' } + const expected = expect.objectContaining({ data: { isLoggedIn: true } }) + await expect(action()).resolves.toEqual(expected) + }) + }) +}) diff --git a/docs/backend/src/server.ts b/docs/backend/src/server.ts new file mode 100644 index 000000000..0522f5fc8 --- /dev/null +++ b/docs/backend/src/server.ts @@ -0,0 +1,104 @@ +import express from 'express' +import http from 'http' +import helmet from 'helmet' +import { ApolloServer } from 'apollo-server-express' +import CONFIG from './config' +import middleware from './middleware' +import { getNeode, getDriver } from './db/neo4j' +import decode from './jwt/decode' +import schema from './schema' +import { RedisPubSub } from 'graphql-redis-subscriptions' +import { PubSub } from 'graphql-subscriptions' +import Redis from 'ioredis' +import bodyParser from 'body-parser' +import { graphqlUploadExpress } from 'graphql-upload' + +export const NOTIFICATION_ADDED = 'NOTIFICATION_ADDED' +export const CHAT_MESSAGE_ADDED = 'CHAT_MESSAGE_ADDED' +export const ROOM_COUNT_UPDATED = 'ROOM_COUNT_UPDATED' +const { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } = CONFIG +let prodPubsub, devPubsub +const options = { + host: REDIS_DOMAIN, + port: REDIS_PORT, + password: REDIS_PASSWORD, + retryStrategy: (times) => { + return Math.min(times * 50, 2000) + }, +} +if (options.host && options.port && options.password) { + prodPubsub = new RedisPubSub({ + publisher: new Redis(options), + subscriber: new Redis(options), + }) +} else { + devPubsub = new PubSub() +} +export const pubsub = prodPubsub || devPubsub +const driver = getDriver() +const neode = getNeode() + +const getContext = async (req) => { + const user = await decode(driver, req.headers.authorization) + return { + driver, + neode, + user, + req, + cypherParams: { + currentUserId: user ? user.id : null, + }, + } +} +export const context = async (options) => { + const { connection, req } = options + if (connection) { + return connection.context + } else { + return getContext(req) + } +} + +const createServer = (options?) => { + const defaults = { + context, + schema: middleware(schema), + subscriptions: { + onConnect: (connectionParams, webSocket) => { + return getContext(connectionParams) + }, + }, + debug: !!CONFIG.DEBUG, + uploads: false, + tracing: !!CONFIG.DEBUG, + formatError: (error) => { + if (error.message === 'ERROR_VALIDATION') { + return new Error(error.originalError.details.map((d) => d.message)) + } + return error + }, + } + const server = new ApolloServer(Object.assign({}, defaults, options)) + + const app = express() + + app.set('driver', driver) + // TODO: this exception is required for the graphql playground, since the playground loads external resources + // See: https://github.com/graphql/graphql-playground/issues/1283 + app.use( + helmet( + (CONFIG.DEBUG && { contentSecurityPolicy: false, crossOriginEmbedderPolicy: false }) || {}, + ) as any, + ) + app.use(express.static('public')) + app.use(bodyParser.json({ limit: '10mb' }) as any) + app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }) as any) + app.use(graphqlUploadExpress()) + server.applyMiddleware({ app, path: '/' }) + const httpServer = http.createServer(app) + server.installSubscriptionHandlers(httpServer) + + return { server, httpServer, app } +} + +export default createServer diff --git a/docs/backend/test/setup.ts b/docs/backend/test/setup.ts new file mode 100644 index 000000000..d2f24bd40 --- /dev/null +++ b/docs/backend/test/setup.ts @@ -0,0 +1,8 @@ +// Polyfill missing encoders in jsdom +// https://stackoverflow.com/questions/68468203/why-am-i-getting-textencoder-is-not-defined-in-jest +import { TextEncoder, TextDecoder } from 'util' +global.TextEncoder = TextEncoder +global.TextDecoder = TextDecoder as any + +// Metascraper takes longer nowadays, double time +jest.setTimeout(10000) \ No newline at end of file diff --git a/docs/backend/testing.html b/docs/backend/testing.html new file mode 100644 index 000000000..7ca54f744 --- /dev/null +++ b/docs/backend/testing.html @@ -0,0 +1,536 @@ + + + + + + + Backend tests · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                +
                + + + + + + + + +
                + +
                + +
                + + + + + + + + +
                +
                + +
                +
                + +
                + +

                Unit Testing

                + + +
                + +
                +
                +
                + +

                results matching ""

                +
                  + +
                  +
                  + +

                  No results matching ""

                  + +
                  +
                  +
                  + +
                  +
                  + +
                  + + + + + + + + + + + + + + +
                  + + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/backend/tsconfig.json b/docs/backend/tsconfig.json new file mode 100644 index 000000000..b6f3526a3 --- /dev/null +++ b/docs/backend/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./build", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + "useUnknownInCatchVariables": false, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, +} diff --git a/docs/backend/yarn.lock b/docs/backend/yarn.lock new file mode 100644 index 000000000..7c1fa2f6b --- /dev/null +++ b/docs/backend/yarn.lock @@ -0,0 +1,11949 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@apollo/protobufjs@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.4.tgz#cf01747a55359066341f31b5ce8db17df44244e0" + integrity sha512-EE3zx+/D/wur/JiLp6VCiw1iYdyy1lCJMf8CGPkLeDt5QJrN4N8tKFx33Ah4V30AUQzMk7Uz4IXKZ1LOj124gA== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollographql/apollo-tools@^0.4.3": + version "0.4.8" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz#d81da89ee880c2345eb86bddb92b35291f6135ed" + integrity sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA== + dependencies: + apollo-env "^0.6.5" + +"@apollographql/graphql-playground-html@1.6.24": + version "1.6.24" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz#3ce939cb127fb8aaa3ffc1e90dff9b8af9f2e3dc" + integrity sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ== + +"@apollographql/graphql-playground-html@1.6.26": + version "1.6.26" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz#2f7b610392e2a872722912fc342b43cf8d641cb3" + integrity sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ== + dependencies: + xss "^1.0.6" + +"@babel/cli@~7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.4.tgz#505fb053721a98777b2b175323ea4f090b7d3c1c" + integrity sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag== + dependencies: + commander "^4.0.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.1.8" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.20.5": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== + +"@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.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.12.3": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@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.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.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.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.20.7", "@babel/generator@^7.7.2", "@babel/generator@^7.9.0": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@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" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" + integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== + dependencies: + "@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" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.8.3": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@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.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.8.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.9.0": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.18.6", "@babel/helper-optimise-call-expression@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" + integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2", "@babel/helper-simple-access@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.9.5": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@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" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.20.7", "@babel/helpers@^7.9.0": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/node@~7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.8.7.tgz#4213ea99f0c86cc1cf460e61131e7acbb723e13a" + integrity sha512-o8cBT3cfRPLwoPh7VBYonSeZypIawGUeVfOIt1xSDgcDdirRGDPZ7/x+FLhhgQmKp3PKbz5Juh9/BNP4Jzrr9Q== + dependencies: + "@babel/register" "^7.8.3" + commander "^4.0.1" + core-js "^3.2.1" + lodash "^4.17.13" + node-environment-flags "^1.0.5" + regenerator-runtime "^0.13.4" + resolve "^1.13.1" + v8flags "^3.1.1" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7", "@babel/parser@^7.9.0": + version "7.20.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + +"@babel/parser@^7.7.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" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + 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" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@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" + +"@babel/plugin-proposal-throw-expressions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.8.3.tgz#155f36ae40c2a88ae685c35e3220f8a0d426cf24" + integrity sha512-tH40s9JnoR+r45ZXKWW+PC5xzPQfVJix3pR1D8Ty5l9sn5NnrbZUzw8MtnNxu/Bz7p0imyeSYj9FQVccEymOEg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-throw-expressions" "^7.8.3" + +"@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.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz#e6c3dba5a61ecf72ba00a3f3f5f1234989a58e6a" + integrity sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.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.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@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" + integrity sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz#7f798eb7e8cfd3821388120679d23d530bae6e53" + integrity sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA== + 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.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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" + integrity sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA== + 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": + 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-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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" + integrity sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA== + 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" + integrity sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg== + 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" + integrity sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg== + 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" + integrity sha512-Mv3shY1i7ZssY4OY+eLZJAmNCwqTcpv2qOKO9x6irELSygfKWVSMXk0igJsA9UhU4hOdw0qMGkjj9TAk4MqzwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@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.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@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.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== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@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" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@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.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@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.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.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.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@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.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@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-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@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.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@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-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.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" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@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.9.5" + "@babel/plugin-transform-computed-properties" "^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.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.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.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" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@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/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/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" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/runtime-corejs2@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz#c3214c08ef20341af4187f1c9fbdc357fbec96b2" + integrity sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/runtime-corejs3@^7.8.3": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.8.4.tgz#ccc4e042e2fae419c67fa709567e5d2179ed3940" + integrity sha512-+wpLqy5+fbQhvbllvlJEVRIpYj+COUWnnsm+I4jZlA8Lo7/MJmBhGTCHyk1/RWfOqBRJ2MbadddG6QltTKTlrg== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.2" + +"@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" + integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.9.2": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2", "@babel/traverse@^7.9.0": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3": + 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.9.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@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.16.7", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.8.3", "@babel/types@^7.9.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.4.4", "@babel/types@^7.7.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: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.43.0": + version "8.43.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" + integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== + +"@faker-js/faker@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-7.6.0.tgz#9ea331766084288634a9247fcd8b84f16ff4ba07" + integrity sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw== + +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@graphql-toolkit/common@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.10.4.tgz#7785f2a3f14559d0778859c49f4442078c196695" + integrity sha512-HQ3HaxCqX+UE8y/0h7LMDBBGSIKJxY/gaQesaksvE2Y+N4NpSWdiW6HpOcgXfC2HGf9yM0hEdsERzzL8z3mbHQ== + dependencies: + aggregate-error "3.0.1" + camel-case "4.1.1" + graphql-tools "5.0.0" + lodash "4.17.15" + +"@graphql-toolkit/file-loading@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/file-loading/-/file-loading-0.10.4.tgz#50e8933e44b17853544c1fe63350df93f33a5e80" + integrity sha512-oUmy/sO3BJfax85pVKI7FZ6TWrViNuWXoJkRM293YV9bKGuYU9TgqZoHyM+oEqWO5ruXCL/nCdw3cIBau+rSNA== + dependencies: + globby "11.0.0" + unixify "1.0.0" + +"@graphql-toolkit/schema-merging@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/schema-merging/-/schema-merging-0.10.4.tgz#2428590a531a33e9fe03be27cce9030f1c4c044b" + integrity sha512-naL6reYBuILLMrkMfKz0lOLL0kl6gGYnaaywnO/Dgp9F4NeAxDdAs5CV6Fy9NO5OzePFP58Dnc4sh2RyYrrFJg== + dependencies: + "@graphql-toolkit/common" "0.10.4" + deepmerge "4.2.2" + graphql-tools "5.0.0" + tslib "1.11.1" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^15.1.1": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@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.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.2.6" + jest-regex-util "^25.2.6" + jest-util "^25.2.6" + 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/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + 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" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@keyvhq/core@^1.6.14": + version "1.6.14" + resolved "https://registry.yarnpkg.com/@keyvhq/core/-/core-1.6.14.tgz#e0c809ac184c761ffae9bccaf4d0b00eb15c053f" + integrity sha512-NQtjFKsZXLYs3SWbeYATdwwJ1fZtzwrV+9YM4Y9JPGGQqLI0q6gyY2sEWI4RvrKBGJ1AXCJPQNXOPr8oAWdEDw== + dependencies: + json-buffer "~3.0.1" + +"@keyvhq/core@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@keyvhq/core/-/core-2.0.0.tgz#518311a59dbc4d6b6fd56852c15f483edb9fc7c9" + integrity sha512-fi3+F7GNImn1j4r6UFhsHRwN8a05uhUlrbNWZgnkX0h1NzcBEPNNqqMOE4KSASJwH2e9Eh/jm+bEfto58csNgg== + dependencies: + json-buffer "~3.0.1" + +"@keyvhq/memoize@~1.6.14": + version "1.6.14" + resolved "https://registry.yarnpkg.com/@keyvhq/memoize/-/memoize-1.6.14.tgz#6a347b81e9be7040c678f8fc4b9046186484b6fc" + integrity sha512-bsFPrpOHEjAK1F7O0lzl5RR6KofA/zCaFzIBFMDRmcvDJk4Jkk5yqo66+DqQO5YBKWM74y/nAN63XCdHWmi91w== + dependencies: + "@keyvhq/core" "^1.6.14" + mimic-fn "~3.0.0" + +"@keyvhq/memoize@~2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@keyvhq/memoize/-/memoize-2.0.0.tgz#58b1118c2972b631aede81040eab6daefce8f5e8" + integrity sha512-0vibPmDh7nCWsbdS4A1IJX1G89PyT+nJEDGj1tUYsLPQ5BLnpLwneCudmXIvxD6cUUvMYqmhxKyjpvHd8DpPkA== + dependencies: + "@keyvhq/core" "^2.0.0" + mimic-fn "~3.0.0" + +"@metascraper/helpers@^4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-4.10.2.tgz#864e49c71468548441f3a1ab68fdb2913855821b" + integrity sha512-l2IyF2X4ytz5Mj/TaVenmjEhEZCCj+Qb1PnIbW10Kas/qg0O58x5hBAHsszkSWQSx/OvnDvT2Mpft77qcBa77g== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~1.0.0" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~2.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.1.0" + isostring "0.0.1" + lodash "~4.17.11" + mime-types "~2.1.22" + normalize-url "~4.2.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.0.1" + url-regex "~4.1.1" + video-extensions "~1.1.0" + +"@metascraper/helpers@^5.33.5", "@metascraper/helpers@^5.34.2", "@metascraper/helpers@^5.34.4", "@metascraper/helpers@^5.34.7": + version "5.34.7" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.34.7.tgz#749a288813e9f61938bb64d34bfb4e2c26689cbe" + integrity sha512-h3Kg9xFoVlr3rqxbhpR+o7nzYuThXtiDuk+kiaIWozAguUWT6xvwb3iHKuCdKC9/29PXeJ+UqM9WxBamxbzGmg== + dependencies: + audio-extensions "0.0.0" + chrono-node "~2.6.2" + condense-whitespace "~2.0.0" + entities "~4.5.0" + file-extension "~4.0.5" + has-values "~2.0.1" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.4" + iso-639-3 "~2.2.0" + isostring "0.0.1" + jsdom "~22.1.0" + lodash "~4.17.21" + memoize-one "~6.0.0" + microsoft-capitalize "~1.0.5" + mime "~3.0.0" + normalize-url "~6.1.0" + re2 "~1.18.3" + smartquotes "~2.3.2" + tldts "~6.0.1" + url-regex-safe "~3.0.0" + video-extensions "~1.2.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@pkgr/utils@^2.3.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" + integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.2.12" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.5.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@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.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.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.15.4" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" + tslib "^1.9.3" + +"@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.15.4" + "@sentry/minimal" "5.15.4" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" + tslib "^1.9.3" + +"@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.15.4" + "@sentry/utils" "5.15.4" + tslib "^1.9.3" + +"@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.15.4" + "@sentry/types" "5.15.4" + tslib "^1.9.3" + +"@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.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.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.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.15.4" + tslib "^1.9.3" + +"@sindresorhus/is@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" + integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/accepts@*", "@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/babel__core@^7.0.0": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__core@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" + integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/babel__traverse@^7.0.4": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*", "@types/body-parser@1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/cacheable-request@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" + integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== + +"@types/cookies@*": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.4.tgz#26dedf791701abc0e36b5b79a5722f40e455f87b" + integrity sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/cors@^2.8.4": + version "2.8.6" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.6.tgz#cfaab33c49c15b1ded32f235111ce9123009bd02" + integrity sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg== + dependencies: + "@types/express" "*" + +"@types/express-serve-static-core@*": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz#dfe61f870eb549dc6d7e12050901847c7d7e915b" + integrity sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.6" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e" + integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@4.17.4": + version "4.17.4" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.4.tgz#e78bf09f3f530889575f4da8a94cd45384520aac" + integrity sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-capacitor@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" + integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== + dependencies: + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/graphql-upload@^8.0.0": + version "8.0.3" + resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.3.tgz#b371edb5f305a2a1f7b7843a890a2a7adc55c3ec" + integrity sha512-hmLg9pCU/GmxBscg8GCr1vmSoEmbItNNxdD5YH2TJkXm//8atjwuprB+xJBK714JG1dkxbbhp5RHX+Pz1KsCMA== + dependencies: + "@types/express" "*" + "@types/fs-capacitor" "*" + "@types/koa" "*" + graphql "^14.5.3" + +"@types/http-assert@*": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" + integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^27.0.2": + version "27.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" + integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/keyv@*": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.2.tgz#5d97bb65526c20b6e0845f6b0d2ade4f28604ee5" + integrity sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg== + dependencies: + "@types/node" "*" + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.11.3" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.3.tgz#540ece376581b12beadf9a417dd1731bc31c16ce" + integrity sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/long@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/mime@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5" + integrity sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q== + +"@types/node-fetch@2.5.7": + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" + integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*": + version "14.0.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" + integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== + +"@types/node@>=6": + version "12.7.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" + integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== + +"@types/node@^10.1.0": + version "10.17.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" + integrity sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw== + +"@types/node@^20.2.5": + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/qs@*": + version "6.9.3" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03" + integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/serve-static@*": + version "1.13.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c" + integrity sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug== + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/ws@^7.0.0": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.5.tgz#513f28b04a1ea1aa9dc2cad3f26e8e37c88aae49" + integrity sha512-4UEih9BI1nBKii385G9id1oFrSkLcClbwtDfcYj8HJLQqZVAtb/42vXVrYvRWCcufNF/a+rZD3MxNwghA7UmCg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@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" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" + integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== + +"@typescript-eslint/eslint-plugin@^5.57.1": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" + integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.60.0" + "@typescript-eslint/type-utils" "5.60.0" + "@typescript-eslint/utils" "5.60.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.57.1": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" + integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== + dependencies: + "@typescript-eslint/scope-manager" "5.60.0" + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/typescript-estree" "5.60.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" + integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== + dependencies: + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/visitor-keys" "5.60.0" + +"@typescript-eslint/type-utils@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" + integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== + dependencies: + "@typescript-eslint/typescript-estree" "5.60.0" + "@typescript-eslint/utils" "5.60.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" + integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== + +"@typescript-eslint/typescript-estree@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" + integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== + dependencies: + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/visitor-keys" "5.60.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.60.0", "@typescript-eslint/utils@^5.10.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" + integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.60.0" + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/typescript-estree" "5.60.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" + integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== + dependencies: + "@typescript-eslint/types" "5.60.0" + eslint-visitor-keys "^3.3.0" + +"@wry/context@^0.4.0": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" + integrity sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag== + dependencies: + "@types/node" ">=6" + tslib "^1.9.3" + +"@wry/equality@^0.1.2": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== + dependencies: + tslib "^1.9.3" + +abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@1, abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@^1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.8.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +aggregate-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" + integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + dependencies: + clean-stack "^2.0.0" + indent-string "^3.2.0" + +ajv@^6.10.0: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.1.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-cache-control@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.4.tgz#06d57d728e6f928e03b9cc3b993f6102f305c32e" + integrity sha512-FUKE8ASr8GxVq5rmky/tY8bsf++cleGT591lfLiqnPsP1fo3kAfgRfWA2QRHTCKFNlQxzUhVOEDv+PaysqiOjw== + dependencies: + apollo-server-env "^2.4.5" + apollo-server-plugin-base "^0.10.2" + +apollo-cache-inmemory@~1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.5.tgz#2ccaa3827686f6ed7fb634203dbf2b8d7015856a" + integrity sha512-koB76JUDJaycfejHmrXBbWIN9pRKM0Z9CJGQcBzIOtmte1JhEBSuzsOUu7NQgiXKYI4iGoMREcnaWffsosZynA== + dependencies: + apollo-cache "^1.3.4" + apollo-utilities "^1.3.3" + optimism "^0.10.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-cache@1.3.4, apollo-cache@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.4.tgz#0c9f63c793e1cd6e34c450f7668e77aff58c9a42" + integrity sha512-7X5aGbqaOWYG+SSkCzJNHTz2ZKDcyRwtmvW4mGVLRqdQs+HxfXS4dUS2CcwrAj449se6tZ6NLUMnjko4KMt3KA== + dependencies: + apollo-utilities "^1.3.3" + tslib "^1.10.0" + +apollo-client@~2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.8.tgz#01cebc18692abf90c6b3806414e081696b0fa537" + integrity sha512-0zvJtAcONiozpa5z5zgou83iEKkBaXhhSSXJebFHRXs100SecDojyUWKjwTtBPn9HbM6o5xrvC5mo9VQ5fgAjw== + dependencies: + "@types/zen-observable" "^0.8.0" + apollo-cache "1.3.4" + apollo-link "^1.0.0" + apollo-utilities "1.3.3" + symbol-observable "^1.0.2" + ts-invariant "^0.4.0" + tslib "^1.10.0" + zen-observable "^0.8.0" + +apollo-datasource@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.2.tgz#1662ee93453a9b89af6f73ce561bde46b41ebf31" + integrity sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw== + dependencies: + apollo-server-caching "^0.5.2" + apollo-server-env "^2.4.5" + +apollo-engine-reporting-protobuf@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz#b6e66e6e382f9bcdc2ac8ed168b047eb1470c1a8" + integrity sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw== + dependencies: + "@apollo/protobufjs" "^1.0.3" + +apollo-env@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.5.tgz#5a36e699d39e2356381f7203493187260fded9f3" + integrity sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg== + dependencies: + "@types/node-fetch" "2.5.7" + core-js "^3.0.1" + node-fetch "^2.2.0" + sha.js "^2.4.11" + +apollo-errors@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/apollo-errors/-/apollo-errors-1.9.0.tgz#f1ed0ca0a6be5cd2f24e2eaa7b0860a10146ff51" + integrity sha512-XVukHd0KLvgY6tNjsPS3/Re3U6RQlTKrTbIpqqeTMo2N34uQMr+H1UheV21o8hOZBAFosvBORVricJiP5vfmrw== + dependencies: + assert "^1.4.1" + extendable-error "^0.1.5" + +apollo-graphql@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.6.0.tgz#37bee7dc853213269137f4c60bfdf2ee28658669" + integrity sha512-BxTf5LOQe649e9BNTPdyCGItVv4Ll8wZ2BKnmiYpRAocYEXAVrQPWuSr3dO4iipqAU8X0gvle/Xu9mSqg5b7Qg== + dependencies: + apollo-env "^0.6.5" + lodash.sortby "^4.7.0" + +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.14" + tslib "^1.9.3" + +apollo-link-http-common@^0.2.14, 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.14" + ts-invariant "^0.4.0" + tslib "^1.9.3" + +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.14" + apollo-link-http-common "^0.2.16" + tslib "^1.9.3" + +apollo-link@^1.0.0, apollo-link@^1.2.12, apollo-link@^1.2.14: + 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.21" + +apollo-reporting-protobuf@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.1.tgz#09294e5f5f6b2285eb94b40621ed42113eaabea3" + integrity sha512-qr4DheFP154PGZsd93SSIS9RkqHnR5b6vT+eCloWjy3UIpY+yZ3cVLlttlIjYvOG4xTJ25XEwcHiAExatQo/7g== + dependencies: + "@apollo/protobufjs" "^1.0.3" + +apollo-server-caching@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz#5cd0536ad5473abb667cc82b59bc56b96fb35db6" + integrity sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw== + dependencies: + lru-cache "^5.0.0" + +apollo-server-caching@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz#bef5d5e0d48473a454927a66b7bb947a0b6eb13e" + integrity sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ== + dependencies: + lru-cache "^5.0.0" + +apollo-server-core@^2.11.0, apollo-server-core@^2.14.2: + version "2.19.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.19.0.tgz#ff14e788f228c2d6739478a68cf93f46a16e5bfa" + integrity sha512-2aMKUVPyNbomJQaG2tkpfqvp1Tfgxgkdr7nX5zHudYNSzsPrHw+CcYlCbIVFFI/mTZsjoK9czNq1qerFRxZbJw== + dependencies: + "@apollographql/apollo-tools" "^0.4.3" + "@apollographql/graphql-playground-html" "1.6.26" + "@types/graphql-upload" "^8.0.0" + "@types/ws" "^7.0.0" + apollo-cache-control "^0.11.4" + apollo-datasource "^0.7.2" + apollo-graphql "^0.6.0" + apollo-reporting-protobuf "^0.6.1" + apollo-server-caching "^0.5.2" + apollo-server-env "^2.4.5" + apollo-server-errors "^2.4.2" + apollo-server-plugin-base "^0.10.2" + apollo-server-types "^0.6.1" + apollo-tracing "^0.12.0" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.0.0" + graphql-extensions "^0.12.6" + graphql-tag "^2.9.2" + graphql-tools "^4.0.0" + graphql-upload "^8.0.2" + loglevel "^1.6.7" + lru-cache "^5.0.0" + sha.js "^2.4.11" + subscriptions-transport-ws "^0.9.11" + uuid "^8.0.0" + ws "^6.0.0" + +apollo-server-env@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.4.tgz#12d2d0896dcb184478cba066c7a683ab18689ca1" + integrity sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-env@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.5.tgz#73730b4f0439094a2272a9d0caa4079d4b661d5f" + integrity sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-errors@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz#1128738a1d14da989f58420896d70524784eabe5" + integrity sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ== + +apollo-server-express@^2.14.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.14.2.tgz#662dfeb9c794c1eca59dd93e57e74487a8195ae6" + integrity sha512-iYyZm0kQqkM561i9l0WC9HbJsGZJbHP9bhnWaa1Itd+yNBS2AJFp6mRR3hQacsWXUw7ewaKAracMIggvfSH5Aw== + 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.4" + accepts "^1.3.5" + apollo-server-core "^2.14.2" + apollo-server-types "^0.5.0" + body-parser "^1.18.3" + cors "^2.8.4" + express "^4.17.1" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.0" + parseurl "^1.3.2" + subscriptions-transport-ws "^0.9.16" + type-is "^1.6.16" + +apollo-server-plugin-base@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.2.tgz#185aea98ba22afe275fb01659070edeb480a89a7" + integrity sha512-uM5uL1lOxbXdgvt/aEIbgs40fV9xA45Y3Mmh0VtQ/ddqq0MXR5aG92nnf8rM+URarBCUfxKJKaYzJJ/CXAnEdA== + dependencies: + apollo-server-types "^0.6.1" + +apollo-server-testing@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.11.0.tgz#3f6e25a6f04a60b0c839aa776a85e886209d1832" + integrity sha512-iqb20FYmkM6VJ9s4M78J8lXabZSDZCt8V2/As1x2zvgZ8bOdX77fR5UxrkkV/zR6bwd7252wIiHp/m9FF9O2zA== + dependencies: + apollo-server-core "^2.11.0" + +apollo-server-types@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.5.0.tgz#51f39c5fa610ece8b07f1fbcf63c47d4ac150340" + integrity sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg== + dependencies: + apollo-engine-reporting-protobuf "^0.5.1" + apollo-server-caching "^0.5.1" + apollo-server-env "^2.4.4" + +apollo-server-types@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.6.1.tgz#61486980b44cacee2cb4939f0b369a0eb661a098" + integrity sha512-IEQ37aYvMLiTUzsySVLOSuvvhxuyYdhI05f3cnH6u2aN1HgGp7vX6bg+U3Ue8wbHfdcifcGIk5UEU+Q+QO6InA== + dependencies: + apollo-reporting-protobuf "^0.6.1" + apollo-server-caching "^0.5.2" + apollo-server-env "^2.4.5" + +apollo-server@~2.14.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.14.2.tgz#65167305479d36e96e6f0d08ac201aa6c7571a44" + integrity sha512-H+X3HprWGxV8DIhQyXzheMheKRxSlD9/lMuzIHyW/7VPspc7rX0xsHaFcTwQGcxLz18LhM+HtMBtvzi/KlRIbA== + dependencies: + apollo-server-core "^2.14.2" + apollo-server-express "^2.14.2" + express "^4.0.0" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.0" + +apollo-tracing@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.12.0.tgz#26250d7789c28aa89d63226eb674706dd69a568a" + integrity sha512-cMUYGE6mOEwb9HDqhf4fiPEo2JMhjPIqEprAQEC57El76avRpRig5NM0bnqMZcYJZR5QmLlNcttNccOwf9WrNg== + dependencies: + apollo-server-env "^2.4.5" + apollo-server-plugin-base "^0.10.2" + +apollo-upload-client@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-13.0.0.tgz#146d1ddd85d711fcac8ca97a72d3ca6787f2b71b" + integrity sha512-lJ9/bk1BH1lD15WhWRha2J3+LrXrPIX5LP5EwiOUHv8PCORp4EUrcujrA3rI5hZeZygrTX8bshcuMdpqpSrvtA== + dependencies: + "@babel/runtime" "^7.9.2" + apollo-link "^1.2.12" + apollo-link-http-common "^0.2.14" + extract-files "^8.0.0" + +apollo-utilities@1.3.3, apollo-utilities@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.3.tgz#f1854715a7be80cd810bc3ac95df085815c0787c" + integrity sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" + integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assert@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assertion-error-formatter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz#be9c8825dee6a8a6c72183d915912d9b57d5d265" + integrity sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ== + dependencies: + diff "^4.0.1" + pad-right "^0.2.2" + repeat-string "^1.6.1" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +assignment@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assignment/-/assignment-2.0.0.tgz#ffd17b21bf5d6b22e777b989681a815456a3dd3e" + integrity sha1-/9F7Ib9dayLnd7mJaBqBVFaj3T4= + +assignment@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/assignment/-/assignment-2.2.0.tgz#f5b5bc2d160d69986e8700cd38f567c0aabe101e" + integrity sha1-9bW8LRYNaZhuhwDNOPVnwKq+EB4= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-retry@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +audio-extensions@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/audio-extensions/-/audio-extensions-0.0.0.tgz#d0eefe077fb9eb625898eed9985890548cf1f8d2" + integrity sha1-0O7+B3+562JYmO7ZmFiQVIzx+NI= + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +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" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +babel-core@~7.0.0-0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-eslint@~10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + 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.2.6" + chalk "^3.0.0" + slash "^3.0.0" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^25.2.6: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" + integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-transform-runtime@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4= + dependencies: + babel-runtime "^6.22.0" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + 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-import-meta" "^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/plugin-syntax-top-level-await" "^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.2.6" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-runtime@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +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== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bcryptjs@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= + +becke-ch--regex--s0-0-v1--base--pl--lib@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz#429ceebbfa5f7e936e78d73fbdc7da7162b20e20" + integrity sha1-Qpzuu/pffpNueNc/vcfacWKyDiA= + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bluebird@^3.4.1: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +body-parser@1.19.0, body-parser@^1.18.3: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +browserslist@^4.8.3, browserslist@^4.9.1: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +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" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +busboy@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" + integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== + dependencies: + dicer "0.3.0" + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.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" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001219: + version "1.0.30001230" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" + integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== + +caniuse-lite@^1.0.30001449: + version "1.0.30001451" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" + integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chai@~4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@~1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +cheerio@~1.0.0-rc.3: + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" + integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.1" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + +chownr@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" + integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrono-node@~1.3.11: + version "1.3.11" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.11.tgz#b86a26b7e3157edcc4fe3374e1b6f90caedc8e39" + integrity sha512-jDWRnY6nYvzfV3HPYBqo+tot7tcsUs9i3arGbMdI0TouPSXP2C2y/Ctp27rxKTQDi6yuTxAB2cw+Q6igGhOhdQ== + dependencies: + moment "2.21.0" + +chrono-node@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.6.3.tgz#fa257cffb2dfc33fa5a01b26bd86f93741ca6dc5" + integrity sha512-VkWaaZnNulqzNH9i4XCdyI05OX6MFEnCMNKdZOR4w//wS5/E2qkwAss/O5sj6SfTZK84fX4SSOG4pzqjqIseiA== + dependencies: + dayjs "^1.10.0" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-stack@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" + integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== + dependencies: + escape-string-regexp "4.0.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-table3@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +clipboardy@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" + integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +cluster-key-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collapse-white-space@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" + integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +colors@^1.1.2: + version "1.3.3" + 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.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== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" + integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +condense-whitespace@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" + integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= + +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.1.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.6.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.3.tgz#41e281ca771209d5f2eb63ce34f96037d0928538" + integrity sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + +core-js@^2.4.0, core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + +core-js@^3.0.1: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +core-js@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" + integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cors@^2.8.4, cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@~7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== + dependencies: + rrweb-cssom "^0.6.0" + +cucumber-expressions@^8.1.0: + version "8.2.1" + resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-8.2.1.tgz#e250063993350df106a8664c90a414814f555e2d" + integrity sha512-6n5JKbAzXfIiwyu2UyUcOmO83QmuSme25+Dw2taK6VNOybOfRkh4yNMA9VtuAJHOmsX3/8l0OVjTbE8lHnjOHA== + dependencies: + becke-ch--regex--s0-0-v1--base--pl--lib "^1.4.0" + xregexp "^4.2.4" + +cucumber-tag-expressions@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.2.tgz#aac27aae3690818ec15235bd056282dad8a2d2b8" + integrity sha512-DohmT4X641KX/sb96bdb7J2kXNcQBPrYmf3Oc5kiHCLfzFMWx/o2kB4JvjvQPZnYuA9lRt6pqtArM5gvUn4uzw== + +cucumber@~6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cucumber/-/cucumber-6.0.5.tgz#cdc752ad18b551bcf7bc92774c925302f4408714" + integrity sha512-x+W9Fwk6TvcapQsYMxwFU5AsQJDOIJVGrPKmH15OC7jzb9/Dk7Hb0ZAyw4WcpaDcUDRc8bi2k2yJejDp5eTRlg== + dependencies: + assertion-error-formatter "^3.0.0" + bluebird "^3.4.1" + cli-table3 "^0.5.1" + colors "^1.1.2" + commander "^3.0.1" + cucumber-expressions "^8.1.0" + cucumber-tag-expressions "^2.0.2" + duration "^0.2.1" + escape-string-regexp "^2.0.0" + figures "^3.0.0" + gherkin "5.0.0" + glob "^7.1.3" + indent-string "^4.0.0" + is-generator "^1.0.2" + is-stream "^2.0.0" + knuth-shuffle-seeded "^1.0.6" + lodash "^4.17.14" + mz "^2.4.0" + progress "^2.0.0" + resolve "^1.3.3" + serialize-error "^4.1.0" + stack-chain "^2.0.0" + stacktrace-js "^2.0.0" + string-argv "^0.3.0" + title-case "^2.1.1" + util-arity "^1.0.2" + verror "^1.9.0" + +d@1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" + +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + +dayjs@^1.10.0: + version "1.10.6" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.6.tgz#288b2aa82f2d8418a6c9d4df5898c0737ad02a63" + integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.2.1, decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +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== + +deepmerge@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +denque@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" + integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +dicer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== + dependencies: + streamsearch "0.1.2" + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" + integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +dom-serializer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" + integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08" + integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg== + dependencies: + dom-serializer "^0.2.1" + domelementtype "^2.0.1" + domhandler "^3.0.0" + +domutils@^2.5.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-prop@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== + dependencies: + is-obj "^1.0.0" + +dotenv@^16.0.0: + version "16.1.4" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.1.4.tgz#67ac1a10cd9c25f5ba604e4e08bc77c0ebe0ca8c" + integrity sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw== + +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + integrity sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ== + +dotenv@~8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duration@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529" + integrity sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg== + dependencies: + d "1" + es5-ext "~0.10.46" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.723: + version "1.3.739" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9" + integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A== + +electron-to-chromium@^1.4.284: + version "1.4.295" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" + integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.12.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +entities@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.3.tgz#9d3c000fb9f5c461f7c4e63c1aa75373ac7aaa36" + integrity sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA== + dependencies: + stackframe "^1.0.4" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.46: + version "0.10.50" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" + integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-config-standard@^17.0.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-import-resolver-typescript@^3.5.4: + version "3.5.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + synckit "^0.8.5" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^27.2.1: + version "27.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz#be4ded5f91905d9ec89aa8968d39c71f3b072c0c" + integrity sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-n@^15.7.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" + integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== + dependencies: + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.11.0" + minimatch "^3.1.2" + resolve "^1.22.1" + semver "^7.3.8" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +eslint-plugin-security@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz#0e9c4a471f6e4d3ca16413c7a4a51f3966ba16e4" + integrity sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ== + dependencies: + safe-regex "^2.1.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^8.37.0: + version "8.43.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" + integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.43.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^3.1.0: + version "3.1.2" + 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.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +express@^4.0.0, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extendable-error@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.5.tgz#122308a7097bc89a263b2c4fbf089c78140e3b6d" + integrity sha1-EiMIpwl7yJomOyxPvwiceBQOO20= + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-files@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-8.1.0.tgz#46a0690d0fe77411a2e3804852adeaa65cd59288" + integrity sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +figures@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-extension@~4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/file-extension/-/file-extension-4.0.5.tgz#ae6cef34c28e7313a92baa4aa955755cacdf0ce3" + integrity sha512-l0rOL3aKkoi6ea7MNZe6OHgqYYpn48Qfflr8Pe9G9JPPTx5A+sfboK91ZufzIs59/lPqh351l0eb6iKU9J5oGg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +fn-name@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c" + integrity sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + 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" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +franc@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/franc/-/franc-4.0.0.tgz#365951bc787b92ffbb1c63c1c492d6b76cbd3a56" + integrity sha512-4991aLWY5sLg2fsyiOPflUjye5XBKyUO4V9O4FTBbQ7xKugvnmP9x3m3LlrpD7kq1BebMThNkEXnK52HaU3ZkQ== + dependencies: + trigram-utils "^1.0.0" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-capacitor@^6.1.0, fs-capacitor@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" + integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== + +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + dependencies: + minipass "^2.2.1" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +fsevents@^2.1.2, fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" + integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== + dependencies: + resolve-pkg-maps "^1.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +get-video-id@~3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/get-video-id/-/get-video-id-3.6.5.tgz#a7bfa1e8602557f2fcbed164d7005fdaa352d572" + integrity sha512-9RPHSQANIeGW5rU3CjWdm1zi+wUHbBWX+m4m+dqQAavrZ9p1P1J7AbxGvVEEHRyGfGrmMf5PqiRWYMyfqM+QYA== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +gherkin@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gherkin/-/gherkin-5.0.0.tgz#96def41198ec3908258b511af74f655a2764d2a1" + integrity sha1-lt70EZjsOQgli1Ea909lWidk0qE= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.0.0: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.3: + version "13.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.0.tgz#7dd5678d765c4680c2e6d106230d86cb727cb1af" + integrity sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +got@~11.8.0, got@~11.8.5, got@~11.8.6: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + +graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.2.6: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +graphql-auth-directives@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/graphql-auth-directives/-/graphql-auth-directives-2.1.0.tgz#85b83817844e2ec5fba8fe5de444287d6dd0f85a" + integrity sha512-mRVsjeMeMABPyjxyzl9mhkcW02YBwSj7dnu7C6wy2dIhiby6xTKy6Q54C8KeqXSYsy6ua4VmBH++d7GKqpvIoA== + dependencies: + apollo-errors "^1.9.0" + graphql-tools "^4.0.4" + jsonwebtoken "^8.3.0" + +graphql-extensions@^0.12.6: + version "0.12.6" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.6.tgz#c66be43035662a8cfb0b8efe9df96595338bd13c" + integrity sha512-EUNw+OIRXYTPxToSoJjhJvS5aGa94KkdkZnL1I9DCZT64/+rzQNeLeGj+goj2RYuYvoQe1Bmcx0CNZ1GqwBhng== + dependencies: + "@apollographql/apollo-tools" "^0.4.3" + apollo-server-env "^2.4.5" + apollo-server-types "^0.6.1" + +graphql-middleware-sentry@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/graphql-middleware-sentry/-/graphql-middleware-sentry-3.2.1.tgz#b5653d78903d655cf4212a602cfa6e26689cda07" + integrity sha512-lAwmHwsyey1db6scQg32javmqAFifabhqPIr0SUzx46O4kvjQlLZZn7KrRT12XDwgW7i6goAotdSPl9Fq+TBrQ== + +graphql-middleware@~4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/graphql-middleware/-/graphql-middleware-4.0.2.tgz#eb589bf428e1795e48cd6a3cfeeba0807b996ebd" + integrity sha512-ESVDvMXeN00S1BNsjNS18uExcR16J8zbT31CuKcpyeBa7IMbidG0Pnqnu5P1wKkJLmPmKOfCljWlhXpD/Fawqg== + dependencies: + graphql-tools "^4.0.5" + +graphql-redis-subscriptions@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/graphql-redis-subscriptions/-/graphql-redis-subscriptions-2.2.1.tgz#377be5670ff344aa78cf147a9852e686a65e4b21" + integrity sha512-Rk0hapKUZuZpJIv3rG5rmd1SX3f+9k1k5AXoh8bxbM3Vkdzh28WM7kvJOqq1pJuO3gQ4OAoqzciNT0MMHRylXQ== + dependencies: + iterall "^1.3.0" + optionalDependencies: + ioredis "^4.6.3" + +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.34" + object-hash "^2.0.3" + yup "^0.28.3" + +graphql-subscriptions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz#5f2fa4233eda44cf7570526adfcf3c16937aef11" + integrity sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA== + dependencies: + iterall "^1.2.1" + +graphql-tag@^2.9.2, graphql-tag@~2.10.3: + version "2.10.3" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" + integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== + +graphql-tools@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-5.0.0.tgz#67281c834a0e29f458adba8018f424816fa627e9" + integrity sha512-5zn3vtn//382b7G3Wzz3d5q/sh+f7tVrnxeuhTMTJ7pWJijNqLxH7VEzv8VwXCq19zAzHYEosFHfXiK7qzvk7w== + dependencies: + apollo-link "^1.2.14" + apollo-upload-client "^13.0.0" + deprecated-decorator "^0.1.6" + form-data "^3.0.0" + iterall "^1.3.0" + node-fetch "^2.6.0" + tslib "^1.11.1" + uuid "^7.0.3" + +graphql-tools@^4.0.0, graphql-tools@^4.0.4, graphql-tools@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" + integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== + dependencies: + apollo-link "^1.2.14" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + +graphql-upload@^11.0.0, graphql-upload@^8.0.2: + version "11.0.0" + resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-11.0.0.tgz#24b245ff18f353bab6715e8a055db9fd73035e10" + integrity sha512-zsrDtu5gCbQFDWsNa5bMB4nf1LpKX9KDgh+f8oL1288ijV4RxeckhVozAjqjXAfRpxOHD1xOESsh6zq8SjdgjA== + dependencies: + busboy "^0.3.1" + fs-capacitor "^6.1.0" + http-errors "^1.7.3" + isobject "^4.0.0" + object-path "^0.11.4" + +graphql@^14.2.1, graphql@^14.5.3, graphql@^14.6.0: + version "14.6.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.6.0.tgz#57822297111e874ea12f5cd4419616930cd83e49" + integrity sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg== + dependencies: + iterall "^1.2.2" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has-values@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d" + integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w== + dependencies: + kind-of "^6.0.2" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" + integrity sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI= + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +helmet@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-7.0.0.tgz#ac3011ba82fa2467f58075afa58a49427ba6212d" + integrity sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ== + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-to-text@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-7.1.1.tgz#69de8d85b91646b4bc14fdf4f850e9e046efff15" + integrity sha512-c9QWysrfnRZevVpS8MlE7PyOdSuIOjg8Bt8ZE10jMU/BEngA6j3llj4GRfAmtQzcd1FjKE0sWu5IHXRUH9YxIQ== + dependencies: + deepmerge "^4.2.2" + he "^1.2.0" + htmlparser2 "^6.1.0" + minimist "^1.2.5" + +htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" + integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + domutils "^2.0.0" + entities "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@^1.7.3, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +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== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-extensions@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/image-extensions/-/image-extensions-1.1.0.tgz#b8e6bf6039df0056e333502a00b6637a3105d894" + integrity sha1-uOa/YDnfAFbjM1AqALZjejEF2JQ= + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +insane@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/insane/-/insane-2.6.1.tgz#c7dcae7b51c20346883b71078fad6ce0483c198f" + integrity sha1-x9yue1HCA0aIO3EHj61s4Eg8GY8= + dependencies: + assignment "2.0.0" + he "0.5.0" + +install-artifact-from-github@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.3.tgz#57d89bacfa0f47d7307fe41b6247cda9f9a8079c" + integrity sha512-x79SL0d8WOi1ZjXSTUqqs0GPQZ92YArJAN9O46wgU9wdH2U9ecyyhB9YGDbPe2OLV4ptmt6AZYRQZ2GydQZosQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +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" + denque "^1.1.0" + lodash.defaults "^4.2.0" + lodash.flatten "^4.4.0" + redis-commands "1.5.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.0.1" + +ip-regex@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.1.tgz#e315cbdcbbc3d6789532d591954ac78a0e5049f6" + integrity sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" + integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + dependencies: + has-symbols "^1.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-relative-url@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-2.0.0.tgz#72902d7fe04b3d4792e7db15f9db84b7204c9cef" + integrity sha1-cpAtf+BLPUeS59sV+duEtyBMnO8= + dependencies: + is-absolute-url "^2.0.0" + +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-uri@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.0.tgz#b92ff234af68c0ed97d2eed46492d01793b7d420" + integrity sha1-uS/yNK9owO2X0u7UZJLQF5O31CA= + dependencies: + parse-uri "~1.0.0" + punycode2 "~1.0.0" + +is-uri@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.4.tgz#d098837e45701eaedce1b53de68b8102465fbd46" + integrity sha512-8sHi5gEARwpMYwJD9uSAkU9Bb7YkSagcM10EYqSe+osqOErXln4VL+EgLSG40e9lVTpcpygpvb9Z6ohZpECDGA== + dependencies: + parse-uri "~1.0.3" + punycode2 "~1.0.0" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iso-639-3@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" + integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== + +iso-639-3@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-2.2.0.tgz#eb01d7734d61396efec934979e8b0806550837f1" + integrity sha512-v9w/U4XDSfXCrXxf4E6ertGC/lTRX8MLLv7XC1j6N5oL3ympe38jp77zgeyMsn3MbufuAAoGeVzDJbOXnPTMhQ== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +isostring@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isostring/-/isostring-0.0.1.tgz#ddb608efbfc89cda86db9cb16be090a788134c7f" + integrity sha1-3bYI77/InNqG25yxa+CQp4gTTH8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +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.2.6" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.3" + 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-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +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-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^25.2.6: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" + integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== + dependencies: + graceful-fs "^4.2.4" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +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.2.6" + chalk "^3.0.0" + is-ci "^2.0.0" + make-dir "^3.0.0" + +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-worker@^25.2.6: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.2.4: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +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.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsdom@~22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" + integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== + dependencies: + abab "^2.0.6" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.1, json-buffer@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@2.x, json5@^2.1.2, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonwebtoken@^8.3.0, jsonwebtoken@~8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keyv@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" + integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== + dependencies: + json-buffer "3.0.1" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +knuth-shuffle-seeded@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz#01f1b65733aa7540ee08d8b0174164d22081e4e1" + integrity sha1-AfG2VzOqdUDuCNiwF0Fk0iCB5OE= + dependencies: + seed-random "~2.2.0" + +languagedetect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/languagedetect/-/languagedetect-2.0.0.tgz#4b8fa2b7593b2a3a02fb1100891041c53238936c" + integrity sha512-AZb/liiQ+6ZoTj4f1J0aE6OkzhCo8fyH+tuSaPfSo8YHCWLFJrdSixhtO2TYdIkjcDQNaR4RmGaV2A5FJklDMQ== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +linkifyjs@~2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.8.tgz#2bee2272674dc196cce3740b8436c43df2162f9c" + integrity sha512-j3QpiEr4UYzN5foKhrr9Sr06VI9vSlI4HisDWt+7Mq+TWDwpJ6H/LLpogYsXcyUIJLVhGblXXdUnblHsVNMPpg== + optionalDependencies: + jquery "^3.3.1" + react "^16.4.2" + react-dom "^16.4.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash-es@^4.17.11: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash@4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@^4.15.0, lodash@^4.17.14, lodash@~4.17.11, lodash@~4.17.14: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +lodash@^4.17.13, lodash@^4.17.15, lodash@^4.7.0, lodash@~4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loglevel@^1.6.7: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^1.1.1: + version "1.1.4" + 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: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.0.0, lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.7.1: + version "7.14.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" + integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memoize-one@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-graphql-schemas@^1.7.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.7.8.tgz#11a0a672a38a61d988c09ffdebe1bd4f8418de48" + integrity sha512-C3EJ1i86OjmbcCT524wVPRl17M5VZzgyh9kIGYAlYnAILX+7xfh8cCbMKfehh9n4opZg6CtcPogCiVZ6PB2NyQ== + dependencies: + "@graphql-toolkit/file-loading" "0.10.4" + "@graphql-toolkit/schema-merging" "0.10.4" + tslib "1.11.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +metascraper-audio@^5.34.4: + version "5.34.4" + resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.34.4.tgz#84437c3962a9186cda69510229f6b68e6a25563a" + integrity sha512-Z/BzT0KLq8H6Zc0wm4PqKlSeI7O54ZsD2QhV9GgkJNz5jGj0Rs4P3OOvoa+FEtDyRKGfIzYuldAuhQMVmo1WMA== + dependencies: + "@keyvhq/memoize" "~2.0.0" + "@metascraper/helpers" "^5.34.4" + got "~11.8.6" + p-reflect "~2.1.0" + +metascraper-author@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.33.5.tgz#ae6fd41c8f9a355e48b851e67308673e1f2fe89c" + integrity sha512-/n4OWwHNQZwb9Z1t3Y58I5+ou885tBHGsTPGhBB7SYdbOBRygr8DuC9HDrPlrmW0aY88lIDTTN3jqTqEoPYgaQ== + dependencies: + "@metascraper/helpers" "^5.33.5" + +metascraper-date@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.33.5.tgz#fccd8f7b685e0f3bb152c86aa93ed03a96c3c834" + integrity sha512-NmzizRF52KzJg2qDSPKT6FnPxB8ufvtZS00kci7Sxdt6PFGKrOEK8qaj6Z3XDSZiBWd8WMtdEHi4K7Mf17C7kA== + dependencies: + "@metascraper/helpers" "^5.33.5" + +metascraper-description@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.33.5.tgz#d6b20e613da6028d6e825162f89f045282d4ce81" + integrity sha512-j+5hY8QPvFbAud6soeoSq7FXvnezPxW3aLgVHtuGTDBfDTSW7TGsfzcajCfgPwi1F3CslBTql/hfoFq1rK+kGw== + dependencies: + "@metascraper/helpers" "^5.33.5" + +metascraper-image@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.33.5.tgz#76e71310cce14fa56232a3802668f07f0d2095bd" + integrity sha512-8IYyjA7FH+laEV+Wg6l+gmMTrLcW9jYkyj8e6R0wuvxKjJNmdZuhLGmteDfyec/kkPHoFQSPFbz+tTsQN8ue9g== + dependencies: + "@metascraper/helpers" "^5.33.5" + +metascraper-lang-detector@^4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/metascraper-lang-detector/-/metascraper-lang-detector-4.10.2.tgz#45744bc331125c098e8b27716d76740161b121d2" + integrity sha512-Lz1d5v/i1j08gQYz7sCdoxjOx94ArLV4UucUhGZeQpR4E6dK47V6aqfYwODRe2XAqhaU+3oLnbAipoHkOeZXiw== + dependencies: + "@metascraper/helpers" "^4.10.2" + franc "~4.0.0" + iso-639-3 "~1.1.0" + +metascraper-lang@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.33.5.tgz#6299b88ff4e84c81325af13a9978fde452f45c46" + integrity sha512-HZiRpyvBkahuK+ULb1C8mQyREpxe6w4kguEl3l5/4CdTUKeEsbkBE41Tz23nSoMfzDP8IsPN65cd/s1Loa47Yw== + dependencies: + "@metascraper/helpers" "^5.33.5" + +metascraper-logo@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.33.5.tgz#395a1acc2f630ec92bb7b794cf1cf2999e61a8d9" + integrity sha512-zTaAqGRJ3ZIINuChRcsXSPNW1RceM5N/nCFa/1cN/UY/6TSmZbDGbtIXmypVd/cHMfC72oKoNrVd1TROtofcoQ== + dependencies: + "@metascraper/helpers" "^5.33.5" + lodash "~4.17.21" + +metascraper-publisher@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.33.5.tgz#381744ebe6e2bedc478f21b101a006cc703bb0b9" + integrity sha512-2M9ZkQPZYUvU4Rz3Mcak6rNtK6/xcLUd77ejOgMB3EVbgm5BGsCp7dPtf4iSSybhu/RsJCvJb4Ndsajzgw9kSQ== + dependencies: + "@metascraper/helpers" "^5.33.5" + +metascraper-soundcloud@^5.34.4: + version "5.34.4" + resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.34.4.tgz#f5e154e20ddad8902630b6f128f0928e7475ef83" + integrity sha512-EO17QYd7HOEGFHgKjC68x5fp8j+V+iYeGO0IgWY53olOfIrxBMG6gG1IIqcOjhbZFVHNX1uBz4BVmNtTvHvcjw== + dependencies: + "@metascraper/helpers" "^5.34.4" + +metascraper-title@^5.34.7: + version "5.34.7" + resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.34.7.tgz#d53afa05eb4d5f2d7b8ec772ddfc335733f86a21" + integrity sha512-k+eDC12Y1m5n/RE3GhqmWRtNSKH9rDXvAzJ6k2T9+9PyaGeaSN9dWLnc3rK9TYmdFP02kTKhCAV8WerHw/7IqA== + dependencies: + "@metascraper/helpers" "^5.34.7" + +metascraper-url@^5.34.2: + version "5.34.2" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.34.2.tgz#1136dbf1177d08835d6b8677a64d9f10f0517fb0" + integrity sha512-ijPe3G64kyxFRWPA7YmH01dt5JImqBgWV07WIpgPj8wuD4ThwteGqV1CtjNYJN8yo/tCQeFNJPoubwiv9RsrJw== + dependencies: + "@metascraper/helpers" "^5.34.2" + +metascraper-video@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.33.5.tgz#4231ddee3bb4cb22f6f41c868de61012f7989fa9" + integrity sha512-Fa0u+O/tY6RbRtY0Y+Ox7OJP3+a9o2HwYvK0NjLUdisF/GBZOJ7i1U2puv4kbOvua5un7BS6J6ULiWIF/+EPAg== + dependencies: + "@keyvhq/memoize" "~1.6.14" + "@metascraper/helpers" "^5.33.5" + got "~11.8.5" + lodash "~4.17.21" + p-reflect "~2.1.0" + +metascraper-youtube@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.33.5.tgz#7b72d2facdce5fdbf53b8353476ea9115e5061a6" + integrity sha512-jztiBU3PbXnxK6AhFqkfpC2PDYkyOfaF/4wjI8AT/wXYvDMk8pEUx8SNAHThxx4CEHVylCIzXc0o6gKUcCic/w== + dependencies: + "@metascraper/helpers" "^5.33.5" + get-video-id "~3.6.5" + p-locate "~5.0.0" + reachable-url "~1.7.1" + +metascraper@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.33.5.tgz#c411cda7c144ec3e9d0dff42da858a2a3925e1c9" + integrity sha512-ey9flNTK8rlJ7GfE0qQ5HvnYF6BMTJZ4EsTLBEB/IMRPCIPjJk6RgV/VpdpnWTBlujjErryay5UWhk13wlXhXQ== + dependencies: + "@metascraper/helpers" "^5.33.5" + cheerio "~1.0.0-rc.12" + lodash "~4.17.21" + whoops "~4.1.2" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +microsoft-capitalize@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/microsoft-capitalize/-/microsoft-capitalize-1.0.5.tgz#bcaf915039f14224c8cfd74c31cea42fecacbb31" + integrity sha512-iqDMU9J643BHg8Zp7EMZNLTp6Pgs2f1S2SMnCW2VlUqMs17xCZ5vwVjalBJEGVcUfG+/1ePqeEGcMW3VfzHK5A== + +migrate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/migrate/-/migrate-2.0.0.tgz#eef68ac206f658d96ddfaf81c8c5999d71694956" + integrity sha512-Oklla7q1Ok3UZZOGL67wkFlKfZHAxdT7NusHwHgzPBfokbCvYDEEGM8Bx7G5jDuoRNiA7R261Y2CwZX0cyx9CQ== + dependencies: + chalk "^4.1.2" + commander "^2.20.3" + dateformat "^4.6.3" + dotenv "^16.0.0" + inherits "^2.0.3" + minimatch "^9.0.1" + mkdirp "^3.0.1" + slug "^8.2.2" + +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^2.1.26, mime-types@~2.1.22, mime-types@~2.1.24: + 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== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-fn@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.0.0.tgz#76044cfa8818bbf6999c5c9acadf2d3649b14b4b" + integrity sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ== + +mimic-fn@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + dependencies: + brace-expansion "^2.0.1" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" + integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== + dependencies: + yallist "^4.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +moment@2.21.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" + integrity sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +n-gram@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/n-gram/-/n-gram-1.1.1.tgz#a374dc176a9063a2388d1be18ed7c35828be2a97" + integrity sha512-qibRqvUghLIVsq+RTwVuwOzgOxf0l4DDZKVYAK0bMam5sG9ZzaJ6BUSJyG2Td8kTc7c/HcMUtjiN5ShobZA2bA== + +nan@2.17.0, nan@^2.12.1, nan@^2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo4j-driver-bolt-connection@^4.4.7: + version "4.4.7" + resolved "https://registry.yarnpkg.com/neo4j-driver-bolt-connection/-/neo4j-driver-bolt-connection-4.4.7.tgz#0582d54de1f213e60c374209193d1f645ba523ea" + integrity sha512-6Q4hCtvWE6gzN64N09UqZqf/3rDl7FUWZZXiVQL0ZRbaMkJpZNC2NmrDIgGXYE05XEEbRBexf2tVv5OTYZYrow== + dependencies: + buffer "^6.0.3" + neo4j-driver-core "^4.4.7" + string_decoder "^1.3.0" + +neo4j-driver-core@^4.4.7: + version "4.4.7" + resolved "https://registry.yarnpkg.com/neo4j-driver-core/-/neo4j-driver-core-4.4.7.tgz#d2475e107b3fea2b9d1c36b0c273da5c5a291c37" + integrity sha512-NhvVuQYgG7eO/vXxRaoJfkWUNkjvIpmCIS9UWU9Bbhb4V+wCOyX/MVOXqD0Yizhs4eyIkD7x90OXb79q+vi+oA== + +neo4j-driver@^4.0.1, neo4j-driver@^4.0.2, neo4j-driver@^4.2.2: + version "4.4.7" + resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-4.4.7.tgz#51b3fb48241e66eb3be94e90032cc494c44e59f3" + integrity sha512-N7GddPhp12gVJe4eB84u5ik5SmrtRv8nH3rK47Qy7IUKnJkVEos/F1QjOJN6zt1jLnDXwDcGzCKK8XklYpzogw== + dependencies: + "@babel/runtime" "^7.5.5" + neo4j-driver-bolt-connection "^4.4.7" + neo4j-driver-core "^4.4.7" + rxjs "^6.6.3" + +neo4j-graphql-js@^2.11.5: + version "2.11.5" + resolved "https://registry.yarnpkg.com/neo4j-graphql-js/-/neo4j-graphql-js-2.11.5.tgz#4e887d727ec05b2c57ab81fad373fa3fcb734e39" + integrity sha512-vex6PRqDT5wdxYgmw9p5oii9EUbflEkjzpjJ0tG1JfhWl5e7W/CLHfjT6wyl5wWRq8WYYvREAX3ADsdNapqUtw== + dependencies: + "@babel/runtime" "^7.5.5" + "@babel/runtime-corejs2" "^7.5.5" + debug "^4.1.1" + graphql "^14.2.1" + graphql-auth-directives "^2.1.0" + lodash "^4.17.15" + neo4j-driver "^4.0.1" + +neode@^0.4.9: + version "0.4.9" + resolved "https://registry.yarnpkg.com/neode/-/neode-0.4.9.tgz#11c46c50d0348751dc6db828f3ca59252e7c247f" + integrity sha512-3RufLD2cmTXrPpvsgkEAqS3maRjXJ89vjbyYmyqJMJl5uv6gcUa32N6hRwHcqfjWRWUaFKaoGLEJLaOQobs4eA== + dependencies: + "@hapi/joi" "^15.1.1" + dotenv "^4.0.0" + neo4j-driver "^4.2.2" + uuid "^3.4.0" + +next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + 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" + +node-environment-flags@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + 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.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" + integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ== + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +nodemailer-html-to-text@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nodemailer-html-to-text/-/nodemailer-html-to-text-3.2.0.tgz#91b959491fef8f7d91796047abb728aa86d4a12b" + integrity sha512-RJUC6640QV1PzTHHapOrc6IzrAJUZtk2BdVdINZ9VTLm+mcQNyBO9LYyhrnufkzqiD9l8hPLJ97rSyK4WanPNg== + dependencies: + html-to-text "7.1.1" + +nodemailer@^6.4.4: + version "6.4.5" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.5.tgz#45614c6454d1a947242105eeddae03df87e29916" + integrity sha512-NH7aNVQyZLAvGr2+EOto7znvz+qJ02Cb/xpou98ApUt5tEAUSVUxhvHvgV/8I5dhjKTYqUw0nasoKzLNBJKrDQ== + +nodemon@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.2.tgz#9c7efeaaf9b8259295a97e5d4585ba8f0cbe50b0" + integrity sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw== + dependencies: + chokidar "^3.2.2" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^6.0.1, normalize-url@~6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@~4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" + integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" + integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + +nwsapi@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@^0.11.4: + version "0.11.5" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" + integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + +optimism@^0.10.0: + version "0.10.2" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.2.tgz#626b6fd28b0923de98ecb36a3fd2d3d4e5632dd9" + integrity sha512-zPfBIxFFWMmQboM9+Z4MSJqc1PXp82v1PFq/GfQaufI69mHKlup7ykGNnfuGIGssXJQkmhSodQ/k9EWwjd8O8A== + dependencies: + "@wry/context" "^0.4.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0, p-locate@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-reflect@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-2.1.0.tgz#5d67c7b3c577c4e780b9451fc9129675bd99fe67" + integrity sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pad-right@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" + integrity sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q= + dependencies: + repeat-string "^1.5.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse-uri@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.0.tgz#2872dcc22f1a797acde1583d8a0ac29552ddac20" + integrity sha1-KHLcwi8aeXrN4Vg9igrClVLdrCA= + +parse-uri@~1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.7.tgz#287629a09328a97e398468f21b8a00c4a2d9cc73" + integrity sha512-eWuZCMKNlVkXrEoANdXxbmqhu2SQO9jUMCSpdbJDObin0JxISn6e400EWsSRbr/czdKvWKkhZnMKEGUwf/Plmg== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +parse5@^7.0.0, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@^1.3.2, parseurl@~1.3.3: + version "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" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss@^7.0.27: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.8.7: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-format@^27.0.0, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-expr@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.2.tgz#fff2a43919135553a3bc2fdd94bdb841965b2330" + integrity sha512-bc/5ggaYZxNkFKj374aLbEDqVADdYaLcFo8XBkishUWbaAdjlphaBFns9TvRA2pUseVL/wMFmui9X3IdNDU37g== + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode2@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8" + integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g= + +punycode@1.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, punycode@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +re2@~1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/re2/-/re2-1.18.3.tgz#64120f3990351e6d71207b095a92ebc41f123c7f" + integrity sha512-QAUSIl5znNR/GOXLIUWWao0pPQ2VZU/t9u+0j17x7lXXypPsil8iuYBsSuMDZ3TGx439332tYdh0d9Nt8XGbHg== + dependencies: + install-artifact-from-github "^1.3.3" + nan "^2.17.0" + node-gyp "^9.3.1" + +reachable-url@~1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/reachable-url/-/reachable-url-1.7.1.tgz#4d56f534d088c084e7d9884dafadf2c43d074c66" + integrity sha512-SCk7V5cwUw246mPhJ7uaqMcxa5iJNlzfztCvcDK1EgqexW2ghLWWrAGZCBNg/lT0ZqjJnLcsKPfGWxmmoABvOw== + dependencies: + got "~11.8.0" + p-reflect "~2.1.0" + +react-dom@^16.4.2: + version "16.9.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.9.0.tgz#5e65527a5e26f22ae3701131bcccaee9fb0d3962" + integrity sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.15.0" + +react-is@^16.8.1: + version "16.9.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" + integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react@^16.4.2: + version "16.9.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.9.0.tgz#40ba2f9af13bc1a38d75dbf2f4359a5185c4f7aa" + integrity sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + +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" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.5.0.tgz#80d2e20698fe688f227127ff9e5164a7dd17e785" + integrity sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg== + +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= + dependencies: + redis-errors "^1.0.0" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + 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" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz#e96bf612a3362d12bb69f7e8f74ffeab25c7ac91" + integrity sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g== + +regenerator-transform@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.2.tgz#949d9d87468ff88d5a7e4734ebb994a892de1ff2" + integrity sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@~0.1.1: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + +regexp.prototype.flags@^1.4.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.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" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +regjsgen@^0.5.0: + version "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" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + 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" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +request@~2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-alpn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.0.tgz#058bb0888d1cd4d12474e9a4b6eb17bdd5addc44" + integrity sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.3: + 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" + +resolve@^1.20.0, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@0.12.0, retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rosie@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rosie/-/rosie-2.0.1.tgz#c250c4787ce450b72aa9eff26509f68589814fa2" + integrity sha1-wlDEeHzkULcqqe/yZQn2hYmBT6I= + +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize-html@~1.22.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.22.1.tgz#5b36c92ab27917ddd2775396815c2bc1a6268310" + integrity sha512-++IMC00KfMQc45UWZJlhWOlS9eMrME38sFG9GXfR+k6oBo9JXSYQgTOZCl9j3v/smFTRNT9XNwz5DseFdMY+2Q== + dependencies: + chalk "^2.4.1" + htmlparser2 "^4.1.0" + lodash.clonedeep "^4.5.0" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.mergewith "^4.6.2" + postcss "^7.0.27" + 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" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e" + integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +seed-random@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" + integrity sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ= + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.x: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.0.0, semver@^7.3.2, semver@^7.3.7, semver@^7.3.8: + version "7.5.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" + integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-error@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-4.1.0.tgz#63e1e33ede20bcd89d9f0528ea4c15fbf0f2b78a" + integrity sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw== + dependencies: + type-fest "^0.3.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slug@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/slug/-/slug-8.2.2.tgz#33b019a857a11fc4773c1e9a9f60e3da651a9e5d" + integrity sha512-5ByW6qXqPeG0Tmlkh24JhdXhvQsbaJSjVr3GgGxUV0BSskZKKBZZfFWxezap8+fh1vxBN9GVbqI1V6nqAFxlBg== + +slug@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/slug/-/slug-6.0.0.tgz#39637b32e5a873bc692812a630842880499ed6c9" + integrity sha512-0MpNLyCSUSf0G1nAZmp9gY1cvesPP35a1Live25vZ23gWQ5SAopF0N+0hk9KI4ytNuTebJrHGNrgTnxboofcSg== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +smartquotes@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/smartquotes/-/smartquotes-2.3.1.tgz#01ebb595d6c7a9e24d90e8cb95c17d0e1af49407" + integrity sha1-Aeu1ldbHqeJNkOjLlcF9Dhr0lAc= + +smartquotes@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/smartquotes/-/smartquotes-2.3.2.tgz#fb1630c49ba04e57446e1a97dc10d590072af4a6" + integrity sha512-0R6YJ5hLpDH4mZR7N5eZ12oCMLspvGOHL9A9SEm2e3b/CQmQidekW4SWSKEmor/3x6m3NCBBEqLzikcZC9VJNQ== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +srcset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-2.0.1.tgz#8f842d357487eb797f413d9c309de7a5149df5ac" + integrity sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + +stack-chain@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-2.0.0.tgz#d73d1172af89565f07438b5bcc086831b6689b2d" + integrity sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg== + +stack-generator@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.3.tgz#bb74385c67ffc4ccf3c4dee5831832d4e509c8a0" + integrity sha512-kdzGoqrnqsMxOEuXsXyQTmvWXZmG0f3Ql2GDx5NtmZs59sT2Bt9Vdyq0XdtxUi58q/+nxtbF9KOQ9HkV1QznGg== + dependencies: + stackframe "^1.0.4" + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== + +stacktrace-gps@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.2.tgz#33f8baa4467323ab2bd1816efa279942ba431ccc" + integrity sha512-9o+nWhiz5wFnrB3hBHs2PTyYrS60M1vvpSzHxwxnIbtY2q9Nt51hZvhrG1+2AxD374ecwyS+IUwfkHRE/2zuGg== + dependencies: + source-map "0.5.6" + stackframe "^1.0.4" + +stacktrace-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.0.tgz#776ca646a95bc6c6b2b90776536a7fc72c6ddb58" + integrity sha1-d2ymRqlbxsayuQd2U2p/xyxt21g= + dependencies: + error-stack-parser "^2.0.1" + stack-generator "^2.0.1" + stacktrace-gps "^3.0.1" + +standard-as-callback@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.0.1.tgz#ed8bb25648e15831759b6023bdb87e6b60b38126" + integrity sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +string-argv@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16, subscriptions-transport-ws@^0.9.19: + version "0.9.19" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf" + integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0 || ^6.0.0 || ^7.0.0" + +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-observable@^1.0.2, symbol-observable@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +synchronous-promise@^2.0.10: + version "2.0.10" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" + integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A== + +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^4: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +tar@^6.1.11, tar@^6.1.2: + version "6.1.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= + dependencies: + any-promise "^1.0.0" + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +title-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + +title@~3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/title/-/title-3.4.1.tgz#166177c48f52ae9b73afe9901a183f0b6c97b2e6" + integrity sha512-CoIakPr4Gi91bm4Xp6xTuZ3EENxPcKgOJzHzrhSdUatGtFMeVJa2qxI4WNhJHgz0Jak5Ck6jY2UNFM71/yBIsw== + dependencies: + arg "1.0.0" + chalk "2.3.0" + clipboardy "1.2.2" + titleize "1.0.0" + +titleize@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" + integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + +tlds@^1.187.0: + version "1.203.1" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" + integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== + +tlds@^1.228.0: + version "1.236.0" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.236.0.tgz#a118eebe33261c577e3a3025144faeabb7dd813c" + integrity sha512-oP2PZ3KeGlgpHgsEfrtva3/K9kzsJUNliQSbCfrJ7JMCWFoCdtG+9YMq/g2AnADQ1v5tVlbtvKJZ4KLpy/P6MA== + +tldts-core@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.0.3.tgz#b59d87507c51cd2488c322b92020b973b608b59a" + integrity sha512-PLiEM2aCkfGifyr8npbd93eWIW4isFRB44vTiup5DRie6e2Qy3+9quwHb252v12JyoM+RmF1cxtDgwD2PVBOjA== + +tldts@~6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.0.3.tgz#6a4a8bb550f396d6d72818606150e0e0263ae826" + integrity sha512-rcdUIwrcGuMWe5+fg5FFBrmWTYdbfpHwkk1AjBKoSDbpsdAsYqJYKoZOVOHn8MQCYatADKGAx/SU+jpSKxSYNw== + dependencies: + tldts-core "^6.0.3" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + +trigram-utils@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/trigram-utils/-/trigram-utils-1.0.2.tgz#47574b7fade636e0fc06515788cbbd61786d2292" + integrity sha512-4/DmYtegpRAyTHPpL+asfLHfTdrTZ5N0FNaixyb4L6Bx3mi+g1wgsFJNixZ9Ycsjs3+FrK4zJoWW86cdMaL8RA== + dependencies: + collapse-white-space "^1.0.3" + n-gram "^1.0.0" + trim "0.0.1" + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trunc-html@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trunc-html/-/trunc-html-1.1.2.tgz#1e97d51f67d470b67662b1a670e6d0ea7a8edafe" + integrity sha1-HpfVH2fUcLZ2YrGmcObQ6nqO2v4= + dependencies: + assignment "2.2.0" + insane "2.6.1" + trunc-text "1.0.1" + +trunc-text@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trunc-text/-/trunc-text-1.0.1.tgz#58f876d8ac59b224b79834bb478b8656e69622b5" + integrity sha1-WPh22KxZsiS3mDS7R4uGVuaWIrU= + +truncate@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" + integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= + +ts-invariant@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" + integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== + dependencies: + tslib "^1.9.3" + +ts-jest@^27.0.5: + version "27.1.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" + integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/type/-/type-1.0.3.tgz#16f5d39f27a2d28d86e48f8981859e9d3296c179" + integrity sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.9.4: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "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" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unixify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA= + dependencies: + normalize-path "^2.1.1" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url-regex-safe@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-regex-safe/-/url-regex-safe-3.0.0.tgz#102a38f74a1a731973fa42690c6a56656fddff12" + integrity sha512-+2U40NrcmtWFVjuxXVt9bGRw6c7/MgkGKN9xIfPrT/2RX0LTkkae6CCEDp93xqUN0UKm/rr821QnHd2dHQmN3A== + dependencies: + ip-regex "4.3.0" + tlds "^1.228.0" + +url-regex@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-4.1.1.tgz#a5617b22e15e26dac57ce74c3f52088bcdfec995" + integrity sha512-ViSDgDPNKkrQHI81GLCjdDN+Rsk3tAW/uLXlBOJxtcHzWZjta58Z0APXhfXzS89YszsheMnEvXeDXsWUB53wwA== + dependencies: + ip-regex "^1.0.1" + tlds "^1.187.0" + +url@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" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-arity@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/util-arity/-/util-arity-1.1.0.tgz#59d01af1fdb3fede0ac4e632b0ab5f6ce97c9330" + integrity sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA= + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@3.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, uuid@^3.4.0: + 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.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== + +uuid@^8.0.0, uuid@~8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +v8flags@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" + integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + dependencies: + homedir-polyfill "^1.0.1" + +validator@^13.9.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" + integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0, verror@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +video-extensions@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/video-extensions/-/video-extensions-1.1.0.tgz#eaa86b45f29a853c2b873e9d8e23b513712997d6" + integrity sha1-6qhrRfKahTwrhz6djiO1E3Epl9Y= + +video-extensions@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/video-extensions/-/video-extensions-1.2.0.tgz#62f449f403b853f02da40964cbf34143f7d96731" + integrity sha512-TriMl18BHEsh2KuuSA065tbu4SNAC9fge7k8uKoTTofTq89+Xsg4K1BGbmSVETwUZhqSjd9KwRCNwXAW/buXMg== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +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== + dependencies: + isexe "^2.0.0" + +whoops@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.1.2.tgz#b8bf080b9b4f4ab93f8249734ac1086fb14b4dd9" + integrity sha512-QITkghBnjbKGOtOrJOGrHnupWDX/AHFlcTXL3/A0B5rx2DacLrpuIpcFVmwYb0IOWZ0G3sxYkS8LBSZ4J/ezng== + dependencies: + clean-stack "~3.0.0" + mimic-fn "~3.1.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +"ws@^5.2.0 || ^6.0.0 || ^7.0.0": + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xml-name-validator@^3.0.0: + version "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== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xregexp@^4.2.4, xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + +xss@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.7.tgz#a554cbd5e909324bd6893fb47fff441ad54e2a95" + integrity sha512-A9v7tblGvxu8TWXQC9rlpW96a+LN1lyw6wyhpTmmGW+FwRMactchBR3ROKSi33UPCUcUHSu8s9YP6F+K3Mw//w== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.x, yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yup@^0.28.3: + version "0.28.3" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.28.3.tgz#1ca607405a8adf24a5ac51f54bd09d527555f0ba" + integrity sha512-amVkCgFWe5bGjrrUiODkbIzrSwtB8JpZrQYSrfj2YsbRdrV+tn9LquWdZDlfOx2HXyfEA8FGnlwidE/bFDxO7Q== + dependencies: + "@babel/runtime" "^7.8.7" + fn-name "~3.0.0" + lodash "^4.17.15" + lodash-es "^4.17.11" + property-expr "^2.0.0" + synchronous-promise "^2.0.10" + toposort "^2.0.2" + +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" + +zen-observable@^0.8.0: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/docs/cypress/create-cucumber-html-report.js b/docs/cypress/create-cucumber-html-report.js new file mode 100644 index 000000000..9720f4281 --- /dev/null +++ b/docs/cypress/create-cucumber-html-report.js @@ -0,0 +1,12 @@ +const report = require("multiple-cucumber-html-reporter"); + +const reportTitle = "Ocelot webapp end-to-end test report" + +report.generate({ + jsonDir: "reports/json_logs", + reportPath: "./reports/cucumber_html_report", + pageTitle: reportTitle, + reportName: reportTitle, + pageFooter: "
                  ", + hideMetadata: true +}); \ No newline at end of file diff --git a/docs/cypress/cypress.config.js b/docs/cypress/cypress.config.js new file mode 100644 index 000000000..b1d80575e --- /dev/null +++ b/docs/cypress/cypress.config.js @@ -0,0 +1,44 @@ +const dotenv = require('dotenv') +const { defineConfig } = require("cypress"); +const browserify = require("@badeball/cypress-cucumber-preprocessor/browserify"); +const { addCucumberPreprocessorPlugin } = require("@badeball/cypress-cucumber-preprocessor"); + +// Test persistent(between commands) store +const testStore = {} + +async function setupNodeEvents(on, config) { + await addCucumberPreprocessorPlugin(on, config); + + on("file:preprocessor", browserify.default(config)); + + on("task", { + pushValue({ name, value }) { + testStore[name] = value + return true + }, + getValue(name) { + console.log("getValue",name,testStore) + return testStore[name] + }, + }); + + return config; +} + +// Import backend .env (smart)? +const { parsed } = dotenv.config({ path: '../backend/.env' }) + +module.exports = defineConfig({ + e2e: { + projectId: "qa7fe2", + defaultCommandTimeout: 10000, + chromeWebSecurity: false, + baseUrl: "http://localhost:3000", + specPattern: "cypress/e2e/**/*.feature", + supportFile: "cypress/support/e2e.js", + retries: 0, + video: false, + setupNodeEvents, + }, + env: parsed +}); \ No newline at end of file diff --git a/docs/cypress/e2e/Admin.DonationInfo.feature b/docs/cypress/e2e/Admin.DonationInfo.feature new file mode 100644 index 000000000..4aa869760 --- /dev/null +++ b/docs/cypress/e2e/Admin.DonationInfo.feature @@ -0,0 +1,31 @@ +Feature: Admin sets donations info settings + As an admin + I want to switch the donation info on and off and like to change to donations goal and progress + In order to manage the funds + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | role | termsAndConditionsAgreedVersion | + | user | user@example.org | abcd | user | User-Chad | user | 0.0.4 | + | admin | admin@example.org | 1234 | admin | Admin-Man | admin | 0.0.4 | + Given the following "posts" are in the database: + | id | title | pinned | createdAt | + | p1 | Some other post | | 2020-01-21 | + | p2 | Houston we have a problem | x | 2020-01-20 | + | p3 | Yet another post | | 2020-01-19 | + Given the following "donations" are in the database: + | id | showDonations | goal | progress | + | d1 | x | 15000.0 | 7000.0 | + + Scenario: The donation info is visible on the index page by default + When I am logged in as "user" + And I navigate to page "/" + Then the donation info is "visible" + And the donation info contains goal "15,000" and progress "7,000" + + Scenario: Admin changes the donation info to be invisible + When I am logged in as "admin" + And I navigate to page "/admin/donations" + Then I click the checkbox show donations progress bar and save + And I navigate to page "/" + Then the donation info is "invisible" diff --git a/docs/cypress/e2e/Admin.PinPost.feature b/docs/cypress/e2e/Admin.PinPost.feature new file mode 100644 index 000000000..a5297d894 --- /dev/null +++ b/docs/cypress/e2e/Admin.PinPost.feature @@ -0,0 +1,43 @@ +Feature: Admin pins a post + As an admin + I want to pin a post so that it always appears at the top + In order to make sure all network users read it + e.g. notify people about security incidents, maintenance downtimes + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | role | termsAndConditionsAgreedVersion | + | user | user@example.org | abcd | user | User-Chad | user | 0.0.4 | + | admin | admin@example.org | 1234 | admin | Admin-Man | admin | 0.0.4 | + Given the following "posts" are in the database: + | id | title | pinned | createdAt | + | p1 | Some other post | | 2020-01-21 | + | p2 | Houston we have a problem | x | 2020-01-20 | + | p3 | Yet another post | | 2020-01-19 | + + Scenario: Pinned post always appears on the top of the newsfeed + When I am logged in as "user" + And I navigate to page "/" + Then the first post on the newsfeed has the title: + """ + Houston we have a problem + """ + And the post with title "Houston we have a problem" has a ribbon for pinned posts + + Scenario: Ordinary users cannot pin a post + When I am logged in as "user" + And I navigate to page "/" + And I open the content menu of post "Yet another post" + Then there is no button to pin a post + + Scenario: Admins are allowed to pin a post + When I am logged in as "admin" + And I navigate to page "/" + And I open the content menu of post "Yet another post" + And I click on "pin post" + Then I see a toaster with "Post pinned successfully" + And the first post on the newsfeed has the title: + """ + Yet another post + """ + And the post with title "Yet another post" has a ribbon for pinned posts diff --git a/docs/cypress/e2e/Admin.TagOverview.feature b/docs/cypress/e2e/Admin.TagOverview.feature new file mode 100644 index 000000000..fcec638ec --- /dev/null +++ b/docs/cypress/e2e/Admin.TagOverview.feature @@ -0,0 +1,31 @@ +Feature: Admin tag overview + As a database administrator + I would like to see a overview of all tags and their usage + In order to be able to decide which tags are popular or not + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | role | termsAndConditionsAgreedVersion | + | admin | admin@example.org | 1234 | admin | Admin-Man | admin | 0.0.4 | + | u1 | u1@example.org | 1234 | u1 | User1 | user | 0.0.4 | + | u2 | u2@example.org | 1234 | u2 | User2 | user | 0.0.4 | + | u3 | u3@example.org | 1234 | u3 | User3 | user | 0.0.4 | + And the following "tags" are in the database: + | id | + | Ecology | + | Nature | + | Democracy | + And the following "posts" are in the database: + | id | title | authorId | tagIds | + | p1 | P1 from U1 | u1 | Nature, Democracy | + | p2 | P2 from U2 | u2 | Ecology, Democracy | + | p3 | P3 from U3 | u3 | Nature, Democracy | + And I am logged in as "admin" + + Scenario: See an overview of tags + When I navigate to page "/admin/hashtags" + Then I can see the following table: + | No. | Hashtags | Users | Posts | + | 1 | #Democracy | 3 | 3 | + | 2 | #Nature | 2 | 2 | + | 3 | #Ecology | 1 | 1 | \ No newline at end of file diff --git a/docs/cypress/e2e/Internationalization.feature b/docs/cypress/e2e/Internationalization.feature new file mode 100644 index 000000000..5eb6bbc3f --- /dev/null +++ b/docs/cypress/e2e/Internationalization.feature @@ -0,0 +1,23 @@ +Feature: Internationalization + As a user who is not very fluent in English + I would like to see the user interface translated to my preferred language + In order to be able to understand the interface + + Background: + Given I navigate to page "/login" + + Scenario Outline: I select "" in the language menu and see "" + When I select "" in the language menu + Then the whole user interface appears in "" + Then I see a button with the label "" + + Examples: Login Button + | language | buttonLabel | + | Français | Connexion | + | Deutsch | Anmelden | + | English | Login | + + Scenario: Keep preferred language after refresh + When I select "Français" in the language menu + And I refresh the page + Then the whole user interface appears in "Français" diff --git a/docs/cypress/e2e/Moderation.HidePost.feature b/docs/cypress/e2e/Moderation.HidePost.feature new file mode 100644 index 000000000..0ef802267 --- /dev/null +++ b/docs/cypress/e2e/Moderation.HidePost.feature @@ -0,0 +1,40 @@ +Feature: Hide Posts + As a moderator + I would like to be able to hide posts from the public + to enforce our network's code of conduct and/or legal regulations + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | role | termsAndConditionsAgreedVersion | + | user | user@example.org | abcd | user | User-Chad | user | 0.0.4 | + | moderator | moderator@example.org | 1234 | moderator | Mod-Man | moderator | 0.0.4 | + Given the following "posts" are in the database: + | id | title | deleted | disabled | + | p1 | This post should be visible | | | + | p2 | This post is disabled | | x | + | p3 | This post is deleted | x | | + + Scenario: Disabled posts don't show up on the newsfeed as user + When I am logged in as "user" + And I navigate to page "/" + Then I should see only 1 posts on the newsfeed + And the first post on the newsfeed has the title: + """ + This post should be visible + """ + + Scenario: Disabled posts show up on the newsfeed as moderator + When I am logged in as "moderator" + And I navigate to page "/" + Then I should see only 2 posts on the newsfeed + And the first post on the newsfeed has the title: + """ + This post is disabled + """ + + Scenario: Visiting a disabled post's page should return 404 + Given I am logged in as "user" + Then the page "/post/this-post-is-disabled" returns a 404 error with a message: + """ + This post could not be found + """ diff --git a/docs/cypress/e2e/Moderation.ReportContent.feature b/docs/cypress/e2e/Moderation.ReportContent.feature new file mode 100644 index 000000000..518020bd0 --- /dev/null +++ b/docs/cypress/e2e/Moderation.ReportContent.feature @@ -0,0 +1,73 @@ +Feature: Report and Moderate + As a user + I would like to report content that violates the community guidlines + So the moderators can take action on it + + As a moderator + I would like to see all reported content + So I can look into it and decide what to do + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | role | termsAndConditionsAgreedVersion | + | user | user@example.org | abcd | user | User-Chad | user | 0.0.4 | + | moderator | moderator@example.org | 1234 | moderator | Mod-Man | moderator | 0.0.4 | + | annoying | annoying@example.org | 1234 | annoying-user | I'm gonna mute Moderators and Admins HA HA HA | user | 0.0.4 | + And the following "posts" are in the database: + | authorId | id | title | content | + | annoying-user | p1 | The Truth about the Holocaust | It never existed! | + | annoying-user | p2 | Fake news | This content is demonstratably infactual in some way | + + Scenario Outline: Report a post from various pages + When I am logged in as "user" + And I navigate to page "" + And I click on "Report Post" from the content menu of the post + And I confirm the reporting dialog because it is a criminal act under German law: + """ + Do you really want to report the contribution "The Truth about the Holocaust"? + """ + Then I see a toaster with "Thanks for reporting!" + Examples: + | Page | + | / | + | /post/p1 | + + Scenario: Report user + Given I am logged in as "user" + And I navigate to page "/post/the-truth-about-the-holocaust" + When I click on the author + And I click on "Report User" from the content menu in the user info box + And I confirm the reporting dialog because he is a holocaust denier: + """ + Do you really want to report the user "I'm gonna mute Moderators and …"? + """ + Then I see a toaster with "Thanks for reporting!" + + Scenario: Review reported content + Given somebody reported the following posts: + | submitterEmail | resourceId | reasonCategory | reasonDescription | + | p1.submitter@example.org | p1 | discrimination_etc | Offensive content | + And I am logged in as "moderator" + And I navigate to page "/" + When I click on the avatar menu in the top right corner + And I click on "Moderation" + Then I see all the reported posts including the one from above + And each list item links to the post page + + Scenario: Review reported posts of a user who's muted a moderator + Given somebody reported the following posts: + | submitterEmail | resourceId | reasonCategory | reasonDescription | + | p2.submitter@example.org | p2 | other | Offensive content | + And I am logged in as "moderator" + And I navigate to page "/" + And there is an annoying user who has muted me + When I click on the avatar menu in the top right corner + And I click on "Moderation" + Then I see all the reported posts including from the user who muted me + And I can visit the post page + + Scenario: Normal user can't see the moderation page + Given I am logged in as "user" + And I navigate to page "/" + When I click on the avatar menu in the top right corner + Then I can't see the moderation menu item diff --git a/docs/cypress/e2e/Notification.Mention.feature b/docs/cypress/e2e/Notification.Mention.feature new file mode 100644 index 000000000..0d3726492 --- /dev/null +++ b/docs/cypress/e2e/Notification.Mention.feature @@ -0,0 +1,29 @@ +Feature: Notification for a mention + As a user + I want to be notified if somebody mentions me in a post or comment + In order join conversations about or related to me + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | wolle-aus-hamburg | wolle@example.org | 1234 | wolle | Wolfgang aus Hamburg | 0.0.4 | + | matt-rider | matt@example.org | 4321 | matt | Matt Rider | 0.0.4 | + + Scenario: Mention another user, re-login as this user and see notifications + Given I am logged in as "wolle-aus-hamburg" + And I navigate to page "/" + And I navigate to page "/post/create" + And I start to write a new post with the title "Hey Matt" beginning with: + """ + Big shout to our fellow contributor + """ + And mention "@matt-rider" in the text + And I click on "save button" + And I am logged in as "matt-rider" + And I navigate to page "/" + And see 1 unread notifications in the top menu + And open the notification menu and click on the first item + And I wait for 750 milliseconds + Then I am on page "/post/.*/hey-matt" + And the unread counter is removed + And the notification menu button links to the all notifications page \ No newline at end of file diff --git a/docs/cypress/e2e/PersistentLinks.feature b/docs/cypress/e2e/PersistentLinks.feature new file mode 100644 index 000000000..89f9d9654 --- /dev/null +++ b/docs/cypress/e2e/PersistentLinks.feature @@ -0,0 +1,31 @@ +Feature: Persistent Links + As a user + I want all links to carry permanent information that identifies the linked resource + In order to have persistent links even if a part of the URL might change + | | Modifiable | Referenceable | Unique | Purpose | + | -- | -- | -- | -- | -- | + | ID | no | yes | yes | Identity, Traceability, Links | + | Slug | yes | yes | yes | @-Mentions, SEO-friendly URL | + | Name | yes | no | no | Search, self-description | + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | thehawk | hawk@example.org | abcd | MHNqce98y1 | Stephen Hawking | 0.0.4 | + | narrator | narrator@example.org | 1234 | narrator | Nathan Narrator | 0.0.4 | + And the following "posts" are in the database: + | id | title | slug | + | bWBjpkTKZp | 101 Essays that will change the way you think | 101-essays | + And I am logged in as "narrator" + + Scenario Outline: Link with healable information is valid and gets auto-completed + When I navigate to page "" + Then I am on page "" + Examples: + | url | redirectUrl | reason | + | /profile/thehawk | /profile/MHNqce98y1/thehawk | Identifiable user slug | + | /post/101-essays | /post/bWBjpkTKZp/101-essays | Identifiable post slug | + | /profile/MHNqce98y1 | /profile/MHNqce98y1/thehawk | Identifiable user ID | + | /post/bWBjpkTKZp | /post/bWBjpkTKZp/101-essays | Identifiable post ID | + | /profile/MHNqce98y1/stephen-hawking | /profile/MHNqce98y1/thehawk | Identifiable user ID takes precedence over slug | + | /post/bWBjpkTKZp/the-way-you-think | /post/bWBjpkTKZp/101-essays | Identifiable post ID takes precedence over slug | diff --git a/docs/cypress/e2e/Post.Comment.feature b/docs/cypress/e2e/Post.Comment.feature new file mode 100644 index 000000000..1ec0c602a --- /dev/null +++ b/docs/cypress/e2e/Post.Comment.feature @@ -0,0 +1,49 @@ +Feature: Comments on post + As a user + I want to comment and see comments on contributions of others + To be able to express my thoughts and emotions about these, discuss, and add give further information. + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | peter-pan| peter@pan.com | abcd | id-of-peter-pan| Peter Pan | 0.0.4 | + | narrator | narrator@example.org | 1234 | narrator | Nathan Narrator | 0.0.4 | + And the following "posts" are in the database: + | id | title | slug | authorId | + | bWBjpkTKZp | 101 Essays that will change the way you think | 101-essays | id-of-peter-pan | + And the following "comments" are in the database: + | postId | content | authorId | + | bWBjpkTKZp | @peter-pan reply to me | id-of-peter-pan | + And I am logged in as "narrator" + + Scenario: Comment creation + Given I navigate to page "/post/bWBjpkTKZp/101-essays" + And I comment the following: + """ + Ocelot.social rocks + """ + And I click on "comment button" + Then my comment should be successfully created + And I should see my comment + And the editor should be cleared + + Scenario: View medium length comments + Given I navigate to page "/post/bWBjpkTKZp/101-essays" + And I type in a comment with 305 characters + And I click on "comment button" + Then my comment should be successfully created + And I should see the entirety of my comment + And the editor should be cleared + + Scenario: View long comments + Given I navigate to page "/post/bWBjpkTKZp/101-essays" + And I type in a comment with 1205 characters + And I click on "comment button" + Then my comment should be successfully created + And I should see an abbreviated version of my comment + And the editor should be cleared + + Scenario: Direct reply to Comment + Given I navigate to page "/post/bWBjpkTKZp/101-essays" + And I click on "reply button" + Then it should create a mention in the CommentForm diff --git a/docs/cypress/e2e/Post.Create.feature b/docs/cypress/e2e/Post.Create.feature new file mode 100644 index 000000000..cdb3e1008 --- /dev/null +++ b/docs/cypress/e2e/Post.Create.feature @@ -0,0 +1,24 @@ +Feature: Create a post + As an logged in user + I would like to create a post + To say something to everyone in the community + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | narrator | narrator@example.org | 1234 | narrator | Nathan Narrator | 0.0.4 | + And I am logged in as "narrator" + And I navigate to page "/" + + Scenario: Create a post + When I click on "create post button" + Then I am on page "post/create" + When I choose "My first post" as the title + And I choose the following text as content: + """ + Ocelot.social is a free and open-source social network + for active citizenship. + """ + And I click on "save button" + Then I am on page "/post/.*/my-first-post" + And the post was saved successfully diff --git a/docs/cypress/e2e/Post.Images.feature b/docs/cypress/e2e/Post.Images.feature new file mode 100644 index 000000000..68c223394 --- /dev/null +++ b/docs/cypress/e2e/Post.Images.feature @@ -0,0 +1,66 @@ +Feature: Upload/Delete images on posts + As a user + I would like to be able to add/delete an image to/from my Post + So that I can personalize my posts + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | narrator | narrator@example.org | 1234 | narrator | Nathan Narrator | 0.0.4 | + And the following "posts" are in the database: + | authorId | id | title | content | + | narrator | p1 | Post to be updated | successfully updated | + And I am logged in as "narrator" + And I navigate to page "/" + + Scenario: Create a Post with a Teaser Image + When I click on "create post button" + Then I wait for 750 milliseconds + Then I should be able to "add" a teaser image + And I add all required fields + And I click on "save button" + And I wait for 750 milliseconds + Then I am on page "/post/.*/new-post" + And I wait for 750 milliseconds + And the post was saved successfully with the "new" teaser image + + Scenario: Update a Post to add an image + Given I navigate to page "/post/edit/p1" + Then I wait for 750 milliseconds + And I should be able to "change" a teaser image + And I click on "save button" + Then I see a toaster with "Saved!" + And I wait for 750 milliseconds + And I am on page "/post/.*/post-to-be-updated" + And I wait for 750 milliseconds + Then the post was saved successfully with the "updated" teaser image + + Scenario: Add image, then add a different image + When I click on "create post button" + Then I wait for 750 milliseconds + Then I should be able to "add" a teaser image + And I should be able to "change" a teaser image + And the first image should not be displayed anymore + + Scenario: Add image, then delete it + When I click on "create post button" + Then I wait for 750 milliseconds + Then I should be able to "add" a teaser image + Then I should be able to "remove" a teaser image + And I add all required fields + And I click on "save button" + And I wait for 750 milliseconds + Then I am on page "/post/.*/new-post" + And I wait for 750 milliseconds + And the "new" post was saved successfully without a teaser image + + Scenario: Delete existing image + Given I navigate to page "/post/edit/p1" + Then I wait for 750 milliseconds + And my post has a teaser image + Then I should be able to "remove" a teaser image + And I click on "save button" + And I wait for 750 milliseconds + Then I am on page "/post/.*/post-to-be-updated" + And I wait for 750 milliseconds + And the "updated" post was saved successfully without a teaser image \ No newline at end of file diff --git a/docs/cypress/e2e/Post.feature b/docs/cypress/e2e/Post.feature new file mode 100644 index 000000000..7a572b955 --- /dev/null +++ b/docs/cypress/e2e/Post.feature @@ -0,0 +1,23 @@ +Feature: See a post + As an logged in user + I would like to see a post + And to see the whole content of it + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | peter-pan| peter@pan.com | abcd | id-of-peter-pan| Peter Pan | 0.0.4 | + | narrator | narrator@example.org | 1234 | narrator | Nathan Narrator | 0.0.4 | + And the following "posts" are in the database: + | id | title | slug | authorId | content | + | aBcDeFgHiJ | previously created post | previously-created-post | id-of-peter-pan | with some content | + And I am logged in as "narrator" + + Scenario: See a post on the newsfeed + When I navigate to page "/" + Then the post shows up on the newsfeed at position 1 + + Scenario: Navigate to the Post Page + When I navigate to page "/" + And I click on "the first post" + Then I am on page "/post/.*" diff --git a/docs/cypress/e2e/Search.feature.broken b/docs/cypress/e2e/Search.feature.broken new file mode 100644 index 000000000..a770c757c --- /dev/null +++ b/docs/cypress/e2e/Search.feature.broken @@ -0,0 +1,58 @@ +Feature: Search + As a user + I would like to be able to search for specific words + In order to find related content + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | termsAndConditionsAgreedVersion | + | narrator | narrator@example.org | 1234 | narrator | Nathan Narrator | 0.0.4 | + | search-for-me | u1@example.org | 1234 | user-for-search | Search for me | 0.0.4 | + | not-to-be-found | u2@example.org | 1234 | just-an-id | Not to be found | 0.0.4 | + And the following "posts" are in the database: + | id | title | content | + | p1 | 101 Essays that will change the way you think | 101 Essays, of course (PR)! | + | p2 | No content | will be found in this post, I guarantee | + And I am logged in as "narrator" + And I navigate to page "/" + + Scenario: Search for specific words + When I search for "Essays" + And I wait for 3000 milliseconds + Then I should have one item in the select dropdown + Then I should see the following posts in the select dropdown: + | title | + | 101 Essays that will change the way you think | + + Scenario: Press enter opens search page + When I type "PR" and press Enter + Then I am on page "/search/search-results" + And the search parameter equals "?search=PR" + Then I should see the following posts on the search results page: + | title | + | 101 Essays that will change the way you think | + + Scenario: Press escape clears search + When I type "Ess" and press escape + Then the search field should clear + + Scenario: Select entry goes to post + When I search for "Essays" + And I wait for 3000 milliseconds + And I select a post entry + Then I am on page "/post/p1/101-essays-that-will-change-the-way-you-think" + + Scenario: Select dropdown content + When I search for "Essays" + Then I should have one item in the select dropdown + Then I should see posts with the searched-for term in the select dropdown + And I should not see posts without the searched-for term in the select dropdown + + Scenario: Search for users + Given I search for "Search" + Then I should have one item in the select dropdown + And I should see the following users in the select dropdown: + | slug | + | search-for-me | + And I select a user entry + Then I am on page "/profile/user-for-search/search-for-me" \ No newline at end of file diff --git a/docs/cypress/e2e/User.Authentication.feature b/docs/cypress/e2e/User.Authentication.feature new file mode 100644 index 000000000..878ecad4a --- /dev/null +++ b/docs/cypress/e2e/User.Authentication.feature @@ -0,0 +1,27 @@ +Feature: User authentication + As an user + I want to sign in + In order to be able to posts and do other contributions as myself + Furthermore I want to be able to stay logged in and logout again + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 1234 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + + Scenario: Log in + When I navigate to page "/login" + And I fill in my credentials "peterpan@example.org" "1234" + And I click on "submit button" + Then I am logged in with username "Peter Pan" + + Scenario: Refresh and stay logged in + Given I am logged in as "peter-pan" + When I refresh the page + Then I am logged in with username "Peter Pan" + + Scenario: Log out + Given I am logged in as "peter-pan" + When I navigate to page "/" + And I log out + Then I am on page "login" diff --git a/docs/cypress/e2e/User.Block.feature.broken b/docs/cypress/e2e/User.Block.feature.broken new file mode 100644 index 000000000..3d58c3c27 --- /dev/null +++ b/docs/cypress/e2e/User.Block.feature.broken @@ -0,0 +1,69 @@ +Feature: User - block an user + As a user + I'd like to have a button to block another user + To prevent him from seeing and interacting with my contributions + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 123 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + | user@example.org | 123 | harassing-user | Harassing User | harassing-user | 0.0.4 | + And the following "posts" are in the database: + | id | title | slug | authorId | + | bWBjpkTKZp | previously created post | previously-created-post | id-of-peter-pan | + And I am logged in as "peter-pan" + + Scenario: Block a user + When I navigate to page "profile/harassing-user" + And I click on "Block user" from the content menu in the user info box + And I "should" see "Unblock user" from the content menu in the user info box + And I navigate to my "Blocked users" settings page + Then I can see the following table: + | Avatar | Name | + | | Harassing User | + + Scenario: Blocked user cannot interact with my contributions + Given I block the user "Harassing User" + And I am logged in as "harassing-user" + And I navigate to page "/post/previously-created-post" + Then they should see a text explaining why commenting is not possible + And they should not see the comment form + + Scenario: Block a previously followed user + Given I follow the user "Harassing User" + When I navigate to page "/profile/harassing-user" + And I click on "Block user" from the content menu in the user info box + And I get removed from his follower collection + And I "should" see "Unblock user" from the content menu in the user info box + + Scenario: Posts of blocked users are not filtered from search results + Given "harassing-user" wrote a post "You can still see my posts" + And I block the user "Harassing User" + When I search for "see" + And I wait for 3000 milliseconds + Then I should see the following posts in the select dropdown: + | title | + | You can still see my posts | + + Scenario: Blocked users can still see my posts + When I block the user "Harassing User" + And I am logged in as "harassing-user" + And I navigate to page "/" + And I search for "previously created" + And I wait for 3000 milliseconds + Then I should see the following posts in the select dropdown: + | title | + | previously created post | + + Scenario: Blocked users cannot see they are blocked in their list + Given a user has blocked me + And I navigate to page "/" + And I navigate to my "Blocked users" settings page + Then I should see no users in my blocked users list + + Scenario: Blocked users should not see link or button to unblock, only blocking users + Given a user has blocked me + When I navigate to page "/profile/harassing-user" + And I should see the "Follow" button + And I should not see "Unblock user" button + And I "should not" see "Unblock user" from the content menu in the user info box diff --git a/docs/cypress/e2e/User.Mute.feature.broken b/docs/cypress/e2e/User.Mute.feature.broken new file mode 100644 index 000000000..1390063f7 --- /dev/null +++ b/docs/cypress/e2e/User.Mute.feature.broken @@ -0,0 +1,60 @@ +Feature: Mute a User + As a user + I'd like to have a button to mute another user + To prevent him from seeing and interacting with my contributions + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 123 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + | user@example.org | 123 | annoying-user | Annoying User | annoying-user | 0.0.4 | + Given the following "posts" are in the database: + | id | title | content | authorId | + | im-not-muted | Post that should be seen | cause I'm not muted | id-of-peter-pan | + | bWBjpkTKZp | previously created post | previously-created-post | id-of-peter-pan | + And I am logged in as "peter-pan" + + Scenario: Mute a user + Given I navigate to page "/profile/annoying-user" + When I click on "Mute user" from the content menu in the user info box + And I navigate to my "Muted users" settings page + Then I can see the following table: + | Avatar | Name | + | | Annoying User | + + Scenario: Mute a previously followed user + Given I follow the user "Annoying User" + And "annoying-user" wrote a post "Spam Spam Spam" + When I navigate to page "/profile/annoying-user" + And I click on "Mute user" from the content menu in the user info box + Then the list of posts of this user is empty + And I get removed from his follower collection + + Scenario: Posts of muted users are filtered from search results, users are not + Given "annoying-user" wrote a post "Spam Spam Spam" + When I search for "Spam" + And I wait for 3000 milliseconds + Then I should see the following posts in the select dropdown: + | title | + | Spam Spam Spam | + When I mute the user "Annoying User" + And I refresh the page + And I search for "Anno" + And I wait for 3000 milliseconds + Then the search should not contain posts by the annoying user + But the search should contain the annoying user + But I search for "not muted" + And I wait for 3000 milliseconds + Then I should see the following posts in the select dropdown: + | title | + | Post that should be seen | + + Scenario: Muted users can still see my posts + And I mute the user "Annoying User" + And I am logged in as "annoying-user" + And I navigate to page "/" + And I search for "previously created" + And I wait for 3000 milliseconds + Then I should see the following posts in the select dropdown: + | title | + | previously created post | diff --git a/docs/cypress/e2e/User.SettingNotifications.feature b/docs/cypress/e2e/User.SettingNotifications.feature new file mode 100644 index 000000000..7e4301b81 --- /dev/null +++ b/docs/cypress/e2e/User.SettingNotifications.feature @@ -0,0 +1,20 @@ +Feature: User sets donations info settings + As a user + I want to change my notifications settings + In order to manage the notifications + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 123 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + | user@example.org | 123 | user | User | user | 0.0.4 | + And I am logged in as "peter-pan" + + Scenario: The notifications setting "Send e-mail notifications" is set to true by default and can be set to false + # When I navigate to my "Notifications" settings page + When I navigate to page "/settings/notifications" + Then the checkbox with ID "send-email" should "be.checked" + And I click on element with ID "send-email" + And the checkbox with ID "send-email" should "not.be.checked" + Then I click save + And I see a toaster with "Notifications settings saved!" diff --git a/docs/cypress/e2e/UserProfile.Avatar.feature b/docs/cypress/e2e/UserProfile.Avatar.feature new file mode 100644 index 000000000..abb3fea63 --- /dev/null +++ b/docs/cypress/e2e/UserProfile.Avatar.feature @@ -0,0 +1,20 @@ +Feature: User profile - Upload avatar image + As a user + I would like to be able to add an avatar image to my profile + So that I can personalize my profile + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 123 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + | user@example.org | 123 | user | User | user | 0.0.4 | + And I am logged in as "peter-pan" + + Scenario: Change my UserProfile Image + And I navigate to page "/profile/peter-pan" + Then I should be able to change my profile picture + + Scenario: Unable to change another user's avatar + Given I am logged in as "user" + And I navigate to page "/profile/peter-pan" + Then I cannot upload a picture \ No newline at end of file diff --git a/docs/cypress/e2e/UserProfile.ChangePassword.feature b/docs/cypress/e2e/UserProfile.ChangePassword.feature new file mode 100644 index 000000000..a7eec1cce --- /dev/null +++ b/docs/cypress/e2e/UserProfile.ChangePassword.feature @@ -0,0 +1,55 @@ +Feature: User profile - change password + As a user + I want to change my password in my settings + For security, e.g. if I exposed my password by accident + + Login via email and password is a well-known authentication procedure and you + can assure to the server that you are who you claim to be. Either if you + exposed your password by acccident and you want to invalidate the exposed + password or just out of an good habit, you want to change your password. + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | exposed | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + And I am logged in as "peter-pan" + And I navigate to page "/settings" + And I click on "security menu" + + Scenario: Incorrect Old Password + When I fill the password form with: + | Your old password | incorrect | + | Your new password | secure | + | Confirm new password | secure | + And I submit the form + And I see a "failure toaster" message: + """ + Old password is not correct + """ + + Scenario: Incorrect Password Repeat + When I fill the password form with: + | Your old password | exposed | + | Your new password | secure | + | Confirm new password | eruces | + And I cannot submit the form + + Scenario: Change my password + Given I navigate to page "/settings" + And I click on "security menu" + When I fill the password form with: + | Your old password | exposed | + | Your new password | secure | + | Confirm new password | secure | + And I submit the form + And I see a "success toaster" message: + """ + Password successfully changed! + """ + And I log out + Then I fill in my credentials "peterpan@example.org" "exposed" + And I click on "submit button" + And I cannot login anymore + But I fill in my credentials "peterpan@example.org" "secure" + And I click on "submit button" + And I can login successfully diff --git a/docs/cypress/e2e/UserProfile.NameDescriptionLocation.feature b/docs/cypress/e2e/UserProfile.NameDescriptionLocation.feature new file mode 100644 index 000000000..891d98748 --- /dev/null +++ b/docs/cypress/e2e/UserProfile.NameDescriptionLocation.feature @@ -0,0 +1,38 @@ +Feature: User profile - name, description and location + As a user + I would like to change my name, add a description and a location + So others can see my name, get some info about me and my location + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 123 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + And I am logged in as "peter-pan" + And I navigate to page "settings" + + Scenario: Change username + When I save "Hansi" as my new name + Then I can see my new name "Hansi" when I click on my profile picture in the top right + When I refresh the page + Then I can see my new name "Hansi" when I click on my profile picture in the top right + + Scenario Outline: I set my location to "" + When I save "" as my location + And I navigate to page "/profile/peter-pan" + Then they can see "" in the info box below my avatar + Examples: Location + | location | type | + | Paris | City | + | Saxony-Anhalt | Region | + | Germany | Country | + + Scenario: Display a description on profile page + Given I have the following self-description: + """ + Ich lebe fettlos, fleischlos, fischlos dahin, fühle mich aber ganz wohl dabei + """ + When I navigate to page "/profile/peter-pan" + Then they can see the following text in the info box below my avatar: + """ + Ich lebe fettlos, fleischlos, fischlos dahin, fühle mich aber ganz wohl dabei + """ diff --git a/docs/cypress/e2e/UserProfile.SocialMedia.feature b/docs/cypress/e2e/UserProfile.SocialMedia.feature new file mode 100644 index 000000000..04c227661 --- /dev/null +++ b/docs/cypress/e2e/UserProfile.SocialMedia.feature @@ -0,0 +1,41 @@ +Feature: User profile - list social media accounts + As a User + I'd like to enter my social media + So I can show them to other users to get in contact + + Background: + Given the following "users" are in the database: + | email | password | id | name | slug | termsAndConditionsAgreedVersion | + | peterpan@example.org | 123 | id-of-peter-pan | Peter Pan | peter-pan | 0.0.4 | + And I am logged in as "peter-pan" + + Scenario: Adding Social Media + When I navigate to page "/settings/my-social-media" + Then I am on page "/settings/my-social-media" + When I add a social media link + Then I see a toaster with status "success" + And the new social media link shows up on the page + + Scenario: Other users viewing my Social Media + Given I have added the social media link "https://freeradical.zone/peter-pan" + When I navigate to page "/profile/peter-pan" + Then they should be able to see my social media links + + Scenario: Deleting Social Media + When I navigate to page "/settings/my-social-media" + Then I am on page "/settings/my-social-media" + Given I have added the social media link "https://freeradical.zone/peter-pan" + When I delete the social media link "https://freeradical.zone/peter-pan" + Then I see a toaster with status "success" + + Scenario: Editing Social Media + When I navigate to page "/settings/my-social-media" + Then I am on page "/settings/my-social-media" + Given I have added the social media link "https://freeradical.zone/peter-pan" + When I start editing a social media link + Then I can cancel editing + When I start editing a social media link + And I edit and save the link + Then I see a toaster with status "success" + And the new url is displayed + But the old url is not displayed diff --git a/docs/cypress/features.html b/docs/cypress/features.html new file mode 100644 index 000000000..cde511d29 --- /dev/null +++ b/docs/cypress/features.html @@ -0,0 +1,803 @@ + + + + + + + Feature Specification · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  +
                  + + + + + + + + +
                  + +
                  + +
                  + + + + + + + + +
                  +
                  + +
                  +
                  + +
                  + +

                  Network Specification

                  +

                  ocelot.social is free and open-source social network code that connects information to action and promotes positive local and global change in all areas of life.

                  +
                    +
                  • Social: Interact with other people not just by commenting their posts, but by providing Pro & Contra arguments, give a Versus or ask them by integrated Chat or Let's Talk
                  • +
                  • Knowledge: Read articles about interesting topics and find related posts in the More Info tab or by Filtering based on Categories and Tagging or by using the Fulltext Search.
                  • +
                  • Action: Don't just read about how to make the world a better place, but come into Action by following provided suggestions on the Action tab provided by other people or Organisations.
                  • +
                  +

                  Features

                  +

                  The following features will be implemented. This gets done in three steps:

                  +
                    +
                  1. First we will implement a basic feature set and provide a test system to test the basic network functionality.
                  2. +
                  3. In a second step we will make our prototype publicly available with an advanced feature set including the technology and organizational structure to drive a bigger public social network.
                  4. +
                  5. In a third step all the remaining features will be implemented to build the full product.
                  6. +
                  +

                  User Account

                  +

                  Cucumber Features

                  +
                    +
                  • Sign-up
                  • +
                  • Agree to Data Privacy Statement
                  • +
                  • Agree to Terms of Service
                  • +
                  • Login
                  • +
                  • Logoff
                  • +
                  • Change User Name
                  • +
                  • Change Email Address
                  • +
                  • Change Password
                  • +
                  • Delete Account
                  • +
                  • Download User's Content
                  • +
                  • GDPR-Information about stored Content
                  • +
                  • Choosing Interface Language (e.g. German / English / French)
                  • +
                  • Persistent Links
                  • +
                  +

                  User Profile

                  +

                  Cucumber Features

                  +
                    +
                  • Upload and Change Avatar
                  • +
                  • Upload and Change Profile Picture
                  • +
                  • Edit Social Media Accounts
                  • +
                  • Edit Locale information
                  • +
                  • Show and delete Bookmarks (later)
                  • +
                  • Show Posts of a specific User
                  • +
                  • Show Comments of a specific User
                  • +
                  +

                  Dashboard

                  +

                  Clickdummy

                  +
                    +
                  • Show Link to own Profile
                  • +
                  • Show Friends Widget
                  • +
                  • Show Favorites Widget
                  • +
                  • Show Get Friends Widget
                  • +
                  • Show popular Hashtags Widget
                  • +
                  • Show Mini-Statistics Widget (all time)
                  • +
                  • Show Chatrooms Widget
                  • +
                  • Show List of Let's Talk requests with online status of requesting people
                  • +
                  +

                  Posts

                  +

                  Cucumber Features

                  +
                    +
                  • Creating Posts
                  • +
                  • Persistent Links
                  • +
                  • Upload Teaser Picture for Post
                  • +
                  • Upload additional Pictures
                  • +
                  • Editing Title and Content
                  • +
                  • Allow embedded Conten (Videos, Sound, ...)
                  • +
                  • Choosing a Category
                  • +
                  • Adding Tags
                  • +
                  • Choosing Language (e.g. German / English / French)
                  • +
                  • Choosing Visibility (Public / Friends / Private)
                  • +
                  • Shout Button for Posts
                  • +
                  • Bookmark Posts (later)
                  • +
                  • Optionally provide Let's Talk Feature
                  • +
                  • Optionally provide Commenting Feature
                  • +
                  +

                  Comments

                  +
                    +
                  • Creating Comments
                  • +
                  • Deleting Comments
                  • +
                  • Editing Comments
                  • +
                  • Upvote comments of others
                  • +
                  +

                  Notifications

                  +

                  Cucumber features

                  +
                    +
                  • User @-mentionings
                  • +
                  • Notify authors for comments
                  • +
                  • Administrative notifications to all users
                  • +
                  +

                  Contribution List

                  +
                    +
                  • Show Posts by Tiles
                  • +
                  • Show Posts as List
                  • +
                  • Filter by Category (Health and Wellbeing, Global Peace & Non-Violence, ...)
                  • +
                  • Filter by Mood (Funny, Happy, Surprised, Cry, Angry, ...)
                  • +
                  • Filter by Source (Connections, Following, Individuals, Non-Profits, ...)
                  • +
                  • Filter by Posts & Tools (Post, Events, CanDos, ...)
                  • +
                  • Filter by Format Type (Text, Pictures, Video, ...)
                  • +
                  • Extended Filter (Continent, Country, Language, ...)
                  • +
                  • Sort Posts by Date
                  • +
                  • Sort Posts by Shouts
                  • +
                  • Sort Posts by most Comments
                  • +
                  • Sort Posts by Emoji-Count (all Types)
                  • +
                  +

                  Blacklist

                  +

                  Video

                  +
                    +
                  • Blacklist Users
                  • +
                  • Blacklist specific Terms
                  • +
                  • Blacklist Tags
                  • +
                  • Switch on/off Adult Content
                  • +
                  + +

                  Cucumber Features

                  +
                    +
                  • Search for Categories
                  • +
                  • Search for Tags
                  • +
                  • Fulltext Search
                  • +
                  +

                  CanDos

                  +
                    +
                  • Creating CanDos
                  • +
                  • Editing Title and Content
                  • +
                  • Choosing a Category
                  • +
                  • Adding Tags
                  • +
                  • Choosing Language (e.g. German / English / French)
                  • +
                  • Choosing Visibility (Public / Friends / Private)
                  • +
                  • Choosing Difficulty
                  • +
                  • Editing Why - why should you do this
                  • +
                  • Editing Usefulness - what is it good for
                  • +
                  +

                  Versus (interaction on existing Post)

                  +
                    +
                  • Create / edit / delete Versus
                  • +
                  +

                  Jobs

                  +
                    +
                  • Create, edit and delete Jobs by an User
                  • +
                  • Handle Jobs as Part of Projects
                  • +
                  • Handle Jobs done by Organizations
                  • +
                  +

                  Projects

                  +
                    +
                  • Create, edit and delete Projects
                  • +
                  • Edit Title and Description for the Project
                  • +
                  • Set Project Type
                  • +
                  • Set and Edit Timeline for the Project
                  • +
                  • Add Media to the Project
                  • +
                  • Chat about the Project
                  • +
                  +

                  Pro & Contra

                  +
                    +
                  • Create Pro and Con (2-row)
                  • +
                  • Add Arguments on Pro or Con Side
                  • +
                  • Rate up Arguments
                  • +
                  • Add Tags
                  • +
                  • Attach Media
                  • +
                  +

                  Votes

                  +
                    +
                  • Create Votes (Surveys with two or more Choices)
                  • +
                  • Add Title and Description
                  • +
                  • Let Users vote
                  • +
                  • Add Tags
                  • +
                  +

                  Bestlist

                  +
                    +
                  • Create Bestlist
                  • +
                  • Create Votes (Surveys)
                  • +
                  • Add Title and Description
                  • +
                  • Add Tags
                  • +
                  • Let Users vote for Best Item
                  • +
                  • Set Settings (allow Uploads, allow Links, ...)
                  • +
                  +

                  Events

                  +
                    +
                  • Create Events
                  • +
                  • Add Title and Description
                  • +
                  • Choose Date and Location
                  • +
                  • Add Tags
                  • +
                  +

                  More Info

                  +

                  Shows automatically related information for existing post.

                  +
                    +
                  • Show related Posts
                  • +
                  • Show Pros and Cons
                  • +
                  • Show Bestlist
                  • +
                  • Show Votes
                  • +
                  • Link to corresponding Chatroom
                  • +
                  +

                  Take Action

                  +

                  Shows automatically related actions for existing post.

                  +
                    +
                  • Show related Organisations
                  • +
                  • Show related CanDos
                  • +
                  • Show related Projects
                  • +
                  • Show related Jobs
                  • +
                  • Show related Events
                  • +
                  • Show Map
                  • +
                  +

                  Badges System

                  +
                    +
                  • Importing Badge Information (CSV)
                  • +
                  • Showing Badges
                  • +
                  • Badge Administration by Admins
                  • +
                  • Choosing Badges to display by User
                  • +
                  +

                  Chat

                  +
                    +
                  • Basic 1:1 Chat functionality
                  • +
                  +

                  Let's Talk

                  +
                    +
                  • Request Let's talk with Author of Post
                  • +
                  • Requestor can request private or public Let's Talk
                  • +
                  • Requestor can choose the Chat format (Video, Audio, Text)
                  • +
                  • Interact with interested People 1:1
                  • +
                  • Approve request from Requestor
                  • +
                  +

                  Organizations

                  +
                    +
                  • Propose Organizations by users
                  • +
                  • Set Name and Details
                  • +
                  • Set Homepage
                  • +
                  • Set Region
                  • +
                  • Set Topic
                  • +
                  • Commit organizations by HC-Org-Team
                  • +
                  • Panel for Organisation Handling by themselfes
                  • +
                  • Choose/Mark Users as authorized to manage an Organization
                  • +
                  +

                  Moderation

                  +

                  Cucumber Features

                  +
                    +
                  • Report Button for users for doubtful Content
                  • +
                  • Moderator Panel
                  • +
                  • List of reported Content (later replaced by User-Moderation)
                  • +
                  • Mark verified Users as Moderators
                  • +
                  • Show Posts to be moderated highlighted to User-Moderators
                  • +
                  • Statistics about kinds of reported Content by Time
                  • +
                  • Statistics about Decisions in Moderation
                  • +
                  +

                  Administration

                  +

                  Cucumber Features

                  +
                    +
                  • Provide Admin-Interface to send Users Invite Code
                  • +
                  • Static Pages for Data Privacy Statement ...
                  • +
                  • Create, edit and delete Announcements
                  • +
                  • Pin a post to inform users
                  • +
                  +

                  Invitation

                  +
                    +
                  • Allow Users to invite others by Email
                  • +
                  • Allow Users to register with Invite Code
                  • +
                  • Double-opt-in by Email
                  • +
                  +

                  Internationalization

                  +

                  Cucumber Features

                  +
                    +
                  • Frontend UI
                  • +
                  • Backend Error Messages
                  • +
                  +

                  Federation

                  +
                    +
                  • Provide Server-Server ActivityPub-API
                  • +
                  • Provide User-Server Activitypub-API
                  • +
                  • Receiving public addressed Article and Note Objects
                  • +
                  • Receiving Like and Follow Activities
                  • +
                  • Receiving Undo and Delete Activities for Articles and Notes
                  • +
                  • Serving Webfinger records and Actor Objects
                  • +
                  • Serving Followers, Following and Outbox collections
                  • +
                  + + +
                  + +
                  +
                  +
                  + +

                  results matching ""

                  +
                    + +
                    +
                    + +

                    No results matching ""

                    + +
                    +
                    +
                    + +
                    +
                    + +
                    + + + + + + + + + + + + + + +
                    + + +
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/cypress/fixtures/example.json b/docs/cypress/fixtures/example.json new file mode 100644 index 000000000..da18d9352 --- /dev/null +++ b/docs/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/docs/cypress/fixtures/humanconnection.png b/docs/cypress/fixtures/humanconnection.png new file mode 100644 index 000000000..f0576413f Binary files /dev/null and b/docs/cypress/fixtures/humanconnection.png differ diff --git a/docs/cypress/fixtures/onourjourney.png b/docs/cypress/fixtures/onourjourney.png new file mode 100644 index 000000000..8e606fabd Binary files /dev/null and b/docs/cypress/fixtures/onourjourney.png differ diff --git a/docs/cypress/fixtures/users.json b/docs/cypress/fixtures/users.json new file mode 100644 index 000000000..339866774 --- /dev/null +++ b/docs/cypress/fixtures/users.json @@ -0,0 +1,17 @@ +{ + "admin": { + "email": "admin@example.org", + "password": "1234", + "name": "Peter Lustig" + }, + "moderator": { + "email": "moderator@example.org", + "password": "1234", + "name": "Bob der Bausmeister" + }, + "user": { + "email": "user@example.org", + "password": "1234", + "name": "Jenny Rostock" + } +} diff --git a/docs/cypress/index.html b/docs/cypress/index.html new file mode 100644 index 000000000..e8aada88d --- /dev/null +++ b/docs/cypress/index.html @@ -0,0 +1,572 @@ + + + + + + + End-to-end tests · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    +
                    + + + + + + + + +
                    + +
                    + +
                    + + + + + + + + +
                    +
                    + +
                    +
                    + +
                    + +

                    End-to-End Testing

                    +

                    Setup with docker

                    +

                    Are you running everything through docker? You're so lucky you don't have to +setup anything!

                    +

                    Just:

                    +
                    $ docker-compose up
                    +
                    +

                    Setup without docker

                    +

                    To start the services that are required for cypress testing manually. You basically need the whole setup to run:

                    +
                      +
                    • backend
                    • +
                    • webapp
                    • +
                    • neo4j
                    • +
                    +

                    Navigate to the corresponding folders and start the services.

                    +

                    Install cypress

                    +

                    Even if the required services for testing run via docker, depending on your +setup, the cypress tests themselves run on your host machine. So with our +without docker, you would have to install cypress and its dependencies first:

                    +
                    # in the root folder /
                    +$ yarn install
                    +
                    +

                    Open Interactive Test Console

                    +

                    The interactive cypress test console allows to run tests and have visual feedback on that. The interactive cypress environment also helps at debugging the tests, you can even time travel between individual steps and see the exact state of the app.

                    +

                    To use this feature run:

                    +
                    $ yarn cypress:open
                    +
                    +

                    Interactive Cypress Environment

                    +

                    Run cypress

                    +

                    To run cypress without the user interface:

                    +
                    $ yarn cypress:run
                    +
                    +

                    This is used to run cypress in CI or in console

                    +

                    Console output after running cypress test

                    +

                    Write some Tests

                    +

                    Check out the Cypress documentation for further information on how to write tests: +Write-a-simple-test

                    + + +
                    + +
                    +
                    +
                    + +

                    results matching ""

                    +
                      + +
                      +
                      + +

                      No results matching ""

                      + +
                      +
                      +
                      + +
                      +
                      + +
                      + + + + + + + + + + + + + + +
                      + + +
                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/cypress/parallel-features.sh b/docs/cypress/parallel-features.sh new file mode 100644 index 000000000..24f5bfa9f --- /dev/null +++ b/docs/cypress/parallel-features.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Functions +function join_by { local IFS="$1"; shift; echo "$*"; } + +# Arguments: +CUR_JOB=$(expr $1 - 1) +MAX_JOBS=$2 + +# Features +FEATURE_LIST=( $(find cypress/e2e/ -maxdepth 1 -name "*.feature") ) + +# Calculation +MAX_FEATURES=$(find cypress/e2e/ -maxdepth 1 -name "*.feature" -print | wc -l) +# adds overhead features to the first jobs +if [[ $CUR_JOB -lt $(expr ${MAX_FEATURES} % ${MAX_JOBS}) ]] +then + FEATURES_PER_JOB=$(expr ${MAX_FEATURES} / ${MAX_JOBS} + 1) + FEATURES_SKIP=$(expr $(expr ${MAX_FEATURES} / ${MAX_JOBS} + 1) \* ${CUR_JOB}) +else + FEATURES_PER_JOB=$(expr ${MAX_FEATURES} / ${MAX_JOBS}) + FEATURES_SKIP=$(expr $(expr ${MAX_FEATURES} / ${MAX_JOBS} + 1) \* $(expr ${MAX_FEATURES} % ${MAX_JOBS}) + $(expr $(expr ${MAX_FEATURES} / ${MAX_JOBS}) \* $(expr ${CUR_JOB} - ${MAX_FEATURES} % ${MAX_JOBS}))) +fi + +# Comma separated list +echo $(join_by , ${FEATURE_LIST[@]:${FEATURES_SKIP}:${FEATURES_PER_JOB}}) \ No newline at end of file diff --git a/docs/cypress/support/commands.js b/docs/cypress/support/commands.js new file mode 100644 index 000000000..92e8bf1f7 --- /dev/null +++ b/docs/cypress/support/commands.js @@ -0,0 +1,68 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) + +/* globals Cypress cy */ +import { GraphQLClient, request } from 'graphql-request' +import CONFIG from '../../backend/build/src/config' + +const authenticatedHeaders = (variables) => { + const mutation = ` + mutation($email: String!, $password: String!) { + login(email: $email, password: $password) + } + ` + return new Cypress.Promise((resolve, reject) => { + request(CONFIG.GRAPHQL_URI, mutation, variables).then((response) => { + resolve({ authorization: `Bearer ${response.login}` }) + }) + }) +} + +Cypress.Commands.add("logout", () => { + cy.visit(`/logout`); + cy.location("pathname").should("contain", "/login"); // we're out +}); + +Cypress.Commands.add( + 'authenticateAs', + ({email, password}) => { + return new Cypress.Promise((resolve, reject) => { + authenticatedHeaders({ email, password }).then((headers) => { + resolve(new GraphQLClient(CONFIG.GRAPHQL_URI, { headers })) + }) + }) + }) + +Cypress.Commands.add( + 'mutate', + { prevSubject: true }, + (graphQLClient, mutation, variables, response) => { + return new Cypress.Promise(async (resolve, reject) => { + graphQLClient.request(mutation, variables).then(() => resolve(graphQLClient)) + + }) + }) + +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This is will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/docs/cypress/support/e2e.js b/docs/cypress/support/e2e.js new file mode 100644 index 000000000..453c8476f --- /dev/null +++ b/docs/cypress/support/e2e.js @@ -0,0 +1,33 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: + +import './commands' +import './factories' + +// intermittent failing tests +// import 'cypress-plugin-retries' + +// Alternatively you can use CommonJS syntax: +// require('./commands') +import { WebSocket } from 'mock-socket' +before(() => { + cy.visit('/', { + onBeforeLoad(win) { + cy.stub(win, "WebSocket", url => new WebSocket(url)) + } + }) +}) diff --git a/docs/cypress/support/factories.js b/docs/cypress/support/factories.js new file mode 100644 index 000000000..a901d867f --- /dev/null +++ b/docs/cypress/support/factories.js @@ -0,0 +1,38 @@ +import Factory from '../../backend/build/src/db/factories' +import { getNeode } from '../../backend/build/src/db/neo4j' + +const neodeInstance = getNeode() + +beforeEach(() => cy.then(() => neodeInstance.writeCypher('MATCH (everything) DETACH DELETE everything;'))) + +Cypress.Commands.add('neode', () => { + return neodeInstance +}) + +Cypress.Commands.add( + 'firstOf', + { prevSubject: true }, + (neode, model, properties) => { + return neode.first(model, properties) + } +) +Cypress.Commands.add( + 'relateTo', + { prevSubject: true }, + (node, otherNode, relationship) => { + return node.relateTo(otherNode, relationship) + } +) + +Cypress.Commands.add('factory', () => Factory) + +Cypress.Commands.add( + 'build', + { prevSubject: true }, + (factory, name, atrributes, options) => { + return new Cypress.Promise((resolve, reject) => { + return factory.build(name, atrributes, options).then(() => resolve(factory)) + }) + } +) + diff --git a/docs/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js b/docs/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js new file mode 100644 index 000000000..454aea44b --- /dev/null +++ b/docs/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("the donation info contains goal {string} and progress {string}", (goal, progress) => { + cy.get('.top-info-bar') + .should('contain', goal) + cy.get('.top-info-bar') + .should('contain', progress) +}); diff --git a/docs/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_is_{string}.js b/docs/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_is_{string}.js new file mode 100644 index 000000000..da231f23a --- /dev/null +++ b/docs/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_is_{string}.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the donation info is {string}", (visibility) => { + cy.get('.top-info-bar') + .should(visibility === 'visible' ? 'exist' : 'not.exist') +}) diff --git a/docs/cypress/support/step_definitions/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js b/docs/cypress/support/step_definitions/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js new file mode 100644 index 000000000..2b8d00dc9 --- /dev/null +++ b/docs/cypress/support/step_definitions/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js @@ -0,0 +1,7 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I open the content menu of post {string}", (title) => { + cy.contains('.post-teaser', title) + .find('.content-menu .base-button') + .click() +}) diff --git a/docs/cypress/support/step_definitions/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js b/docs/cypress/support/step_definitions/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js new file mode 100644 index 000000000..3e9f43bc3 --- /dev/null +++ b/docs/cypress/support/step_definitions/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js @@ -0,0 +1,9 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the post with title {string} has a ribbon for pinned posts", (title) => { + cy.get(".post-teaser").contains(title) + .parent() + .parent() + .find(".ribbon.--pinned") + .should("contain", "Announcement") +}) diff --git a/docs/cypress/support/step_definitions/Admin.PinPost/there_is_no_button_to_pin_a_post.js b/docs/cypress/support/step_definitions/Admin.PinPost/there_is_no_button_to_pin_a_post.js new file mode 100644 index 000000000..70535b920 --- /dev/null +++ b/docs/cypress/support/step_definitions/Admin.PinPost/there_is_no_button_to_pin_a_post.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("there is no button to pin a post", () => { + cy.get("a.ds-menu-item-link") + .should('contain', "Report Post") // sanity check + .should('not.contain', "Pin post") +}) diff --git a/docs/cypress/support/step_definitions/Internationalization/I_see_a_button_with_the_label_{string}.js b/docs/cypress/support/step_definitions/Internationalization/I_see_a_button_with_the_label_{string}.js new file mode 100644 index 000000000..73a4a5e50 --- /dev/null +++ b/docs/cypress/support/step_definitions/Internationalization/I_see_a_button_with_the_label_{string}.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I see a button with the label {string}", label => { + cy.contains("button", label); +}); diff --git a/docs/cypress/support/step_definitions/Internationalization/I_select_{string}_in_the_language_menu.js b/docs/cypress/support/step_definitions/Internationalization/I_select_{string}_in_the_language_menu.js new file mode 100644 index 000000000..ba89fd3f5 --- /dev/null +++ b/docs/cypress/support/step_definitions/Internationalization/I_select_{string}_in_the_language_menu.js @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I select {string} in the language menu", language => { + cy.get(".locale-menu") + .click(); + cy.contains(".locale-menu-popover a", language) + .click(); +}); diff --git a/docs/cypress/support/step_definitions/Internationalization/the_whole_user_interface_appears_in_{string}.js b/docs/cypress/support/step_definitions/Internationalization/the_whole_user_interface_appears_in_{string}.js new file mode 100644 index 000000000..d5a8ac95c --- /dev/null +++ b/docs/cypress/support/step_definitions/Internationalization/the_whole_user_interface_appears_in_{string}.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; +import locales from '../../../../webapp/locales' + +Then("the whole user interface appears in {string}", language => { + const { code } = locales.find((entry) => entry.name === language); + cy.get(`html[lang=${code}]`); + cy.getCookie("locale").should("have.property", "value", code); +}); diff --git a/docs/cypress/support/step_definitions/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js b/docs/cypress/support/step_definitions/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js new file mode 100644 index 000000000..26221ae66 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see only {int} posts on the newsfeed", posts => { + cy.get(".post-teaser") + .should("have.length", posts); +}); + diff --git a/docs/cypress/support/step_definitions/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js b/docs/cypress/support/step_definitions/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js new file mode 100644 index 000000000..538e8a64d --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js @@ -0,0 +1,14 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the page {string} returns a 404 error with a message:", (route, message) => { + cy.request({ + url: route, + failOnStatusCode: false + }) + .its("status") + .should("eq", 404); + cy.visit(route, { + failOnStatusCode: false + }); + cy.get(".error-message").should("contain", message); +}); diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js new file mode 100644 index 000000000..fcb1cb686 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js @@ -0,0 +1,11 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then(`I can't see the moderation menu item`, () => { + cy.get('.avatar-menu-popover') + .find('a[href="/settings"]', 'Settings') + .should('exist') // OK, the dropdown is actually open + + cy.get('.avatar-menu-popover') + .find('a[href="/moderation"]', 'Moderation') + .should('not.exist') +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_can_visit_the_post_page.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_can_visit_the_post_page.js new file mode 100644 index 000000000..ce846c39a --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_can_visit_the_post_page.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I can visit the post page', () => { + cy.contains('Fake news').click() + cy.location('pathname').should('contain', '/post') + .get('.base-card .title').should('contain', 'Fake news') +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js new file mode 100644 index 000000000..8588e156a --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js @@ -0,0 +1,11 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I click on "Report Post" from the content menu of the post', () => { + cy.contains('.base-card', 'The Truth about the Holocaust') + .find('.content-menu .base-button') + .click() + + cy.get('.popover .ds-menu-item-link') + .contains('Report Post') + .click() +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_author.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_author.js new file mode 100644 index 000000000..049eb8e72 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_author.js @@ -0,0 +1,7 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I click on the author', () => { + cy.get('[data-test="avatarUserLink"]') + .click() + .url().should('include', '/profile/') +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js new file mode 100644 index 000000000..0bb1e816f --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js @@ -0,0 +1,7 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; +import 'cypress-network-idle'; + +When("I click on the avatar menu in the top right corner", () => { + cy.get(".avatar-menu").click(); + cy.waitForNetworkIdle(2000); +}); diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_confirm_the_reporting_dialog.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_confirm_the_reporting_dialog.js new file mode 100644 index 000000000..970c61c00 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_confirm_the_reporting_dialog.js @@ -0,0 +1,16 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When(/^I confirm the reporting dialog .*:$/, message => { + cy.contains(message) // wait for element to become visible + cy.get('.ds-modal') + .within(() => { + cy.get('.ds-radio-option-label') + .first() + .click({ + force: true + }) + cy.get('button') + .contains('Report') + .click() + }) +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js new file mode 100644 index 000000000..8989ecf68 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I see all the reported posts including from the user who muted me', () => { + cy.get('table tbody').within(() => { + cy.contains('tr', 'Fake news') + }) +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js new file mode 100644 index 000000000..f5cb71f91 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js @@ -0,0 +1,109 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I see all the reported posts including the one from above', () => { + cy.intercept({ + method: 'POST', + url: '/api', + hostname: 'localhost', + }).as('getReports') + + cy.wait(['@getReports'],{ timeout: 30000 }).then((interception) => { + console.log('Cypress interception:', interception) + cy.wrap(interception.response.statusCode).should('eq', 200) + cy.wrap(interception.request.body) + .should('have.property', 'query', `query ($orderBy: ReportOrdering, $first: Int, $offset: Int, $reviewed: Boolean, $closed: Boolean) { + reports(orderBy: $orderBy, first: $first, offset: $offset, reviewed: $reviewed, closed: $closed) { + id + createdAt + updatedAt + closed + reviewed { + createdAt + updatedAt + disable + moderator { + id + slug + name + __typename + } + __typename + } + resource { + __typename + ... on User { + id + slug + name + disabled + deleted + __typename + } + ... on Comment { + id + contentExcerpt + disabled + deleted + author { + id + slug + name + disabled + deleted + __typename + } + post { + id + slug + title + disabled + deleted + __typename + } + __typename + } + ... on Post { + id + slug + title + disabled + deleted + author { + id + slug + name + disabled + deleted + __typename + } + __typename + } + } + filed { + submitter { + id + slug + name + disabled + deleted + __typename + } + createdAt + reasonCategory + reasonDescription + __typename + } + __typename + } +} +` + ) + cy.wrap(interception.response.body) + .should('have.nested.property', 'data.reports.0.resource.author.id') + .and('equal', 'annoying-user') + }) + + cy.get('table tbody').within(() => { + cy.contains('tr', 'The Truth about the Holocaust') + }) +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/each_list_item_links_to_the_post_page.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/each_list_item_links_to_the_post_page.js new file mode 100644 index 000000000..e174113fc --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/each_list_item_links_to_the_post_page.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('each list item links to the post page', () => { + cy.contains('The Truth about the Holocaust').click(); + cy.location('pathname').should('contain', '/post') +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/somebody_reported_the_following_posts.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/somebody_reported_the_following_posts.js new file mode 100644 index 000000000..38cdbee09 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/somebody_reported_the_following_posts.js @@ -0,0 +1,40 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; +import 'cypress-network-idle'; + +Given('somebody reported the following posts:', table => { + const reportIdRegex = /^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/ + cy.intercept({ + method: 'POST', + url: '/', + hostname: 'localhost', + }).as('postToLocalhost') + + table.hashes().forEach(({ submitterEmail, resourceId, reasonCategory, reasonDescription }) => { + const submitter = { + email: submitterEmail, + password: '1234' + } + cy.factory() + .build('user', {}, submitter) + .authenticateAs(submitter) + .mutate(`mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + fileReport(resourceId: $resourceId, reasonCategory: $reasonCategory, reasonDescription: $reasonDescription) { + reportId + } + }`, { + resourceId, + reasonCategory, + reasonDescription + }) + cy.wait(['@postToLocalhost']).then((interception) => { + cy.wrap(interception.response.statusCode).should('eq', 200) + }) + cy.wait(['@postToLocalhost']).then((interception) => { + cy.wrap(interception.response.statusCode).should('eq', 200) + cy.wrap(interception.response.body) + .should('have.nested.property', 'data.fileReport.reportId') + .and('match', reportIdRegex) + }) + cy.waitForNetworkIdle(2000) + }) +}) diff --git a/docs/cypress/support/step_definitions/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js b/docs/cypress/support/step_definitions/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js new file mode 100644 index 000000000..8d61afd61 --- /dev/null +++ b/docs/cypress/support/step_definitions/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js @@ -0,0 +1,15 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given("there is an annoying user who has muted me", () => { + cy.neode() + .firstOf("User", { + role: 'moderator' + }) + .then(mutedUser => { + cy.neode() + .firstOf("User", { + id: 'user' + }) + .relateTo(mutedUser, "muted"); + }); +}); diff --git a/docs/cypress/support/step_definitions/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js b/docs/cypress/support/step_definitions/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js new file mode 100644 index 000000000..b8e705c82 --- /dev/null +++ b/docs/cypress/support/step_definitions/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I start to write a new post with the title {string} beginning with:", (title, intro) => { + cy.get('input[name="title"]') + .type(title); + cy.get(".ProseMirror") + .type(intro); +}); diff --git a/docs/cypress/support/step_definitions/Notification.Mention/mention_{string}_in_the_text.js b/docs/cypress/support/step_definitions/Notification.Mention/mention_{string}_in_the_text.js new file mode 100644 index 000000000..e1bd19da0 --- /dev/null +++ b/docs/cypress/support/step_definitions/Notification.Mention/mention_{string}_in_the_text.js @@ -0,0 +1,9 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("mention {string} in the text", mention => { + cy.get(".ProseMirror") + .type(" @"); + cy.get(".suggestion-list__item") + .contains(mention) + .click(); +}); diff --git a/docs/cypress/support/step_definitions/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js b/docs/cypress/support/step_definitions/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js new file mode 100644 index 000000000..0143d1ac5 --- /dev/null +++ b/docs/cypress/support/step_definitions/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js @@ -0,0 +1,10 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("open the notification menu and click on the first item", () => { + cy.get(".notifications-menu") + .invoke('show') + .click(); // "invoke('show')" because of the delay for show the menu + cy.get(".notification .link") + .first() + .click({force: true}); +}); diff --git a/docs/cypress/support/step_definitions/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js b/docs/cypress/support/step_definitions/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js new file mode 100644 index 000000000..ae1644cef --- /dev/null +++ b/docs/cypress/support/step_definitions/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("see {int} unread notifications in the top menu", count => { + cy.get(".notifications-menu") + .should("contain", count); +}); diff --git a/docs/cypress/support/step_definitions/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js b/docs/cypress/support/step_definitions/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js new file mode 100644 index 000000000..a7204978e --- /dev/null +++ b/docs/cypress/support/step_definitions/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the notification menu button links to the all notifications page", () => { + cy.get(".notifications-menu") + .click(); + cy.location("pathname") + .should("contain", "/notifications"); +}); diff --git a/docs/cypress/support/step_definitions/Notification.Mention/the_unread_counter_is_removed.js b/docs/cypress/support/step_definitions/Notification.Mention/the_unread_counter_is_removed.js new file mode 100644 index 000000000..6c7ff96f0 --- /dev/null +++ b/docs/cypress/support/step_definitions/Notification.Mention/the_unread_counter_is_removed.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the unread counter is removed", () => { + cy.get('.notifications-menu .counter-icon') + .should('not.exist'); +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/I_comment_the_following.js b/docs/cypress/support/step_definitions/Post.Comment/I_comment_the_following.js new file mode 100644 index 000000000..5a64ded50 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/I_comment_the_following.js @@ -0,0 +1,7 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I comment the following:", async text => { + const comment = text.replace("\n", " ") + cy.task('pushValue', { name: 'lastComment', value: comment }) + cy.get(".editor .ProseMirror").type(comment); +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js b/docs/cypress/support/step_definitions/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js new file mode 100644 index 000000000..67dc9bef8 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see an abbreviated version of my comment", () => { + cy.get("article.comment-card") + .should("contain", "show more") +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/I_should_see_my_comment.js b/docs/cypress/support/step_definitions/Post.Comment/I_should_see_my_comment.js new file mode 100644 index 000000000..7b30ee82d --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/I_should_see_my_comment.js @@ -0,0 +1,13 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see my comment", () => { + cy.get("article.comment-card p") + .should("contain", "Ocelot.social rocks") + .get(".user-teaser span.slug") + .should("contain", "@peter-pan") // specific enough + .get(".profile-avatar img") + .should("have.attr", "src") + .and("contain", 'https://') // some url + .get(".user-teaser > .info > .text") + .should("contain", "today at"); +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/I_should_see_the_entirety_of_my_comment.js b/docs/cypress/support/step_definitions/Post.Comment/I_should_see_the_entirety_of_my_comment.js new file mode 100644 index 000000000..9ea48fa05 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/I_should_see_the_entirety_of_my_comment.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see the entirety of my comment", () => { + cy.get("article.comment-card") + .should("not.contain", "show more") +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/I_type_in_a_comment_with_{int}_characters.js b/docs/cypress/support/step_definitions/Post.Comment/I_type_in_a_comment_with_{int}_characters.js new file mode 100644 index 000000000..ef39bdbf4 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/I_type_in_a_comment_with_{int}_characters.js @@ -0,0 +1,9 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I type in a comment with {int} characters", size => { + var c=""; + for (var i = 0; i < size; i++) { + c += "c" + } + cy.get(".editor .ProseMirror").type(c); +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js b/docs/cypress/support/step_definitions/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js new file mode 100644 index 000000000..0e52e0f7a --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("it should create a mention in the CommentForm", () => { + cy.get(".ProseMirror a") + .should('have.class', 'mention') + .should('contain', '@peter-pan') +}) diff --git a/docs/cypress/support/step_definitions/Post.Comment/my_comment_should_be_successfully_created.js b/docs/cypress/support/step_definitions/Post.Comment/my_comment_should_be_successfully_created.js new file mode 100644 index 000000000..acb94f216 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/my_comment_should_be_successfully_created.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("my comment should be successfully created", () => { + cy.get(".iziToast-message").contains("Comment submitted!"); +}); diff --git a/docs/cypress/support/step_definitions/Post.Comment/the_editor_should_be_cleared.js b/docs/cypress/support/step_definitions/Post.Comment/the_editor_should_be_cleared.js new file mode 100644 index 000000000..f6e47313a --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Comment/the_editor_should_be_cleared.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the editor should be cleared", () => { + cy.get(".ProseMirror p").should("have.class", "is-empty"); +}); diff --git a/docs/cypress/support/step_definitions/Post.Create/I_choose_{string}_as_the_title.js b/docs/cypress/support/step_definitions/Post.Create/I_choose_{string}_as_the_title.js new file mode 100644 index 000000000..a5a292a0c --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Create/I_choose_{string}_as_the_title.js @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I choose {string} as the title", async title => { + const lastPost = {} + lastPost.title = title.replace("\n", " "); + cy.task('pushValue', { name: 'lastPost', value: lastPost }) + cy.get('input[name="title"]').type(lastPost.title); +}); diff --git a/docs/cypress/support/step_definitions/Post.Create/the_post_was_saved_successfully.js b/docs/cypress/support/step_definitions/Post.Create/the_post_was_saved_successfully.js new file mode 100644 index 000000000..987e477d4 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Create/the_post_was_saved_successfully.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the post was saved successfully", async () => { + cy.task('getValue', 'lastPost').then(lastPost => { + cy.get(".base-card > .title").should("contain", lastPost.title); + cy.get(".content").should("contain", lastPost.content); + }) +}); diff --git a/docs/cypress/support/step_definitions/Post.Images/I_add_all_required_fields.js b/docs/cypress/support/step_definitions/Post.Images/I_add_all_required_fields.js new file mode 100644 index 000000000..ce2e88a83 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Images/I_add_all_required_fields.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I add all required fields", () => { + cy.get('input[name="title"]') + .type('new post') + .get(".editor .ProseMirror") + .type('new post content') + }) diff --git a/docs/cypress/support/step_definitions/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js b/docs/cypress/support/step_definitions/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js new file mode 100644 index 000000000..478851f92 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js @@ -0,0 +1,29 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should be able to {string} a teaser image", condition => { + let postTeaserImage = "" + + switch(condition){ + case "change": + postTeaserImage = "humanconnection.png" + cy.get(".delete-image-button") + .click() + cy.get("#postdropzone").selectFile( + { contents: `cypress/fixtures/${postTeaserImage}`, fileName: postTeaserImage, mimeType: "image/png" }, + { action: "drag-drop", force: true } + ).wait(750); + break; + case "add": + postTeaserImage = "onourjourney.png" + cy.get("#postdropzone").selectFile( + { contents: `cypress/fixtures/${postTeaserImage}`, fileName: postTeaserImage, mimeType: "image/png" }, + { action: "drag-drop", force: true } + ).wait(750); + break; + case "remove": + cy.get(".delete-image-button") + .click() + break; + } + +}) diff --git a/docs/cypress/support/step_definitions/Post.Images/my_post_has_a_teaser_image.js b/docs/cypress/support/step_definitions/Post.Images/my_post_has_a_teaser_image.js new file mode 100644 index 000000000..b9ce4b3c7 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Images/my_post_has_a_teaser_image.js @@ -0,0 +1,7 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('my post has a teaser image', () => { + cy.get('.contribution-form .image') + .should('exist') + .and('have.attr', 'src') +}) diff --git a/docs/cypress/support/step_definitions/Post.Images/the_first_image_should_not_be_displayed_anymore.js b/docs/cypress/support/step_definitions/Post.Images/the_first_image_should_not_be_displayed_anymore.js new file mode 100644 index 000000000..6388f4458 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Images/the_first_image_should_not_be_displayed_anymore.js @@ -0,0 +1,9 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the first image should not be displayed anymore", () => { + cy.get(".hero-image") + .children() + .get('.hero-image > .image') + .should('have.length', 1) + .and('have.attr', 'src') +}) diff --git a/docs/cypress/support/step_definitions/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js b/docs/cypress/support/step_definitions/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js new file mode 100644 index 000000000..c0571068e --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js @@ -0,0 +1,11 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the post was saved successfully with the {string} teaser image", condition => { + cy.get(".base-card > .title") + .should("contain", condition === 'updated' ? 'to be updated' : 'new post') + .get(".content") + .should("contain", condition === 'updated' ? 'successfully updated' : 'new post content') + .get('.post-page img') + .should("have.attr", "src") + .and("contains", condition === 'updated' ? 'humanconnection' : 'onourjourney') +}) diff --git a/docs/cypress/support/step_definitions/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js b/docs/cypress/support/step_definitions/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js new file mode 100644 index 000000000..40245df2b --- /dev/null +++ b/docs/cypress/support/step_definitions/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js @@ -0,0 +1,12 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('the {string} post was saved successfully without a teaser image', condition => { + cy.get(".base-card > .title") + .should("contain", condition === 'updated' ? 'to be updated' : 'new post') + .get(".content") + .should("contain", condition === 'updated' ? 'successfully updated' : 'new post content') + .get('.post-page') + .should('exist') + .get('.hero-image > .image') + .should('not.exist') +}) diff --git a/docs/cypress/support/step_definitions/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js b/docs/cypress/support/step_definitions/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js new file mode 100644 index 000000000..f10896a33 --- /dev/null +++ b/docs/cypress/support/step_definitions/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the post shows up on the newsfeed at position {int}", index => { + const selector = `.post-teaser:nth-child(${index}) > .base-card`; + cy.get(selector).should("contain", 'previously created post'); + cy.get(selector).should("contain", 'with some content'); + +}); diff --git a/docs/cypress/support/step_definitions/Search/I_select_a_post_entry.js b/docs/cypress/support/step_definitions/Search/I_select_a_post_entry.js new file mode 100644 index 000000000..26e673499 --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_select_a_post_entry.js @@ -0,0 +1,7 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I select a post entry", () => { + cy.get(".searchable-input .search-post") + .first() + .trigger("click"); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_select_a_user_entry.js b/docs/cypress/support/step_definitions/Search/I_select_a_user_entry.js new file mode 100644 index 000000000..3d186ffd8 --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_select_a_user_entry.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I select a user entry", () => { + cy.get(".searchable-input .user-teaser") + .first() + .trigger("click"); +}) diff --git a/docs/cypress/support/step_definitions/Search/I_should_have_one_item_in_the_select_dropdown.js b/docs/cypress/support/step_definitions/Search/I_should_have_one_item_in_the_select_dropdown.js new file mode 100644 index 000000000..148bb8195 --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_should_have_one_item_in_the_select_dropdown.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should have one item in the select dropdown", () => { + cy.get(".searchable-input .ds-select-dropdown").should($li => { + expect($li).to.have.length(1); + }); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js b/docs/cypress/support/step_definitions/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js new file mode 100644 index 000000000..d2a2bc1df --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should not see posts without the searched-for term in the select dropdown", () => { + cy.get(".ds-select-dropdown") + .should("not.contain","No searched for content"); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js b/docs/cypress/support/step_definitions/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js new file mode 100644 index 000000000..41c132dea --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see posts with the searched-for term in the select dropdown", () => { + cy.get(".ds-select-dropdown") + .should("contain","101 Essays that will change the way you think"); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_should_see_the_following_posts_on_the_search_results_page.js b/docs/cypress/support/step_definitions/Search/I_should_see_the_following_posts_on_the_search_results_page.js new file mode 100644 index 000000000..3e5da72f7 --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_should_see_the_following_posts_on_the_search_results_page.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see the following posts on the search results page:", table => { + table.hashes().forEach(({ title }) => { + cy.get(".post-teaser") + .should("contain",title) + }); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_should_see_the_following_users_in_the_select_dropdown.js b/docs/cypress/support/step_definitions/Search/I_should_see_the_following_users_in_the_select_dropdown.js new file mode 100644 index 000000000..830e19a8d --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_should_see_the_following_users_in_the_select_dropdown.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see the following users in the select dropdown:", table => { + cy.get(".search-heading").should("contain", "Users"); + table.hashes().forEach(({ slug }) => { + cy.get(".ds-select-dropdown").should("contain", slug); + }); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_type_{string}_and_press_Enter.js b/docs/cypress/support/step_definitions/Search/I_type_{string}_and_press_Enter.js new file mode 100644 index 000000000..796820ba0 --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_type_{string}_and_press_Enter.js @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I type {string} and press Enter", value => { + cy.get(".searchable-input .ds-select input") + .focus() + .type(value) + .type("{enter}", { force: true }); +}); diff --git a/docs/cypress/support/step_definitions/Search/I_type_{string}_and_press_escape.js b/docs/cypress/support/step_definitions/Search/I_type_{string}_and_press_escape.js new file mode 100644 index 000000000..3e2e67be8 --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/I_type_{string}_and_press_escape.js @@ -0,0 +1,8 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I type {string} and press escape", value => { + cy.get(".searchable-input .ds-select input") + .focus() + .type(value) + .type("{esc}"); +}); diff --git a/docs/cypress/support/step_definitions/Search/the_search_field_should_clear.js b/docs/cypress/support/step_definitions/Search/the_search_field_should_clear.js new file mode 100644 index 000000000..10f73959f --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/the_search_field_should_clear.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the search field should clear", () => { + cy.get(".searchable-input .ds-select input") + .should("have.text", ""); +}); diff --git a/docs/cypress/support/step_definitions/Search/the_search_parameter_equals_{string}.js b/docs/cypress/support/step_definitions/Search/the_search_parameter_equals_{string}.js new file mode 100644 index 000000000..0f433cf1f --- /dev/null +++ b/docs/cypress/support/step_definitions/Search/the_search_parameter_equals_{string}.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the search parameter equals {string}", search => { + cy.location("search") + .should("eq", search); +}); diff --git a/docs/cypress/support/step_definitions/User.Authentication/I_am_logged_in_with_username_{string}.js b/docs/cypress/support/step_definitions/User.Authentication/I_am_logged_in_with_username_{string}.js new file mode 100644 index 000000000..d4af04ff6 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Authentication/I_am_logged_in_with_username_{string}.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I am logged in with username {string}", name => { + cy.get(".avatar-menu").click(); + cy.get(".avatar-menu-popover").contains(name); + cy.get(".avatar-menu").click(); // Close menu again +}); diff --git a/docs/cypress/support/step_definitions/User.Block/I_block_the_user_{string}.js b/docs/cypress/support/step_definitions/User.Block/I_block_the_user_{string}.js new file mode 100644 index 000000000..be82f00d9 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/I_block_the_user_{string}.js @@ -0,0 +1,11 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I block the user {string}", name => { + cy.neode() + .firstOf("User", { name }) + .then(blockedUser => { + cy.neode() + .firstOf("User", {id: "id-of-peter-pan"}) + .relateTo(blockedUser, "blocked"); + }); +}); diff --git a/docs/cypress/support/step_definitions/User.Block/I_should_not_see_{string}_button.js b/docs/cypress/support/step_definitions/User.Block/I_should_not_see_{string}_button.js new file mode 100644 index 000000000..791a5aaaf --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/I_should_not_see_{string}_button.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I should not see {string} button', button => { + cy.get('.base-card .action-buttons') + .should('have.length', 1) +}) diff --git a/docs/cypress/support/step_definitions/User.Block/I_should_see_no_users_in_my_blocked_users_list.js b/docs/cypress/support/step_definitions/User.Block/I_should_see_no_users_in_my_blocked_users_list.js new file mode 100644 index 000000000..3e4813fbc --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/I_should_see_no_users_in_my_blocked_users_list.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see no users in my blocked users list", () => { + cy.get('.ds-placeholder') + .should('contain', "So far, you have not blocked anybody.") +}) diff --git a/docs/cypress/support/step_definitions/User.Block/I_should_see_the_{string}_button.js b/docs/cypress/support/step_definitions/User.Block/I_should_see_the_{string}_button.js new file mode 100644 index 000000000..7e6b7eacb --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/I_should_see_the_{string}_button.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I should see the {string} button', button => { + cy.get('.base-card .action-buttons .base-button') + .should('contain', button) +}) diff --git a/docs/cypress/support/step_definitions/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js b/docs/cypress/support/step_definitions/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js new file mode 100644 index 000000000..bcfd9bd7a --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I {string} see {string} from the content menu in the user info box", (condition, link) => { + cy.get(".user-content-menu .base-button").click() + cy.get(".popover .ds-menu-item-link") + .should(condition === 'should' ? 'contain' : 'not.contain', link) +}) diff --git a/docs/cypress/support/step_definitions/User.Block/a_user_has_blocked_me.js b/docs/cypress/support/step_definitions/User.Block/a_user_has_blocked_me.js new file mode 100644 index 000000000..13b247ccf --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/a_user_has_blocked_me.js @@ -0,0 +1,15 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("a user has blocked me", () => { + cy.neode() + .firstOf("User", { + name: "Peter Pan" + }) + .then(blockedUser => { + cy.neode() + .firstOf("User", { + name: 'Harassing User' + }) + .relateTo(blockedUser, "blocked"); + }); +}); diff --git a/docs/cypress/support/step_definitions/User.Block/they_should_not_see_the_comment_form.js b/docs/cypress/support/step_definitions/User.Block/they_should_not_see_the_comment_form.js new file mode 100644 index 000000000..34aa86aaf --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/they_should_not_see_the_comment_form.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("they should not see the comment form", () => { + cy.get(".base-card").children().should('not.have.class', 'comment-form') +}) diff --git a/docs/cypress/support/step_definitions/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js b/docs/cypress/support/step_definitions/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js new file mode 100644 index 000000000..64f0f0fd1 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("they should see a text explaining why commenting is not possible", () => { + cy.get('.ds-placeholder').should('contain', "Commenting is not possible at this time on this post.") +}) diff --git a/docs/cypress/support/step_definitions/User.Mute/I_mute_the_user_{string}.js b/docs/cypress/support/step_definitions/User.Mute/I_mute_the_user_{string}.js new file mode 100644 index 000000000..7b52ca373 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Mute/I_mute_the_user_{string}.js @@ -0,0 +1,13 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I mute the user {string}", name => { + cy.neode() + .firstOf("User", { name }) + .then(mutedUser => { + cy.neode() + .firstOf("User", { + name: "Peter Pan" + }) + .relateTo(mutedUser, "muted"); + }); +}); diff --git a/docs/cypress/support/step_definitions/User.Mute/the_list_of_posts_of_this_user_is_empty.js b/docs/cypress/support/step_definitions/User.Mute/the_list_of_posts_of_this_user_is_empty.js new file mode 100644 index 000000000..66ac3bdb8 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Mute/the_list_of_posts_of_this_user_is_empty.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the list of posts of this user is empty", () => { + cy.get(".base-card").not(".post-link"); + cy.get(".main-container").find(".ds-space.hc-empty"); +}); diff --git a/docs/cypress/support/step_definitions/User.Mute/the_search_should_contain_the_annoying_user.js b/docs/cypress/support/step_definitions/User.Mute/the_search_should_contain_the_annoying_user.js new file mode 100644 index 000000000..7d47c48aa --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Mute/the_search_should_contain_the_annoying_user.js @@ -0,0 +1,13 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the search should contain the annoying user", () => { + cy.get(".searchable-input .ds-select-dropdown") + .should($li => { + expect($li).to.have.length(1); + }) + cy.get(".ds-select-dropdown .user-teaser .slug") + .should("contain", '@annoying-user'); + cy.get(".searchable-input .ds-select input") + .focus() + .type("{esc}"); +}) diff --git a/docs/cypress/support/step_definitions/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js b/docs/cypress/support/step_definitions/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js new file mode 100644 index 000000000..1dad99678 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js @@ -0,0 +1,10 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the search should not contain posts by the annoying user", () => { + cy.get(".searchable-input .ds-select-dropdown").should($li => { + expect($li).to.have.length(1); + }) + cy.get(".ds-select-dropdown") + .should("not.have.class", '.search-post') + .should("not.contain", 'Spam') +}); diff --git a/docs/cypress/support/step_definitions/User.SettingNotifications/I_click_on_element_with_ID_{string}.js b/docs/cypress/support/step_definitions/User.SettingNotifications/I_click_on_element_with_ID_{string}.js new file mode 100644 index 000000000..7bdb20e5d --- /dev/null +++ b/docs/cypress/support/step_definitions/User.SettingNotifications/I_click_on_element_with_ID_{string}.js @@ -0,0 +1,5 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I click on element with ID {string}", (id) => { + cy.get('#' + id).click() +}) diff --git a/docs/cypress/support/step_definitions/User.SettingNotifications/I_click_save.js b/docs/cypress/support/step_definitions/User.SettingNotifications/I_click_save.js new file mode 100644 index 000000000..9412d7912 --- /dev/null +++ b/docs/cypress/support/step_definitions/User.SettingNotifications/I_click_save.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I click save", () => { + cy.get(".save-button").click() +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.Avatar/I_cannot_upload_a_picture.js b/docs/cypress/support/step_definitions/UserProfile.Avatar/I_cannot_upload_a_picture.js new file mode 100644 index 000000000..9e44b55ba --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.Avatar/I_cannot_upload_a_picture.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I cannot upload a picture", () => { + cy.get(".base-card") + .children() + .should("not.have.id", "customdropzone") + .should("have.class", "profile-avatar"); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js b/docs/cypress/support/step_definitions/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js new file mode 100644 index 000000000..b1b2401e2 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js @@ -0,0 +1,15 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should be able to change my profile picture", () => { + const avatarUpload = "onourjourney.png"; + + cy.get("#customdropzone").selectFile( + { contents: `cypress/fixtures/${avatarUpload}`, fileName: avatarUpload, mimeType: "image/png" }, + { action: "drag-drop" } + ); + cy.get(".profile-page-avatar img") + .should("have.attr", "src") + .and("contains", "onourjourney"); + cy.contains(".iziToast-message", "Upload successful") + .should("have.length",1); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_can_login_successfully.js b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_can_login_successfully.js new file mode 100644 index 000000000..1349b5eb9 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_can_login_successfully.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I can login successfully", () => { + // cy.reload(); + cy.get(".iziToast-wrapper") + .should("contain", "You are logged in!"); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_login_anymore.js b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_login_anymore.js new file mode 100644 index 000000000..f6159c79b --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_login_anymore.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I cannot login anymore", password => { + //cy.reload(); + cy.get(".iziToast-wrapper") + .should("contain", "Incorrect email address or password."); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_submit_the_form.js b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_submit_the_form.js new file mode 100644 index 000000000..02a2c7d83 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_submit_the_form.js @@ -0,0 +1,6 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I cannot submit the form", () => { + cy.get("button[type=submit]") + .should('be.disabled'); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_fill_the_password_form_with.js b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_fill_the_password_form_with.js new file mode 100644 index 000000000..af0c6639b --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_fill_the_password_form_with.js @@ -0,0 +1,11 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I fill the password form with:", table => { + table = table.rowsHash(); + cy.get("input[id=oldPassword]") + .type(table["Your old password"]) + .get("input[id=password]") + .type(table["Your new password"]) + .get("input[id=passwordConfirmation]") + .type(table["Confirm new password"]); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_submit_the_form.js b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_submit_the_form.js new file mode 100644 index 000000000..8b17f6de1 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.ChangePassword/I_submit_the_form.js @@ -0,0 +1,5 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I submit the form", () => { + cy.get("form").submit(); +}); diff --git a/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js new file mode 100644 index 000000000..c5dd84bf0 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js @@ -0,0 +1,13 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I can see my new name {string} when I click on my profile picture in the top right', name => { + cy.get(".avatar-menu").then(($menu) => { + if (!$menu.is(':visible')){ + cy.scrollTo("top"); + cy.wait(500); + } + }) + cy.get('.avatar-menu').click() // open + cy.get('.avatar-menu-popover').contains(name) + cy.get('.avatar-menu').click() // close again +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js new file mode 100644 index 000000000..f0f6ba4da --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js @@ -0,0 +1,12 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I have the following self-description:', text => { + cy.get('textarea[id=about]') + .clear() + .type(text) + cy.get('[type=submit]') + .click() + .not('[disabled]') + cy.get('.iziToast-message') + .should('contain', 'Your data was successfully updated') + }) diff --git a/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js new file mode 100644 index 000000000..00d5141f8 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js @@ -0,0 +1,13 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I save {string} as my location', location => { + cy.get('input[id=city]').type(location) + cy.get('.ds-select-option') + .contains(location) + .click() + cy.get('[type=submit]') + .click() + .not('[disabled]') + cy.get('.iziToast-message') + .should('contain', 'Your data was successfully updated') + }) diff --git a/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js new file mode 100644 index 000000000..b94683a5b --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js @@ -0,0 +1,12 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I save {string} as my new name', name => { + cy.get('input[id=name]') + .clear() + .type(name) + cy.get('[type=submit]') + .click() + .not('[disabled]') + cy.get('.iziToast-message') + .should('contain', 'Your data was successfully updated') +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js new file mode 100644 index 000000000..d416c8d10 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js @@ -0,0 +1,5 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('they can see the following text in the info box below my avatar:', text => { + cy.contains(text) +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js new file mode 100644 index 000000000..ea8cf2158 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('they can see {string} in the info box below my avatar', location => { + cy.contains(location) +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_add_a_social_media_link.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_add_a_social_media_link.js new file mode 100644 index 000000000..eab8ba0d6 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_add_a_social_media_link.js @@ -0,0 +1,10 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I add a social media link', () => { + cy.get('[data-test="add-save-button"]') + .click() + .get('#editSocialMedia') + .type('https://freeradical.zone/peter-pan') + .get('[data-test="add-save-button"]') + .click() +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_can_cancel_editing.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_can_cancel_editing.js new file mode 100644 index 000000000..72d83c9a3 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_can_cancel_editing.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I can cancel editing', () => { + cy.get('button#cancel') + .click() + .get('input#editSocialMedia') + .should('have.length', 0) +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_a_social_media_link.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_a_social_media_link.js new file mode 100644 index 000000000..1f0f3e22e --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_a_social_media_link.js @@ -0,0 +1,6 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I delete a social media link', () => { + cy.get(".base-button[title='Delete']") + .click() +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js new file mode 100644 index 000000000..3acba4756 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js @@ -0,0 +1,12 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I delete the social media link {string}', (link) => { + cy.get('[data-test="delete-button"]') + .click() + cy.get('[data-test="confirm-modal"]') + .should("be.visible") + cy.get('[data-test="confirm-button"]') + .click() + cy.get('.ds-list-item-content > a') + .should('not.exist') +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_edit_and_save_the_link.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_edit_and_save_the_link.js new file mode 100644 index 000000000..3cec61688 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_edit_and_save_the_link.js @@ -0,0 +1,9 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I edit and save the link', () => { + cy.get('input#editSocialMedia') + .clear() + .type('https://freeradical.zone/tinkerbell') + .get('[data-test="add-save-button"]') + .click() +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_a_social_media_link.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_a_social_media_link.js new file mode 100644 index 000000000..b1eb698de --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_a_social_media_link.js @@ -0,0 +1,13 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given('I have added a social media link', () => { + cy.visit('/settings/my-social-media') + .get('button') + .contains('Add link') + .click() + .get('#editSocialMedia') + .type('https://freeradical.zone/peter-pan') + .get('button') + .contains('Save') + .click() +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js new file mode 100644 index 000000000..d0daab843 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js @@ -0,0 +1,13 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given('I have added the social media link {string}', (link) => { + cy.visit('/settings/my-social-media') + .get('[data-test="add-save-button"]') + .click() + .get('#editSocialMedia') + .type(link) + .get('[data-test="add-save-button"]') + .click() + cy.get('.ds-list-item-content > a') + .contains(link) +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js new file mode 100644 index 000000000..11ee84084 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js @@ -0,0 +1,6 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I start editing a social media link', () => { + cy.get('[data-test="edit-button"]') + .click() +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js new file mode 100644 index 000000000..fd1bf9350 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('the new social media link shows up on the page', () => { + cy.get('a[href="https://freeradical.zone/peter-pan"]') + .should('have.length', 1) +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_url_is_displayed.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_url_is_displayed.js new file mode 100644 index 000000000..c9c7dd906 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_url_is_displayed.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('the new url is displayed', () => { + cy.get("a[href='https://freeradical.zone/tinkerbell']") + .should('have.length', 1) +}) diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_old_url_is_not_displayed.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_old_url_is_not_displayed.js new file mode 100644 index 000000000..c0941f600 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/the_old_url_is_not_displayed.js @@ -0,0 +1,7 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('the old url is not displayed', () => { + cy.get("a[href='https://freeradical.zone/peter-pan']") + .should('have.length', 0) +}) + diff --git a/docs/cypress/support/step_definitions/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js new file mode 100644 index 000000000..3b1692b59 --- /dev/null +++ b/docs/cypress/support/step_definitions/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('they should be able to see my social media links', () => { + cy.get('[data-test="social-media-list-headline"]') + .contains('Peter Pan') + .get('a[href="https://freeradical.zone/peter-pan"]') + .should('have.length', 1) +}) diff --git a/docs/cypress/support/step_definitions/common/I_am_logged_in_as_{string}.js b/docs/cypress/support/step_definitions/common/I_am_logged_in_as_{string}.js new file mode 100644 index 000000000..1dbaa3d94 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_am_logged_in_as_{string}.js @@ -0,0 +1,18 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; +import encode from '../../../../backend/build/src/jwt/encode' + +Given("I am logged in as {string}", slug => { + cy.neode() + .firstOf("User", { slug }) + .then(user => { + return new Cypress.Promise((resolve, reject) => { + if(!user) { + return reject(`User ${email} not found in database`) + } + return user.toJson().then((user) => resolve(user)) + }) + }) + .then(user => { + cy.setCookie('ocelot-social-token', encode(user)) + }) +}); diff --git a/docs/cypress/support/step_definitions/common/I_am_on_page_{string}.js b/docs/cypress/support/step_definitions/common/I_am_on_page_{string}.js new file mode 100644 index 000000000..44b10c4c4 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_am_on_page_{string}.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I am on page {string}", page => { + cy.location("pathname") + .should("match", new RegExp(page)); +}); diff --git a/docs/cypress/support/step_definitions/common/I_can_see_the_following_table.js b/docs/cypress/support/step_definitions/common/I_can_see_the_following_table.js new file mode 100644 index 000000000..f62e1a99a --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_can_see_the_following_table.js @@ -0,0 +1,16 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then('I can see the following table:', table => { + const headers = table.raw()[0] + headers.forEach((expected, i) => { + cy.get('thead th') + .eq(i) + .should('contain', expected) + }) + const flattened = [].concat.apply([], table.rows()) + flattened.forEach((expected, i) => { + cy.get('tbody td') + .eq(i) + .should('contain', expected) + }) +}) diff --git a/docs/cypress/support/step_definitions/common/I_choose_the_following_text_as_content.js b/docs/cypress/support/step_definitions/common/I_choose_the_following_text_as_content.js new file mode 100644 index 000000000..0cb974004 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_choose_the_following_text_as_content.js @@ -0,0 +1,9 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I choose the following text as content:", async text => { + cy.task('getValue', 'lastPost').then(lastPost => { + lastPost.content = text.replace("\n", " "); + cy.task('pushValue', { name: 'lastPost', value: lastPost }) + cy.get(".editor .ProseMirror").type(lastPost.content); + }) +}); diff --git a/docs/cypress/support/step_definitions/common/I_click_on_{string}.js b/docs/cypress/support/step_definitions/common/I_click_on_{string}.js new file mode 100644 index 000000000..9d51f27f7 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_click_on_{string}.js @@ -0,0 +1,19 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I click on {string}", element => { + const elementSelectors = { + 'submit button': 'button[name=submit]', + 'create post button': '.post-add-button', + 'save button': 'button[type=submit]', + 'the first post': '.post-teaser:first-child', + 'comment button': 'button[type=submit]', + 'reply button': '.reply-button', + 'security menu': 'a[href="/settings/security"]', + 'pin post': '.ds-menu-item:first-child', + 'Moderation': 'a[href="/moderation"]', + } + + cy.get(elementSelectors[element]) + .click() + .wait(750); +}); diff --git a/docs/cypress/support/step_definitions/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js b/docs/cypress/support/step_definitions/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js new file mode 100644 index 000000000..66373037e --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js @@ -0,0 +1,12 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I click on {string} from the content menu in the user info box", + button => { + cy.get(".user-content-menu .base-button").click(); + cy.get(".popover .ds-menu-item-link") + .contains(button) + .click({ + force: true + }); + } +); diff --git a/docs/cypress/support/step_definitions/common/I_click_the_checkbox_show_donations_progress_bar_and_save.js b/docs/cypress/support/step_definitions/common/I_click_the_checkbox_show_donations_progress_bar_and_save.js new file mode 100644 index 000000000..1806af807 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_click_the_checkbox_show_donations_progress_bar_and_save.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I click the checkbox show donations progress bar and save", () => { + cy.get("#showDonations").click() + cy.get(".donations-info-button").click() +}) diff --git a/docs/cypress/support/step_definitions/common/I_fill_in_my_credentials_{string}_{string}.js b/docs/cypress/support/step_definitions/common/I_fill_in_my_credentials_{string}_{string}.js new file mode 100644 index 000000000..3c0b0d02e --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_fill_in_my_credentials_{string}_{string}.js @@ -0,0 +1,12 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I fill in my credentials {string} {string}", (email,password) => { + cy.get("input[name=email]") + .trigger("focus") + .type('{selectall}{backspace}') + .type(email) + .get("input[name=password]") + .trigger("focus") + .type('{selectall}{backspace}') + .type(password); +}); diff --git a/docs/cypress/support/step_definitions/common/I_follow_the_user_{string}.js b/docs/cypress/support/step_definitions/common/I_follow_the_user_{string}.js new file mode 100644 index 000000000..3698daee8 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_follow_the_user_{string}.js @@ -0,0 +1,13 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given("I follow the user {string}", name => { + cy.neode() + .firstOf("User", {name}) + .then(followed => { + cy.neode() + .firstOf("User", { + name: "Peter Pan" + }) + .relateTo(followed, "following"); + }); +}); diff --git a/docs/cypress/support/step_definitions/common/I_get_removed_from_his_follower_collection.js b/docs/cypress/support/step_definitions/common/I_get_removed_from_his_follower_collection.js new file mode 100644 index 000000000..7721efda0 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_get_removed_from_his_follower_collection.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I get removed from his follower collection", () => { + cy.get(".base-card") + .not(".post-link"); + cy.get(".main-container") + .contains(".base-card","is not followed by anyone"); + }); diff --git a/docs/cypress/support/step_definitions/common/I_log_out.js b/docs/cypress/support/step_definitions/common/I_log_out.js new file mode 100644 index 000000000..c97506535 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_log_out.js @@ -0,0 +1,15 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I log out", () => { + cy.get(".avatar-menu").then(($menu) => { + if (!$menu.is(':visible')){ + cy.scrollTo("top"); + cy.wait(500); + } + }) + cy.get(".avatar-menu") + .click(); + cy.get(".avatar-menu-popover") + .find('a[href="/logout"]') + .click(); +}); diff --git a/docs/cypress/support/step_definitions/common/I_navigate_to_my_{string}_settings_page.js b/docs/cypress/support/step_definitions/common/I_navigate_to_my_{string}_settings_page.js new file mode 100644 index 000000000..91a3b58d9 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_navigate_to_my_{string}_settings_page.js @@ -0,0 +1,10 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I navigate to my {string} settings page", settingsPage => { + cy.get(".avatar-menu-trigger").click(); + cy.get(".avatar-menu-popover") + .find("a[href]") + .contains("Settings") + .click(); + cy.contains(".ds-menu-item-link", settingsPage).click(); +}); diff --git a/docs/cypress/support/step_definitions/common/I_navigate_to_page_{string}.js b/docs/cypress/support/step_definitions/common/I_navigate_to_page_{string}.js new file mode 100644 index 000000000..d90cc906c --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_navigate_to_page_{string}.js @@ -0,0 +1,7 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; +import 'cypress-network-idle'; + +Given("I navigate to page {string}", page => { + cy.visit(page); + cy.waitForNetworkIdle(2000) +}); diff --git a/docs/cypress/support/step_definitions/common/I_refresh_the_page.js b/docs/cypress/support/step_definitions/common/I_refresh_the_page.js new file mode 100644 index 000000000..47e493fe4 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_refresh_the_page.js @@ -0,0 +1,6 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When('I refresh the page', () => { + cy.visit('/') + .reload(); +}); diff --git a/docs/cypress/support/step_definitions/common/I_search_for_{string}.js b/docs/cypress/support/step_definitions/common/I_search_for_{string}.js new file mode 100644 index 000000000..f91959182 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_search_for_{string}.js @@ -0,0 +1,12 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I search for {string}", value => { + cy.intercept({ + method: "POST", + url: "http://localhost:3000/api", + }).as("graphqlRequest"); + cy.get(".searchable-input .ds-select input") + .focus() + .type(value); + cy.wait("@graphqlRequest"); +}); diff --git a/docs/cypress/support/step_definitions/common/I_see_a_toaster_with_status_{string}.js b/docs/cypress/support/step_definitions/common/I_see_a_toaster_with_status_{string}.js new file mode 100644 index 000000000..c7bd91e29 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_see_a_toaster_with_status_{string}.js @@ -0,0 +1,9 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I see a toaster with status {string}", (status) => { + switch (status) { + case "success": + cy.get(".iziToast.iziToast-color-green").should("be.visible"); + break; + } +}) diff --git a/docs/cypress/support/step_definitions/common/I_see_a_toaster_with_{string}.js b/docs/cypress/support/step_definitions/common/I_see_a_toaster_with_{string}.js new file mode 100644 index 000000000..e1496b8de --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_see_a_toaster_with_{string}.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I see a toaster with {string}", (title) => { + cy.get(".iziToast-message").should("contain", title); +}) diff --git a/docs/cypress/support/step_definitions/common/I_see_a_{string}_message.js b/docs/cypress/support/step_definitions/common/I_see_a_{string}_message.js new file mode 100644 index 000000000..cc8deca5f --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_see_a_{string}_message.js @@ -0,0 +1,5 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I see a {string} message:", (_type, message) => { + cy.contains(message); +}); diff --git a/docs/cypress/support/step_definitions/common/I_should_see_the_following_posts_in_the_select_dropdown.js b/docs/cypress/support/step_definitions/common/I_should_see_the_following_posts_in_the_select_dropdown.js new file mode 100644 index 000000000..88e18a280 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_should_see_the_following_posts_in_the_select_dropdown.js @@ -0,0 +1,8 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("I should see the following posts in the select dropdown:", table => { + table.hashes().forEach(({ title }) => { + cy.get(".ds-select-dropdown") + .should("contain", title); + }); +}); diff --git a/docs/cypress/support/step_definitions/common/I_wait_for_{int}_milliseconds.js b/docs/cypress/support/step_definitions/common/I_wait_for_{int}_milliseconds.js new file mode 100644 index 000000000..2ed462340 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/I_wait_for_{int}_milliseconds.js @@ -0,0 +1,5 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("I wait for {int} milliseconds", time => { + cy.wait(time) +}); diff --git a/docs/cypress/support/step_definitions/common/the_checkbox_with_ID_{string}_should_{string}.js b/docs/cypress/support/step_definitions/common/the_checkbox_with_ID_{string}_should_{string}.js new file mode 100644 index 000000000..603524804 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/the_checkbox_with_ID_{string}_should_{string}.js @@ -0,0 +1,5 @@ +import { When } from "@badeball/cypress-cucumber-preprocessor"; + +When("the checkbox with ID {string} should {string}", (id, value) => { + cy.get('#' + id).should(value) +}) diff --git a/docs/cypress/support/step_definitions/common/the_first_post_on_the_newsfeed_has_the_title.js b/docs/cypress/support/step_definitions/common/the_first_post_on_the_newsfeed_has_the_title.js new file mode 100644 index 000000000..ba98a7a8e --- /dev/null +++ b/docs/cypress/support/step_definitions/common/the_first_post_on_the_newsfeed_has_the_title.js @@ -0,0 +1,6 @@ +import { Then } from "@badeball/cypress-cucumber-preprocessor"; + +Then("the first post on the newsfeed has the title:", title => { + cy.get(".post-teaser:first") + .should("contain", title); +}); diff --git a/docs/cypress/support/step_definitions/common/the_following_{string}_are_in_the_database.js b/docs/cypress/support/step_definitions/common/the_following_{string}_are_in_the_database.js new file mode 100644 index 000000000..8e41afa2a --- /dev/null +++ b/docs/cypress/support/step_definitions/common/the_following_{string}_are_in_the_database.js @@ -0,0 +1,40 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given("the following {string} are in the database:", (table,data) => { + switch(table){ + case "posts": + data.hashes().forEach( entry => { + cy.factory().build("post", { + ...entry, + deleted: Boolean(entry.deleted), + disabled: Boolean(entry.disabled), + pinned: Boolean(entry.pinned), + },{ + ...entry, + tagIds: entry.tagIds ? entry.tagIds.split(',').map(item => item.trim()) : [], + }); + }) + break + case "comments": + data.hashes().forEach( entry => { + cy.factory() + .build("comment", entry, entry); + }) + break + case "users": + data.hashes().forEach( entry => { + cy.factory().build("user", entry, entry); + }); + break + case "tags": + data.hashes().forEach( entry => { + cy.factory().build("tag", entry, entry) + }); + break + case "donations": + data.hashes().forEach( entry => { + cy.factory().build("donations", entry, entry) + }); + break + } +}) diff --git a/docs/cypress/support/step_definitions/common/{string}_wrote_a_post_{string}.js b/docs/cypress/support/step_definitions/common/{string}_wrote_a_post_{string}.js new file mode 100644 index 000000000..0da055951 --- /dev/null +++ b/docs/cypress/support/step_definitions/common/{string}_wrote_a_post_{string}.js @@ -0,0 +1,10 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor"; + +Given('{string} wrote a post {string}', (author, title) => { + cy.factory() + .build("post", { + title, + }, { + authorId: author, + }); +}); diff --git a/docs/deployment/.env.dist b/docs/deployment/.env.dist new file mode 100644 index 000000000..8b8901647 --- /dev/null +++ b/docs/deployment/.env.dist @@ -0,0 +1 @@ +CONFIGURATION=example \ No newline at end of file diff --git a/docs/deployment/DOCKER_MORE_CLOSELY.md b/docs/deployment/DOCKER_MORE_CLOSELY.md new file mode 100644 index 000000000..67488fe81 --- /dev/null +++ b/docs/deployment/DOCKER_MORE_CLOSELY.md @@ -0,0 +1,33 @@ +# Docker + +## Apple M1 Platform + +***Attention:** For using Docker commands in Apple M1 environments!* + +```bash +# set env variable for your shell +$ export DOCKER_DEFAULT_PLATFORM=linux/amd64 +``` + +For even more informations, see [Docker More Closely](#docker-more-closely) + +### Docker Compose Override File For Apple M1 Platform + +For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform: + +```bash +# in main folder + +# for production +$ docker compose -f docker-compose.yml -f docker-compose.apple-m1.override.yml up + +# for production testing Docker images from DockerHub +$ docker compose -f docker-compose.ocelotsocial-branded.yml -f docker-compose.apple-m1.override.yml up + +# only once: init admin user and create indexes and constraints in Neo4j database +$ docker compose exec backend /bin/sh -c "yarn prod:migrate init" +``` + +## Docker More Closely In Main Code + +To get more informations about the Apple M1 platform and to analyze the Docker builds etc. you find our documentation in our main code, [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/DOCKER_MORE_CLOSELY.md). diff --git a/docs/deployment/Minikube.md b/docs/deployment/Minikube.md new file mode 100644 index 000000000..8e6240a7c --- /dev/null +++ b/docs/deployment/Minikube.md @@ -0,0 +1,25 @@ +# Minikube + +There are many Kubernetes providers, but if you're just getting started, Minikube is a tool that you can use to get your feet wet. + +After you [installed Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) +open your minikube dashboard: + +```text +$ minikube dashboard +``` + +This will give you an overview. Some of the steps below need some timing to make resources available to other dependent deployments. Keeping an eye on the dashboard is a great way to check that. + +Follow the installation instruction for [Kubernetes with Helm](./kubernetes/README.md). + +If all the pods and services have settled and everything looks green in your +minikube dashboard, expose the services you want on your host system. + +For example: + +```text +$ minikube service webapp --namespace=ocelotsocialnetwork +# optionally +$ minikube service backend --namespace=ocelotsocialnetwork +``` \ No newline at end of file diff --git a/docs/deployment/README.deployment.md b/docs/deployment/README.deployment.md new file mode 100644 index 000000000..f085b48d0 --- /dev/null +++ b/docs/deployment/README.deployment.md @@ -0,0 +1,78 @@ +# Deployment + +Before you start the deployment you have to do preparations. + +## Deployment Preparations + +Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](/package.json) file as your `dockerOrganisation`. +Read more details in the [main README](/README.md) under [Usage](/README.md#usage). + +## Deployment Methods + +You have the following options for a deployment: + +- [Kubernetes with Helm](./kubernetes/README.md) + +## After Deployment + +After the first deployment of the new network on your server, the database is initialized with the default administrator: + +- E-mail: `admin@example.org` +- Password: `1234` + +***ATTENTION:*** When you are logged in for the first time, please change your (the admin's) e-mail to an existing one and change your password to a secure one !!! + +## Use the Scripts + +To use all the scripts you have to set the variable `CONFIGURATION` in your terminal by entering: + +```bash +# in deployment folder + +# set configuration name to folder name in 'configurations' folder (network name) +$ export CONFIGURATION=`` +# to check this +$ echo $CONFIGURATION +``` + +### Secrets Encrypt/Decrypt + +To encrypt and decrypt the secrets of your network in your terminal set a correct password in a (new) file `configurations//SECRET`. +If done please enter: + +```bash +# in deployment folder + +# encrypt secrets +$ scripts/secrets.encrypt.sh + +# decrypt secrets +$ scripts/secrets.decrypt.sh +``` + +### Maintenance Mode On/Off + +Activate or deactivate maintenance mode in your terminal: + +```bash +# in deployment folder + +# activate maintenance mode +$ scripts/cluster.maintenance.sh on + +# deactivate maintenance mode +$ scripts/cluster.maintenance.sh off +``` + +### Backup Script + +To save a locale backup of the database and uploaded images: + +```bash +# in deployment folder + +# save backup +$ scripts/cluster.backup.sh +``` + +The backup will be saved into your network folders `backup` folder in a new folder with the date and time. diff --git a/docs/deployment/README.md b/docs/deployment/README.md new file mode 100644 index 000000000..030eb8a44 --- /dev/null +++ b/docs/deployment/README.md @@ -0,0 +1,136 @@ +# Ocelot.Social Deploy And Rebranding + +[![Build Status Publish](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/actions/workflows/publish.yml/badge.svg)](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/actions) +[![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/blob/LICENSE.md) +[![Discord Channel](https://img.shields.io/discord/489522408076738561.svg)](https://discord.gg/AJSX9DCSUA) +[![Open Source Helpers](https://www.codetriage.com/ocelot-social-community/ocelot-social-deploy-rebranding/badges/users.svg)](https://www.codetriage.com/ocelot-social-community/ocelot-social-deploy-rebranding) + +This repository is an in use template to rebrand, configure, and deploy [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) networks. +The forked original repository is [Ocelot-Social-Deploy-Rebranding](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding). + + +

                      + Ocelot-Social +

                      + + +## Live demo + +__Try out our deployed [development environment](https://stage.ocelot.social).__ + +Visit our staging networks: + +- central staging network: [stage.ocelot.social](https://stage.ocelot.social) + + +Logins: + +| email | password | role | +| :--- | :--- | :--- | +| `user@example.org` | 1234 | user | +| `moderator@example.org` | 1234 | moderator | +| `admin@example.org` | 1234 | admin | + +## Usage + +Fork this repository to configure and rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. + +### Package.Json And DockerHub Organisation + +Write your own data into the main configuration file: + +- [package.json](/package.json) + +Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](/package.json) file as your `dockerOrganisation`. + +### Configure And Branding + +The next step is: + +- [Configure And Branding](/branding/README.md) + +### Optional: Locally Testing Configuration And Branding + +Just in case you have Docker installed and run the following, you can check your branding locally: + +```bash +# in main folder +$ docker-compose up +# fill the database with an initial admin +$ docker-compose exec backend yarn run prod:migrate init +``` + +The database is then initialised with the default administrator: + +- E-mail: admin@example.org +- Password: 1234 + +For login or registration have a look in your browser at `http://localhost:3000/`. +For the maintenance page have a look in your browser at `http://localhost:5000/`. + +### Push Changes To GitHub + +Before merging these changes into the "master" branch on your GitHub fork repository, you need to configure the GitHub repository secrets. This is necessary to [publish](/.github/workflows/publish.yml) the Docker images by pushing them via GitHub actions to repositories belonging to your DockerHub organisation. + +First, go to your DockerHub profile under `Account Settings` and click on the `Security` tab. There you create an access token called `-access-token` and copy the token to a safe place. + +Secondly, in your GitHub repository, click on the 'Settings' tab and go to the 'Secrets' tab. There you create two secrets by clicking on `New repository secret`: + +1. Named `DOCKERHUB_TOKEN` with the newly created DockerHub token (only the code, not the token name). +2. Named `DOCKERHUB_USERNAME` with your DockerHub username. + +### Optional: Locally Testing Your DockerHub Images + +Just in case you like to check your pushed Docker images in your organisation's DockerHub repositories locally: + +- rename the file `docker-compose.ocelotsocial-branded.yml` with your network name +- in the file, rename the ocelot.social DockerHub organisation `ocelotsocialnetwork` to your organisations name + +Remove any local Docker images if necessary and do the following: + +```bash +# in main folder +$ docker-compose -f docker-compose.-branded.yml up +# fill the database with an initial admin +$ docker-compose exec backend yarn run prod:migrate init +``` + +See the login details and browser addresses above. + +### Deployment + +Afterwards you can [deploy](/deployment/README.md) it on your server: + +- [Kubernetes with Helm](/deployment/kubernetes/README.md) + +## Developer Chat + +Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat: +Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: +Check out the [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too! + +We give write permissions to every developer who asks for it. Just text us on +[Discord](https://discord.gg/AJSX9DCSUA). + +## Technology Stack + +- [Docker](https://www.docker.com) +- [Kubernetes](https://kubernetes.io) +- [Helm](https://helm.sh) + + + +## License + +See the [LICENSE](/LICENSE.md) file for license rights and limitations (MIT). + + +We need `DOCKER_BUILDKIT=0` for this to work. \ No newline at end of file diff --git a/docs/deployment/TODO-next-update.md b/docs/deployment/TODO-next-update.md new file mode 100644 index 000000000..8e30d1f47 --- /dev/null +++ b/docs/deployment/TODO-next-update.md @@ -0,0 +1,92 @@ +# Todo For Next Update + +When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings: + +## Version >= 2.7.0 with 'ocelotDockerVersionTag' 2.7.0-470 + +- You have to rename all `.js` files to `.ts` in `branding/constants` + +## Version >= 2.4.0 with 'ocelotDockerVersionTag' 2.4.0-298 + +- You have to set `SHOW_CONTENT_FILTER_HEADER_MENU` and `SHOW_CONTENT_FILTER_MASONRY_GRID` in `branding/constants/filter.js` originally in main code file `webapp/constants/filter.js` to your preferred value. + +### Main Code PR – feat(webapp): map #5843 + +- Create your own [Mapbox](https://mapbox.com/) account at [https://mapbox.com/](https://mapbox.com/) for your organization to get your own Mapbox token. +- You have to add the `MAPBOX_TOKEN` from the `deployment/kubernetes/values.template.yaml` to your `deployment/kubernetes/values.yaml` and set it to your own Mapbox token. + +## Version >= 2.2.0 with 'ocelotDockerVersionTag' 2.2.0-267 + +### Main Code PR – feat: 🍰 Footer And Header Links Configurable To Have External Link Target #5590 + +- You have to add property `target` to all array elements with value `url` to your preferred value in `branding/constants/headerMenu.js` originally in main code file `webapp/constants/headerMenu.js`. +- You have to move value of all `externalLink` to new property `externalLink.url` and set new property `externalLink.target` to your preferred value in `branding/constants/links.js` originally in main code file `webapp/constants/links.js`. + +### Main Code PR – feat: 🍰 Make Donation Progress Bar Color Configurable #5593 + +- You have to set `PROGRESS_BAR_COLOR_TYPE` in `branding/constants/donation.js` originally in main code file `webapp/constants/donation.js` to your preferred value. + +### Main Code PR – feat: 🍰 Header Logo Routing Update #5579 + +- You have to move value of `LOGO_HEADER_CLICK.externalLink` to new property `LOGO_HEADER_CLICK.externalLink.url` and set new property `LOGO_HEADER_CLICK.externalLink.target` to your preferred value in `branding/constants/logos.js` originally in main code file `webapp/constants/logos.js`. + +## Version >= 2.0.0 with 'ocelotDockerVersionTag' 2.0.0-250 + +### Main Code PR – feat: 🍰 Implement LOGO_HEADER_CLICK As Configuration #5525 + +- You have to set `LOGO_HEADER_CLICK` in `branding/constants/logos.js` originally in main code file `webapp/constants/logos.js` to your preferred value. + +### Main Code Issue – 🌟 [EPIC] Release v2.0.0 – Beta Test → Final #5547 + +- You have to set `SHOW_GROUP_BUTTON_IN_HEADER` in `branding/constants/groups.js` originally in main code file `webapp/constants/groups.js` to your preferred value. + +## Version >= 1.1.0 with 'ocelotDockerVersionTag' 1.1.0-205 + +### Deployment/Rebranding PR – chore: 🍰 Release v1.1.0 - Implement Categories Again #63 + +- You have to add the `CATEGORIES_ACTIVE` from the `deployment/kubernetes/values.template.yaml` to your `deployment/kubernetes/values.yaml` and set it to your preferred value. +- Make sure the correct categories are in your Neo4j database on the server. + +## Version >= 1.0.9 with 'ocelotDockerVersionTag' 1.0.9-199 + +### Deployment/Rebranding PR – chore: 🍰 Implement PRODUCTION_DB_CLEAN_ALLOW for Staging Production Environments #56 + +- Copy `PRODUCTION_DB_CLEAN_ALLOW` from `deployment/kubernetes/values.template.yaml` to `values.yaml` and set it to `false` for production environments and only for several stage test servers to `true`. + +### Deployment/Rebranding PR – chore: [WIP] 🍰 Refine docs, first step #46 + +Upgrade the cert-manager, but install CRDs of the version 1.0.0-alpha to actually be able to upgrade ocelot. Then uninstall the legacy CRDs and install the correct ones. + +```bash +# upgrade cert-manager to 1.9.1 +> helm upgrade --set installCRDs=true --version 1.9.1 --namespace cert-manager cert-manager jetstack/cert-manager +# apply legacy CRDs +> kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.0.0-alpha.1/cert-manager.crds.yaml +# upgrade ocelot +> helm upgrade ocelot ./ +# delete legacy CRDs +> kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/v1.0.0-alpha.1/cert-manager.crds.yaml +# apply CRDs for cert-manager 1.9.1 +> kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.crds.yaml +``` + +Background: We had to upgrade cert-manager due to an external dependency - therefore we had to update cert-manager apiVersion `cert-manager.io/v1alpha2` to `cert-manager.io/v1`. + +The error occurring when not doing this is the following: + +```bash +Error: UPGRADE FAILED: unable to build kubernetes objects from current release manifest: [resource mapping not found for name: "letsencrypt-production" namespace: "" from "": no matches for kind "ClusterIssuer" in version "cert-manager.io/v1alpha2" +ensure CRDs are installed first, resource mapping not found for name: "letsencrypt-staging" namespace: "" from "": no matches for kind "ClusterIssuer" in version "cert-manager.io/v1alpha2" +ensure CRDs are installed first] +``` + +## Version >= 1.0.8 with 'ocelotDockerVersionTag' 1.0.8-182 + +### PR – feat: 🍰 Configure Cookie Expire Time #43 + +- You have to add the `COOKIE_EXPIRE_TIME` from the `deployment/kubernetes/values.template.yaml` to your `deployment/kubernetes/values.yaml` and set it to your preferred value. +- Correct `locale` cookie exploration time in data privacy. + +## Version 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 + +- No information. diff --git a/docs/deployment/configurations/.gitignore b/docs/deployment/configurations/.gitignore new file mode 100644 index 000000000..5a7d01850 --- /dev/null +++ b/docs/deployment/configurations/.gitignore @@ -0,0 +1,3 @@ +/* +!/example +!.gitignore \ No newline at end of file diff --git a/docs/deployment/docker-compose.ocelotsocial-branded.yml b/docs/deployment/docker-compose.ocelotsocial-branded.yml new file mode 100644 index 000000000..0c42d6273 --- /dev/null +++ b/docs/deployment/docker-compose.ocelotsocial-branded.yml @@ -0,0 +1,103 @@ +# This docker-compose file is just here for testing +version: "3.4" + +services: + + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/webapp-branded:latest + ports: + - 3000:3000 + networks: + - test-network + depends_on: + - backend + environment: + - HOST=0.0.0.0 + - GRAPHQL_URI=http://backend:4000 + - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + # - WEBSOCKETS_URI=ws://backend:4000/graphql # is not working and not given in Docker YAML in main repo + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/backend-branded:latest + networks: + - test-network + depends_on: + - neo4j + ports: + - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads + environment: + - NEO4J_URI=bolt://neo4j:7687 + - GRAPHQL_URI=http://backend:4000 + - CLIENT_URI=http://localhost:3000 + - JWT_SECRET=b/&&7b78BF&fv/Vd + - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - EMAIL_SUPPORT=support@wir.social + - EMAIL_DEFAULT_SENDER=info@wir.social + # - PRODUCTION_DB_CLEAN_ALLOW=false # only true for production environments on staging servers + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/maintenance-branded:latest + networks: + - test-network + ports: + - 3001:80 + + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/neo4j-community-branded:latest + networks: + - test-network + environment: + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + ports: + - 7687:7687 + volumes: + - neo4j_data:/data + + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - test-network + +networks: + test-network: + +volumes: + backend_uploads: + neo4j_data: diff --git a/docs/deployment/docker-compose.yml b/docs/deployment/docker-compose.yml new file mode 100644 index 000000000..973dc6ac5 --- /dev/null +++ b/docs/deployment/docker-compose.yml @@ -0,0 +1,172 @@ +# This docker-compose file is just here for testing +version: "3.4" +services: + webapp-base: + image: ocelotsocialnetwork/webapp:local-base + build: + dockerfile: ../webapp/Dockerfile + context: ../webapp + target: base + command: sleep 0 + + webapp-code: + image: ocelotsocialnetwork/webapp:local-code + build: + dockerfile: ../webapp/Dockerfile + context: ../webapp + target: code + command: sleep 0 + + webapp: + image: ocelotsocialnetwork/webapp-branded:local-${CONFIGURATION} + container_name: webapp-branded + build: + dockerfile: src/docker/webapp.Dockerfile + target: branded + context: . + args: + - CONFIGURATION=$CONFIGURATION + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code + ports: + - 3000:3000 + networks: + - test-network + depends_on: + - backend + - webapp-base + - webapp-code + env_file: + - .env + environment: + - HOST=0.0.0.0 + - GRAPHQL_URI=http://backend:4000 + - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + # - WEBSOCKETS_URI=ws://backend:4000/graphql # is not working and not given in Docker YAML in main repo + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + + backend-base: + image: ocelotsocialnetwork/backend:local-base + build: + dockerfile: ../backend/Dockerfile + context: ../backend + target: base + command: sleep 0 + + backend-code: + image: ocelotsocialnetwork/backend:local-code + build: + dockerfile: ../backend/Dockerfile + context: ../backend + target: code + command: sleep 0 + + backend: + image: ocelotsocialnetwork/backend-branded:local-${CONFIGURATION} + container_name: backend-branded + build: + dockerfile: src/docker/backend.Dockerfile + target: branded + context: . + args: + - CONFIGURATION=$CONFIGURATION + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code + networks: + - test-network + depends_on: + - neo4j + - backend-base + - backend-code + ports: + - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads + environment: + - NEO4J_URI=bolt://neo4j:7687 + - GRAPHQL_URI=http://backend:4000 + - CLIENT_URI=http://localhost:3000 + - JWT_SECRET=b/&&7b78BF&fv/Vd + - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - EMAIL_SUPPORT=support@wir.social + - EMAIL_DEFAULT_SENDER=info@wir.social + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + #- PRODUCTION_DB_CLEAN_ALLOW=true + - NODE_ENV=development + + maintenance-base: + image: ocelotsocialnetwork/maintenance:local-base + build: + dockerfile: ../webapp/Dockerfile.maintenance + context: ../webapp + target: base + command: sleep 0 + + maintenance-code: + image: ocelotsocialnetwork/maintenance:local-code + build: + dockerfile: ../webapp/Dockerfile.maintenance + context: ../webapp + target: code + command: sleep 0 + + maintenance: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/maintenance-branded:local-${CONFIGURATION} + container_name: maintenance-branded + build: + # TODO: Separate from webapp, this must be independent + dockerfile: src/docker/maintenance.Dockerfile + target: branded + context: . + args: + - CONFIGURATION=$CONFIGURATION + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code + networks: + - test-network + depends_on: + - maintenance-base + - maintenance-code + ports: + - 3001:80 + + neo4j: + image: ocelotsocialnetwork/neo4j-community:latest + container_name: neo4j-branded + networks: + - test-network + volumes: + - neo4j_data:/data + environment: + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + ports: + - 7687:7687 + - 7474:7474 + + mailserver: + image: djfarrelly/maildev + container_name: mailserver-branded + ports: + - 1080:80 + networks: + - test-network + +networks: + test-network: + +volumes: + backend_uploads: + neo4j_data: diff --git a/docs/deployment/scripts/branded-images.build.sh b/docs/deployment/scripts/branded-images.build.sh new file mode 100644 index 000000000..fa9da67d1 --- /dev/null +++ b/docs/deployment/scripts/branded-images.build.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# for a branded version you should pass the following env variables: +# CONFIGURATION - your configuration folder name +# DOCKERHUB_ORGANISATION - your dockerhub organisation +# OCELOT_VERSION - specify the specific tag to build upon e.g. 2.4.0-300 + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# check DOCKERHUB_BRAND_VARRIANT +if [ -z ${DOCKERHUB_BRAND_VARRIANT} ]; then + echo "You must provide a `DOCKERHUB_BRAND_VARRIANT` via environment variable" + exit 1 +fi +echo "Using DOCKERHUB_BRAND_VARRIANT=${DOCKERHUB_BRAND_VARRIANT}" + +# configuration +DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"} +OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../../package.json').version")} +OCELOT_GITHUB_RUN_NUMBER=${OCELOT_GITHUB_RUN_NUMBER:-master} +OCELOT_VERSION_BUILD=${OCELOT_VERSION_BUILD:-${OCELOT_VERSION}-${OCELOT_GITHUB_RUN_NUMBER}} +BRANDED_VERSION=${BRANDED_VERSION:-${GITHUB_RUN_NUMBER:-"local"}} +BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')} +BUILD_VERSION_BASE=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION} +BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION_BUILD} +BUILD_COMMIT=${GITHUB_SHA:-"0000000"} + +# backend +docker build --target branded \ + -t "${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:latest" \ + -t "${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION}" \ + -t "${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION_BUILD}" \ + -t "${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION_BASE}" \ + -t "${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION}" \ + -f "${SCRIPT_DIR}/../src/docker/backend.Dockerfile" \ + --build-arg "CONFIGURATION=${CONFIGURATION}" \ + --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_VERSION}-code" \ + --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_VERSION}-base" \ + "${SCRIPT_DIR}/../." + +# webapp +docker build --target branded \ + -t "${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:latest" \ + -t "${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION}" \ + -t "${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION_BUILD}" \ + -t "${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION_BASE}" \ + -t "${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION}" \ + -f "${SCRIPT_DIR}/../src/docker/webapp.Dockerfile" \ + --build-arg "CONFIGURATION=${CONFIGURATION}" \ + --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_VERSION}-code" \ + --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_VERSION}-base" \ + "${SCRIPT_DIR}/../." + +# mainteance +docker build --target branded \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:latest" \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION}" \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION_BUILD}" \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION_BASE}" \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION}" \ + -f "${SCRIPT_DIR}/../src/docker/maintenance.Dockerfile" \ + --build-arg "CONFIGURATION=${CONFIGURATION}" \ + --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_VERSION}-code" \ + --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_VERSION}-base" \ + "${SCRIPT_DIR}/../." diff --git a/docs/deployment/scripts/branded-images.upload.sh b/docs/deployment/scripts/branded-images.upload.sh new file mode 100644 index 000000000..83e27496b --- /dev/null +++ b/docs/deployment/scripts/branded-images.upload.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# for a branded version you should pass the following env variables: +# DOCKERHUB_ORGANISATION - your dockerhub organisation +# OCELOT_VERSION - specify the specific tag to build upon e.g. 2.4.0-300 +# DOCKERHUB_USERNAME - your dockerhub username +# DOCKERHUB_TOKEN - your dockerhub access token + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check DOCKERHUB_BRAND_VARRIANT +if [ -z ${DOCKERHUB_BRAND_VARRIANT} ]; then + echo "You must provide a `DOCKERHUB_BRAND_VARRIANT` via environment variable" + exit 1 +fi +echo "Using DOCKERHUB_BRAND_VARRIANT=${DOCKERHUB_BRAND_VARRIANT}" + +# configuration +DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"} +OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../../package.json').version")} +OCELOT_GITHUB_RUN_NUMBER=${OCELOT_GITHUB_RUN_NUMBER:-master} +OCELOT_VERSION_BUILD=${OCELOT_VERSION_BUILD:-${OCELOT_VERSION}-${OCELOT_GITHUB_RUN_NUMBER}} +BRANDED_VERSION=${BRANDED_VERSION:-${GITHUB_RUN_NUMBER:-"local"}} +BUILD_VERSION_BASE=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION} +BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION_BUILD} + +# login to dockerhub +echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin + +# push backend images +docker push ${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:latest +docker push ${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION} +docker push ${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION_BUILD} +docker push ${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION_BASE} +docker push ${DOCKERHUB_ORGANISATION}/backend-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION} + +# push webapp images +docker push ${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:latest +docker push ${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION} +docker push ${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION_BUILD} +docker push ${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION_BASE} +docker push ${DOCKERHUB_ORGANISATION}/webapp-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION} + +# push maintenance images +docker push ${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:latest +docker push ${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION} +docker push ${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${OCELOT_VERSION_BUILD} +docker push ${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION_BASE} +docker push ${DOCKERHUB_ORGANISATION}/maintenance-${DOCKERHUB_BRAND_VARRIANT}:${BUILD_VERSION} \ No newline at end of file diff --git a/docs/deployment/scripts/cluster.backup.sh b/docs/deployment/scripts/cluster.backup.sh new file mode 100644 index 000000000..7d9cbd44d --- /dev/null +++ b/docs/deployment/scripts/cluster.backup.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi + +# configuration +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} +BACKUP_DATE=$(date "+%F_%H-%M-%S") +BACKUP_FOLDER=${BACKUP_FOLDER:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/backup/${BACKUP_DATE}} + +# create backup fodler +mkdir -p ${BACKUP_FOLDER} + +# maintenance mode on +${SCRIPT_DIR}/cluster.maintenance.sh on + +# shutdown database +kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ + | jq '.spec.template.spec.containers[] += {"command": ["tail", "-f", "/dev/null"]}' \ + | kubectl --kubeconfig=${KUBECONFIG} apply -f - + +# wait for the container to restart +sleep 60 + +# database backup +kubectl --kubeconfig=${KUBECONFIG} -n default exec -it \ + $(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') \ + -- neo4j-admin dump --to=/var/lib/neo4j/$BACKUP_DATE-neo4j-dump +# copy neo4j backup to local drive +kubectl --kubeconfig=${KUBECONFIG} cp \ + default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j |awk '{ print $1 }'):/var/lib/neo4j/$BACKUP_DATE-neo4j-dump $BACKUP_FOLDER/neo4j-dump +# copy image data +kubectl --kubeconfig=${KUBECONFIG} cp \ + default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-backend |awk '{ print $1 }'):/app/public/uploads $BACKUP_FOLDER/public-uploads + +# restart database +kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ + | jq 'del(.spec.template.spec.containers[].command)' \ + | kubectl --kubeconfig=${KUBECONFIG} apply -f - + +# wait for the container to restart +sleep 60 + +# maintenance mode off +${SCRIPT_DIR}/cluster.maintenance.sh off \ No newline at end of file diff --git a/docs/deployment/scripts/cluster.maintenance.sh b/docs/deployment/scripts/cluster.maintenance.sh new file mode 100644 index 000000000..b64994e9b --- /dev/null +++ b/docs/deployment/scripts/cluster.maintenance.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# configuration +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} + +case $1 in + on) + kubectl --kubeconfig=${KUBECONFIG} patch ingress ingress-ocelot-webapp --type merge --patch-file ${SCRIPT_DIR}/../src/kubernetes/patches/patch.ingress.maintenance.on.yaml + ;; + off) + kubectl --kubeconfig=${KUBECONFIG} patch ingress ingress-ocelot-webapp --type merge --patch-file ${SCRIPT_DIR}/../src/kubernetes/patches/patch.ingress.maintenance.off.yaml + ;; + *) + echo -e "Run this script with first argument either 'on' or 'off'" + exit + ;; +esac diff --git a/docs/deployment/scripts/cluster.reseed.sh b/docs/deployment/scripts/cluster.reseed.sh new file mode 100644 index 000000000..7bd44153b --- /dev/null +++ b/docs/deployment/scripts/cluster.reseed.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# configuration +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} + +# clean & seed +kubectl --kubeconfig=${KUBECONFIG} -n default exec -it $(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node --experimental-repl-await build/src/db/clean.js && node --experimental-repl-await build/src/db/seed.js" \ No newline at end of file diff --git a/docs/deployment/scripts/cluster.upgrade.sh b/docs/deployment/scripts/cluster.upgrade.sh new file mode 100644 index 000000000..de0444065 --- /dev/null +++ b/docs/deployment/scripts/cluster.upgrade.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# configuration +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} +VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml +DOCKERHUB_OCELOT_TAG=${DOCKERHUB_OCELOT_TAG:-"latest"} + +# upgrade with helm +helm --kubeconfig=${KUBECONFIG} upgrade ocelot \ + --values ${VALUES} \ + --set appVersion="${DOCKERHUB_OCELOT_TAG}" \ + ${SCRIPT_DIR}/../src/kubernetes/ \ + --timeout 10m \ No newline at end of file diff --git a/docs/deployment/scripts/secret.generate.sh b/docs/deployment/scripts/secret.generate.sh new file mode 100644 index 000000000..cb788a7bd --- /dev/null +++ b/docs/deployment/scripts/secret.generate.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# generate a secret and store it in the SECRET file. +# Note that this overwrites the existing file + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# configuration +SECRET_FILE=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/SECRET + +openssl rand -base64 32 > ${SECRET_FILE} \ No newline at end of file diff --git a/docs/deployment/scripts/secrets.decrypt.sh b/docs/deployment/scripts/secrets.decrypt.sh new file mode 100644 index 000000000..a7a1328b1 --- /dev/null +++ b/docs/deployment/scripts/secrets.decrypt.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# decrypt secrets in the selected configuration +# Note that existing decrypted files will be overwritten + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# configuration +SECRET=${SECRET} +SECRET_FILE=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/SECRET +FILES=(\ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/.env" \ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml" \ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml" \ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/dns.values.yaml" \ + ) + +# Load SECRET from file if it is not set explicitly +if [ -z ${SECRET} ] && [ -f "${SECRET_FILE}" ]; then + SECRET=$(<${SECRET_FILE}) +fi + +# exit when there is no SECRET set +if [ -z ${SECRET} ]; then + echo "No SECRET provided and no SECRET-File found." + exit 1 +fi + +# decrypt +for file in "${FILES[@]}" +do + if [ -f "${file}.enc" ]; then + #gpg --symmetric --batch --passphrase="${SECRET}" --cipher-algo AES256 --output ${file}.enc ${file} + gpg --quiet --batch --yes --decrypt --passphrase="${SECRET}" --output ${file} ${file}.enc + echo "Decrypted ${file}" + fi +done + +echo "DONE" +# gpg --quiet --batch --yes --decrypt --passphrase="${SECRET}" \ +# --output $HOME/secrets/my_secret.json my_secret.json.gpg diff --git a/docs/deployment/scripts/secrets.encrypt.sh b/docs/deployment/scripts/secrets.encrypt.sh new file mode 100644 index 000000000..57be1c16e --- /dev/null +++ b/docs/deployment/scripts/secrets.encrypt.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# encrypt secrets in the selected configuration +# Note that existing encrypted files will be overwritten + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# check CONFIGURATION +if [ -z ${CONFIGURATION} ]; then + echo "You must provide a `CONFIGURATION` via environment variable" + exit 1 +fi +echo "Using CONFIGURATION=${CONFIGURATION}" + +# configuration +SECRET=${SECRET} +SECRET_FILE=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/SECRET +FILES=(\ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/.env" \ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml" \ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml" \ + "${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/dns.values.yaml" \ + ) + +# Load SECRET from file if it is not set explicitly +if [ -z ${SECRET} ] && [ -f "${SECRET_FILE}" ]; then + SECRET=$(<${SECRET_FILE}) +fi + +# exit when there is no SECRET set +if [ -z ${SECRET} ]; then + echo "No SECRET provided and no SECRET-File found." + exit 1 +fi + +# encrypt +for file in "${FILES[@]}" +do + if [ -f "${file}" ]; then + gpg --symmetric --batch --yes --passphrase="${SECRET}" --cipher-algo AES256 --output ${file}.enc ${file} + echo "Encrypted ${file}" + fi +done + +echo "DONE" diff --git a/docs/deployment/src/docker/backend.Dockerfile b/docs/deployment/src/docker/backend.Dockerfile new file mode 100644 index 000000000..a0b6e4ed4 --- /dev/null +++ b/docs/deployment/src/docker/backend.Dockerfile @@ -0,0 +1,46 @@ +ARG APP_IMAGE=ocelotsocialnetwork/backend +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + +################################################################################## +# CODE (branded) ################################################################# +################################################################################## +FROM $APP_IMAGE_CODE as code + +ARG CONFIGURATION=example + +# copy public constants and email templates into the Docker image to brand it +COPY configurations/${CONFIGURATION}/branding/constants/emails.ts src/config/ +COPY configurations/${CONFIGURATION}/branding/constants/logos.ts src/config/ +COPY configurations/${CONFIGURATION}/branding/constants/metadata.ts src/config/ +COPY configurations/${CONFIGURATION}/branding/email/ src/middleware/helpers/email/ + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# BRANDED (Does contain only "binary"- and static-files to reduce image size) #### +################################################################################## +FROM $APP_IMAGE_BASE as branded + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/build ./build +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +# TODO - externalize the uploads so we can copy the whole folder +COPY --from=build ${DOCKER_WORKDIR}/public/img/ ./public/img/ +COPY --from=build ${DOCKER_WORKDIR}/public/providers.json ./build/public/providers.json +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/docs/deployment/src/docker/maintenance.Dockerfile b/docs/deployment/src/docker/maintenance.Dockerfile new file mode 100644 index 000000000..95501252c --- /dev/null +++ b/docs/deployment/src/docker/maintenance.Dockerfile @@ -0,0 +1,44 @@ +ARG APP_IMAGE=ocelotsocialnetwork/maintenance +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + +################################################################################## +# CODE (branded) ################################################################# +################################################################################## +FROM $APP_IMAGE_CODE as code + +ARG CONFIGURATION=example + +# copy public constants into the Docker image to brand it +COPY configurations/${CONFIGURATION}/branding/static/ static/ +COPY configurations/${CONFIGURATION}/branding/constants/ constants/ +RUN /bin/sh -c 'cd constants && for f in *.ts; do mv -- "$f" "${f%.ts}.js"; done' + +# locales +COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ +COPY src/tools/ tools/ +RUN apk add --no-cache bash jq +RUN tools/merge-locales.sh + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +## unnicely done in $APP_IMAGE_CODE at the moment, see main repo +# RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn generate +RUN yarn run generate + +################################################################################## +# BRANDED ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO #### +################################################################################## +# FROM $APP_IMAGE_BASE as branded +FROM nginx:alpine as branded + +COPY --from=build ./app/dist/ /usr/share/nginx/html/ +RUN rm /etc/nginx/conf.d/default.conf +COPY --from=code ./app/maintenance/nginx/custom.conf /etc/nginx/conf.d/ diff --git a/docs/deployment/src/docker/webapp.Dockerfile b/docs/deployment/src/docker/webapp.Dockerfile new file mode 100644 index 000000000..d811219c3 --- /dev/null +++ b/docs/deployment/src/docker/webapp.Dockerfile @@ -0,0 +1,61 @@ +ARG APP_IMAGE=ocelotsocialnetwork/webapp +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + +################################################################################## +# CODE (branded) ################################################################# +################################################################################## +FROM $APP_IMAGE_CODE as code + +ARG CONFIGURATION=example + +# copy public constants into the Docker image to brand it +COPY configurations/${CONFIGURATION}/branding/static/ static/ +COPY configurations/${CONFIGURATION}/branding/constants/ constants/ +RUN /bin/sh -c 'cd constants && for f in *.ts; do mv -- "$f" "${f%.ts}.js"; done' +COPY configurations/${CONFIGURATION}/branding/locales/html/ locales/html/ +COPY configurations/${CONFIGURATION}/branding/assets/styles/imports/ assets/styles/imports/ +COPY configurations/${CONFIGURATION}/branding/assets/fonts/ assets/fonts/ + +# locales +COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ +COPY src/tools/ tools/ +RUN apk add --no-cache bash jq +RUN tools/merge-locales.sh + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# BRANDED (Does contain only "binary"- and static-files to reduce image size) #### +################################################################################## +FROM $APP_IMAGE_BASE as branded + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js +# Copy static files +# TODO - this seems not be needed anymore for the new rebranding +# TODO - this should be one Folder containign all stuff needed to be copied +COPY --from=build ${DOCKER_WORKDIR}/config/ ./config/ +COPY --from=build ${DOCKER_WORKDIR}/constants ./constants +COPY --from=build ${DOCKER_WORKDIR}/static ./static +COPY --from=build ${DOCKER_WORKDIR}/locales ./locales +COPY --from=build ${DOCKER_WORKDIR}/assets/styles/imports ./assets/styles/imports +COPY --from=build ${DOCKER_WORKDIR}/assets/fonts ./assets/fonts +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/docs/deployment/src/kubernetes/Backup.md b/docs/deployment/src/kubernetes/Backup.md new file mode 100644 index 000000000..227b5765f --- /dev/null +++ b/docs/deployment/src/kubernetes/Backup.md @@ -0,0 +1,305 @@ +# Kubernetes Backup Of Ocelot.Social + +One of the most important tasks in managing a running [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network is backing up the data, e.g. the Neo4j database and the stored image files. + +## Manual Offline Backup + +To prepare, [kubectl](https://kubernetes.io/docs/tasks/tools/) must be installed and ready to use so that you have access to Kubernetes on your server. + +Check if the correct context is used by running the following commands: + +```bash +# check context and set the correct one +$ kubectl config get-contexts +# if the wrong context is chosen use it +$ kubectl config use-context +# if you like check additionally if all pods are running well +$ kubectl -n default get pods -o wide +``` + +The very first step is to put the website into **maintenance mode**. + +### Set Maintenance Mode + +There are two ways to put the network into maintenance mode: + +- via Kubernetes Dashboard +- via `kubectl` + +#### Maintenance Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Ingresses` from the left side menu under `Service`. + +After that, in the list that appears, you will find the entry `ingress-ocelot-webapp`, which has three dots on the right, where you can click to edit the entry. + +You can scroll to the end of the YAML file, where you will find one or more `host` entries under `rules`, one for each domain of the network. + +In all entries, change the value of the `serviceName` entry from ***ocelot-webapp*** to `ocelot-maintenance` and the value of the `servicePort` entry from ***3000*** to `80`. + +First, check if your website is still online. +After you click `Update`, the new settings will be applied and you will find your website in maintenance mode. + +#### Maintenance Mode Via `kubectl` + +To put the network into maintenance mode, run the following commands in the terminal: + +```bash +# list ingresses +$ kubectl get ingress -n default +# edit ingress +$ kubectl -n default edit ingress ingress-ocelot-webapp +``` + +Change the content of the YAML file for all domains to: + +```yaml + spec: + rules: + - host: network-domain.social + http: + paths: + - backend: + # serviceName: ocelot-webapp + # servicePort: 3000 + serviceName: ocelot-maintenance + servicePort: 80 +``` + +First, check if your website is still online. +After you save the file, the new settings will be applied and you will find your website in maintenance mode. + +### Neo4j Database Offline Backup + +Before we can back up the database, we need to put it into **sleep mode**. + +#### Set Neo4j To Sleep Mode + +Again there are two ways to put the network into sleep mode: + +- via Kubernetes Dashboard +- via `kubectl` + +##### Sleep Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Deployments` from the left side menu under `Workloads`. + +After that, in the list that appears, you will find the entry `ocelot-neo4j`, which has three dots on the right, where you can click to edit the entry. + +Scroll to the end of the YAML file where you will find the `spec.template.spec.containers` entry. Here you can insert the `command` entry directly after `imagePullPolicy` in a new line. + +```yaml + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + imagePullPolicy: Always + command: ["tail", "-f", "/dev/null"] +``` + +After clicking `Update`, the new settings will be applied and you should check in the `Pods` menu item on the left side if the `ocelot-neo4j-` pod restarts. + +##### Sleep Mode Via `kubectl` + +To put Neo4j into sleep mode, run the following commands in the terminal: + +```bash +# list deployments +$ kubectl get deployments -n default +# edit deployment +$ kubectl -n default edit deployment ocelot-neo4j +``` + +Scroll to the `spec.template.spec.containers` entry. Here you can insert the `command` entry directly after `imagePullPolicy` in a new line. + +```yaml + image: /neo4j-community-branded:latest + imagePullPolicy: Always + command: ["tail", "-f", "/dev/null"] +``` + +After pressing enter, the new settings will be applied and you should check if the `ocelot-neo4j-` pod restarts. +Use command: + +```bash +# check if the old pod restarts +$ kubectl -n default get pods -o wide +``` + +#### Generate Offline Backup + +The offline backup is generated via `kubectl`: + +```bash +# check for the Neo4j pod +$ kubectl -n default get pods -o wide + +# ls: see wish backup dumps are already there +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- ls + +# bash: enter bash of Neo4j +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- bash +# generate Dump +neo4j% neo4j-admin dump --to=/var/lib/neo4j/$(date +%F)-neo4j-dump +# exit bash +neo4j% exit + +# ls: see if the new backup dump is there +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- ls +``` + +Lets copy the dump backup + +```bash +# copy dump onto backup volume direct +$ kubectl cp default/$(kubectl -n default get pods | grep ocelot-neo4j |awk '{ print $1 }'):/var/lib/neo4j/$(date +%F)-neo4j-dump /Volumes//$(date +%F)-neo4j-dump + +``` + +#### Remove Sleep Mode From Neo4j + +Again there are two ways to put the network into working mode: + +- via Kubernetes Dashboard +- via `kubectl` + +##### Remove Sleep Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Deployments` from the left side menu under `Workloads`. + +After that, in the list that appears, you will find the entry `ocelot-neo4j`, which has three dots on the right, where you can click to edit the entry. + +Scroll to the `spec.template.spec.containers.command` entry and remove the whole `command` entry like: + +```yaml + containers: + - name: container-ocelot-neo4j + image: 'senderfm/neo4j-community-branded:latest' + command: + - tail + - '-f' + - /dev/null + ports: + - containerPort: 7687 + protocol: TCP +``` + +And get: + +```yaml + containers: + - name: container-ocelot-neo4j + image: 'senderfm/neo4j-community-branded:latest' + ports: + - containerPort: 7687 + protocol: TCP +``` + +After clicking `Update`, the new settings will be applied and you should check in the `Pods` menu item on the left side if the `ocelot-neo4j-` pod restarts. + +##### Remove Sleep Mode Via `kubectl` + +To put Neo4j into working mode, run the following commands in the terminal: + +```bash +# list deployments +$ kubectl get deployments -n default +# edit deployment +$ kubectl -n default edit deployment ocelot-neo4j +``` + +Scroll to the `spec.template.spec.containers.command` entry and remove the whole `command` entry like: + +```yaml + spec: + containers: + - command: + - tail + - -f + - /dev/null + envFrom: + - configMapRef: + name: configmap-ocelot-neo4j +``` + +And get: + +```yaml + spec: + containers: + - envFrom: + - configMapRef: + name: configmap-ocelot-neo4j +``` + +After pressing enter, the new settings will be applied and you should check if the `ocelot-neo4j-` pod restarts. +Use command: + +```bash +# check if the old pod restarts +$ kubectl -n default get pods -o wide +``` + +### Backend Backup + +To back up the images from the backend volume, run commands: + +```bash +# ls: backend/public/uploads +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- ls public/uploads + +# copy all images from upload to backup volume direct +$ kubectl cp default/$(kubectl -n default get pods | grep ocelot-backend |awk '{ print $1 }'):/app/public/uploads /Volumes//$(date +%F)-public-uploads +``` + +### Remove Maintenance Mode + +There are two ways to put the network into working mode: + +- via Kubernetes Dashboard +- via `kubectl` + +#### Remove Maintenance Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Ingresses` from the left side menu under `Service`. + +After that, in the list that appears, you will find the entry `ingress-ocelot-webapp`, which has three dots on the right, where you can click to edit the entry. + +You can scroll to the end of the YAML file, where you will find one or more `host` entries under `rules`, one for each domain of the network. + +In all entries, change the value of the `serviceName` entry from ***ocelot-maintenance*** to `ocelot-webapp` and the value of the `servicePort` entry from ***80*** to `3000`. + +First, check if your website is still in maintenance mode. +After you click `Update`, the new settings will be applied and you will find your website online again. + +#### Remove Maintenance Mode Via `kubectl` + +To put the network into working mode, run the following commands in the terminal: + +```bash +# list ingresses +$ kubectl get ingress -n default +# edit ingress +$ kubectl -n default edit ingress ingress-ocelot-webapp +``` + +Change the content of the YAML file for all domains to: + +```yaml + spec: + rules: + - host: network-domain.social + http: + paths: + - backend: + serviceName: ocelot-webapp + servicePort: 3000 + # serviceName: ocelot-maintenance + # servicePort: 80 +``` + +First, check if your website is still in maintenance mode. +After you save the file, the new settings will be applied and you will find your website online again. + +XXX + +```bash +# Dump: Create a Backup in Kubernetes: https://docs.human-connection.org/human-connection/deployment/volumes/neo4j-offline-backup#create-a-backup-in-kubernetes +``` diff --git a/docs/deployment/src/kubernetes/Chart.yaml b/docs/deployment/src/kubernetes/Chart.yaml new file mode 100644 index 000000000..5b953e3e7 --- /dev/null +++ b/docs/deployment/src/kubernetes/Chart.yaml @@ -0,0 +1,39 @@ +type: application +apiVersion: v2 +name: ocelot-social +version: "1.0.0" +# The appVersion defines which docker image is pulled. +# Having it set to latest will pull the latest build on dockerhub. +# You are free to define a specific version here tho. +# e.g. appVersion: "latest" or "1.0.2-3-ocelot.social1.0.2-79" +# Be aware that this requires all your apps to have the same docker image version available. +appVersion: "latest" +description: The Helm chart for ocelot.social +home: https://ocelot.social +sources: + - https://github.com/Ocelot-Social-Community/ + - https://github.com/Ocelot-Social-Community/Ocelot-Social + - https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding +maintainers: + - name: Ulf Gebhardt + email: ulf.gebhardt@webcraft-media.de + url: https://www.webcraft-media.de/#!ulf_gebhardt +icon: https://github.com/Ocelot-Social-Community/Ocelot-Social/raw/master/webapp/static/img/custom/welcome.svg +deprecated: false + +# Unused Fields +#dependencies: # A list of the chart requirements (optional) +# - name: ingress-nginx +# version: v1.10.0 +# repository: https://kubernetes.github.io/ingress-nginx +# condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled ) +# tags: # (optional) +# - Tags can be used to group charts for enabling/disabling together +# import-values: # (optional) +# - ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items. +# alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times +#kubeVersion: A SemVer range of compatible Kubernetes versions (optional) +#keywords: +# - A list of keywords about this project (optional) +#annotations: +# example: A list of annotations keyed by name (optional). \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/DigitalOcean.md b/docs/deployment/src/kubernetes/DigitalOcean.md new file mode 100644 index 000000000..2c919d5f2 --- /dev/null +++ b/docs/deployment/src/kubernetes/DigitalOcean.md @@ -0,0 +1,84 @@ +# DigitalOcean + +If you want to set up a [Kubernetes](https://kubernetes.io) cluster on [DigitalOcean](https://www.digitalocean.com), follow this guide. + +## Create Account + +Create an account with DigitalOcean. + +## Add Project + +On the left side you will see a menu. Click on `New Project`. Enter a name and click `Create Project`. +Skip moving resources, probably. + +## Create Kubernetes Cluster + +On the right top you find the button `Create`. Click on it and choose `Kubernetes - Create Kubernetes Cluster`. + +- use the latest Kubernetes version +- choose your datacenter region +- name your node pool: e.g. `pool-` +- `2 Basic nodes` with `2.5 GB RAM (total of 4 GB)`, `2 shared CPUs`, and `80 GB Disk` each is optimal for the beginning +- set your cluster name: e.g. `cluster-` +- select your project +- no tags necessary + +## Getting Started + +After your cluster is set up – see progress bar above – click on `Getting started`. Please install the following management tools: + +- [kubectl v1.24.1](https://kubernetes.io/docs/tasks/tools/) +- [doctl v1.78.0](https://github.com/digitalocean/doctl) + +Install the tools as described on the tab or see the links here. + +After the installation, click on `Continue`. + +### Download Configuration File + +Follow the steps to download the configuration file. + +You can skip this step if necessary, as you can download the file later. You can then do this by clicking on `Kubernetes` in the left menu. In the menu to the right of the cluster name in the cluster list, click on `More` and select `Download Config`. + +### Patch & Minor Version Upgrades + +Skip `Patch & Minor Version Upgrades` for now. + +### Install 1-Click Apps + +You don't need a 1-click app. Our helmet script will install the required NGINXs. +Therefore, skip this step as well. + +## DNS Configuration + +There are the following two ways to set up the DNS. + +### Manage DNS With A Different Domain Provider + +If you have registered your domain or subdomain with another domain provider, add an `A` record there with one of the IP addresses from one of the cluster droplets in the DNS. + +To find the correct IP address to set in the DNS `A` record, click `Droplets` in the left main menu. +A list of all your droplets will be displayed. +Take one of the IPs of perhaps two or more droplets in your cluster from the list and enter it into the `A` record. + +### Manage DNS With DigitalOcean + +***TODO:** How to configure the DigitalOcean DNS management service …* + +To understand what makes sense to do when managing your DNS with DigitalOcean, you need to know how DNS works: + +DNS means `Domain Name System`. It resolves domains like `example.com` into an IP like `123.123.123.123`. +DigitalOcean is not a domain registrar, but provides a DNS management service. If you use DigitalOcean's DNS management service, you can configure [your cluster](/deployment/kubernetes/README.md#dns) to always resolve the domain to the correct IP and automatically update it for that. +The IPs of the DigitalOcean machines are not necessarily stable, so the cluster's DNS service will update the DNS records managed by DigitalOcean to the new IP as needed. + +***CAUTION:** If you are using an external DNS, you currently have to do this manually, which can cause downtime.* + +## Deploy + +Yeah, you're done here. Back to [Deployment with Helm for Kubernetes](/deployment/kubernetes/README.md). + +## Backups On DigitalOcean + +You can and should do [backups](/deployment/kubernetes/Backup.md) with Kubernetes for sure. + +Additional to backup and copying the Neo4j database dump and the backend images you can do a volume snapshot on DigitalOcean at the moment you have the database in sleep mode. diff --git a/docs/deployment/src/kubernetes/README.md b/docs/deployment/src/kubernetes/README.md new file mode 100644 index 000000000..126c37e9c --- /dev/null +++ b/docs/deployment/src/kubernetes/README.md @@ -0,0 +1,299 @@ +# Kubernetes Helm Installation Of Ocelot.Social + +Deploying [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) with [Helm](https://helm.sh) for [Kubernetes](https://kubernetes.io) is very straight forward. All you have to do is to change certain parameters, like domain names and API keys, then you just install our provided Helm chart to your cluster. + +## Kubernetes Cloud Hosting + +There are various ways to set up your own or a managed Kubernetes cluster. We will extend the following lists over time. +Please contact us if you are interested in options not listed below. + +Managed Kubernetes: + +- [DigitalOcean](/deployment/kubernetes/DigitalOcean.md) + +## Configuration + +You can customize the network server with your configuration by duplicate the `values.template.yaml` to a new `values.yaml` file and change it to your need. All included variables will be available as environment variables in your deployed kubernetes pods. + +Besides the `values.template.yaml` file we provide a `nginx.values.template.yaml` and `dns.values.template.yaml` for a similar procedure. The new `nginx.values.yaml` is the configuration for the ingress-nginx Helm chart, while the `dns.values.yaml` file is for automatically updating the dns values on DigitalOcean and therefore optional. + +## Installation + +Due to the many limitations of Helm you still have to do several manual steps. +Those occur before you run the actual *ocelot.social* Helm chart. +Obviously it is expected of you to have `helm` and `kubectl` installed. +For the cert-manager you may need `cmctl`, see below. +For DigitalOcean you may also need `doctl`. + +Install: + +- [kubectl v1.24.1](https://kubernetes.io/docs/tasks/tools/) +- [doctl v1.78.0](https://docs.digitalocean.com/reference/doctl/how-to/install/) +- [cmctl v1.8.2](https://cert-manager.io/docs/usage/cmctl/#installation) +- [helm v3.9.0](https://helm.sh/docs/intro/install/) + + +### Cert Manager (https) + +Please refer to [cert-manager.io docs](https://cert-manager.io/docs/installation/) for more details. + +***ATTENTION:*** *Be with the Terminal in your repository in the folder of this README.* + +We have three ways to install the cert-manager, purely via `kubectl`, via `cmctl`, or with `helm`. + +We recommend using `helm` because then we do not mix the installation methods. +Please have a look here: + +- [Installing with Helm](https://cert-manager.io/docs/installation/helm/#installing-with-helm) + +Our Helm installation is optimized for cert-manager version `v1.9.1` and `kubectl` version `"v1.24.2`. + +Please search here for cert-manager versions that are compatible with your `kubectl` version on the cluster and on the client: [cert-manager Supported Releases](https://cert-manager.io/docs/installation/supported-releases/#supported-releases). + +***ATTENTION:*** *When uninstalling cert-manager, be sure to use the same method as for installation! Otherwise, we could end up in a broken state, see [Uninstall](https://cert-manager.io/docs/installation/kubectl/#uninstalling).* + + + +### Ingress-Nginx + +#### 1. Add Helm repository for `ingress-nginx` and update + +```bash +$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +$ helm repo update +``` + +#### 2. Install ingress-nginx + +```bash +# kubeconfig.yaml set globaly +$ helm install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +``` + +### DigitalOcean Firewall + +This is only necessary if you run DigitalOcean without load balancer ([see here for more info](https://stackoverflow.com/questions/54119399/expose-port-80-on-digital-oceans-managed-kubernetes-without-a-load-balancer/55968709)) . + +#### 1. Authenticate towards DO with your local `doctl` + +You will need a DO token for that. + +```bash +# without doctl context +$ doctl auth init +# with doctl new context to be filled in +$ doctl auth init --context +``` + +You will need an API token, which you can generate in the control panel at . + +#### 2. Generate DO firewall + + Get the `CLUSTER_UUID` value from the dashboard or from the ID column via `doctl kubernetes cluster list`: + +```bash +# need to apply access token by `doctl auth init` before +$ doctl kubernetes cluster list +``` + +Fill in the `CLUSTER_UUID` and `your-domain`. The latter with hyphens `-` instead of dots `.`: + +```bash +# without doctl context +$ doctl compute firewall create \ +--inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \ +--tag-names=k8s: \ +--name=-http-https +# with doctl context to be filled in +$ doctl compute firewall create \ +--inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \ +--tag-names=k8s: \ +--name=-http-https --context +``` + +To get informations about your success use this command. (Fill in the `ID` you got at creation.): + +```bash +# without doctl context +$ doctl compute firewall get +# with doctl context to be filled in +$ doctl compute firewall get --context +``` + +### DNS + +***TODO:** I thought this is necessary if we use the DigitalOcean DNS management service? See [Manage DNS With DigitalOcean](/deployment/kubernetes/DigitalOcean.md#manage-dns-with-digitalocean)* + +This chart is only necessary (recommended is more precise) if you run DigitalOcean without load balancer. +You need to generate an access token with read + write for the `dns.values.yaml` at and fill it in. + +#### 1. Add Helm repository for `binami` and update + +```bash +$ helm repo add bitnami https://charts.bitnami.com/bitnami +$ helm repo update +``` + +#### 2. Install DNS + +```bash +# kubeconfig.yaml set globaly +$ helm install dns bitnami/external-dns -f dns.values.yaml +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns.values.yaml +``` + +### Ocelot.Social + +***Attention:** Before installing your own ocelot.social network, you need to create a DockerHub (account and) organization, put its name in the `package.json` file, and push your deployment and rebranding code to GitHub so that GitHub Actions can push your Docker images to DockerHub. This is because Kubernetes will pull these images to create PODs from them.* + +All commands for ocelot need to be executed in the kubernetes folder. Therefore `cd deployment/kubernetes/` is expected to be run before every command. Furthermore the given commands will install ocelot into the default namespace. This can be modified to by attaching `--namespace not.default`. + +#### Install + +Only run once for the first time of installation: + +```bash +# kubeconfig.yaml set globaly +$ helm install ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ +``` + +#### Upgrade & Update + +Run for all upgrades and updates: + +```bash +# kubeconfig.yaml set globaly +$ helm upgrade ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml upgrade ocelot ./ +``` + +#### Rollback + +Run for a rollback, in case something went wrong: + +```bash +# kubeconfig.yaml set globaly +$ helm rollback ocelot +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml rollback ocelot +``` + +#### Uninstall + +Be aware that if you uninstall ocelot the formerly bound volumes become unbound. Those volumes contain all data from uploads and database. You have to manually free their reference in order to bind them again when reinstalling. Once unbound from their former container references they should automatically be rebound (considering the sizes did not change) + +```bash +# kubeconfig.yaml set globaly +$ helm uninstall ocelot +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot +``` + +## Backups + +You can and should do [backups](/deployment/kubernetes/Backup.md) with Kubernetes for sure. + +## Error Reporting + +We use [Sentry](https://github.com/getsentry/sentry) for error reporting in both +our backend and web frontend. You can either use a hosted or a self-hosted +instance. Just set the two `DSN` in your +[configmap](../templates/configmap.template.yaml) and update the `COMMIT` +during a deployment with your commit or the version of your release. + +### Self-hosted Sentry + +For data privacy it is recommended to set up your own instance of sentry. +If you are lucky enough to have a kubernetes cluster with the required hardware +support, try this [helm chart](https://github.com/helm/charts/tree/master/stable/sentry). + +On our kubernetes cluster we get "mult-attach" errors for persistent volumes. +Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements. + +## Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster + +### Deploy A Version + +```bash +# !!! be aware of the correct kube context !!! +$ kubectl config get-contexts + +# deploy version '$BUILD_VERSION' +# !!! 'latest' is not recommended on production !!! + +# for easyness set env +$ export BUILD_VERSION=1.0.8-48-ocelot.social1.0.8-184 # example +# check this with +$ echo $BUILD_VERSION +1.0.8-48-ocelot.social1.0.8-184 + +# deploy actual version '$BUILD_VERSION' to Kubernetes cluster +$ kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-webapp +$ kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-backend +$ kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-maintenance +$ kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-neo4j +# verify deployment and wait for the pods of each deployment to get ready for cleaning and seeding of the database +$ kubectl -n default rollout status deployment/ocelot-webapp --timeout=240s +$ kubectl -n default rollout status deployment/ocelot-maintenance --timeout=240s +$ kubectl -n default rollout status deployment/ocelot-backend --timeout=240s +$ kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s +``` + +### Staging – Clean And Seed Neo4j Database + +***ATTENTION:*** Cleaning and seeding of our Neo4j database is only possible in production if env `PRODUCTION_DB_CLEAN_ALLOW=true` is set in our deployment. + +```bash +# !!! be aware of the correct kube context !!! +$ kubectl config get-contexts + +# reset and seed Neo4j database via backend for staging +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node --experimental-repl-await build/src/db/clean.js && node --experimental-repl-await build/src/db/seed.js" + + +``` diff --git a/docs/deployment/src/kubernetes/charts/.gitkeep b/docs/deployment/src/kubernetes/charts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/kubernetes/crds/.gitkeep b/docs/deployment/src/kubernetes/crds/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/kubernetes/nginx.values.yaml b/docs/deployment/src/kubernetes/nginx.values.yaml new file mode 100644 index 000000000..8035104d2 --- /dev/null +++ b/docs/deployment/src/kubernetes/nginx.values.yaml @@ -0,0 +1,13 @@ +# please duplicate template file and rename to "nginx.values.yaml" and fill in your value + +controller: + kind: DaemonSet + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + ingressClass: nginx + daemonset: + useHostPort: true + service: + type: ClusterIP +rbac: + create: true \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml b/docs/deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml new file mode 100644 index 000000000..c01745d0a --- /dev/null +++ b/docs/deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml @@ -0,0 +1,12 @@ +spec: + rules: + - host: + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: ocelot-webapp + port: + number: 3000 \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml b/docs/deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml new file mode 100644 index 000000000..8a2c5d45f --- /dev/null +++ b/docs/deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml @@ -0,0 +1,12 @@ +spec: + rules: + - host: + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: ocelot-maintenance + port: + number: 80 \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/NOTES.txt b/docs/deployment/src/kubernetes/templates/NOTES.txt new file mode 100644 index 000000000..3db4648ca --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/NOTES.txt @@ -0,0 +1 @@ +You installed ocelot-social! Congrats <3 \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/backend/ConfigMap.yml b/docs/deployment/src/kubernetes/templates/backend/ConfigMap.yml new file mode 100644 index 000000000..1222b0da0 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/backend/ConfigMap.yml @@ -0,0 +1,29 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + PRODUCTION_DB_CLEAN_ALLOW: "{{ .Values.PRODUCTION_DB_CLEAN_ALLOW }}" + PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" + CATEGORIES_ACTIVE: "{{ .Values.CATEGORIES_ACTIVE }}" + CLIENT_URI: "{{ .Values.BACKEND.CLIENT_URI }}" + EMAIL_DEFAULT_SENDER: "{{ .Values.BACKEND.EMAIL_DEFAULT_SENDER }}" + SMTP_HOST: "{{ .Values.BACKEND.SMTP_HOST }}" + SMTP_PORT: "{{ .Values.BACKEND.SMTP_PORT }}" + SMTP_IGNORE_TLS: "{{ .Values.BACKEND.SMTP_IGNORE_TLS }}" + SMTP_SECURE: "{{ .Values.BACKEND.SMTP_SECURE }}" + GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000" + NEO4J_URI: "bolt://{{ .Release.Name }}-neo4j:7687" + #REDIS_DOMAIN: ---toBeSet(IP)--- + #REDIS_PORT: "6379" + #SENTRY_DSN_WEBAPP: "---toBeSet---" + #SENTRY_DSN_BACKEND: "---toBeSet---" \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/backend/Deployment.yaml b/docs/deployment/src/kubernetes/templates/backend/Deployment.yaml new file mode 100644 index 000000000..4d0f66dbc --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/backend/Deployment.yaml @@ -0,0 +1,62 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: 1 + minReadySeconds: {{ .Values.BACKEND.MIN_READY_SECONDS }} + progressDeadlineSeconds: {{ .Values.BACKEND.PROGRESS_DEADLINE_SECONDS }} + revisionHistoryLimit: {{ .Values.BACKEND.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-backend + template: + metadata: + annotations: + backup.velero.io/backup-volumes: uploads + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + labels: + app: {{ .Release.Name }}-backend + spec: + containers: + - name: container-{{ .Release.Name }}-backend + image: "{{ .Values.BACKEND.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.BACKEND.DOCKER_IMAGE_PULL_POLICY }} + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-backend + - secretRef: + name: secret-{{ .Release.Name }}-backend + resources: + requests: + memory: {{ .Values.BACKEND.RESOURCE_REQUESTS_MEMORY | default "500M" | quote }} + limits: + memory: {{ .Values.BACKEND.RESOURCE_LIMITS_MEMORY | default "1G" | quote }} + ports: + - containerPort: 4000 + protocol: TCP + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /app/public/uploads + name: uploads + dnsPolicy: ClusterFirst + schedulerName: default-scheduler + restartPolicy: {{ .Values.BACKEND.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.BACKEND.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} + volumes: + - name: uploads + persistentVolumeClaim: + claimName: volume-claim-{{ .Release.Name }}-uploads \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml b/docs/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml new file mode 100644 index 000000000..758e9e18c --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml @@ -0,0 +1,24 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: volume-claim-{{ .Release.Name }}-uploads + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "volume-claim-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + #dataSource: + # name: uploads-snapshot + # kind: VolumeSnapshot + # apiGroup: snapshot.storage.k8s.io + storageClassName: storage-{{ .Release.Name }}-persistent + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.BACKEND.STORAGE_UPLOADS }} + diff --git a/docs/deployment/src/kubernetes/templates/backend/Secret.yaml b/docs/deployment/src/kubernetes/templates/backend/Secret.yaml new file mode 100644 index 000000000..512505694 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/backend/Secret.yaml @@ -0,0 +1,21 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: + JWT_SECRET: "{{ .Values.BACKEND.JWT_SECRET }}" + MAPBOX_TOKEN: "{{ .Values.MAPBOX_TOKEN }}" + PRIVATE_KEY_PASSPHRASE: "{{ .Values.BACKEND.PRIVATE_KEY_PASSPHRASE }}" + SMTP_USERNAME: "{{ .Values.BACKEND.SMTP_USERNAME }}" + SMTP_PASSWORD: "{{ .Values.BACKEND.SMTP_PASSWORD }}" + #NEO4J_USERNAME: "" + #NEO4J_PASSWORD: "" + #REDIS_PASSWORD: ---toBeSet--- diff --git a/docs/deployment/src/kubernetes/templates/backend/Service.yaml b/docs/deployment/src/kubernetes/templates/backend/Service.yaml new file mode 100644 index 000000000..9029be586 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/backend/Service.yaml @@ -0,0 +1,20 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-graphql + port: 4000 + targetPort: 4000 + protocol: TCP + selector: + app: {{ .Release.Name }}-backend diff --git a/docs/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml b/docs/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml new file mode 100644 index 000000000..6f82f3686 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml @@ -0,0 +1,22 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-production + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "letsencrypt-production" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: {{ .Values.LETSENCRYPT.EMAIL }} + privateKeySecretRef: + name: letsencrypt-production + solvers: + - http01: + ingress: + class: nginx diff --git a/docs/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml b/docs/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml new file mode 100644 index 000000000..e488d9335 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml @@ -0,0 +1,22 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-staging + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "letsencrypt-staging" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + acme: + server: https://acme-staging-v02.api.letsencrypt.org/directory + email: {{ .Values.LETSENCRYPT.EMAIL }} + privateKeySecretRef: + name: letsencrypt-staging + solvers: + - http01: + ingress: + class: nginx diff --git a/docs/deployment/src/kubernetes/templates/jobs/job-db-init.yaml b/docs/deployment/src/kubernetes/templates/jobs/job-db-init.yaml new file mode 100644 index 000000000..f207bd8c1 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/jobs/job-db-init.yaml @@ -0,0 +1,29 @@ +kind: Job +apiVersion: batch/v1 +metadata: + name: job-{{ .Release.Name }}-db-init + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "job-db-init" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": hook-succeeded, hook-failed + "helm.sh/hook-weight": "0" +spec: + template: + spec: + restartPolicy: Never + containers: + - name: job-{{ .Release.Name }}-db-init + image: "{{ .Values.BACKEND.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + command: ["/bin/sh", "-c", "yarn prod:migrate init"] + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-backend + - secretRef: + name: secret-{{ .Release.Name }}-backend \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml b/docs/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml new file mode 100644 index 000000000..950793db4 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml @@ -0,0 +1,29 @@ +kind: Job +apiVersion: batch/v1 +metadata: + name: job-{{ .Release.Name }}-db-migrate + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "job-db-migrate" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, hook-failed + "helm.sh/hook-weight": "5" +spec: + template: + spec: + restartPolicy: Never + containers: + - name: job-{{ .Release.Name }}-db-migrations + image: "{{ .Values.BACKEND.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + command: ["/bin/sh", "-c", "yarn prod:migrate up"] + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-backend + - secretRef: + name: secret-{{ .Release.Name }}-backend \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml b/docs/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml new file mode 100644 index 000000000..fe29afbfe --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml @@ -0,0 +1,14 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + HOST: "0.0.0.0" \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/maintenance/Deployment.yaml b/docs/deployment/src/kubernetes/templates/maintenance/Deployment.yaml new file mode 100644 index 000000000..ec37552d1 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/maintenance/Deployment.yaml @@ -0,0 +1,45 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + revisionHistoryLimit: {{ .Values.MAINTENANCE.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-maintenance + template: + metadata: + labels: + app: {{ .Release.Name }}-maintenance + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + spec: + containers: + - name: container-{{ .Release.Name }}-maintenance + image: "{{ .Values.MAINTENANCE.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.MAINTENANCE.DOCKER_IMAGE_PULL_POLICY }} + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-webapp + - secretRef: + name: secret-{{ .Release.Name }}-webapp + resources: + requests: + memory: {{ .Values.MAINTENANCE.RESOURCE_REQUESTS_MEMORY | default "500M" | quote }} + limits: + memory: {{ .Values.MAINTENANCE.RESOURCE_LIMITS_MEMORY | default "1G" | quote }} + ports: + - containerPort: 80 + restartPolicy: {{ .Values.MAINTENANCE.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.MAINTENANCE.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} diff --git a/docs/deployment/src/kubernetes/templates/maintenance/Secret.yaml b/docs/deployment/src/kubernetes/templates/maintenance/Secret.yaml new file mode 100644 index 000000000..b4752e552 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/maintenance/Secret.yaml @@ -0,0 +1,13 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: diff --git a/docs/deployment/src/kubernetes/templates/maintenance/Service.yaml b/docs/deployment/src/kubernetes/templates/maintenance/Service.yaml new file mode 100644 index 000000000..95f042df5 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/maintenance/Service.yaml @@ -0,0 +1,20 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-http + port: 80 + targetPort: 80 + protocol: TCP + selector: + app: {{ .Release.Name }}-maintenance diff --git a/docs/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml b/docs/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml new file mode 100644 index 000000000..f71f11285 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml @@ -0,0 +1,23 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + NEO4J_ACCEPT_LICENSE_AGREEMENT: "{{ .Values.NEO4J.ACCEPT_LICENSE_AGREEMENT }}" + NEO4J_AUTH: "{{ .Values.NEO4J.AUTH }}" + NEO4J_dbms_connector_bolt_thread__pool__max__size: "{{ .Values.NEO4J.DBMS_CONNECTOR_BOLT_THREAD_POOL_MAX_SIZE }}" + NEO4J_dbms_memory_heap_initial__size: "{{ .Values.NEO4J.DBMS_MEMORY_HEAP_INITIAL_SIZE }}" + NEO4J_dbms_memory_heap_max__size: "{{ .Values.NEO4J.DBMS_MEMORY_HEAP_MAX_SIZE }}" + NEO4J_dbms_memory_pagecache_size: "{{ .Values.NEO4J.DBMS_MEMORY_PAGECACHE_SIZE }}" + NEO4J_dbms_security_procedures_unrestricted: "{{ .Values.NEO4J.DBMS_SECURITY_PROCEDURES_UNRESTRICTED }}" + NEO4J_dbms_allow__format__migration: "true" + NEO4J_dbms_allow__upgrade: "true" + NEO4J_apoc_import_file_enabled: "{{ .Values.NEO4J.APOC_IMPORT_FILE_ENABLED }}" \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/neo4j/Deployment.yaml b/docs/deployment/src/kubernetes/templates/neo4j/Deployment.yaml new file mode 100644 index 000000000..96867dbb5 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/neo4j/Deployment.yaml @@ -0,0 +1,57 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: 1 + revisionHistoryLimit: {{ .Values.NEO4J.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-neo4j + template: + metadata: + name: neo4j + annotations: + backup.velero.io/backup-volumes: neo4j-data + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + labels: + app: {{ .Release.Name }}-neo4j + spec: + containers: + - name: container-{{ .Release.Name }}-neo4j + image: "{{ .Values.NEO4J.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.NEO4J.DOCKER_IMAGE_PULL_POLICY }} + ports: + - containerPort: 7687 + - containerPort: 7474 + resources: + requests: + memory: {{ .Values.NEO4J.RESOURCE_REQUESTS_MEMORY | default "1G" | quote }} + limits: + memory: {{ .Values.NEO4J.RESOURCE_LIMITS_MEMORY | default "1G" | quote }} + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-neo4j + - secretRef: + name: secret-{{ .Release.Name }}-neo4j + volumeMounts: + - mountPath: /data/ + name: neo4j-data + volumes: + - name: neo4j-data + persistentVolumeClaim: + claimName: volume-claim-{{ .Release.Name }}-neo4j + restartPolicy: {{ .Values.NEO4J.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.NEO4J.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} diff --git a/docs/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml b/docs/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml new file mode 100644 index 000000000..3aab02d9f --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml @@ -0,0 +1,19 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: volume-claim-{{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "volume-claim-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + storageClassName: storage-{{ .Release.Name }}-persistent + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.NEO4J.STORAGE }} \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/neo4j/Secret.yaml b/docs/deployment/src/kubernetes/templates/neo4j/Secret.yaml new file mode 100644 index 000000000..d8b1c17db --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/neo4j/Secret.yaml @@ -0,0 +1,15 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: + NEO4J_USERNAME: "" + NEO4J_PASSWORD: "" \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/neo4j/Service.yaml b/docs/deployment/src/kubernetes/templates/neo4j/Service.yaml new file mode 100644 index 000000000..4ed56bd3f --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/neo4j/Service.yaml @@ -0,0 +1,23 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-bolt + port: 7687 + targetPort: 7687 + protocol: TCP + #- name: {{ .Release.Name }}-http + # port: 7474 + # targetPort: 7474 + selector: + app: {{ .Release.Name }}-neo4j diff --git a/docs/deployment/src/kubernetes/templates/storage/persistent.yml b/docs/deployment/src/kubernetes/templates/storage/persistent.yml new file mode 100644 index 000000000..2ac07c5de --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/storage/persistent.yml @@ -0,0 +1,16 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: storage-{{ .Release.Name }}-persistent + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "storage-persistent" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +provisioner: {{ .Values.STORAGE.PROVISIONER }} +reclaimPolicy: {{ .Values.STORAGE.RECLAIM_POLICY }} +volumeBindingMode: {{ .Values.STORAGE.VOLUME_BINDING_MODE }} +allowVolumeExpansion: {{ .Values.STORAGE.ALLOW_VOLUME_EXPANSION }} \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/webapp/ConfigMap.yml b/docs/deployment/src/kubernetes/templates/webapp/ConfigMap.yml new file mode 100644 index 000000000..762b355cc --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/webapp/ConfigMap.yml @@ -0,0 +1,20 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + HOST: "0.0.0.0" + PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" + CATEGORIES_ACTIVE: "{{ .Values.CATEGORIES_ACTIVE }}" + COOKIE_EXPIRE_TIME: "{{ .Values.COOKIE_EXPIRE_TIME }}" + WEBSOCKETS_URI: "{{ .Values.WEBAPP.WEBSOCKETS_URI }}" + GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000" \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/webapp/Deployment.yaml b/docs/deployment/src/kubernetes/templates/webapp/Deployment.yaml new file mode 100644 index 000000000..41221185c --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/webapp/Deployment.yaml @@ -0,0 +1,49 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: {{ .Values.WEBAPP.REPLICAS }} + minReadySeconds: {{ .Values.WEBAPP.MIN_READY_SECONDS }} + progressDeadlineSeconds: {{ .Values.WEBAPP.PROGRESS_DEADLINE_SECONDS }} + revisionHistoryLimit: {{ .Values.WEBAPP.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-webapp + template: + metadata: + annotations: + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + labels: + app: {{ .Release.Name }}-webapp + spec: + containers: + - name: container-{{ .Release.Name }}-webapp + image: "{{ .Values.WEBAPP.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.WEBAPP.DOCKER_IMAGE_PULL_POLICY }} + ports: + - containerPort: 3000 + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-webapp + - secretRef: + name: secret-{{ .Release.Name }}-webapp + resources: + requests: + memory: {{ .Values.WEBAPP.RESOURCE_REQUESTS_MEMORY | default "500M" | quote }} + limits: + memory: {{ .Values.WEBAPP.RESOURCE_LIMITS_MEMORY | default "1G" | quote }} + restartPolicy: {{ .Values.WEBAPP.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.WEBAPP.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/webapp/Ingress.yaml b/docs/deployment/src/kubernetes/templates/webapp/Ingress.yaml new file mode 100644 index 000000000..d7b12bdc8 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/webapp/Ingress.yaml @@ -0,0 +1,36 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: ingress-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "ingress-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + kubernetes.io/ingress.class: "nginx" + cert-manager.io/cluster-issuer: {{ .Values.LETSENCRYPT.ISSUER }} + nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.NGINX.PROXY_BODY_SIZE }} +spec: + tls: + - hosts: + {{- range .Values.LETSENCRYPT.DOMAINS }} + - {{ . }} + {{- end }} + secretName: tls + rules: + {{- range .Values.LETSENCRYPT.DOMAINS }} + - host: {{ . }} + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: {{ $.Release.Name }}-webapp + port: + number: 3000 + {{- end }} \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/webapp/Secret.yaml b/docs/deployment/src/kubernetes/templates/webapp/Secret.yaml new file mode 100644 index 000000000..8c0fd9d39 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/webapp/Secret.yaml @@ -0,0 +1,14 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: + MAPBOX_TOKEN: "{{ .Values.MAPBOX_TOKEN }}" \ No newline at end of file diff --git a/docs/deployment/src/kubernetes/templates/webapp/Service.yaml b/docs/deployment/src/kubernetes/templates/webapp/Service.yaml new file mode 100644 index 000000000..0c3112e77 --- /dev/null +++ b/docs/deployment/src/kubernetes/templates/webapp/Service.yaml @@ -0,0 +1,20 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-http + port: 3000 + targetPort: 3000 + protocol: TCP + selector: + app: {{ .Release.Name }}-webapp diff --git a/docs/deployment/src/old/Maintenance.md b/docs/deployment/src/old/Maintenance.md new file mode 100644 index 000000000..08a177e65 --- /dev/null +++ b/docs/deployment/src/old/Maintenance.md @@ -0,0 +1,45 @@ +# Maintenance mode + +> Despite our best efforts, systems sometimes require downtime for a variety of reasons. + +Quote from [here](https://www.nrmitchi.com/2017/11/easy-maintenance-mode-in-kubernetes/) + +We use our maintenance mode for manual database backup and restore. Also we +bring the database into maintenance mode for manual database migrations. + +## Deploy the service + +We prepared sample configuration, so you can simply run: + +```sh +# in folder deployment/ +$ kubectl apply -f ./ocelot-social/maintenance/ +``` + +This will fire up a maintenance service. + +## Bring application into maintenance mode + +Now if you want to have a controlled downtime and you want to bring your +application into maintenance mode, you can edit your global ingress server. + +E.g. copy file [`deployment/digital-ocean/https/templates/ingress.template.yaml`](../../digital-ocean/https/templates/ingress.template.yaml) to new file `deployment/digital-ocean/https/ingress.yaml` and change the following: + +```yaml +... + + - host: develop-k8s.ocelot.social + http: + paths: + - path: / + backend: + # serviceName: web + serviceName: maintenance + # servicePort: 3000 + servicePort: 80 +``` + +Then run `$ kubectl apply -f deployment/digital-ocean/https/ingress.yaml`. If you +want to deactivate the maintenance server, just undo the edit and apply the +configuration again. + diff --git a/docs/deployment/src/old/digital-ocean/README.md b/docs/deployment/src/old/digital-ocean/README.md new file mode 100644 index 000000000..c5893f645 --- /dev/null +++ b/docs/deployment/src/old/digital-ocean/README.md @@ -0,0 +1,39 @@ +# DigitalOcean + +As a start, read the [introduction into Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) by the folks at DigitalOcean. The following section should enable you to deploy ocelot.social to your Kubernetes cluster. + +## Connect to your local cluster + +1. Create a cluster at [DigitalOcean](https://www.digitalocean.com/). +2. Download the `***-kubeconfig.yaml` from the Web UI. +3. Move the file to the default location where kubectl expects it to be: `mv ***-kubeconfig.yaml ~/.kube/config`. Alternatively you can set the config on every command: `--kubeconfig ***-kubeconfig.yaml` +4. Now check if you can connect to the cluster and if its your newly created one by running: `kubectl get nodes` + +The output should look about like this: + +```sh +$ kubectl get nodes +NAME STATUS ROLES AGE VERSION +nifty-driscoll-uu1w Ready 69d v1.13.2 +nifty-driscoll-uuiw Ready 69d v1.13.2 +nifty-driscoll-uusn Ready 69d v1.13.2 +``` + +If you got the steps right above and see your nodes you can continue. + +DigitalOcean 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, i.e. `ocelot-social-uploads`. + +After configuring `s3cmd` with your credentials, etc. you should be able to make a backup with this command. + +```sh +s3cmg get --recursive --skip-existing s3://ocelot-social-uploads +``` diff --git a/docs/deployment/src/old/digital-ocean/dashboard/README.md b/docs/deployment/src/old/digital-ocean/dashboard/README.md new file mode 100644 index 000000000..5f66afe0b --- /dev/null +++ b/docs/deployment/src/old/digital-ocean/dashboard/README.md @@ -0,0 +1,55 @@ +# Install Kubernetes Dashboard + +The kubernetes dashboard is optional but very helpful for debugging. If you want to install it, you have to do so only **once** per cluster: + +```bash +# in folder deployment/digital-ocean/ +$ kubectl apply -f dashboard/ +$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml +``` + +### Login to your dashboard + +Proxy the remote kubernetes dashboard to localhost: + +```bash +$ kubectl proxy +``` + +Visit: + +[http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/](http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/) + +You should see a login screen. + +To get your token for the dashboard you can run this command: + +```bash +$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') +``` + +It should print something like: + +```text +Name: admin-user-token-6gl6l +Namespace: kube-system +Labels: +Annotations: kubernetes.io/service-account.name=admin-user + kubernetes.io/service-account.uid=b16afba9-dfec-11e7-bbb9-901b0e532516 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1025 bytes +namespace: 11 bytes +token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTZnbDZsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMTZhZmJhOS1kZmVjLTExZTctYmJiOS05MDFiMGU1MzI1MTYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.M70CU3lbu3PP4OjhFms8PVL5pQKj-jj4RNSLA4YmQfTXpPUuxqXjiTf094_Rzr0fgN_IVX6gC4fiNUL5ynx9KU-lkPfk0HnX8scxfJNzypL039mpGt0bbe1IXKSIRaq_9VW59Xz-yBUhycYcKPO9RM2Qa1Ax29nqNVko4vLn1_1wPqJ6XSq3GYI8anTzV8Fku4jasUwjrws6Cn6_sPEGmL54sq5R4Z5afUtv-mItTmqZZdxnkRqcJLlg2Y8WbCPogErbsaCDJoABQ7ppaqHetwfM_0yMun6ABOQbIwwl8pspJhpplKwyo700OSpvTT9zlBsu-b35lzXGBRHzv5g_RA +``` + +Grab the token from above and paste it into the [login screen](http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/) + +When you are logged in, you should see sth. like: + +![Dashboard](./dashboard-screenshot.png) + +Feel free to save the login token from above in your password manager. Unlike the `kubeconfig` file, this token does not expire. diff --git a/docs/deployment/src/old/digital-ocean/dashboard/admin-user.yaml b/docs/deployment/src/old/digital-ocean/dashboard/admin-user.yaml new file mode 100644 index 000000000..27b6bb802 --- /dev/null +++ b/docs/deployment/src/old/digital-ocean/dashboard/admin-user.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: admin-user + namespace: kube-system diff --git a/docs/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png b/docs/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png new file mode 100644 index 000000000..6aefb5414 Binary files /dev/null and b/docs/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png differ diff --git a/docs/deployment/src/old/digital-ocean/dashboard/role-binding.yaml b/docs/deployment/src/old/digital-ocean/dashboard/role-binding.yaml new file mode 100644 index 000000000..faa8927a2 --- /dev/null +++ b/docs/deployment/src/old/digital-ocean/dashboard/role-binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: admin-user +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: admin-user + namespace: kube-system diff --git a/docs/deployment/src/old/digital-ocean/https/README.md b/docs/deployment/src/old/digital-ocean/https/README.md new file mode 100644 index 000000000..8cfaabde4 --- /dev/null +++ b/docs/deployment/src/old/digital-ocean/https/README.md @@ -0,0 +1,126 @@ +## Create Letsencrypt Issuers and Ingress Services + +Copy the configuration templates and change the file according to your needs. + +```bash +# in folder deployment/digital-ocean/https/ +cp templates/issuer.template.yaml ./issuer.yaml +cp templates/ingress.template.yaml ./ingress.yaml +``` + +At least, **change email addresses** in `issuer.yaml`. For sure you also want +to _change the domain name_ in `ingress.yaml`. + +Once you are done, apply the configuration: + +```bash +# in folder deployment/digital-ocean/https/ +$ kubectl apply -f . +``` + +{% hint style="info" %} +CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore. +And to create a load balancer costs money. Please refine the following documentation if required. +{% endhint %} + +{% tabs %} +{% tab title="Without Load Balancer" %} + +A solution without a load balance you can find [here](../no-loadbalancer/README.md). + +{% endtab %} +{% tab title="With DigitalOcean Load Balancer" %} + +{% hint style="info" %} +CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore. +Please refine the following documentation if required. +{% endhint %} + +In earlier days by now, your cluster should have a load balancer assigned with an external IP +address. On DigitalOcean, this is how it should look like: + +![Screenshot of DigitalOcean dashboard showing external ip address](./ip-address.png) + +If the load balancer isn't created automatically you have to create it your self on DigitalOcean under Networks. +In case you don't need a DigitalOcean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`. + +{% endtab %} +{% endtabs %} + +Check the ingress server is working correctly: + +```bash +$ curl -kivL -H 'Host: ' 'https://' + +``` + +If the response looks good, configure your domain registrar for the new IP address and the domain. + +Now let's get a valid HTTPS certificate. According to the tutorial above, check your tls certificate for staging: + +```bash +$ kubectl -n ocelot-social describe certificate tls +< +... +Spec: + ... + Issuer Ref: + Group: cert-manager.io + Kind: ClusterIssuer + Name: letsencrypt-staging +... +Events: + +> +$ kubectl -n ocelot-social describe secret tls +< +... +Annotations: ... + cert-manager.io/issuer-kind: ClusterIssuer + cert-manager.io/issuer-name: letsencrypt-staging +... +> +``` + +If everything looks good, update the cluster-issuer of your ingress. Change the annotation `cert-manager.io/cluster-issuer` from `letsencrypt-staging` (for testing by getting a dummy certificate – no blocking by letsencrypt, because of to many request cycles) to `letsencrypt-prod` (for production with a real certificate – possible blocking by letsencrypt for several days, because of to many request cycles) in your ingress configuration in `ingress.yaml`. + +```bash +# in folder deployment/digital-ocean/https/ +$ kubectl apply -f ingress.yaml +``` + +Take a minute and have a look if the certificate is now newly generated by `letsencrypt-prod`, the cluster-issuer for production: + +```bash +$ kubectl -n ocelot-social describe certificate tls +< +... +Spec: + ... + Issuer Ref: + Group: cert-manager.io + Kind: ClusterIssuer + Name: letsencrypt-prod +... +Events: + +> +$ kubectl -n ocelot-social describe secret tls +< +... +Annotations: ... + cert-manager.io/issuer-kind: ClusterIssuer + cert-manager.io/issuer-name: letsencrypt-prod +... +> +``` + +In case the certificate is not newly created delete the former secret to force a refresh: + +```bash +$ kubectl -n ocelot-social delete secret tls +``` + +Now, HTTPS should be configured on your domain. Congrats! + +For troubleshooting have a look at the cert-manager's [Troubleshooting](https://cert-manager.io/docs/faq/troubleshooting/) or [Troubleshooting Issuing ACME Certificates](https://cert-manager.io/docs/faq/acme/). diff --git a/docs/deployment/src/old/digital-ocean/https/ip-address.png b/docs/deployment/src/old/digital-ocean/https/ip-address.png new file mode 100644 index 000000000..db523156a Binary files /dev/null and b/docs/deployment/src/old/digital-ocean/https/ip-address.png differ diff --git a/docs/deployment/src/old/legacy-migration/README.md b/docs/deployment/src/old/legacy-migration/README.md new file mode 100644 index 000000000..66100a3c8 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/README.md @@ -0,0 +1,85 @@ +# Legacy data migration + +This setup is **completely optional** and only required if you have data on a +server which is running our legacy code and you want to import that data. It +will import the uploads folder and migrate a dump of the legacy Mongo database +into our new Neo4J graph database. + +## Configure Maintenance-Worker Pod + +Create a configmap with the specific connection data of your legacy server: + +```bash +$ kubectl create configmap maintenance-worker \ + -n ocelot-social \ + --from-literal=SSH_USERNAME=someuser \ + --from-literal=SSH_HOST=yourhost \ + --from-literal=MONGODB_USERNAME=hc-api \ + --from-literal=MONGODB_PASSWORD=secretpassword \ + --from-literal=MONGODB_AUTH_DB=hc_api \ + --from-literal=MONGODB_DATABASE=hc_api \ + --from-literal=UPLOADS_DIRECTORY=/var/www/api/uploads +``` + +Create a secret with your public and private ssh keys. As the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/secret/#use-case-pod-with-ssh-keys) points out, you should be careful with your ssh keys. Anyone with access to your cluster will have access to your ssh keys. Better create a new pair with `ssh-keygen` and copy the public key to your legacy server with `ssh-copy-id`: + +```bash +$ kubectl create secret generic ssh-keys \ + -n ocelot-social \ + --from-file=id_rsa=/path/to/.ssh/id_rsa \ + --from-file=id_rsa.pub=/path/to/.ssh/id_rsa.pub \ + --from-file=known_hosts=/path/to/.ssh/known_hosts +``` + +## Deploy a Temporary Maintenance-Worker Pod + +Bring the application into maintenance mode. + +{% hint style="info" %} TODO: implement maintenance mode {% endhint %} + + +Then temporarily delete backend and database deployments + +```bash +$ kubectl -n ocelot-social get deployments +NAME READY UP-TO-DATE AVAILABLE AGE +backend 1/1 1 1 3d11h +neo4j 1/1 1 1 3d11h +webapp 2/2 2 2 73d +$ kubectl -n ocelot-social delete deployment neo4j +deployment.extensions "neo4j" deleted +$ kubectl -n ocelot-social delete deployment backend +deployment.extensions "backend" deleted +``` + +Deploy one-time develop-maintenance-worker pod: + +```bash +# in deployment/legacy-migration/ +$ kubectl apply -f maintenance-worker.yaml +pod/develop-maintenance-worker created +``` + +Import legacy database and uploads: + +```bash +$ kubectl -n ocelot-social exec -it develop-maintenance-worker bash +$ import_legacy_db +$ import_legacy_uploads +$ exit +``` + +Delete the pod when you're done: + +```bash +$ kubectl -n ocelot-social delete pod develop-maintenance-worker +``` + +Oh, and of course you have to get those deleted deployments back. One way of +doing it would be: + +```bash +# in folder deployment/ +$ kubectl apply -f human-connection/deployment-backend.yaml -f human-connection/deployment-neo4j.yaml +``` + diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker.yaml b/docs/deployment/src/old/legacy-migration/maintenance-worker.yaml new file mode 100644 index 000000000..d8b118b67 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker.yaml @@ -0,0 +1,40 @@ +--- + kind: Pod + apiVersion: v1 + metadata: + name: develop-maintenance-worker + namespace: ocelot-social + spec: + containers: + - name: develop-maintenance-worker + image: ocelotsocialnetwork/develop-maintenance-worker:latest + imagePullPolicy: Always + resources: + requests: + memory: "2G" + limits: + memory: "8G" + envFrom: + - configMapRef: + name: maintenance-worker + - configMapRef: + name: configmap + volumeMounts: + - name: secret-volume + readOnly: false + mountPath: /root/.ssh + - name: uploads + mountPath: /uploads + - name: neo4j-data + mountPath: /data/ + volumes: + - name: secret-volume + secret: + secretName: ssh-keys + defaultMode: 0400 + - name: uploads + persistentVolumeClaim: + claimName: uploads-claim + - name: neo4j-data + persistentVolumeClaim: + claimName: neo4j-data-claim diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore b/docs/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore new file mode 100644 index 000000000..59ba63a8b --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore @@ -0,0 +1 @@ +.ssh/ diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/.gitignore b/docs/deployment/src/old/legacy-migration/maintenance-worker/.gitignore new file mode 100644 index 000000000..485bc00e6 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/.gitignore @@ -0,0 +1,2 @@ +.ssh/ +ssh/ \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile b/docs/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile new file mode 100644 index 000000000..760cc06c8 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile @@ -0,0 +1,21 @@ +FROM ocelotsocialnetwork/develop-neo4j:latest + +ENV NODE_ENV=maintenance +EXPOSE 7687 7474 + +ENV BUILD_DEPS="gettext" \ + RUNTIME_DEPS="libintl" + +RUN set -x && \ + apk add --update $RUNTIME_DEPS && \ + apk add --virtual build_deps $BUILD_DEPS && \ + cp /usr/bin/envsubst /usr/local/bin/envsubst && \ + apk del build_deps + + +RUN apk upgrade --update +RUN apk add --no-cache mongodb-tools openssh nodejs yarn rsync + +COPY known_hosts /root/.ssh/known_hosts +COPY migration /migration +COPY ./binaries/* /usr/local/bin/ diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle b/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle new file mode 100644 index 000000000..f5b1b2454 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +tail -f /dev/null diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db b/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db new file mode 100644 index 000000000..6ffdf8e3f --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e +for var in "SSH_USERNAME" "SSH_HOST" "MONGODB_USERNAME" "MONGODB_PASSWORD" "MONGODB_DATABASE" "MONGODB_AUTH_DB" +do + if [[ -z "${!var}" ]]; then + echo "${var} is undefined" + exit 1 + fi +done + +/migration/mongo/export.sh +/migration/neo4j/import.sh diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads b/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads new file mode 100644 index 000000000..5c0b67d74 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e + +# import .env config +set -o allexport +source $(dirname "$0")/.env +set +o allexport + +for var in "SSH_USERNAME" "SSH_HOST" "UPLOADS_DIRECTORY" +do + if [[ -z "${!var}" ]]; then + echo "${var} is undefined" + exit 1 + fi +done + +rsync --archive --update --verbose ${SSH_USERNAME}@${SSH_HOST}:${UPLOADS_DIRECTORY}/ ${OUTPUT_DIRECTORY} diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/known_hosts b/docs/deployment/src/old/legacy-migration/maintenance-worker/known_hosts new file mode 100644 index 000000000..947840cb2 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/known_hosts @@ -0,0 +1,3 @@ +|1|GuOYlVEhTowidPs18zj9p5F2j3o=|sDHJYLz9Ftv11oXeGEjs7SpVyg0= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBM5N29bI5CeKu1/RBPyM2fwyf7fuajOO+tyhKe1+CC2sZ1XNB5Ff6t6MtCLNRv2mUuvzTbW/HkisDiA5tuXUHOk= +|1|2KP9NV+Q5g2MrtjAeFSVcs8YeOI=|nf3h4wWVwC4xbBS1kzgzE2tBldk= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhRK6BeIEUxXlS0z/pOfkUkSPfn33g4J1U3L+MyUQYHm+7agT08799ANJhnvELKE1tt4Vx80I9UR81oxzZcy3E= +|1|HonYIRNhKyroUHPKU1HSZw0+Qzs=|5T1btfwFBz2vNSldhqAIfTbfIgQ= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhRK6BeIEUxXlS0z/pOfkUkSPfn33g4J1U3L+MyUQYHm+7agT08799ANJhnvELKE1tt4Vx80I9UR81oxzZcy3E= diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh new file mode 100644 index 000000000..b56ace87a --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +set -e + +# import .env config +set -o allexport +source $(dirname "$0")/.env +set +o allexport + +# Export collection function defintion +function export_collection () { + "${EXPORT_MONGOEXPORT_BIN}" --db ${MONGODB_DATABASE} --host localhost -d ${MONGODB_DATABASE} --port 27018 --username ${MONGODB_USERNAME} --password ${MONGODB_PASSWORD} --authenticationDatabase ${MONGODB_AUTH_DB} --collection $1 --out "${EXPORT_PATH}$1.json" + mkdir -p ${EXPORT_PATH}splits/$1/ + split -l ${MONGO_EXPORT_SPLIT_SIZE} -a 3 ${EXPORT_PATH}$1.json ${EXPORT_PATH}splits/$1/ +} + +# Export collection with query function defintion +function export_collection_query () { + "${EXPORT_MONGOEXPORT_BIN}" --db ${MONGODB_DATABASE} --host localhost -d ${MONGODB_DATABASE} --port 27018 --username ${MONGODB_USERNAME} --password ${MONGODB_PASSWORD} --authenticationDatabase ${MONGODB_AUTH_DB} --collection $1 --out "${EXPORT_PATH}$1_$3.json" --query "$2" + mkdir -p ${EXPORT_PATH}splits/$1_$3/ + split -l ${MONGO_EXPORT_SPLIT_SIZE} -a 3 ${EXPORT_PATH}$1_$3.json ${EXPORT_PATH}splits/$1_$3/ +} + +# Delete old export & ensure directory +rm -rf ${EXPORT_PATH}* +mkdir -p ${EXPORT_PATH} + +# Open SSH Tunnel +ssh -4 -M -S my-ctrl-socket -fnNT -L 27018:localhost:27017 -l ${SSH_USERNAME} ${SSH_HOST} + +# Export all Data from the Alpha to json and split them up +export_collection "badges" +export_collection "categories" +export_collection "comments" +export_collection_query "contributions" '{"type": "DELETED"}' "DELETED" +export_collection_query "contributions" '{"type": "post"}' "post" +# export_collection_query "contributions" '{"type": "cando"}' "cando" +export_collection "emotions" +# export_collection_query "follows" '{"foreignService": "organizations"}' "organizations" +export_collection_query "follows" '{"foreignService": "users"}' "users" +# export_collection "invites" +# export_collection "organizations" +# export_collection "pages" +# export_collection "projects" +# export_collection "settings" +export_collection "shouts" +# export_collection "status" +export_collection_query "users" '{"isVerified": true }' "verified" +# export_collection "userscandos" +# export_collection "usersettings" + +# Close SSH Tunnel +ssh -S my-ctrl-socket -O check -l ${SSH_USERNAME} ${SSH_HOST} +ssh -S my-ctrl-socket -O exit -l ${SSH_USERNAME} ${SSH_HOST} diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql new file mode 100644 index 000000000..adf63dc1f --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql @@ -0,0 +1,52 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] image: { +[?] path: { // Path is incorrect in Nitro - is icon the correct name for this field? +[X] type: String, +[X] required: true + }, +[ ] alt: { // If we use an image - should we not have an alt? +[ ] type: String, +[ ] required: true + } + }, +[?] status: { +[X] type: String, +[X] enum: ['permanent', 'temporary'], +[ ] default: 'permanent', // Default value is missing in Nitro +[X] required: true + }, +[?] type: { +[?] type: String, // in nitro this is a defined enum - seems good for now +[X] required: true + }, +[X] id: { +[X] type: String, +[X] required: true + }, +[?] createdAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as badge +MERGE(b:Badge {id: badge._id["$oid"]}) +ON CREATE SET +b.id = badge.key, +b.type = badge.type, +b.icon = replace(badge.image.path, 'https://api-alpha.human-connection.org', ''), +b.status = badge.status, +b.createdAt = badge.createdAt.`$date`, +b.updatedAt = badge.updatedAt.`$date` +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql new file mode 100644 index 000000000..2a6f8c244 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql @@ -0,0 +1 @@ +MATCH (n:Badge) DETACH DELETE n; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql new file mode 100644 index 000000000..5d4958876 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql @@ -0,0 +1,129 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[X] title: { +[X] type: String, +[X] required: true + }, +[?] slug: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[ ] unique: true // Unique value is not enforced in Nitro? + }, +[?] icon: { // Nitro adds required: true +[X] type: String, +[ ] unique: true // Unique value is not enforced in Nitro? + }, +[?] createdAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as category +MERGE(c:Category {id: category._id["$oid"]}) +ON CREATE SET +c.name = category.title, +c.slug = category.slug, +c.icon = category.icon, +c.createdAt = category.createdAt.`$date`, +c.updatedAt = category.updatedAt.`$date` +; + +// Transform icon names +MATCH (c:Category) +WHERE (c.icon = "categories-justforfun") +SET c.icon = 'smile' +SET c.slug = 'just-for-fun' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-luck") +SET c.icon = 'heart-o' +SET c.slug = 'happiness-values' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-health") +SET c.icon = 'medkit' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-environment") +SET c.icon = 'tree' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-animal-justice") +SET c.icon = 'paw' +SET c.slug = 'animal-protection' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-human-rights") +SET c.icon = 'balance-scale' +SET c.slug = 'human-rights-justice' + +; + +MATCH (c:Category) +WHERE (c.icon = "categories-education") +SET c.icon = 'graduation-cap' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-cooperation") +SET c.icon = 'users' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-politics") +SET c.icon = 'university' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-economy") +SET c.icon = 'money' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-technology") +SET c.icon = 'flash' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-internet") +SET c.icon = 'mouse-pointer' +SET c.slug = 'it-internet-data-privacy' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-art") +SET c.icon = 'paint-brush' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-freedom-of-speech") +SET c.icon = 'bullhorn' +SET c.slug = 'freedom-of-speech' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-sustainability") +SET c.icon = 'shopping-cart' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-peace") +SET c.icon = 'angellist' +SET c.slug = 'global-peace-nonviolence' +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql new file mode 100644 index 000000000..c06b5ef2b --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql @@ -0,0 +1 @@ +MATCH (n:Category) DETACH DELETE n; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql new file mode 100644 index 000000000..083f9f762 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql @@ -0,0 +1,67 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] userId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[?] contributionId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[X] content: { +[X] type: String, +[X] required: true + }, +[?] contentExcerpt: { // Generated from content +[X] type: String, +[ ] required: true // Not required in Nitro + }, +[ ] hasMore: { type: Boolean }, +[ ] upvotes: { +[ ] type: Array, +[ ] default: [] + }, +[ ] upvoteCount: { +[ ] type: Number, +[ ] default: 0 + }, +[?] deleted: { +[X] type: Boolean, +[ ] default: false, // Default value is missing in Nitro +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as comment +MERGE (c:Comment {id: comment._id["$oid"]}) +ON CREATE SET +c.content = comment.content, +c.contentExcerpt = comment.contentExcerpt, +c.deleted = comment.deleted, +c.createdAt = comment.createdAt.`$date`, +c.updatedAt = comment.updatedAt.`$date`, +c.disabled = false +WITH c, comment, comment.contributionId as postId +MATCH (post:Post {id: postId}) +WITH c, post, comment.userId as userId +MATCH (author:User {id: userId}) +MERGE (c)-[:COMMENTS]->(post) +MERGE (author)-[:WROTE]->(c) +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql new file mode 100644 index 000000000..c4a7961c5 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql @@ -0,0 +1 @@ +MATCH (n:Comment) DETACH DELETE n; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql new file mode 100644 index 000000000..f09b5ad71 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql @@ -0,0 +1,156 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro +[?] { //Modeled incorrect as Post +[?] userId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[ ] organizationId: { +[ ] type: String, +[-] index: true + }, +[X] categoryIds: { +[X] type: Array, +[-] index: true + }, +[X] title: { +[X] type: String, +[X] required: true + }, +[?] slug: { // Generated from title +[X] type: String, +[ ] required: true, // Not required in Nitro +[?] unique: true, // Unique value is not enforced in Nitro? +[-] index: true + }, +[ ] type: { // db.getCollection('contributions').distinct('type') -> 'DELETED', 'cando', 'post' +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] cando: { +[ ] difficulty: { +[ ] type: String, +[ ] enum: ['easy', 'medium', 'hard'] + }, +[ ] reasonTitle: { type: String }, +[ ] reason: { type: String } + }, +[X] content: { +[X] type: String, +[X] required: true + }, +[?] contentExcerpt: { // Generated from content +[X] type: String, +[?] required: true // Not required in Nitro + }, +[ ] hasMore: { type: Boolean }, +[X] teaserImg: { type: String }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] shoutCount: { +[ ] type: Number, +[ ] default: 0, +[-] index: true + }, +[ ] meta: { +[ ] hasVideo: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] embedds: { +[ ] type: Object, +[ ] default: {} + } + }, +[?] visibility: { +[X] type: String, +[X] enum: ['public', 'friends', 'private'], +[ ] default: 'public', // Default value is missing in Nitro +[-] index: true + }, +[?] isEnabled: { +[X] type: Boolean, +[ ] default: true, // Default value is missing in Nitro +[-] index: true + }, +[?] tags: { type: Array }, // ensure this is working properly +[ ] emotions: { +[ ] type: Object, +[-] index: true, +[ ] default: { +[ ] angry: { +[ ] count: 0, +[ ] percent: 0 +[ ] }, +[ ] cry: { +[ ] count: 0, +[ ] percent: 0 +[ ] }, +[ ] surprised: { +[ ] count: 0, +[ ] percent: 0 + }, +[ ] happy: { +[ ] count: 0, +[ ] percent: 0 + }, +[ ] funny: { +[ ] count: 0, +[ ] percent: 0 + } + } + }, +[?] deleted: { // THis field is not always present in the alpha-data +[?] type: Boolean, +[ ] default: false, // Default value is missing in Nitro +[-] index: true + }, +[?] createdAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[ ] wasSeeded: { type: Boolean } + } +*/ +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as post +MERGE (p:Post {id: post._id["$oid"]}) +ON CREATE SET +p.title = post.title, +p.slug = post.slug, +p.image = replace(post.teaserImg, 'https://api-alpha.human-connection.org', ''), +p.content = post.content, +p.contentExcerpt = post.contentExcerpt, +p.visibility = toLower(post.visibility), +p.createdAt = post.createdAt.`$date`, +p.updatedAt = post.updatedAt.`$date`, +p.deleted = COALESCE(post.deleted, false), +p.disabled = COALESCE(NOT post.isEnabled, false) +WITH p, post +MATCH (u:User {id: post.userId}) +MERGE (u)-[:WROTE]->(p) +WITH p, post, post.categoryIds as categoryIds +UNWIND categoryIds AS categoryId +MATCH (c:Category {id: categoryId}) +MERGE (p)-[:CATEGORIZED]->(c) +WITH p, post.tags AS tags +UNWIND tags AS tag +WITH apoc.text.replace(tag, '[^\\p{L}0-9]', '') as tagNoSpacesAllowed +CALL apoc.when(tagNoSpacesAllowed =~ '^((\\p{L}+[\\p{L}0-9]*)|([0-9]+\\p{L}+[\\p{L}0-9]*))$', 'RETURN tagNoSpacesAllowed', '', {tagNoSpacesAllowed: tagNoSpacesAllowed}) +YIELD value as validated +WHERE validated.tagNoSpacesAllowed IS NOT NULL +MERGE (t:Tag { id: validated.tagNoSpacesAllowed, disabled: false, deleted: false }) +MERGE (p)-[:TAGGED]->(t) +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql new file mode 100644 index 000000000..70adad664 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql @@ -0,0 +1,2 @@ +MATCH (n:Post) DETACH DELETE n; +MATCH (n:Tag) DETACH DELETE n; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql new file mode 100644 index 000000000..d01871300 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql @@ -0,0 +1 @@ +MATCH (n) DETACH DELETE n; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql new file mode 100644 index 000000000..18fb6699f --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql @@ -0,0 +1 @@ +MATCH (u:User)-[e:EMOTED]->(c:Post) DETACH DELETE e; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql new file mode 100644 index 000000000..06341f277 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql @@ -0,0 +1,58 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[X] userId: { +[X] type: String, +[X] required: true, +[-] index: true + }, +[X] contributionId: { +[X] type: String, +[X] required: true, +[-] index: true + }, +[?] rated: { +[X] type: String, +[ ] required: true, +[?] enum: ['funny', 'happy', 'surprised', 'cry', 'angry'] + }, +[X] createdAt: { +[X] type: Date, +[X] default: Date.now + }, +[X] updatedAt: { +[X] type: Date, +[X] default: Date.now + }, +[-] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as emotion +MATCH (u:User {id: emotion.userId}), + (c:Post {id: emotion.contributionId}) +MERGE (u)-[e:EMOTED { + id: emotion._id["$oid"], + emotion: emotion.rated, + createdAt: datetime(emotion.createdAt.`$date`), + updatedAt: datetime(emotion.updatedAt.`$date`) + }]->(c) +RETURN e; +/* + // Queries + // user sets an emotion emotion: + // MERGE (u)-[e:EMOTED {id: ..., emotion: "funny", createdAt: ..., updatedAt: ...}]->(c) + // user removes emotion + // MATCH (u)-[e:EMOTED]->(c) DELETE e + // contribution distributions over every `emotion` property value for one post + // MATCH (u:User)-[e:EMOTED]->(c:Post {id: "5a70bbc8508f5b000b443b1a"}) RETURN e.emotion,COUNT(e.emotion) + // contribution distributions over every `emotion` property value for one user (advanced - "whats the primary emotion used by the user?") + // MATCH (u:User{id:"5a663b1ac64291000bf302a1"})-[e:EMOTED]->(c:Post) RETURN e.emotion,COUNT(e.emotion) + // contribution distributions over every `emotion` property value for all posts created by one user (advanced - "how do others react to my contributions?") + // MATCH (u:User)-[e:EMOTED]->(c:Post)<-[w:WROTE]-(a:User{id:"5a663b1ac64291000bf302a1"}) RETURN e.emotion,COUNT(e.emotion) + // if we can filter the above an a variable timescale that would be great (should be possible on createdAt and updatedAt fields) +*/ \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql new file mode 100644 index 000000000..3de01f8ea --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql @@ -0,0 +1 @@ +MATCH (u1:User)-[f:FOLLOWS]->(u2:User) DETACH DELETE f; \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql new file mode 100644 index 000000000..fac858a9a --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql @@ -0,0 +1,36 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] userId: { +[-] type: String, +[ ] required: true, +[-] index: true + }, +[?] foreignId: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[?] foreignService: { // db.getCollection('follows').distinct('foreignService') returns 'organizations' and 'users' +[ ] type: String, +[ ] required: true, +[ ] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[?] { userId: 1, foreignId: 1, foreignService: 1 },{ unique: true } // is the unique constrain modeled? +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as follow +MATCH (u1:User {id: follow.userId}), (u2:User {id: follow.foreignId}) +MERGE (u1)-[:FOLLOWS]->(u2) +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh new file mode 100644 index 000000000..ccb22dafb --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh @@ -0,0 +1,108 @@ +#!/usr/bin/env bash +set -e + +# import .env config +set -o allexport +source $(dirname "$0")/.env +set +o allexport + +# Delete collection function defintion +function delete_collection () { + # Delete from Database + echo "Delete $2" + "${IMPORT_CYPHERSHELL_BIN}" < $(dirname "$0")/$1/delete.cql > /dev/null + # Delete index file + rm -f "${IMPORT_PATH}splits/$2.index" +} + +# Import collection function defintion +function import_collection () { + # index file of those chunks we have already imported + INDEX_FILE="${IMPORT_PATH}splits/$1.index" + # load index file + if [ -f "$INDEX_FILE" ]; then + readarray -t IMPORT_INDEX <$INDEX_FILE + else + declare -a IMPORT_INDEX + fi + # for each chunk import data + for chunk in ${IMPORT_PATH}splits/$1/* + do + CHUNK_FILE_NAME=$(basename "${chunk}") + # does the index not contain the chunk file name? + if [[ ! " ${IMPORT_INDEX[@]} " =~ " ${CHUNK_FILE_NAME} " ]]; then + # calculate the path of the chunk + export IMPORT_CHUNK_PATH_CQL_FILE="${IMPORT_CHUNK_PATH_CQL}$1/${CHUNK_FILE_NAME}" + # load the neo4j command and replace file variable with actual path + NEO4J_COMMAND="$(envsubst '${IMPORT_CHUNK_PATH_CQL_FILE}' < $(dirname "$0")/$2)" + # run the import of the chunk + echo "Import $1 ${CHUNK_FILE_NAME} (${chunk})" + echo "${NEO4J_COMMAND}" | "${IMPORT_CYPHERSHELL_BIN}" > /dev/null + # add file to array and file + IMPORT_INDEX+=("${CHUNK_FILE_NAME}") + echo "${CHUNK_FILE_NAME}" >> ${INDEX_FILE} + else + echo "Skipping $1 ${CHUNK_FILE_NAME} (${chunk})" + fi + done +} + +# Time variable +SECONDS=0 + +# Delete all Neo4J Database content +echo "Deleting Database Contents" +delete_collection "badges" "badges" +delete_collection "categories" "categories" +delete_collection "users" "users" +delete_collection "follows" "follows_users" +delete_collection "contributions" "contributions_post" +delete_collection "contributions" "contributions_cando" +delete_collection "shouts" "shouts" +delete_collection "comments" "comments" +delete_collection "emotions" "emotions" + +#delete_collection "invites" +#delete_collection "notifications" +#delete_collection "organizations" +#delete_collection "pages" +#delete_collection "projects" +#delete_collection "settings" +#delete_collection "status" +#delete_collection "systemnotifications" +#delete_collection "userscandos" +#delete_collection "usersettings" +echo "DONE" + +# Import Data +echo "Start Importing Data" +import_collection "badges" "badges/badges.cql" +import_collection "categories" "categories/categories.cql" +import_collection "users_verified" "users/users.cql" +import_collection "follows_users" "follows/follows.cql" +#import_collection "follows_organizations" "follows/follows.cql" +import_collection "contributions_post" "contributions/contributions.cql" +#import_collection "contributions_cando" "contributions/contributions.cql" +#import_collection "contributions_DELETED" "contributions/contributions.cql" +import_collection "shouts" "shouts/shouts.cql" +import_collection "comments" "comments/comments.cql" +import_collection "emotions" "emotions/emotions.cql" + +# import_collection "invites" +# import_collection "notifications" +# import_collection "organizations" +# import_collection "pages" +# import_collection "systemnotifications" +# import_collection "userscandos" +# import_collection "usersettings" + +# does only contain dummy data +# import_collection "projects" + +# does only contain alpha specifc data +# import_collection "status +# import_collection "settings"" + +echo "DONE" + +echo "Time elapsed: $SECONDS seconds" diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql new file mode 100644 index 000000000..f4a5bf006 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql @@ -0,0 +1,39 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] email: { +[ ] type: String, +[ ] required: true, +[-] index: true, +[ ] unique: true + }, +[ ] code: { +[ ] type: String, +[-] index: true, +[ ] required: true + }, +[ ] role: { +[ ] type: String, +[ ] enum: ['admin', 'moderator', 'manager', 'editor', 'user'], +[ ] default: 'user' + }, +[ ] invitedByUserId: { type: String }, +[ ] language: { type: String }, +[ ] badgeIds: [], +[ ] wasUsed: { +[ ] type: Boolean, +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as invite; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql new file mode 100644 index 000000000..aa6ac8eb9 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql @@ -0,0 +1,48 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] userId: { // User this notification is sent to +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] type: { +[ ] type: String, +[ ] required: true, +[ ] enum: ['comment','comment-mention','contribution-mention','following-contribution'] + }, +[ ] relatedUserId: { +[ ] type: String, +[-] index: true + }, +[ ] relatedContributionId: { +[ ] type: String, +[-] index: true + }, +[ ] relatedOrganizationId: { +[ ] type: String, +[-] index: true + }, +[ ] relatedCommentId: {type: String }, +[ ] unseen: { +[ ] type: Boolean, +[ ] default: true, +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as notification; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql new file mode 100644 index 000000000..e473e697c --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql @@ -0,0 +1,137 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] name: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] slug: { +[ ] type: String, +[ ] required: true, +[ ] unique: true, +[-] index: true + }, +[ ] followersCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] followingCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] categoryIds: { +[ ] type: Array, +[ ] required: true, +[-] index: true + }, +[ ] logo: { type: String }, +[ ] coverImg: { type: String }, +[ ] userId: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] description: { +[ ] type: String, +[ ] required: true + }, +[ ] descriptionExcerpt: { type: String }, // will be generated automatically +[ ] publicEmail: { type: String }, +[ ] url: { type: String }, +[ ] type: { +[ ] type: String, +[-] index: true, +[ ] enum: ['ngo', 'npo', 'goodpurpose', 'ev', 'eva'] + }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[ ] default: 'de', +[-] index: true + }, +[ ] addresses: { +[ ] type: [{ +[ ] street: { +[ ] type: String, +[ ] required: true + }, +[ ] zipCode: { +[ ] type: String, +[ ] required: true + }, +[ ] city: { +[ ] type: String, +[ ] required: true + }, +[ ] country: { +[ ] type: String, +[ ] required: true + }, +[ ] lat: { +[ ] type: Number, +[ ] required: true + }, +[ ] lng: { +[ ] type: Number, +[ ] required: true + } + }], +[ ] default: [] + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] isEnabled: { +[ ] type: Boolean, +[ ] default: false, +[-] index: true + }, +[ ] reviewedBy: { +[ ] type: String, +[ ] default: null, +[-] index: true + }, +[ ] tags: { +[ ] type: Array, +[-] index: true + }, +[ ] deleted: { +[ ] type: Boolean, +[ ] default: false, +[-] index: true + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as organisation; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql new file mode 100644 index 000000000..18223136b --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql @@ -0,0 +1,55 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] title: { +[ ] type: String, +[ ] required: true + }, +[ ] slug: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] type: { +[ ] type: String, +[ ] required: true, +[ ] default: 'page' + }, +[ ] key: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] content: { +[ ] type: String, +[ ] required: true + }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] active: { +[ ] type: Boolean, +[ ] default: true, +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[ ] { slug: 1, language: 1 },{ unique: true } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as page; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql new file mode 100644 index 000000000..ed859c157 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql @@ -0,0 +1,44 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] name: { +[ ] type: String, +[ ] required: true + }, +[ ] slug: { type: String }, +[ ] followerIds: [], +[ ] categoryIds: { type: Array }, +[ ] logo: { type: String }, +[ ] userId: { +[ ] type: String, +[ ] required: true + }, +[ ] description: { +[ ] type: String, +[ ] required: true + }, +[ ] content: { +[ ] type: String, +[ ] required: true + }, +[ ] addresses: { +[ ] type: Array, +[ ] default: [] + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as project; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql new file mode 100644 index 000000000..1d557d30c --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql @@ -0,0 +1,36 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] key: { +[ ] type: String, +[ ] default: 'system', +[-] index: true, +[ ] unique: true + }, +[ ] invites: { +[ ] userCanInvite: { +[ ] type: Boolean, +[ ] required: true, +[ ] default: false + }, +[ ] maxInvitesByUser: { +[ ] type: Number, +[ ] required: true, +[ ] default: 1 + }, +[ ] onlyUserWithBadgesCanInvite: { +[ ] type: Array, +[ ] default: [] + } + }, +[ ] maintenance: false + }, { +[ ] timestamps: true + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as setting; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql new file mode 100644 index 000000000..21c2e1f90 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql @@ -0,0 +1 @@ +// this is just a relation between users and contributions - no need to delete \ No newline at end of file diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql new file mode 100644 index 000000000..d370b4b4a --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql @@ -0,0 +1,36 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] userId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[?] foreignId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[?] foreignService: { // db.getCollection('shots').distinct('foreignService') returns 'contributions' +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[?] { userId: 1, foreignId: 1 },{ unique: true } // is the unique constrain modeled? +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as shout +MATCH (u:User {id: shout.userId}), (p:Post {id: shout.foreignId}) +MERGE (u)-[:SHOUTED]->(p) +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql new file mode 100644 index 000000000..010c2ca09 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql @@ -0,0 +1,19 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] maintenance: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as status; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql new file mode 100644 index 000000000..4bd33eb7c --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql @@ -0,0 +1,61 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] type: { +[ ] type: String, +[ ] default: 'info', +[ ] required: true, +[-] index: true + }, +[ ] title: { +[ ] type: String, +[ ] required: true + }, +[ ] content: { +[ ] type: String, +[ ] required: true + }, +[ ] slot: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] permanent: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] requireConfirmation: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] active: { +[ ] type: Boolean, +[ ] default: true, +[-] index: true + }, +[ ] totalCount: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as systemnotification; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql new file mode 100644 index 000000000..32679f6c8 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql @@ -0,0 +1,2 @@ +MATCH (n:User) DETACH DELETE n; +MATCH (e:EmailAddress) DETACH DELETE e; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql new file mode 100644 index 000000000..02dff089f --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql @@ -0,0 +1,124 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] email: { +[X] type: String, +[-] index: true, +[X] required: true, +[?] unique: true //unique constrain missing in Nitro + }, +[?] password: { // Not required in Alpha -> verify if always present +[X] type: String + }, +[X] name: { type: String }, +[X] slug: { +[X] type: String, +[-] index: true + }, +[ ] gender: { type: String }, +[ ] followersCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] followingCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] timezone: { type: String }, +[X] avatar: { type: String }, +[X] coverImg: { type: String }, +[ ] doiToken: { type: String }, +[ ] confirmedAt: { type: Date }, +[?] badgeIds: [], // Verify this is working properly +[?] deletedAt: { type: Date }, // The Date of deletion is not saved in Nitro +[?] createdAt: { +[?] type: Date, // Modeled as String in Nitro +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Modeled as String in Nitro +[ ] default: Date.now // Default value is missing in Nitro + }, +[ ] lastActiveAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] isVerified: { type: Boolean }, +[?] role: { +[X] type: String, +[-] index: true, +[?] enum: ['admin', 'moderator', 'manager', 'editor', 'user'], // missing roles manager & editor in Nitro +[ ] default: 'user' // Default value is missing in Nitro + }, +[ ] verifyToken: { type: String }, +[ ] verifyShortToken: { type: String }, +[ ] verifyExpires: { type: Date }, +[ ] verifyChanges: { type: Object }, +[ ] resetToken: { type: String }, +[ ] resetShortToken: { type: String }, +[ ] resetExpires: { type: Date }, +[X] wasSeeded: { type: Boolean }, +[X] wasInvited: { type: Boolean }, +[ ] language: { +[ ] type: String, +[ ] default: 'en' + }, +[ ] termsAndConditionsAccepted: { type: Date }, // we display the terms and conditions on registration +[ ] systemNotificationsSeen: { +[ ] type: Array, +[ ] default: [] + } + } +*/ +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as user +MERGE(u:User {id: user._id["$oid"]}) +ON CREATE SET +u.name = user.name, +u.slug = COALESCE(user.slug, apoc.text.random(20, "[A-Za-z]")), +u.email = user.email, +u.encryptedPassword = user.password, +u.avatar = replace(user.avatar, 'https://api-alpha.human-connection.org', ''), +u.coverImg = replace(user.coverImg, 'https://api-alpha.human-connection.org', ''), +u.wasInvited = user.wasInvited, +u.wasSeeded = user.wasSeeded, +u.role = toLower(user.role), +u.createdAt = user.createdAt.`$date`, +u.updatedAt = user.updatedAt.`$date`, +u.deleted = user.deletedAt IS NOT NULL, +u.disabled = false +MERGE (e:EmailAddress { + email: user.email, + createdAt: toString(datetime()), + verifiedAt: toString(datetime()) +}) +MERGE (e)-[:BELONGS_TO]->(u) +MERGE (u)-[:PRIMARY_EMAIL]->(e) +WITH u, user, user.badgeIds AS badgeIds +UNWIND badgeIds AS badgeId +MATCH (b:Badge {id: badgeId}) +MERGE (b)-[:REWARDED]->(u) +; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql new file mode 100644 index 000000000..55f58f171 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql @@ -0,0 +1,35 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] userId: { +[ ] type: String, +[ ] required: true + }, +[ ] contributionId: { +[ ] type: String, +[ ] required: true + }, +[ ] done: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] doneAt: { type: Date }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[ ] { userId: 1, contributionId: 1 },{ unique: true } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as usercando; diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql new file mode 100644 index 000000000..722625944 --- /dev/null +++ b/docs/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql @@ -0,0 +1,43 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] userId: { +[ ] type: String, +[ ] required: true, +[ ] unique: true + }, +[ ] blacklist: { +[ ] type: Array, +[ ] default: [] + }, +[ ] uiLanguage: { +[ ] type: String, +[ ] required: true + }, +[ ] contentLanguages: { +[ ] type: Array, +[ ] default: [] + }, +[ ] filter: { +[ ] categoryIds: { +[ ] type: Array, +[ ] index: true + }, +[ ] emotions: { +[ ] type: Array, +[ ] index: true + } + }, +[ ] hideUsersWithoutTermsOfUseSigniture: {type: Boolean}, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as usersetting; diff --git a/docs/deployment/src/old/mailserver/Deployment.yaml b/docs/deployment/src/old/mailserver/Deployment.yaml new file mode 100644 index 000000000..a36e1652e --- /dev/null +++ b/docs/deployment/src/old/mailserver/Deployment.yaml @@ -0,0 +1,40 @@ +{{- if .Values.developmentMailserverDomain }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-mailserver + labels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/name: ocelot-social + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: 1 + minReadySeconds: 15 + progressDeadlineSeconds: 60 + selector: + matchLabels: + ocelot.social/selector: deployment-mailserver + template: + metadata: + labels: + ocelot.social/selector: deployment-mailserver + name: mailserver + spec: + containers: + - name: mailserver + image: djfarrelly/maildev + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 80 + - containerPort: 25 + envFrom: + - configMapRef: + name: {{ .Release.Name }}-configmap + - secretRef: + name: {{ .Release.Name }}-secrets + restartPolicy: Always + terminationGracePeriodSeconds: 30 +status: {} +{{- end}} \ No newline at end of file diff --git a/docs/deployment/src/old/mailserver/README.md b/docs/deployment/src/old/mailserver/README.md new file mode 100644 index 000000000..ed9292d5c --- /dev/null +++ b/docs/deployment/src/old/mailserver/README.md @@ -0,0 +1,18 @@ +# Development Mail Server + +You can deploy a fake smtp server which captures all send mails and displays +them in a web interface. The [sample configuration](../templates/configmap.template.yaml) +is assuming such a dummy server in the `SMTP_HOST` configuration and points to +a cluster-internal SMTP server. + +To deploy the SMTP server just uncomment the relevant code in the +[ingress server configuration](../../https/templates/ingress.template.yaml) and +run the following: + +```bash +# in folder deployment/ocelot-social +$ kubectl apply -f mailserver/ +``` + +You might need to refresh the TLS secret to enable HTTPS on the publicly +available web interface. diff --git a/docs/deployment/src/old/mailserver/Service.yaml b/docs/deployment/src/old/mailserver/Service.yaml new file mode 100644 index 000000000..bba734967 --- /dev/null +++ b/docs/deployment/src/old/mailserver/Service.yaml @@ -0,0 +1,22 @@ +{{- if .Values.developmentMailserverDomain }} +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-mailserver + labels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/name: ocelot-social + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: web + port: 80 + targetPort: 80 + - name: smtp + port: 25 + targetPort: 25 + selector: + ocelot.social/selector: deployment-mailserver +{{- end}} \ No newline at end of file diff --git a/docs/deployment/src/old/mailserver/ingress.yaml b/docs/deployment/src/old/mailserver/ingress.yaml new file mode 100644 index 000000000..1ea9c58be --- /dev/null +++ b/docs/deployment/src/old/mailserver/ingress.yaml @@ -0,0 +1,42 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: ingress-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "ingress webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + kubernetes.io/ingress.class: "nginx" + cert-manager.io/cluster-issuer: {{ .Values.LETSENCRYPT.ISSUER }} + nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.NGINX.PROXY_BODY_SIZE }} +spec: + tls: + - hosts: + - {{ .Values.LETSENCRYPT.DOMAIN }} + secretName: tls + rules: + - host: {{ .Values.LETSENCRYPT.DOMAIN }} + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: {{ .Release.Name }}-webapp + port: + number: 3000 + +#{{- if .Values.developmentMailserverDomain }} +# - host: {{ .Values.developmentMailserverDomain }} +# http: +# paths: +# - path: / +# backend: +# serviceName: {{ .Release.Name }}-mailserver +# servicePort: 80 +#{{- end }} diff --git a/docs/deployment/src/old/monitoring/README.md b/docs/deployment/src/old/monitoring/README.md new file mode 100644 index 000000000..46dfb0301 --- /dev/null +++ b/docs/deployment/src/old/monitoring/README.md @@ -0,0 +1,43 @@ +# Metrics + +You can optionally setup [prometheus](https://prometheus.io/) and +[grafana](https://grafana.com/) for metrics. + +We follow this tutorial [here](https://medium.com/@chris_linguine/how-to-monitor-your-kubernetes-cluster-with-prometheus-and-grafana-2d5704187fc8): + +```bash +kubectl proxy # proxy to your kubernetes dashboard + +helm repo list +# If using helm v3, the stable repository is not set, so you need to manually add it. +helm repo add stable https://kubernetes-charts.storage.googleapis.com +# Create a monitoring namespace for your cluster +kubectl create namespace monitoring +helm --namespace monitoring install prometheus stable/prometheus +kubectl -n monitoring get pods # look for 'server' +kubectl port-forward -n monitoring 9090 +# You can now see your prometheus server on: http://localhost:9090 + +# Make sure you are in folder `deployment/` +kubectl apply -f monitoring/grafana/config.yml +helm --namespace monitoring install grafana stable/grafana -f monitoring/grafana/values.yml +# Get the admin password for grafana from your kubernetes dashboard. +kubectl --namespace monitoring port-forward 3000 +# You can now see your grafana dashboard on: http://localhost:3000 +# Login with user 'admin' and the password you just looked up. +# In your dashboard import this dashboard: +# https://grafana.com/grafana/dashboards/1860 +# Enter ID 180 and choose "Prometheus" as datasource. +# You got metrics! +``` + +Now you should see something like this: + +![Grafana dashboard](./grafana/metrics.png) + +You can set up a grafana dashboard, by visiting https://grafana.com/dashboards, finding one that is suitable and copying it's id. +You then go to the left hand menu in localhost, choose `Dashboard` > `Manage` > `Import` +Paste in the id, click `Load`, select `Prometheus` for the data source, and click `Import` + +When you just installed prometheus and grafana, the data will not be available +immediately, so wait for a couple of minutes and reload. diff --git a/docs/deployment/src/old/monitoring/grafana/config.yml b/docs/deployment/src/old/monitoring/grafana/config.yml new file mode 100644 index 000000000..a338e3480 --- /dev/null +++ b/docs/deployment/src/old/monitoring/grafana/config.yml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: prometheus-grafana-datasource + namespace: monitoring + labels: + grafana_datasource: '1' +data: + datasource.yaml: |- + apiVersion: 1 + datasources: + - name: Prometheus + type: prometheus + access: proxy + orgId: 1 + url: http://prometheus-server.monitoring.svc.cluster.local diff --git a/docs/deployment/src/old/monitoring/grafana/metrics.png b/docs/deployment/src/old/monitoring/grafana/metrics.png new file mode 100644 index 000000000..cc68f1bad Binary files /dev/null and b/docs/deployment/src/old/monitoring/grafana/metrics.png differ diff --git a/docs/deployment/src/old/monitoring/grafana/values.yml b/docs/deployment/src/old/monitoring/grafana/values.yml new file mode 100644 index 000000000..02004cc1c --- /dev/null +++ b/docs/deployment/src/old/monitoring/grafana/values.yml @@ -0,0 +1,4 @@ +sidecar: + datasources: + enabled: true + label: grafana_datasource diff --git a/docs/deployment/src/old/volumes/README.md b/docs/deployment/src/old/volumes/README.md new file mode 100644 index 000000000..00619d33a --- /dev/null +++ b/docs/deployment/src/old/volumes/README.md @@ -0,0 +1,37 @@ +# Persistent Volumes + +At the moment, the application needs two persistent volumes: + +* The `/data/` folder where `neo4j` stores its database and +* the folder `/develop-backend/public/uploads` where the backend stores uploads, in case you don't use DigitalOcean Spaces (an AWS S3 bucket) for this purpose. + +As a matter of precaution, the persistent volume claims that setup these volumes +live in a separate folder. You don't want to accidently loose all your data in +your database by running + +```sh +kubectl delete -f ocelot-social/ +``` + +or do you? + +## Create Persistent Volume Claims + +Run the following: + +```sh +# in folder deployments/ +$ kubectl apply -f volumes +persistentvolumeclaim/neo4j-data-claim created +persistentvolumeclaim/uploads-claim created +``` + +## Backup And Restore + +We tested a couple of options how to do disaster recovery in kubernetes. First, +there is the [offline backup strategy](./neo4j-offline-backup/README.md) of the +community edition of Neo4J, which you can also run on a local installation. +Kubernetes also offers so-called [volume snapshots](./volume-snapshots/README.md). +Changing the [reclaim policy](./reclaim-policy/README.md) of your persistent +volumes might be an additional safety measure. Finally, there is also a +kubernetes specific disaster recovery tool called [Velero](./velero/README.md). diff --git a/docs/deployment/src/old/volumes/neo4j-offline-backup/README.md b/docs/deployment/src/old/volumes/neo4j-offline-backup/README.md new file mode 100644 index 000000000..7c34aa764 --- /dev/null +++ b/docs/deployment/src/old/volumes/neo4j-offline-backup/README.md @@ -0,0 +1,88 @@ +# Backup (offline) + +This tutorial explains how to carry out an offline backup of your Neo4J +database in a kubernetes cluster. + +An offline backup requires the Neo4J database to be stopped. Read +[the docs](https://neo4j.com/docs/operations-manual/current/tools/dump-load/). +Neo4J also offers online backups but this is available in enterprise edition +only. + +The tricky part is to stop the Neo4J database *without* stopping the container. +Neo4J's docker container image starts `neo4j` by default, so we have to override +this command with sth. that keeps the container spinning but does not terminate +it. + +## Stop and Restart Neo4J Database in Kubernetes + +[This tutorial](http://bigdatums.net/2017/11/07/how-to-keep-docker-containers-running/) +explains how to keep a docker container running. For kubernetes, the way to +override the docker image `CMD` is explained [here](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#define-a-command-and-arguments-when-you-create-a-pod). + +So, all we have to do is edit the kubernetes deployment of our Neo4J database +and set a custom `command` every time we have to carry out tasks like backup, +restore, seed etc. + +First bring the application into [maintenance mode](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/deployment/ocelot-social/maintenance/README.md) to ensure there are no +database connections left and nobody can access the application. + +Run the following: + +```sh +$ kubectl -n ocelot-social edit deployment develop-neo4j +``` + +Add the following to `spec.template.spec.containers`: + +```sh +["tail", "-f", "/dev/null"] +``` + +and write the file which will update the deployment. + +The command `tail -f /dev/null` is the equivalent of *sleep forever*. It is a +hack to keep the container busy and to prevent its shutdown. It will also +override the default `neo4j` command and the kubernetes pod will not start the +database. + +Now perform your tasks! + +When you're done, edit the deployment again and remove the `command`. Write the +file and trigger an update of the deployment. + +## Create a Backup in Kubernetes + +First stop your Neo4J database, see above. Then: + +```sh +$ kubectl -n ocelot-social get pods +# Copy the ID of the pod running Neo4J. +$ kubectl -n ocelot-social exec -it bash +# Once you're in the pod, dump the db to a file e.g. `/root/neo4j-backup`. +> neo4j-admin dump --to=/root/neo4j-backup +> exit +# Download the file from the pod to your computer. +$ kubectl cp human-connection/:/root/neo4j-backup ./neo4j-backup +``` + +Revert your changes to deployment `develop-neo4j` which will restart the database. + +## Restore a Backup in Kubernetes + +First stop your Neo4J database. Then: + +```sh +$ kubectl -n ocelot-social get pods +# Copy the ID of the pod running Neo4J. +# Then upload your local backup to the pod. Note that once the pod gets deleted +# e.g. if you change the deployment, the backup file is gone with it. +$ kubectl cp ./neo4j-backup human-connection/:/root/ +$ kubectl -n ocelot-social exec -it bash +# Once you're in the pod restore the backup and overwrite the default database +# called `graph.db` with `--force`. +# This will delete all existing data in database `graph.db`! +> neo4j-admin load --from=/root/neo4j-backup --force +> exit +``` + +Revert your changes to deployment `develop-neo4j` which will restart the database. diff --git a/docs/deployment/src/old/volumes/neo4j-online-backup/README.md b/docs/deployment/src/old/volumes/neo4j-online-backup/README.md new file mode 100644 index 000000000..602bbd577 --- /dev/null +++ b/docs/deployment/src/old/volumes/neo4j-online-backup/README.md @@ -0,0 +1,59 @@ +# Backup (online) + +## Online backups are only avaible with a Neo4j Enterprise and a license, see https://neo4j.com/licensing/ for the different licenses available + +This tutorial explains how to carry out an online backup of your Neo4J +database in a kubernetes cluster. + +One of the benefits of doing an online backup is that the Neo4j database does not need to be stopped, so there is no downtime. Read [the docs](https://neo4j.com/docs/operations-manual/current/backup/performing/) + +To use Neo4j Enterprise you must add this line to your configmap, if using, or your deployment `develop-neo4j` env. + +```sh +NEO4J_ACCEPT_LICENSE_AGREEMENT: "yes" +``` + +## Create a Backup in Kubernetes + +```sh +# Backup the database with one command, this will get the develop-neo4j pod, ssh into it, and run the backup command +$ kubectl -n=human-connection exec -it $(kubectl -n=human-connection get pods | grep develop-neo4j | awk '{ print $1 }') -- neo4j-admin backup --backup-dir=/var/lib/neo4j --name=neo4j-backup +# Download the file from the pod to your computer. +$ kubectl cp human-connection/$(kubectl -n=human-connection get pods | grep develop-neo4j | awk '{ print $1 }'):/var/lib/neo4j/neo4j-backup ./neo4j-backup/ +``` + +You should now have a backup of the database locally. If you want, you can simulate disaster recovery by sshing into the develop-neo4j pod, deleting all data and restoring from backup + +## Disaster where database data is gone somehow + +```sh +$ kubectl -n=human-connection exec -it $(kubectl -n=human-connection get pods | grep develop-neo4j |awk '{ print $1 }') bash +# Enter cypher-shell +$ cypher-shell +# Delete all data +> MATCH (n) DETACH DELETE (n); + +> exit +``` + +## Restore a backup in Kubernetes + +Restoration must be done while the database is not running, see [our docs](https://docs.human-connection.org/human-connection/deployment/volumes/neo4j-offline-backup#stop-and-restart-neo-4-j-database-in-kubernetes) for how to stop the database, but keep the container running + +After, you have stopped the database, and have the pod running, you can restore the database by running these commands: + +```sh +$ kubectl -n ocelot-social get pods +# Copy the ID of the pod running Neo4J. +# Then upload your local backup to the pod. Note that once the pod gets deleted +# e.g. if you change the deployment, the backup file is gone with it. +$ kubectl cp ./neo4j-backup/ human-connection/:/root/ +$ kubectl -n ocelot-social exec -it bash +# Once you're in the pod restore the backup and overwrite the default database +# called `graph.db` with `--force`. +# This will delete all existing data in database `graph.db`! +> neo4j-admin restore --from=/root/neo4j-backup --force +> exit +``` + +Revert your changes to deployment `develop-neo4j` which will restart the database. diff --git a/docs/deployment/src/old/volumes/uploads.yaml b/docs/deployment/src/old/volumes/uploads.yaml new file mode 100644 index 000000000..45e1292a8 --- /dev/null +++ b/docs/deployment/src/old/volumes/uploads.yaml @@ -0,0 +1,12 @@ +--- + kind: PersistentVolumeClaim + apiVersion: v1 + metadata: + name: uploads-claim + namespace: ocelot-social + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "10Gi" diff --git a/docs/deployment/src/old/volumes/velero/README.md b/docs/deployment/src/old/volumes/velero/README.md new file mode 100644 index 000000000..bf63f13c8 --- /dev/null +++ b/docs/deployment/src/old/volumes/velero/README.md @@ -0,0 +1,112 @@ +# Velero + +{% hint style="danger" %} +I tried Velero and it did not work reliably all the time. Sometimes the +kubernetes cluster crashes during recovery or data is not fully recovered. + +Feel free to test it out and update this documentation once you feel that it's +working reliably. It is very likely that DigitalOcean had some bugs when I +tried out the steps below. +{% endhint %} + +We use [velero](https://github.com/heptio/velero) for on premise backups, we +tested on version `v0.11.0`, you can find their +documentation [here](https://heptio.github.io/velero/v0.11.0/). + +Our kubernets configurations adds some annotations to pods. The annotations +define the important persistent volumes that need to be backed up. Velero will +pick them up and store the volumes in the same cluster but in another namespace +`velero`. + +## Prequisites + +You have to install the binary `velero` on your computer and get a tarball of +the latest release. We use `v0.11.0` so visit the +[release](https://github.com/heptio/velero/releases/tag/v0.11.0) page and +download and extract e.g. [velero-v0.11.0-linux-arm64.tar.gz](https://github.com/heptio/velero/releases/download/v0.11.0/velero-v0.11.0-linux-amd64.tar.gz). + + +## Setup Velero Namespace + +Follow their [getting started](https://heptio.github.io/velero/v0.11.0/get-started) +instructions to setup the Velero namespace. We use +[Minio](https://docs.min.io/docs/deploy-minio-on-kubernetes) and +[restic](https://github.com/restic/restic), so check out Velero's instructions +how to setup [restic](https://heptio.github.io/velero/v0.11.0/restic): + +```sh +# run from the extracted folder of the tarball +$ kubectl apply -f config/common/00-prereqs.yaml +$ kubectl apply -f config/minio/ +``` + +Once completed, you should see the namespace in your kubernetes dashboard. + +## Manually Create an On-Premise Backup + +When you create your deployments for Human Connection the required annotations +should already be in place. So when you create a backup of namespace +`human-connection`: + +```sh +$ velero backup create hc-backup --include-namespaces=human-connection +``` + +That should backup your persistent volumes, too. When you enter: + +```sh +$ velero backup describe hc-backup --details +``` + +You should see the persistent volumes at the end of the log: + +```sh +.... + +Restic Backups: + Completed: + human-connection/develop-backend-5b6dd96d6b-q77n6: uploads + human-connection/develop-neo4j-686d768598-z2vhh: neo4j-data +``` + +## Simulate a Disaster + +Feel free to try out if you loose any data when you simulate a disaster and try +to restore the namespace from the backup: + +```sh +$ kubectl delete namespace human-connection +``` + +Wait until the wrongdoing has completed, then: +```sh +$ velero restore create --from-backup hc-backup +``` + +Now, I keep my fingers crossed that everything comes back again. If not, I feel +very sorry for you. + + +## Schedule a Regular Backup + +Check out the [docs](https://heptio.github.io/velero/v0.11.0/get-started). You +can create a regular schedule e.g. with: + +```sh +$ velero schedule create hc-weekly-backup --schedule="@weekly" --include-namespaces=human-connection +``` + +Inspect the created backups: + +```sh +$ velero schedule get +NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR +hc-weekly-backup Enabled 2019-05-08 17:51:31 +0200 CEST @weekly 720h0m0s 6s ago + +$ velero backup get +NAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR +hc-weekly-backup-20190508155132 Completed 2019-05-08 17:51:32 +0200 CEST 29d default + +$ velero backup describe hc-weekly-backup-20190508155132 --details +# see if the persistent volumes are backed up +``` diff --git a/docs/deployment/src/old/volumes/volume-snapshots/README.md b/docs/deployment/src/old/volumes/volume-snapshots/README.md new file mode 100644 index 000000000..010cfc636 --- /dev/null +++ b/docs/deployment/src/old/volumes/volume-snapshots/README.md @@ -0,0 +1,49 @@ +# Kubernetes Volume Snapshots + +It is possible to backup persistent volumes through volume snapshots. This is especially handy if you don't want to stop the database to create an [offline backup](../neo4j-offline-backup/README.md) thus having a downtime. + +Kubernetes announced this feature in a [blog post](https://kubernetes.io/blog/2018/10/09/introducing-volume-snapshot-alpha-for-kubernetes/). Please make yourself familiar with it before you continue. + +## Create a Volume Snapshot + +There is an example in this folder how you can e.g. create a volume snapshot for the persistent volume claim of the database `volume-claim-ocelot-neo4j`, or for the uploads of the backend `volume-claim-ocelot-uploads`. + +Replace `YYYY-MM-DD` in the `metadata.name` entry in the yaml files with the actual date before you enter the following commands: + +```bash +# in folder deployment/volumes/volume-snapshots/ +kubectl apply -f neo4j-data-snapshot.yaml +# in case the images are stored on backend and not in S3 storage +kubectl apply -f backen-uploads-snapshot.yaml +``` + +If you are on DigitalOcean the volume snapshot should show up in the Web UI: + +![DigitalOcean Web UI showing a volume snapshot](./digital-ocean-volume-snapshots.png) + +## Provision a Volume based on a Snapshot + +Edit your persistent volume claim configuration and add a `dataSource` pointing +to your volume snapshot. [The blog post](https://kubernetes.io/blog/2018/10/09/introducing-volume-snapshot-alpha-for-kubernetes/) has an example in section "Provision a new volume from a snapshot with +Kubernetes". + +There is also an example in this folder how the configuration could look like. If you apply the configuration new persistent volume claim will be provisioned with the data from the volume snapshot: + +```bash +# in folder deployment/volumes/volume-snapshots/ +kubectl apply -f neo4j-data-provision-snapshot.yaml +``` + +## Data Consistency Warning + +Note that volume snapshots do not guarantee data consistency. Quote from the +[blog post](https://kubernetes.io/blog/2018/10/09/introducing-volume-snapshot-alpha-for-kubernetes/): + +> Please note that the alpha release of Kubernetes Snapshot does not provide +> any consistency guarantees. You have to prepare your application (pause +> application, freeze filesystem etc.) before taking the snapshot for data +> consistency. + +In case of Neo4J this probably means that enterprise edition is required which +supports [online backups](https://neo4j.com/docs/operations-manual/current/backup/). + diff --git a/docs/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml b/docs/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml new file mode 100644 index 000000000..697346c82 --- /dev/null +++ b/docs/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: snapshot.storage.k8s.io/v1beta1 +kind: VolumeSnapshot +metadata: + name: YYYY-MM-DD-uploads-snapshot +spec: + source: + persistentVolumeClaimName: volume-claim-ocelot-uploads diff --git a/docs/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png b/docs/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png new file mode 100644 index 000000000..cb6599616 Binary files /dev/null and b/docs/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png differ diff --git a/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml b/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml new file mode 100644 index 000000000..cd8552bda --- /dev/null +++ b/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml @@ -0,0 +1,18 @@ +--- + kind: PersistentVolumeClaim + apiVersion: v1 + metadata: + name: neo4j-data-claim + namespace: ocelot-social + labels: + app: ocelot-social + spec: + dataSource: + name: neo4j-data-snapshot + kind: VolumeSnapshot + apiGroup: snapshot.storage.k8s.io + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml new file mode 100644 index 000000000..6ac15cc05 --- /dev/null +++ b/docs/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: snapshot.storage.k8s.io/v1beta1 +kind: VolumeSnapshot +metadata: + name: YYYY-MM-DD-neo4j-data-snapshot +spec: + source: + persistentVolumeClaimName: volume-claim-ocelot-neo4j \ No newline at end of file diff --git a/docs/deployment/src/tools/merge-locales.sh b/docs/deployment/src/tools/merge-locales.sh new file mode 100644 index 000000000..21d263265 --- /dev/null +++ b/docs/deployment/src/tools/merge-locales.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +for locale in `ls locales/*.json`; +do + file=$(basename $locale); + if [ -f locales/tmp/$file ]; then + jq -s '.[0] * .[1]' $locale locales/tmp/$file > locales/tmp/tmp.json; + mv locales/tmp/tmp.json $locale; + fi; +done; + +rm -r locales/tmp/ diff --git a/docs/docker-compose.maintenance.yml b/docs/docker-compose.maintenance.yml new file mode 100644 index 000000000..b006713ec --- /dev/null +++ b/docs/docker-compose.maintenance.yml @@ -0,0 +1,44 @@ +# Todo: !!! This file seems related to our old maintenance worker for MongoDB and has to be refactored in case of using it !!! + +version: "3.4" + +services: + maintenance-worker: + image: ocelotsocialnetwork/develop-maintenance-worker:latest + build: + context: deployment/legacy-migration/maintenance-worker + volumes: + - uploads:/uploads + - neo4j-data:/data + - ./deployment/legacy-migration/maintenance-worker/migration/:/migration + - ./deployment/legacy-migration/maintenance-worker/ssh/:/root/.ssh + networks: + - hc-network + environment: + - NEO4J_dbms_security_auth__enabled=false + - NEO4J_dbms_memory_heap_max__size=2G + - GRAPHQL_URI=http://localhost:4000 + - CLIENT_URI=http://localhost:3000 + - JWT_SECRET=b/&&7b78BF&fv/Vd + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - NEO4J_apoc_import_file_enabled=true + - "SSH_USERNAME=${SSH_USERNAME}" + - "SSH_HOST=${SSH_HOST}" + - "MONGODB_USERNAME=${MONGODB_USERNAME}" + - "MONGODB_PASSWORD=${MONGODB_PASSWORD}" + - "MONGODB_AUTH_DB=${MONGODB_AUTH_DB}" + - "MONGODB_DATABASE=${MONGODB_DATABASE}" + - "UPLOADS_DIRECTORY=${UPLOADS_DIRECTORY}" + - "MONGO_EXPORT_SPLIT_SIZE=${MONGO_EXPORT_SPLIT_SIZE}" + ports: + - 7687:7687 + - 7474:7474 + +networks: + hc-network: + +volumes: + webapp_node_modules: + backend_node_modules: + neo4j-data: + uploads: diff --git a/docs/docker-compose.override.yml b/docs/docker-compose.override.yml new file mode 100644 index 000000000..52bf57896 --- /dev/null +++ b/docs/docker-compose.override.yml @@ -0,0 +1,80 @@ +version: "3.4" + +services: + + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/webapp:local-development + build: + target: development + environment: + - NODE_ENV="development" + # - DEBUG=true + - NUXT_BUILD=/tmp/nuxt # avoid file permission issues when `rm -rf .nuxt/` + volumes: + # This makes sure the docker container has its own node modules. + # Therefore it is possible to have a different node version on the host machine + - webapp_node_modules:/app/node_modules + # bind the local folder to the docker to allow live reload + - ./webapp:/app + + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/backend:local-development + build: + target: development + environment: + - NODE_ENV="development" + - DEBUG=true + volumes: + # This makes sure the docker container has its own node modules. + # Therefore it is possible to have a different node version on the host machine + - backend_node_modules:/app/node_modules + # bind the local folder to the docker to allow live reload + - ./backend:/app + + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/maintenance:local-development + + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/neo4j-community:local-development + ports: + # Also expose the neo4j query browser + - 7474:7474 + networks: + # So we can access the neo4j query browser from our host machine + - external-net + + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## + mailserver: + image: djfarrelly/maildev + container_name: mailserver + ports: + - 1080:80 + networks: + - external-net + +# the following network from the main YAML gives the warning `WARNING: Some networks were defined but are not used by any service: internal-net` and should be removed +# but removing is not possible yet, it seems: https://github.com/docker/compose/issues/3729#issuecomment-623154878 +# networks: +# internal-net: + +volumes: + webapp_node_modules: + backend_node_modules: diff --git a/docs/docker-compose.test.yml b/docs/docker-compose.test.yml new file mode 100644 index 000000000..fa858f28c --- /dev/null +++ b/docs/docker-compose.test.yml @@ -0,0 +1,68 @@ +version: "3.4" + +services: + + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/webapp:test + build: + target: test + environment: + - NODE_ENV="test" + volumes: + - ./coverage:/app/coverage + + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/backend:test + build: + target: test + environment: + - NODE_ENV="test" + volumes: + - ./coverage:/app/coverage + + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/maintenance:test + + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/neo4j-community:test + #environment: + # - NEO4J_dbms_connector_bolt_enabled=true + # - NEO4J_dbms_connector_bolt_tls__level=OPTIONAL + # - NEO4J_dbms_connector_bolt_listen__address=0.0.0.0:7687 + # - NEO4J_auth=none + # - NEO4J_dbms_connectors_default__listen__address=0.0.0.0 + # - NEO4J_dbms_connector_http_listen__address=0.0.0.0:7474 + # - NEO4J_dbms_connector_https_listen__address=0.0.0.0:7473 + networks: + # So we can access the neo4j query browser from our host machine + - external-net + + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - external-net + +volumes: + webapp_node_modules: + backend_node_modules: diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml new file mode 100644 index 000000000..41a03a7fc --- /dev/null +++ b/docs/docker-compose.yml @@ -0,0 +1,128 @@ +# This file defines the production settings. It is overwritten by docker-compose.override.yml, +# which defines the development settings. The override.yml is loaded by default. Therefore it +# is required to explicitly define if you want an production build: +# > docker-compose -f docker-compose.yml up + +version: "3.4" + +services: + + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/webapp:local-production + container_name: webapp + build: + context: ./webapp + target: production + networks: + - external-net + depends_on: + - backend + ports: + - 3000:3000 + # Storybook: Todo externalize, its not working anyways + # - 3002:3002 + environment: + # Envs used in Dockerfile + # - DOCKER_WORKDIR="/app" + # - PORT="3000" + - BUILD_DATE + - BUILD_VERSION + - BUILD_COMMIT + - NODE_ENV="production" + # Application only envs + - HOST=0.0.0.0 # This is nuxt specific, alternative value is HOST=webapp + - GRAPHQL_URI=http://backend:4000 + env_file: + - ./webapp/.env + + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/backend:local-production + container_name: backend + build: + context: ./backend + target: production + networks: + - external-net + - internal-net + depends_on: + - neo4j + ports: + - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads + environment: + # Envs used in Dockerfile + # - DOCKER_WORKDIR="/app" + # - PORT="4000" + - BUILD_DATE + - BUILD_VERSION + - BUILD_COMMIT + - NODE_ENV="production" + # Application only envs + - DEBUG=false + - NEO4J_URI=bolt://neo4j:7687 + - GRAPHQL_URI=http://backend:4000 + - CLIENT_URI=http://webapp:3000 + env_file: + - ./backend/.env + + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/maintenance:local-production + container_name: maintenance + build: + # TODO: Separate from webapp, this must be independent + context: ./webapp + dockerfile: Dockerfile.maintenance + networks: + - external-net + ports: + - 3001:80 + + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/neo4j-community:local-production + container_name: neo4j + build: + context: ./neo4j + # community edition 👆🏼, because we have no enterprise licence 👇🏼 at the moment + target: community + networks: + - internal-net + ports: + - 7687:7687 + volumes: + - neo4j_data:/data + environment: + # TODO: This sounds scary for a production environment + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_dbms_allow__format__migration=true + - NEO4J_dbms_allow__upgrade=true + # Uncomment following line for Neo4j Enterprise version instead of Community version + # TODO: clarify if that is the only thing needed to unlock the Enterprise version + # - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + # TODO: Remove the playground from production + +networks: + external-net: + internal-net: + internal: true + +volumes: + backend_uploads: + neo4j_data: diff --git a/docs/docs/.gitkeep b/docs/docs/.gitkeep new file mode 100644 index 000000000..41d9dfcf7 --- /dev/null +++ b/docs/docs/.gitkeep @@ -0,0 +1 @@ +Gitbook Action will put the files for GitHub Pages in here \ No newline at end of file diff --git a/docs/docu/dashboard/dashboard.desktop_1920x1080.png b/docs/docu/dashboard/dashboard.desktop_1920x1080.png new file mode 100644 index 000000000..1a2b02dac Binary files /dev/null and b/docs/docu/dashboard/dashboard.desktop_1920x1080.png differ diff --git a/docs/docu/dashboard/donate+restruturing.png b/docs/docu/dashboard/donate+restruturing.png new file mode 100644 index 000000000..2b5df7e39 Binary files /dev/null and b/docs/docu/dashboard/donate+restruturing.png differ diff --git a/docs/docu/deploy-structure.drawio b/docs/docu/deploy-structure.drawio new file mode 100644 index 000000000..a96314937 --- /dev/null +++ b/docs/docu/deploy-structure.drawio @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docu/deploy-structure.png b/docs/docu/deploy-structure.png new file mode 100644 index 000000000..dc779bd98 Binary files /dev/null and b/docs/docu/deploy-structure.png differ diff --git a/docs/docu/desktop_1920x1080.template.svg b/docs/docu/desktop_1920x1080.template.svg new file mode 100644 index 000000000..52774d61a --- /dev/null +++ b/docs/docu/desktop_1920x1080.template.svg @@ -0,0 +1,296 @@ + + + Desktop template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Desktop template + + + Xaviju + + + + + web desktop 1920x1080 + + + + + + + + + + + + + + + + + diff --git a/docs/docu/footer/footer.desktop_1920x1080.png b/docs/docu/footer/footer.desktop_1920x1080.png new file mode 100644 index 000000000..ce2c214ef Binary files /dev/null and b/docs/docu/footer/footer.desktop_1920x1080.png differ diff --git a/docs/docu/kubernetes.drawio b/docs/docu/kubernetes.drawio new file mode 100644 index 000000000..42ebba06c --- /dev/null +++ b/docs/docu/kubernetes.drawio @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docu/kubernetes.png b/docs/docu/kubernetes.png new file mode 100644 index 000000000..29d6d0595 Binary files /dev/null and b/docs/docu/kubernetes.png differ diff --git a/docs/docu/login/login.desktop_1920x1080.png b/docs/docu/login/login.desktop_1920x1080.png new file mode 100644 index 000000000..518418b0b Binary files /dev/null and b/docs/docu/login/login.desktop_1920x1080.png differ diff --git a/docs/docu/ocelot.desktop_1920x1080.svg b/docs/docu/ocelot.desktop_1920x1080.svg new file mode 100644 index 000000000..f1d89ac12 --- /dev/null +++ b/docs/docu/ocelot.desktop_1920x1080.svg @@ -0,0 +1,52301 @@ + + + Desktop template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Desktop template + + + Xaviju + + + + + web desktop 1920x1080 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search... + + + + + + + + + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + Bekannte + + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + Deine Projekte + + + Deine Organisationen + + + + + + Ulf Gebhardt + + + + + + + Ulf Gebhardt + + + + + + + + 212 + + + + 103 + + + + 5 + + + + + 12 + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vestibulum seddolor eu consequat. Maecenas vel mattis nibh, laoreet fringilla ipsum. Donecdictum rutrum mollis. In hac habitasse platea dictumst. Suspendisse feugiat, leoeu lacinia bibendum, odio magna tincidunt ex, sit amet iaculis augue felis iddolor. Fusce pharetra ipsum tortor, et imperdiet ex fermentum cursus. Sedeleifend imperdiet diam consectetur viverra. Integer eu finibus lacus, etvulputate diam. Integer consequat feugiat laoreet. Quisque pulvinar dui sit ametmollis dictum. + + + + 48min + Ulf Gebhardt + + + + + + + + + + + 212 + + + + 103 + + + + 5 + + + + + 12 + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vestibulum seddolor eu consequat. Maecenas vel mattis nibh, laoreet fringilla ipsum. Donecdictum rutrum mollis. In hac habitasse platea dictumst. Suspendisse feugiat, leoeu lacinia bibendum, odio magna tincidunt ex, sit amet iaculis augue felis iddolor. Fusce pharetra ipsum tortor, et imperdiet ex fermentum cursus. Sedeleifend imperdiet diam consectetur viverra. Integer eu finibus lacus, etvulputate diam. Integer consequat feugiat laoreet. Quisque pulvinar dui sit ametmollis dictum. + + + + + 48min + Ulf Gebhardt + + + + + + + + + + + + 130€ + Betrieb von wir.social + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vestibulum sed dolor eu consequat. Maecenas vel mattis nibh, laoreet fringilla ipsum. Donec dictum rutrum mollis. In hachabitasse platea dictumst. Suspendisse feugiat, leo eu lacinia bibendum, odio magna tincidunt ex, sit amet iaculis augue felis id dolor. Fusce pharetra ipsum tortor, et imperdiet ex fer + + 48min + Ulf Gebhardt + + + + + + + + + + + + + v0.6.3 + FAQ + - + Code of Conduct + - + Data Privacy + - + Terms & Conditions + - + Imprint + - + + + + + + + Made with + + + + + + + diff --git a/docs/docu/register/register.flow.drawio b/docs/docu/register/register.flow.drawio new file mode 100644 index 000000000..ecc8a803b --- /dev/null +++ b/docs/docu/register/register.flow.drawio @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/docu/register/register.flow.png b/docs/docu/register/register.flow.png new file mode 100644 index 000000000..cbf70a0a7 Binary files /dev/null and b/docs/docu/register/register.flow.png differ diff --git a/docs/docu/register/register1.desktop_1920x1080.png b/docs/docu/register/register1.desktop_1920x1080.png new file mode 100644 index 000000000..914b6ebc8 Binary files /dev/null and b/docs/docu/register/register1.desktop_1920x1080.png differ diff --git a/docs/docu/register/register2.desktop_1920x1080.png b/docs/docu/register/register2.desktop_1920x1080.png new file mode 100644 index 000000000..14a277a4c Binary files /dev/null and b/docs/docu/register/register2.desktop_1920x1080.png differ diff --git a/docs/docu/register/register3.desktop_1920x1080.png b/docs/docu/register/register3.desktop_1920x1080.png new file mode 100644 index 000000000..4df19c135 Binary files /dev/null and b/docs/docu/register/register3.desktop_1920x1080.png differ diff --git a/docs/docu/register/register4.desktop_1920x1080.png b/docs/docu/register/register4.desktop_1920x1080.png new file mode 100644 index 000000000..3877efdf9 Binary files /dev/null and b/docs/docu/register/register4.desktop_1920x1080.png differ diff --git a/docs/docu/register/register5.desktop_1920x1080.png b/docs/docu/register/register5.desktop_1920x1080.png new file mode 100644 index 000000000..a541e5aef Binary files /dev/null and b/docs/docu/register/register5.desktop_1920x1080.png differ diff --git a/docs/docu/register/register6.desktop_1920x1080.png b/docs/docu/register/register6.desktop_1920x1080.png new file mode 100644 index 000000000..d5562afb5 Binary files /dev/null and b/docs/docu/register/register6.desktop_1920x1080.png differ diff --git a/docs/edit-this-documentation.html b/docs/edit-this-documentation.html new file mode 100644 index 000000000..10b7e98cb --- /dev/null +++ b/docs/edit-this-documentation.html @@ -0,0 +1,590 @@ + + + + + + + Edit this Documentation · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      +
                      + + + + + + + + +
                      + +
                      + +
                      + + + + + + + + +
                      +
                      + +
                      +
                      + +
                      + +

                      Edit this Documentation

                      +

                      Find the table of contents for this documentation on GitHub and navigate to the file you need to update.

                      +

                      Click on the edit pencil on the right side directly above the text to edit this file on your fork of Human Connection (HC).

                      +

                      You can see a preview of your changes by clicking the Preview changes tab aside the Edit file tab.

                      +

                      If you are ready, fill in the Propose file change at the end of the webpage.

                      +

                      After that you have to send your change to the HC basis with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our open issues please include the number.)

                      +

                      Markdown your documentation

                      +

                      To design your documentation see the syntax description at GitBook:

                      +

                      https://toolchain.gitbook.com/syntax/markdown.html

                      +

                      Some quick Examples

                      +

                      Headlines

                      +
                      # Main headline
                      +## Smaller headlines
                      +### Small headlines
                      +
                      +

                      Tabs

                      +
                      {% tabs %}
                      +{% tab title="XXX" %}
                      +XXX
                      +{% endtab %}
                      +{% tab title="XXX" %}
                      +XXX
                      +{% endtab %}
                      +…
                      +{% endtabs %}
                      +
                      +

                      Commands

                      +
                      ```<LANGUAGE> (for text highlighting)
                      +XXX
                      +```
                      +
                      + +
                      [XXX](https://XXX)
                      +
                      +

                      Screenshots or other Images

                      +
                      ![XXX](https://XXX)
                      +
                      +

                      Hints For ToDos

                      +
                      {% hint style="info" %} TODO: XXX {% endhint %}
                      +
                      +

                      Host The Screenshots

                      +

                      Often we need screenshots to explain things.

                      +

                      Host On Ocelot-Social GitHub repository

                      +

                      TODO: How to host on Ocelot-Social GitHub repository ...

                      +

                      +

                      Quick Solution

                      +

                      To quickly host the screenshots go to:

                      +

                      https://imgur.com.

                      +

                      There click the green button New post.

                      +

                      Drag the image into the appropriate area.

                      +

                      Right click on it and choose kind of Open link in new tab.

                      +

                      Copy the URL and paste it were you need it.

                      +

                      Screenshot modification

                      +

                      Add an arrow or some other marking stuff

                      +

                      In the Preview App

                      Got to: Menu + Tools (GER: Werkzeuge) + Annotate (GER: Anmerkungen) + etc.

                      + + +
                      + +
                      +
                      +
                      + +

                      results matching ""

                      +
                        + +
                        +
                        + +

                        No results matching ""

                        + +
                        +
                        +
                        + +
                        +
                        + +
                        + + + + + + + + + + + + + + +
                        + + +
                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/features/support/steps.js b/docs/features/support/steps.js new file mode 100644 index 000000000..67127fa1e --- /dev/null +++ b/docs/features/support/steps.js @@ -0,0 +1,46 @@ +// features/support/steps.js +import { Given, When, Then, After, AfterAll } from 'cucumber' +import Factory, { cleanDatabase } from '../../backend/src/db/factories' +import dotenv from 'dotenv' +import expect from 'expect' + +const debug = require('debug')('ea:test:steps') + +After(async () => { + await cleanDatabase() +}) + +Given('our CLIENT_URI is {string}', function (string) { + expect(string).toEqual('http://localhost:3000') + // This is just for documentation. When you see URLs in the response of + // scenarios you, should be able to tell that it's coming from this + // environment variable. +}); + +Given('we have the following users in our database:', function (dataTable) { + return Promise.all(dataTable.hashes().map(({ slug, name }) => { + return Factory.build('user', { + name, + slug, + }) + })) +}) + +When('I send a GET request to {string}', async function (pathname) { + const response = await this.get(pathname) + this.lastContentType = response.lastContentType + + this.lastResponses.push(response.lastResponse) + this.statusCode = response.statusCode +}) + +Then('the server responds with a HTTP Status {int} and the following json:', function (statusCode, docString) { + expect(this.statusCode).toEqual(statusCode) + const [ lastResponse ] = this.lastResponses + expect(JSON.parse(lastResponse)).toMatchObject(JSON.parse(docString)) +}) + +Then('the Content-Type is {string}', function (contentType) { + expect(this.lastContentType).toEqual(contentType) +}) + diff --git a/docs/features/webfinger.feature b/docs/features/webfinger.feature new file mode 100644 index 000000000..1a17e7ea3 --- /dev/null +++ b/docs/features/webfinger.feature @@ -0,0 +1,36 @@ +Feature: Webfinger discovery + From an external server, e.g. Mastodon + I want to search for an actor alias + In order to follow the actor + + Background: + Given our CLIENT_URI is "http://localhost:3000" + And we have the following users in our database: + | name | slug | + | Peter Lustiger | peter-lustiger | + + Scenario: Search a user + When I send a GET request to "/.well-known/webfinger?resource=acct:peter-lustiger@localhost" + Then the server responds with a HTTP Status 200 and the following json: + """ + { + "subject": "acct:peter-lustiger@localhost:3000", + "links": [ + { + "rel": "self", + "type": "application/activity+json", + "href": "http://localhost:3000/activitypub/users/peter-lustiger" + } + ] + } + """ + And the Content-Type is "application/jrd+json; charset=utf-8" + + Scenario: Search without result + When I send a GET request to "/.well-known/webfinger?resource=acct:nonexisting@localhost" + Then the server responds with a HTTP Status 404 and the following json: + """ + { + "error": "No record found for \"nonexisting@localhost\"." + } + """ diff --git a/docs/features/world.js b/docs/features/world.js new file mode 100644 index 000000000..f46a63d4e --- /dev/null +++ b/docs/features/world.js @@ -0,0 +1,38 @@ +import { setWorldConstructor } from 'cucumber' +import request from 'request' + +class CustomWorld { + constructor () { + // webFinger.feature + this.lastResponses = [] + this.lastContentType = null + this.lastInboxUrl = null + this.lastActivity = null + // object-article.feature + this.statusCode = null + } + get (pathname) { + return new Promise((resolve, reject) => { + request(`http://localhost:4000/${this.replaceSlashes(pathname)}`, { + headers: { + 'Accept': 'application/activity+json' + }}, (error, response, body) => { + if (!error) { + resolve({ + lastResponse: body, + lastContentType: response.headers['content-type'], + statusCode: response.statusCode + }) + } else { + reject(error) + } + }) + }) + } + + replaceSlashes (pathname) { + return pathname.replace(/^\/+/, '') + } +} + +setWorldConstructor(CustomWorld) diff --git a/docs/gitbook/fonts/fontawesome/FontAwesome.otf b/docs/gitbook/fonts/fontawesome/FontAwesome.otf new file mode 100644 index 000000000..d4de13e83 Binary files /dev/null and b/docs/gitbook/fonts/fontawesome/FontAwesome.otf differ diff --git a/docs/gitbook/fonts/fontawesome/fontawesome-webfont.eot b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.eot new file mode 100644 index 000000000..c7b00d2ba Binary files /dev/null and b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.eot differ diff --git a/docs/gitbook/fonts/fontawesome/fontawesome-webfont.svg b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.svg new file mode 100644 index 000000000..8b66187fe --- /dev/null +++ b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/gitbook/fonts/fontawesome/fontawesome-webfont.ttf b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.ttf new file mode 100644 index 000000000..f221e50a2 Binary files /dev/null and b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.ttf differ diff --git a/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff new file mode 100644 index 000000000..6e7483cf6 Binary files /dev/null and b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff differ diff --git a/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 new file mode 100644 index 000000000..7eb74fd12 Binary files /dev/null and b/docs/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 differ diff --git a/docs/gitbook/gitbook-plugin-chapter-fold/chapter-fold.css b/docs/gitbook/gitbook-plugin-chapter-fold/chapter-fold.css new file mode 100644 index 000000000..1f7bb95ba --- /dev/null +++ b/docs/gitbook/gitbook-plugin-chapter-fold/chapter-fold.css @@ -0,0 +1,29 @@ +.book .book-summary .chapter > .articles { + overflow: hidden; + max-height: 0px; +} + +.book .book-summary .chapter.expanded > .articles { + max-height: 9999px; +} + +.book .book-summary .exc-trigger { + position: absolute; + left: 12px; + top: 12px; +} + +.book .book-summary ul.summary li a, +.book .book-summary ul.summary li span { + padding-left: 30px; +} + +.book .book-summary .exc-trigger:before { + content: "\f105"; +} + +.book .book-summary .expanded > a .exc-trigger:before, +.book .book-summary .expanded > span .exc-trigger:before { + content: "\f107"; +} + diff --git a/docs/gitbook/gitbook-plugin-chapter-fold/chapter-fold.js b/docs/gitbook/gitbook-plugin-chapter-fold/chapter-fold.js new file mode 100644 index 000000000..0a7518997 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-chapter-fold/chapter-fold.js @@ -0,0 +1,67 @@ +require(['gitbook', 'jQuery'], function(gitbook, $) { + var TOGGLE_CLASSNAME = 'expanded', + CHAPTER = '.chapter', + ARTICLES = '.articles', + TRIGGER_TEMPLATE = '', + LS_NAMESPACE = 'expChapters'; + var init = function () { + // adding the trigger element to each ARTICLES parent and binding the event + var chapterLink = $(ARTICLES).parent(CHAPTER).children('a'); + chapterLink.append($(TRIGGER_TEMPLATE)); + chapterLink.on('click', function (e) { + e.preventDefault(); + //e.stopPropagation(); + toggle($(e.target).closest(CHAPTER)); + }); + + expand(lsItem()); + //expand current selected chapter with it's parents + collapse($(CHAPTER)); + var activeChapter = $(CHAPTER + '.active'); + expand(activeChapter); + expand(activeChapter.parents(CHAPTER)); + } + //on page.change will happend the function. + + var toggle = function ($chapter) { + if ($chapter.hasClass('expanded')) { + collapse($chapter); + } else { + expand($chapter); + //$chapter.addClass('active').siblings().removeClass('active'); + } + } + var collapse = function ($chapter) { + if ($chapter.length && $chapter.hasClass(TOGGLE_CLASSNAME)) { + $chapter.removeClass(TOGGLE_CLASSNAME); + lsItem($chapter); + } + } + var expand = function ($chapter) { + if ($chapter.length && !$chapter.hasClass(TOGGLE_CLASSNAME)) { + $chapter.addClass(TOGGLE_CLASSNAME); + lsItem($chapter); + } + } + var lsItem = function () { + var map = JSON.parse(localStorage.getItem(LS_NAMESPACE)) || {} + if (arguments.length) { + var $chapters = arguments[0]; + $chapters.each(function (index, element) { + var level = $(this).data('level'); + var value = $(this).hasClass(TOGGLE_CLASSNAME); + map[level] = value; + }) + localStorage.setItem(LS_NAMESPACE, JSON.stringify(map)); + } else { + return $(CHAPTER).map(function(index, element){ + if (map[$(this).data('level')]) { + return this; + } + }) + } + } + gitbook.events.bind('page.change', function() { + init() + }); +}); diff --git a/docs/gitbook/gitbook-plugin-copy-code-button/toggle.js b/docs/gitbook/gitbook-plugin-copy-code-button/toggle.js new file mode 100644 index 000000000..b7db5229d --- /dev/null +++ b/docs/gitbook/gitbook-plugin-copy-code-button/toggle.js @@ -0,0 +1,86 @@ +require(["gitbook", "jQuery"], function(gitbook, $) { + function selectElementText(el){ + var range = document.createRange(); + range.selectNodeContents(el); + var selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } + + function getSelectedText() { + var t = ''; + if (window.getSelection) { + t = window.getSelection(); + } else if (document.getSelection) { + t = document.getSelection(); + } else if (document.selection) { + t = document.selection.createRange().text; + } + return t; + } + + function copyToClipboard(text) { + if (window.clipboardData && window.clipboardData.setData) { + // IE specific code path to prevent textarea being shown while dialog is visible. + return clipboardData.setData("Text", text); + + } else if (document.queryCommandSupported && document.queryCommandSupported("copy")) { + var textarea = document.createElement("textarea"); + textarea.textContent = text; + textarea.style.position = "fixed"; // Prevent scrolling to bottom of page in MS Edge. + document.body.appendChild(textarea); + textarea.select(); + try { + return document.execCommand("copy"); // Security exception may be thrown by some browsers. + } catch (ex) { + console.warn("Copy to clipboard failed.", ex); + return false; + } finally { + document.body.removeChild(textarea); + } + } + } + + function expand(chapter) { + chapter.show(); + if (chapter.parent().attr('class') != 'summary' + && chapter.parent().attr('class') != 'book-summary' + && chapter.length != 0 + ) { + expand(chapter.parent()); + } + } + + gitbook.events.bind("page.change", function() { + $("pre").each(function(){ + $(this).css("position", "relative"); + + var $copyCodeButton = $(""); + $copyCodeButton.css({"position": "absolute", "top": "5px", "right": "5px", "padding": "3px", "background-color":"#CCCCCC", "color":"white", "border-radius": "5px" , "-moz-border-radius": "5px", "-webkit-border-radius": "5px", "border": "2px solid #CCCCCC"}); + $copyCodeButton.click(function(){ + var $codeContainer = $(this).siblings("code"); + if($codeContainer) { + selectElementText($codeContainer.get(0)); + var selectedText = getSelectedText(); + + var buttonNewText = ""; + if(copyToClipboard(selectedText) == true){ + buttonNewText = "Copied"; + selectElementText($codeContainer.get(0)); + } else { + buttonNewText = "Unable to copy"; + selectElementText($codeContainer.get(0)); + } + + $(this).text(buttonNewText); + var that = this; + setTimeout(function(){ + $(that).text("Copy"); + }, 2000); + } + }); + + $(this).append($copyCodeButton); + }); + }); +}); diff --git a/docs/gitbook/gitbook-plugin-edit-link/plugin.js b/docs/gitbook/gitbook-plugin-edit-link/plugin.js new file mode 100644 index 000000000..a79f5ba29 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-edit-link/plugin.js @@ -0,0 +1,31 @@ +require(["gitbook", "jQuery"], function(gitbook, $) { + gitbook.events.bind('start', function (e, config) { + var conf = config['edit-link']; + var label = conf.label; + var base = conf.base; + var lang = gitbook.state.innerLanguage; + if (lang) { + // label can be a unique string for multi-languages site + if (typeof label === 'object') label = label[lang]; + + lang = lang + '/'; + } + + // Add slash at the end if not present + if (base.slice(-1) != "/") { + base = base + "/"; + } + + gitbook.toolbar.createButton({ + icon: 'fa fa-edit', + position: 'right', + text: label, + onClick: function() { + var filepath = gitbook.state.filepath; + + window.open(base + lang + filepath); + } + }); + }); + +}); diff --git a/docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js b/docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js new file mode 100644 index 000000000..ff7be7141 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js @@ -0,0 +1,240 @@ +require(['gitbook', 'jquery'], function(gitbook, $) { + // Configuration + var MAX_SIZE = 4, + MIN_SIZE = 0, + BUTTON_ID; + + // Current fontsettings state + var fontState; + + // Default themes + var THEMES = [ + { + config: 'white', + text: 'White', + id: 0 + }, + { + config: 'sepia', + text: 'Sepia', + id: 1 + }, + { + config: 'night', + text: 'Night', + id: 2 + } + ]; + + // Default font families + var FAMILIES = [ + { + config: 'serif', + text: 'Serif', + id: 0 + }, + { + config: 'sans', + text: 'Sans', + id: 1 + } + ]; + + // Return configured themes + function getThemes() { + return THEMES; + } + + // Modify configured themes + function setThemes(themes) { + THEMES = themes; + updateButtons(); + } + + // Return configured font families + function getFamilies() { + return FAMILIES; + } + + // Modify configured font families + function setFamilies(families) { + FAMILIES = families; + updateButtons(); + } + + // Save current font settings + function saveFontSettings() { + gitbook.storage.set('fontState', fontState); + update(); + } + + // Increase font size + function enlargeFontSize(e) { + e.preventDefault(); + if (fontState.size >= MAX_SIZE) return; + + fontState.size++; + saveFontSettings(); + } + + // Decrease font size + function reduceFontSize(e) { + e.preventDefault(); + if (fontState.size <= MIN_SIZE) return; + + fontState.size--; + saveFontSettings(); + } + + // Change font family + function changeFontFamily(configName, e) { + if (e && e instanceof Event) { + e.preventDefault(); + } + + var familyId = getFontFamilyId(configName); + fontState.family = familyId; + saveFontSettings(); + } + + // Change type of color theme + function changeColorTheme(configName, e) { + if (e && e instanceof Event) { + e.preventDefault(); + } + + var $book = gitbook.state.$book; + + // Remove currently applied color theme + if (fontState.theme !== 0) + $book.removeClass('color-theme-'+fontState.theme); + + // Set new color theme + var themeId = getThemeId(configName); + fontState.theme = themeId; + if (fontState.theme !== 0) + $book.addClass('color-theme-'+fontState.theme); + + saveFontSettings(); + } + + // Return the correct id for a font-family config key + // Default to first font-family + function getFontFamilyId(configName) { + // Search for plugin configured font family + var configFamily = $.grep(FAMILIES, function(family) { + return family.config == configName; + })[0]; + // Fallback to default font family + return (!!configFamily)? configFamily.id : 0; + } + + // Return the correct id for a theme config key + // Default to first theme + function getThemeId(configName) { + // Search for plugin configured theme + var configTheme = $.grep(THEMES, function(theme) { + return theme.config == configName; + })[0]; + // Fallback to default theme + return (!!configTheme)? configTheme.id : 0; + } + + function update() { + var $book = gitbook.state.$book; + + $('.font-settings .font-family-list li').removeClass('active'); + $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active'); + + $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); + $book.addClass('font-size-'+fontState.size); + $book.addClass('font-family-'+fontState.family); + + if(fontState.theme !== 0) { + $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); + $book.addClass('color-theme-'+fontState.theme); + } + } + + function init(config) { + // Search for plugin configured font family + var configFamily = getFontFamilyId(config.family), + configTheme = getThemeId(config.theme); + + // Instantiate font state object + fontState = gitbook.storage.get('fontState', { + size: config.size || 2, + family: configFamily, + theme: configTheme + }); + + update(); + } + + function updateButtons() { + // Remove existing fontsettings buttons + if (!!BUTTON_ID) { + gitbook.toolbar.removeButton(BUTTON_ID); + } + + // Create buttons in toolbar + BUTTON_ID = gitbook.toolbar.createButton({ + icon: 'fa fa-font', + label: 'Font Settings', + className: 'font-settings', + dropdown: [ + [ + { + text: 'A', + className: 'font-reduce', + onClick: reduceFontSize + }, + { + text: 'A', + className: 'font-enlarge', + onClick: enlargeFontSize + } + ], + $.map(FAMILIES, function(family) { + family.onClick = function(e) { + return changeFontFamily(family.config, e); + }; + + return family; + }), + $.map(THEMES, function(theme) { + theme.onClick = function(e) { + return changeColorTheme(theme.config, e); + }; + + return theme; + }) + ] + }); + } + + // Init configuration at start + gitbook.events.bind('start', function(e, config) { + var opts = config.fontsettings; + + // Generate buttons at start + updateButtons(); + + // Init current settings + init(opts); + }); + + // Expose API + gitbook.fontsettings = { + enlargeFontSize: enlargeFontSize, + reduceFontSize: reduceFontSize, + setTheme: changeColorTheme, + setFamily: changeFontFamily, + getThemes: getThemes, + setThemes: setThemes, + getFamilies: getFamilies, + setFamilies: setFamilies + }; +}); + + diff --git a/docs/gitbook/gitbook-plugin-fontsettings/website.css b/docs/gitbook/gitbook-plugin-fontsettings/website.css new file mode 100644 index 000000000..26591fe81 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-fontsettings/website.css @@ -0,0 +1,291 @@ +/* + * Theme 1 + */ +.color-theme-1 .dropdown-menu { + background-color: #111111; + border-color: #7e888b; +} +.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { + border-bottom: 9px solid #111111; +} +.color-theme-1 .dropdown-menu .buttons { + border-color: #7e888b; +} +.color-theme-1 .dropdown-menu .button { + color: #afa790; +} +.color-theme-1 .dropdown-menu .button:hover { + color: #73553c; +} +/* + * Theme 2 + */ +.color-theme-2 .dropdown-menu { + background-color: #2d3143; + border-color: #272a3a; +} +.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { + border-bottom: 9px solid #2d3143; +} +.color-theme-2 .dropdown-menu .buttons { + border-color: #272a3a; +} +.color-theme-2 .dropdown-menu .button { + color: #62677f; +} +.color-theme-2 .dropdown-menu .button:hover { + color: #f4f4f5; +} +.book .book-header .font-settings .font-enlarge { + line-height: 30px; + font-size: 1.4em; +} +.book .book-header .font-settings .font-reduce { + line-height: 30px; + font-size: 1em; +} +.book.color-theme-1 .book-body { + color: #704214; + background: #f3eacb; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section { + background: #f3eacb; +} +.book.color-theme-2 .book-body { + color: #bdcadb; + background: #1c1f2b; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section { + background: #1c1f2b; +} +.book.font-size-0 .book-body .page-inner section { + font-size: 1.2rem; +} +.book.font-size-1 .book-body .page-inner section { + font-size: 1.4rem; +} +.book.font-size-2 .book-body .page-inner section { + font-size: 1.6rem; +} +.book.font-size-3 .book-body .page-inner section { + font-size: 2.2rem; +} +.book.font-size-4 .book-body .page-inner section { + font-size: 4rem; +} +.book.font-family-0 { + font-family: Georgia, serif; +} +.book.font-family-1 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { + color: #704214; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { + border-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { + background-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { + border-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { + background: #fdf6e3; + color: #657b83; + border-color: #f8df9c; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { + background-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { + border-color: #f5d06c; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { + color: inherit; + background-color: #fdf6e3; + border-color: #444444; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { + background-color: #fbeecb; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { + color: #bdcadb; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { + color: #3eb1d0; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { + color: #fffffa; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { + border-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { + color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { + background-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { + border-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { + color: #9dbed8; + background: #2d3143; + border-color: #2d3143; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { + background-color: #282a39; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { + border-color: #3b3f54; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { + color: #b6c2d2; + background-color: #2d3143; + border-color: #3b3f54; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { + background-color: #35394b; +} +.book.color-theme-1 .book-header { + color: #afa790; + background: transparent; +} +.book.color-theme-1 .book-header .btn { + color: #afa790; +} +.book.color-theme-1 .book-header .btn:hover { + color: #73553c; + background: none; +} +.book.color-theme-1 .book-header h1 { + color: #704214; +} +.book.color-theme-2 .book-header { + color: #7e888b; + background: transparent; +} +.book.color-theme-2 .book-header .btn { + color: #3b3f54; +} +.book.color-theme-2 .book-header .btn:hover { + color: #fffff5; + background: none; +} +.book.color-theme-2 .book-header h1 { + color: #bdcadb; +} +.book.color-theme-1 .book-body .navigation { + color: #afa790; +} +.book.color-theme-1 .book-body .navigation:hover { + color: #73553c; +} +.book.color-theme-2 .book-body .navigation { + color: #383f52; +} +.book.color-theme-2 .book-body .navigation:hover { + color: #fffff5; +} +/* + * Theme 1 + */ +.book.color-theme-1 .book-summary { + color: #afa790; + background: #111111; + border-right: 1px solid rgba(0, 0, 0, 0.07); +} +.book.color-theme-1 .book-summary .book-search { + background: transparent; +} +.book.color-theme-1 .book-summary .book-search input, +.book.color-theme-1 .book-summary .book-search input:focus { + border: 1px solid transparent; +} +.book.color-theme-1 .book-summary ul.summary li.divider { + background: #7e888b; + box-shadow: none; +} +.book.color-theme-1 .book-summary ul.summary li i.fa-check { + color: #33cc33; +} +.book.color-theme-1 .book-summary ul.summary li.done > a { + color: #877f6a; +} +.book.color-theme-1 .book-summary ul.summary li a, +.book.color-theme-1 .book-summary ul.summary li span { + color: #877f6a; + background: transparent; + font-weight: normal; +} +.book.color-theme-1 .book-summary ul.summary li.active > a, +.book.color-theme-1 .book-summary ul.summary li a:hover { + color: #704214; + background: transparent; + font-weight: normal; +} +/* + * Theme 2 + */ +.book.color-theme-2 .book-summary { + color: #bcc1d2; + background: #2d3143; + border-right: none; +} +.book.color-theme-2 .book-summary .book-search { + background: transparent; +} +.book.color-theme-2 .book-summary .book-search input, +.book.color-theme-2 .book-summary .book-search input:focus { + border: 1px solid transparent; +} +.book.color-theme-2 .book-summary ul.summary li.divider { + background: #272a3a; + box-shadow: none; +} +.book.color-theme-2 .book-summary ul.summary li i.fa-check { + color: #33cc33; +} +.book.color-theme-2 .book-summary ul.summary li.done > a { + color: #62687f; +} +.book.color-theme-2 .book-summary ul.summary li a, +.book.color-theme-2 .book-summary ul.summary li span { + color: #c1c6d7; + background: transparent; + font-weight: 600; +} +.book.color-theme-2 .book-summary ul.summary li.active > a, +.book.color-theme-2 .book-summary ul.summary li a:hover { + color: #f4f4f5; + background: #252737; + font-weight: 600; +} diff --git a/docs/gitbook/gitbook-plugin-gtag/plugin.js b/docs/gitbook/gitbook-plugin-gtag/plugin.js new file mode 100644 index 000000000..7c2490649 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-gtag/plugin.js @@ -0,0 +1,50 @@ +require(['gitbook'], function(gitbook) { + function addScript(url) { + var script = document.createElement('script') + script.src = url + script.async = 1 + var m = document.getElementsByTagName('script')[0] + m.parentNode.insertBefore(script, m) + } + + function insertAfter(newNode, existNode) { + var parent = existNode.parentNode + if (parent.lastChild === existNode) { + parent.appendChild(newNode) + } else { + parent.insertBefore(newNode, existNode.nextSibling) + } + } + + function addEvent(gtag, category, label, value) { + gtag('event', 'page', { + event_category: category, + event_label: label, + value: value + }) + } + + gitbook.events.bind('start', function(e, config) { + var pluginConfig = config.gtag + if (pluginConfig) { + addScript( + 'https://www.googletagmanager.com/gtag/js?id=' + pluginConfig.token + ) + } + }) + + gitbook.events.bind('page.change', function(e, config) { + var state = gitbook.state + var pluginsConfig = state.config.pluginsConfig.gtag + if (pluginsConfig) { + window.dataLayer = window.dataLayer || [] + function gtag() { + dataLayer.push(arguments) + } + gtag('js', new Date()) + + gtag('config', pluginsConfig.token) + addEvent(gtag, 'navigate', 'menu', state.chapterTitle) + } + }) +}) diff --git a/docs/gitbook/gitbook-plugin-highlight/ebook.css b/docs/gitbook/gitbook-plugin-highlight/ebook.css new file mode 100644 index 000000000..cecaaab5a --- /dev/null +++ b/docs/gitbook/gitbook-plugin-highlight/ebook.css @@ -0,0 +1,135 @@ +pre, +code { + /* http://jmblog.github.io/color-themes-for-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +pre .hljs-comment, +code .hljs-comment, +pre .hljs-title, +code .hljs-title { + color: #8e908c; +} +pre .hljs-variable, +code .hljs-variable, +pre .hljs-attribute, +code .hljs-attribute, +pre .hljs-tag, +code .hljs-tag, +pre .hljs-regexp, +code .hljs-regexp, +pre .hljs-deletion, +code .hljs-deletion, +pre .ruby .hljs-constant, +code .ruby .hljs-constant, +pre .xml .hljs-tag .hljs-title, +code .xml .hljs-tag .hljs-title, +pre .xml .hljs-pi, +code .xml .hljs-pi, +pre .xml .hljs-doctype, +code .xml .hljs-doctype, +pre .html .hljs-doctype, +code .html .hljs-doctype, +pre .css .hljs-id, +code .css .hljs-id, +pre .css .hljs-class, +code .css .hljs-class, +pre .css .hljs-pseudo, +code .css .hljs-pseudo { + color: #c82829; +} +pre .hljs-number, +code .hljs-number, +pre .hljs-preprocessor, +code .hljs-preprocessor, +pre .hljs-pragma, +code .hljs-pragma, +pre .hljs-built_in, +code .hljs-built_in, +pre .hljs-literal, +code .hljs-literal, +pre .hljs-params, +code .hljs-params, +pre .hljs-constant, +code .hljs-constant { + color: #f5871f; +} +pre .ruby .hljs-class .hljs-title, +code .ruby .hljs-class .hljs-title, +pre .css .hljs-rules .hljs-attribute, +code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +pre .hljs-string, +code .hljs-string, +pre .hljs-value, +code .hljs-value, +pre .hljs-inheritance, +code .hljs-inheritance, +pre .hljs-header, +code .hljs-header, +pre .hljs-addition, +code .hljs-addition, +pre .ruby .hljs-symbol, +code .ruby .hljs-symbol, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + color: #718c00; +} +pre .css .hljs-hexcolor, +code .css .hljs-hexcolor { + color: #3e999f; +} +pre .hljs-function, +code .hljs-function, +pre .python .hljs-decorator, +code .python .hljs-decorator, +pre .python .hljs-title, +code .python .hljs-title, +pre .ruby .hljs-function .hljs-title, +code .ruby .hljs-function .hljs-title, +pre .ruby .hljs-title .hljs-keyword, +code .ruby .hljs-title .hljs-keyword, +pre .perl .hljs-sub, +code .perl .hljs-sub, +pre .javascript .hljs-title, +code .javascript .hljs-title, +pre .coffeescript .hljs-title, +code .coffeescript .hljs-title { + color: #4271ae; +} +pre .hljs-keyword, +code .hljs-keyword, +pre .javascript .hljs-function, +code .javascript .hljs-function { + color: #8959a8; +} +pre .hljs, +code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +pre .coffeescript .javascript, +code .coffeescript .javascript, +pre .javascript .xml, +code .javascript .xml, +pre .tex .hljs-formula, +code .tex .hljs-formula, +pre .xml .javascript, +code .xml .javascript, +pre .xml .vbscript, +code .xml .vbscript, +pre .xml .css, +code .xml .css, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/docs/gitbook/gitbook-plugin-highlight/website.css b/docs/gitbook/gitbook-plugin-highlight/website.css new file mode 100644 index 000000000..6674448f7 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-highlight/website.css @@ -0,0 +1,434 @@ +.book .book-body .page-wrapper .page-inner section.normal pre, +.book .book-body .page-wrapper .page-inner section.normal code { + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-title { + color: #8e908c; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + color: #c82829; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-params, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #f5871f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #718c00; +} +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #3e999f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + color: #4271ae; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + color: #8959a8; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { + /* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + /* Solarized Green */ + /* Solarized Cyan */ + /* Solarized Blue */ + /* Solarized Yellow */ + /* Solarized Orange */ + /* Solarized Red */ + /* Solarized Violet */ +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc { + color: #93a1a1; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title { + color: #859900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url { + color: #2aa198; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function { + color: #268bd2; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference { + color: #b58900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header { + color: #cb4b16; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important { + color: #dc322f; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label { + color: #6c71c4; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula { + background: #eee8d5; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { + /* Tomorrow Night Bright Theme */ + /* Original theme - https://github.com/chriskempson/tomorrow-theme */ + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title { + color: #969896; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + color: #d54e53; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #e78c45; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { + color: #e7c547; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #b9ca4a; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #70c0b1; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + color: #7aa6da; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + color: #c397d8; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + background: black; + color: #eaeaea; + padding: 0.5em; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/docs/gitbook/gitbook-plugin-hints/plugin-hints.css b/docs/gitbook/gitbook-plugin-hints/plugin-hints.css new file mode 100644 index 000000000..ed4480c51 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-hints/plugin-hints.css @@ -0,0 +1,9 @@ +.hints-icon { + display: table-cell; + padding-right: 15px; + padding-left: 5px; +} + +.hints-container { + display: table-cell; +} diff --git a/docs/gitbook/gitbook-plugin-search-pro/jquery.mark.min.js b/docs/gitbook/gitbook-plugin-search-pro/jquery.mark.min.js new file mode 100644 index 000000000..a126e95e7 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-search-pro/jquery.mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** + * mark.js v8.8.0 + * https://github.com/julmot/mark.js + * Copyright (c) 2014–2017, Julian Motz + * Released under the MIT license https://git.io/vwTVl + *****************************************************/ +"use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _extends=Object.assign||function(a){for(var b=1;b-1||d.indexOf("Trident")>-1)&&(this.ie=!0)}return _createClass(c,[{key:"log",value:function a(b){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",a=this.opt.log;this.opt.debug&&"object"===("undefined"==typeof a?"undefined":_typeof(a))&&"function"==typeof a[c]&&a[c]("mark.js: "+b)}},{key:"escapeStr",value:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(a){return a=this.escapeStr(a),Object.keys(this.opt.synonyms).length&&(a=this.createSynonymsRegExp(a)),this.opt.ignoreJoiners&&(a=this.setupIgnoreJoinersRegExp(a)),this.opt.diacritics&&(a=this.createDiacriticsRegExp(a)),a=this.createMergedBlanksRegExp(a),this.opt.ignoreJoiners&&(a=this.createIgnoreJoinersRegExp(a)),a=this.createAccuracyRegExp(a)}},{key:"createSynonymsRegExp",value:function(a){var b=this.opt.synonyms,c=this.opt.caseSensitive?"":"i";for(var d in b)if(b.hasOwnProperty(d)){var e=b[d],f=this.escapeStr(d),g=this.escapeStr(e);a=a.replace(new RegExp("("+f+"|"+g+")","gm"+c),"("+f+"|"+g+")")}return a}},{key:"setupIgnoreJoinersRegExp",value:function(a){return a.replace(/[^(|)\\]/g,function(a,b,c){var d=c.charAt(b+1);return/[(|)\\]/.test(d)||""===d?a:a+"\0"})}},{key:"createIgnoreJoinersRegExp",value:function(a){return a.split("\0").join("[\\u00ad|\\u200b|\\u200c|\\u200d]?")}},{key:"createDiacriticsRegExp",value:function(a){var b=this.opt.caseSensitive?"":"i",c=this.opt.caseSensitive?["aàáâãäåāąă","AÀÁÂÃÄÅĀĄĂ","cçćč","CÇĆČ","dđď","DĐĎ","eèéêëěēę","EÈÉÊËĚĒĘ","iìíîïī","IÌÍÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóôõöøō","OÒÓÔÕÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúûüůū","UÙÚÛÜŮŪ","yÿý","YŸÝ","zžżź","ZŽŻŹ"]:["aÀÁÂÃÄÅàáâãäåĀāąĄăĂ","cÇçćĆčČ","dđĐďĎ","eÈÉÊËèéêëěĚĒēęĘ","iÌÍÎÏìíîïĪī","lłŁ","nÑñňŇńŃ","oÒÓÔÕÖØòóôõöøŌō","rřŘ","sŠšśŚșȘşŞ","tťŤțȚţŢ","uÙÚÛÜùúûüůŮŪū","yŸÿýÝ","zŽžżŻźŹ"],d=[];return a.split("").forEach(function(e){c.every(function(c){if(c.indexOf(e)!==-1){if(d.indexOf(c)>-1)return!1;a=a.replace(new RegExp("["+c+"]","gm"+b),"["+c+"]"),d.push(c)}return!0})}),a}},{key:"createMergedBlanksRegExp",value:function(a){return a.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(a){var b=this,c=this.opt.accuracy,d="string"==typeof c?c:c.value,e="string"==typeof c?[]:c.limiters,f="";switch(e.forEach(function(a){f+="|"+b.escapeStr(a)}),d){case"partially":default:return"()("+a+")";case"complementary":return"()([^\\s"+f+"]*"+a+"[^\\s"+f+"]*)";case"exactly":return"(^|\\s"+f+")("+a+")(?=$|\\s"+f+")"}}},{key:"getSeparatedKeywords",value:function(a){var b=this,c=[];return a.forEach(function(a){b.opt.separateWordSearch?a.split(" ").forEach(function(a){a.trim()&&c.indexOf(a)===-1&&c.push(a)}):a.trim()&&c.indexOf(a)===-1&&c.push(a)}),{keywords:c.sort(function(a,b){return b.length-a.length}),length:c.length}}},{key:"getTextNodes",value:function(a){var b=this,c="",d=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(a){d.push({start:c.length,end:(c+=a.textContent).length,node:a})},function(a){return b.matchesExclude(a.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){a({value:c,nodes:d})})}},{key:"matchesExclude",value:function(a){return e.matches(a,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(a,c,d){var e=this.opt.element?this.opt.element:"mark",f=a.splitText(c),g=f.splitText(d-c),h=b.createElement(e);return h.setAttribute("data-markjs","true"),this.opt.className&&h.setAttribute("class",this.opt.className),h.textContent=f.textContent,f.parentNode.replaceChild(h,f),g}},{key:"wrapRangeInMappedTextNode",value:function(a,b,c,d,e){var f=this;a.nodes.every(function(g,h){var i=a.nodes[h+1];if("undefined"==typeof i||i.start>b){var j=function(){if(!d(g.node))return{v:!1};var i=b-g.start,j=(c>g.end?g.end:c)-g.start,k=a.value.substr(0,g.start),l=a.value.substr(j+g.start);return g.node=f.wrapRangeInTextNode(g.node,i,j),a.value=k+l,a.nodes.forEach(function(b,c){c>=h&&(a.nodes[c].start>0&&c!==h&&(a.nodes[c].start-=j),a.nodes[c].end-=j)}),c-=j,e(g.node.previousSibling,g.start),c>g.end?void(b=g.end):{v:!1}}();if("object"===("undefined"==typeof j?"undefined":_typeof(j)))return j.v}return!0})}},{key:"wrapMatches",value:function(a,b,c,d,e){var f=this,g=0===b?0:b+1;this.getTextNodes(function(b){b.nodes.forEach(function(b){b=b.node;for(var e=void 0;null!==(e=a.exec(b.textContent))&&""!==e[g];)if(c(e[g],b)){var h=e.index;if(0!==g)for(var i=1;i1&&void 0!==arguments[1])||arguments[1],d=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],e=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;_classCallCheck(this,a),this.ctx=b,this.iframes=c,this.exclude=d,this.iframesTimeout=e}return _createClass(a,[{key:"getContexts",value:function(){var a=void 0,c=[];return a="undefined"!=typeof this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(b.querySelectorAll(this.ctx)):[this.ctx]:[],a.forEach(function(a){var b=c.filter(function(b){return b.contains(a)}).length>0;c.indexOf(a)!==-1||b||c.push(a)}),c}},{key:"getIframeContents",value:function(a,b){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},d=void 0;try{var e=a.contentWindow;if(d=e.document,!e||!d)throw new Error("iframe inaccessible")}catch(a){c()}d&&b(d)}},{key:"isIframeBlank",value:function(a){var b="about:blank",c=a.getAttribute("src").trim(),d=a.contentWindow.location.href;return d===b&&c!==b&&c}},{key:"observeIframeLoad",value:function(a,b,c){var d=this,e=!1,f=null,g=function g(){if(!e){e=!0,clearTimeout(f);try{d.isIframeBlank(a)||(a.removeEventListener("load",g),d.getIframeContents(a,b,c))}catch(a){c()}}};a.addEventListener("load",g),f=setTimeout(g,this.iframesTimeout)}},{key:"onIframeReady",value:function(a,b,c){try{"complete"===a.contentWindow.document.readyState?this.isIframeBlank(a)?this.observeIframeLoad(a,b,c):this.getIframeContents(a,b,c):this.observeIframeLoad(a,b,c)}catch(a){c()}}},{key:"waitForIframes",value:function(a,b){var c=this,d=0;this.forEachIframe(a,function(){return!0},function(a){d++,c.waitForIframes(a.querySelector("html"),function(){--d||b()})},function(a){a||b()})}},{key:"forEachIframe",value:function(b,c,d){var e=this,f=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},g=b.querySelectorAll("iframe"),h=g.length,i=0;g=Array.prototype.slice.call(g);var j=function(){--h<=0&&f(i)};h||j(),g.forEach(function(b){a.matches(b,e.exclude)?j():e.onIframeReady(b,function(a){c(b)&&(i++,d(a)),j()},j)})}},{key:"createIterator",value:function(a,c,d){return b.createNodeIterator(a,c,d,!1)}},{key:"createInstanceOnIframe",value:function(b){return new a(b.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(a,b,c){var d=a.compareDocumentPosition(c),e=Node.DOCUMENT_POSITION_PRECEDING;if(d&e){if(null===b)return!0;var f=b.compareDocumentPosition(c),g=Node.DOCUMENT_POSITION_FOLLOWING;if(f&g)return!0}return!1}},{key:"getIteratorNode",value:function(a){var b=a.previousNode(),c=void 0;return c=null===b?a.nextNode():a.nextNode()&&a.nextNode(),{prevNode:b,node:c}}},{key:"checkIframeFilter",value:function(a,b,c,d){var e=!1,f=!1;return d.forEach(function(a,b){a.val===c&&(e=b,f=a.handled)}),this.compareNodeIframe(a,b,c)?(e!==!1||f?e===!1||f||(d[e].handled=!0):d.push({val:c,handled:!0}),!0):(e===!1&&d.push({val:c,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(a,b,c,d){var e=this;a.forEach(function(a){a.handled||e.getIframeContents(a.val,function(a){e.createInstanceOnIframe(a).forEachNode(b,c,d)})})}},{key:"iterateThroughNodes",value:function(a,b,c,d,e){for(var f=this,g=this.createIterator(b,a,d),h=[],i=[],j=void 0,k=void 0,l=function(){var a=f.getIteratorNode(g);return k=a.prevNode,j=a.node};l();)this.iframes&&this.forEachIframe(b,function(a){return f.checkIframeFilter(j,k,a,h)},function(b){f.createInstanceOnIframe(b).forEachNode(a,c,d)}),i.push(j);i.forEach(function(a){c(a)}),this.iframes&&this.handleOpenIframes(h,a,c,d),e()}},{key:"forEachNode",value:function(a,b,c){var d=this,e=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},f=this.getContexts(),g=f.length;g||e(),f.forEach(function(f){var h=function(){d.iterateThroughNodes(a,f,b,c,function(){--g<=0&&e()})};d.iframes?d.waitForIframes(f,h):h()})}}],[{key:"matches",value:function(a,b){var c="string"==typeof b?[b]:b,d=a.matches||a.matchesSelector||a.msMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.webkitMatchesSelector;if(d){var e=!1;return c.every(function(b){return!d.call(a,b)||(e=!0,!1)}),e}return!1}}]),a}();return c.fn.mark=function(a,b){return new d(this.get()).mark(a,b),this},c.fn.markRegExp=function(a,b){return new d(this.get()).markRegExp(a,b),this},c.fn.unmark=function(a){return new d(this.get()).unmark(a),this},c},window,document); \ No newline at end of file diff --git a/docs/gitbook/gitbook-plugin-search-pro/search.css b/docs/gitbook/gitbook-plugin-search-pro/search.css new file mode 100644 index 000000000..4dba66716 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-search-pro/search.css @@ -0,0 +1,41 @@ +/* + This CSS only styled the search results section, not the search input + It defines the basic interraction to hide content when displaying results, etc +*/ +#book-search-input { + background: inherit; +} +#book-search-results .search-results { + display: none; +} +#book-search-results .search-results ul.search-results-list { + list-style-type: none; + padding-left: 0; +} +#book-search-results .search-results ul.search-results-list li { + margin-bottom: 1.5rem; + padding-bottom: 0.5rem; + /* Highlight results */ +} +#book-search-results .search-results ul.search-results-list li p em { + background-color: rgba(255, 220, 0, 0.4); + font-style: normal; +} +#book-search-results .search-results .no-results { + display: none; +} +#book-search-results.open .search-results { + display: block; +} +#book-search-results.open .search-noresults { + display: none; +} +#book-search-results.no-results .search-results .has-results { + display: none; +} +#book-search-results.no-results .search-results .no-results { + display: block; +} +#book-search-results span.search-highlight-keyword { + background: #ff0; +} diff --git a/docs/gitbook/gitbook-plugin-search-pro/search.js b/docs/gitbook/gitbook-plugin-search-pro/search.js new file mode 100644 index 000000000..5249d8895 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-search-pro/search.js @@ -0,0 +1,261 @@ +require([ + 'gitbook', + 'jquery' +], function(gitbook, $) { + var MAX_DESCRIPTION_SIZE = 500; + var state = gitbook.state; + var INDEX_DATA = {}; + var usePushState = (typeof history.pushState !== 'undefined'); + + // DOM Elements + var $body = $('body'); + var $bookSearchResults; + var $searchList; + var $searchTitle; + var $searchResultsCount; + var $searchQuery; + + // Throttle search + function throttle(fn, wait) { + var timeout; + + return function() { + var ctx = this, + args = arguments; + if (!timeout) { + timeout = setTimeout(function() { + timeout = null; + fn.apply(ctx, args); + }, wait); + } + }; + } + + function displayResults(res) { + $bookSearchResults = $('#book-search-results'); + $searchList = $bookSearchResults.find('.search-results-list'); + $searchTitle = $bookSearchResults.find('.search-results-title'); + $searchResultsCount = $searchTitle.find('.search-results-count'); + $searchQuery = $searchTitle.find('.search-query'); + + $bookSearchResults.addClass('open'); + + var noResults = res.count == 0; + $bookSearchResults.toggleClass('no-results', noResults); + + // Clear old results + $searchList.empty(); + + // Display title for research + $searchResultsCount.text(res.count); + $searchQuery.text(res.query); + + // Create an
                      • element for each result + res.results.forEach(function(item) { + var $li = $('
                      • ', { + 'class': 'search-results-item' + }); + + var $title = $('

                        '); + + var $link = $('', { + 'href': gitbook.state.basePath + '/' + item.url + '?h=' + encodeURIComponent(res.query), + 'text': item.title, + 'data-is-search': 1 + }); + + if ($link[0].href.split('?')[0] === location.href.split('?')[0]) { + $link[0].setAttribute('data-need-reload', 1); + } + + var content = item.body.trim(); + if (content.length > MAX_DESCRIPTION_SIZE) { + content = content + '...'; + } + var $content = $('

                        ').html(content); + + $link.appendTo($title); + $title.appendTo($li); + $content.appendTo($li); + $li.appendTo($searchList); + }); + $('.body-inner').scrollTop(0); + } + + function escapeReg(keyword) { + //escape regexp prevserve word + return String(keyword).replace(/([\*\.\?\+\$\^\[\]\(\)\{\}\|\/\\])/g, '\\$1'); + } + + function query(keyword) { + if (keyword == null || keyword.trim() === '') return; + + var results = [], + index = -1; + for (var page in INDEX_DATA) { + if ((index = INDEX_DATA[page].body.toLowerCase().indexOf(keyword.toLowerCase())) !== -1) { + results.push({ + url: page, + title: INDEX_DATA[page].title, + body: INDEX_DATA[page].body.substr(Math.max(0, index - 50), MAX_DESCRIPTION_SIZE).replace(new RegExp('(' + escapeReg(keyword) + ')', 'gi'), '$1') + }); + } + } + displayResults({ + count: results.length, + query: keyword, + results: results + }); + } + + function launchSearch(keyword) { + // Add class for loading + $body.addClass('with-search'); + $body.addClass('search-loading'); + + function doSearch() { + query(keyword); + $body.removeClass('search-loading'); + } + + throttle(doSearch)(); + } + + function closeSearch() { + $body.removeClass('with-search'); + $('#book-search-results').removeClass('open'); + } + + function bindSearch() { + // Bind DOM + var $body = $('body'); + + // Launch query based on input content + function handleUpdate() { + var $searchInput = $('#book-search-input input'); + var keyword = $searchInput.val(); + + if (keyword.length == 0) { + closeSearch(); + } else { + launchSearch(keyword); + } + } + + $body.on('keyup', '#book-search-input input', function(e) { + if (e.keyCode === 13) { + if (usePushState) { + var uri = updateQueryString('q', $(this).val()); + history.pushState({ + path: uri + }, null, uri); + } + } + handleUpdate(); + }); + + // Push to history on blur + $body.on('blur', '#book-search-input input', function(e) { + // Update history state + if (usePushState) { + var uri = updateQueryString('q', $(this).val()); + history.pushState({ + path: uri + }, null, uri); + } + }); + } + + gitbook.events.on('start', function() { + bindSearch(); + $.getJSON(state.basePath + "/search_plus_index.json").then(function(data) { + INDEX_DATA = data; + showResult(); + closeSearch(); + }); + }); + + // 高亮文本 + var highLightPageInner = function(keyword) { + $('.page-inner').mark(keyword, { + 'ignoreJoiners': true, + 'acrossElements': true, + 'separateWordSearch': false + }); + + setTimeout(function() { + var mark = $('mark[data-markjs="true"]'); + if (mark.length) { + mark[0].scrollIntoView(); + } + }, 100); + }; + + function showResult() { + var keyword, type; + if (/\b(q|h)=([^&]+)/.test(location.search)) { + type = RegExp.$1; + keyword = decodeURIComponent(RegExp.$2); + if (type === 'q') { + launchSearch(keyword); + } else { + highLightPageInner(keyword); + } + $('#book-search-input input').val(keyword); + } + } + + gitbook.events.on('page.change', showResult); + + function getParameterByName(name) { + var url = window.location.href; + name = name.replace(/[\[\]]/g, '\\$&'); + var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'), + results = regex.exec(url); + if (!results) return null; + if (!results[2]) return ''; + return decodeURIComponent(results[2].replace(/\+/g, ' ')); + } + + function updateQueryString(key, value) { + value = encodeURIComponent(value); + + var url = window.location.href.replace(/([?&])(?:q|h)=([^&]+)(&|$)/, function(all, pre, value, end) { + if (end === '&') { + return pre; + } + return ''; + }); + var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), + hash; + + if (re.test(url)) { + if (typeof value !== 'undefined' && value !== null) + return url.replace(re, '$1' + key + '=' + value + '$2$3'); + else { + hash = url.split('#'); + url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); + if (typeof hash[1] !== 'undefined' && hash[1] !== null) + url += '#' + hash[1]; + return url; + } + } else { + if (typeof value !== 'undefined' && value !== null) { + var separator = url.indexOf('?') !== -1 ? '&' : '?'; + hash = url.split('#'); + url = hash[0] + separator + key + '=' + value; + if (typeof hash[1] !== 'undefined' && hash[1] !== null) + url += '#' + hash[1]; + return url; + } else + return url; + } + } + window.addEventListener('click', function(e) { + if (e.target.tagName === 'A' && e.target.getAttribute('data-need-reload')) { + setTimeout(function() { + location.reload(); + }, 100); + } + }, true); +}); \ No newline at end of file diff --git a/docs/gitbook/gitbook-plugin-splitter/splitter.css b/docs/gitbook/gitbook-plugin-splitter/splitter.css new file mode 100644 index 000000000..4e84720bf --- /dev/null +++ b/docs/gitbook/gitbook-plugin-splitter/splitter.css @@ -0,0 +1,22 @@ +.divider-content-summary { + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 5px; + display: table; + cursor: col-resize; + color: #ccc; + -webkit-transition: color 350ms ease; + -moz-transition: color 350ms ease; + -o-transition: color 350ms ease; + transition: color 350ms ease +} +.divider-content-summary:hover { + color: #444; +} + .divider-content-summary__icon { + display: table-cell; + vertical-align: middle; + text-align: center; + } diff --git a/docs/gitbook/gitbook-plugin-splitter/splitter.js b/docs/gitbook/gitbook-plugin-splitter/splitter.js new file mode 100644 index 000000000..5034e5b15 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-splitter/splitter.js @@ -0,0 +1,128 @@ +require(['gitbook', 'jQuery'], function (gitbook, $) { + + // MEMO: + // Gitbook is calculated as "calc (100% - 60px)" in the horizontal width when the width of the screen size is 600px + // or less. + // In this case, since contradiction occurs in the implementation of this module, return. + if($(window).width() <= 600) { + return; + } + + gitbook.events.bind('start', function () { + }); + + gitbook.events.bind('page.change', function () { + + var KEY_SPLIT_STATE = 'plugin_gitbook_split'; + + var dividerWidth = null; + var isDraggable = false; + var dividerCenterOffsetLeft = null; + var splitState = null; + var grabPointWidth = null; + + var $body = $('body'); + var $book = $('.book'); + var $summary = $('.book-summary'); + var $bookBody = $('.book-body'); + var $divider = $('

                        ' + + '
                        ' + + '' + + '
                        ' + + '
                        '); + + $summary.append($divider); + + dividerWidth = $divider.outerWidth(); + dividerCenterOffsetLeft = $divider.outerWidth() / 2; + + // restore split state from sessionStorage + splitState = getSplitState(); + setSplitState( + splitState.summaryWidth, + splitState.summaryOffset, + splitState.bookBodyOffset + ); + + setTimeout(function() { + var isGreaterThanEqualGitbookV2_5 = !Boolean($('.toggle-summary').length); + + var $toggleSummary = isGreaterThanEqualGitbookV2_5 + ? $('.fa.fa-align-justify').parent() : $('.toggle-summary'); + + $toggleSummary.on('click', function () { + + var summaryOffset = null; + var bookBodyOffset = null; + + var isOpen = isGreaterThanEqualGitbookV2_5 + ? !gitbook.sidebar.isOpen() : $book.hasClass('with-summary'); + + if (isOpen) { + summaryOffset = -($summary.outerWidth()); + bookBodyOffset = 0; + } else { + summaryOffset = 0; + bookBodyOffset = $summary.outerWidth(); + } + + setSplitState($summary.outerWidth(), summaryOffset, bookBodyOffset); + saveSplitState($summary.outerWidth(), summaryOffset, bookBodyOffset); + }); + }, 1); + + $divider.on('mousedown', function (event) { + event.stopPropagation(); + isDraggable = true; + grabPointWidth = $summary.outerWidth() - event.pageX; + }); + + $body.on('mouseup', function (event) { + event.stopPropagation(); + isDraggable = false; + saveSplitState( + $summary.outerWidth(), + $summary.position().left, + $bookBody.position().left + ); + }); + + $body.on('mousemove', function (event) { + if (!isDraggable) { + return; + } + event.stopPropagation(); + event.preventDefault(); + $summary.outerWidth(event.pageX + grabPointWidth); + $bookBody.offset({ left: event.pageX + grabPointWidth }); + }); + + function getSplitState() { + var splitState = JSON.parse(sessionStorage.getItem(KEY_SPLIT_STATE)); + splitState || (splitState = {}); + splitState.summaryWidth || (splitState.summaryWidth = $summary.outerWidth()); + splitState.summaryOffset || (splitState.summaryOffset = $summary.position().left); + splitState.bookBodyOffset || (splitState.bookBodyOffset = $bookBody.position().left); + return splitState; + } + + function saveSplitState(summaryWidth, summaryWidthOffset, bookBodyOffset) { + sessionStorage.setItem(KEY_SPLIT_STATE, JSON.stringify({ + summaryWidth: summaryWidth, + summaryOffset: summaryWidthOffset, + bookBodyOffset: bookBodyOffset, + })); + } + + function setSplitState(summaryWidth, summaryOffset, bookBodyOffset) { + $summary.outerWidth(summaryWidth); + $summary.offset({ left: summaryOffset }); + $bookBody.offset({ left: bookBodyOffset }); + // improved broken layout in windows chrome. + // "$(x).offset" automatically add to "position:relative". + // but it cause layout broken.. + $summary.css({ position: 'absolute' }); + $bookBody.css({ position: 'absolute' }); + } + }); +}); diff --git a/docs/gitbook/gitbook-plugin-tabs2/tabs.css b/docs/gitbook/gitbook-plugin-tabs2/tabs.css new file mode 100644 index 000000000..f5734c343 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-tabs2/tabs.css @@ -0,0 +1,9 @@ +.markdown-tabs { + padding-bottom: .85em; + margin-bottom: 1em; + border-bottom: 1px solid #ddd; +} + +.markdown-tabs ul , .markdown-tabs .nav-tabs { + padding : 0px; +} \ No newline at end of file diff --git a/docs/gitbook/gitbook-plugin-tabs2/tabs.js b/docs/gitbook/gitbook-plugin-tabs2/tabs.js new file mode 100644 index 000000000..c9e48ba84 --- /dev/null +++ b/docs/gitbook/gitbook-plugin-tabs2/tabs.js @@ -0,0 +1,9 @@ +require(["gitbook", "jquery"], function (gitbook, $) { + gitbook.events.bind("page.change", function () { + $('ul[role="tablist"] a').on('click', function(e) { + $(this).tab('show'); + }); + + $('ul[role="tablist"] a:first').tab('show'); + }); +}); \ No newline at end of file diff --git a/docs/gitbook/gitbook.js b/docs/gitbook/gitbook.js new file mode 100644 index 000000000..13077b45c --- /dev/null +++ b/docs/gitbook/gitbook.js @@ -0,0 +1,4 @@ +!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="
                        ",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ +return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
                        "],col:[2,"","
                        "],tr:[2,"","
                        "],td:[3,"","
                        "],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/neo4j/.archived/add_image_aspect_ratio.sh b/docs/neo4j/.archived/add_image_aspect_ratio.sh new file mode 100644 index 000000000..8e2a16a01 --- /dev/null +++ b/docs/neo4j/.archived/add_image_aspect_ratio.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +if [ -z "$NEO4J_USERNAME" ] || [ -z "$NEO4J_PASSWORD" ]; then + echo "Please set NEO4J_USERNAME and NEO4J_PASSWORD environment variables." + echo "Database manipulation is not possible without connecting to the database." + echo "E.g. you could \`cp .env.template .env\` unless you run the script in a docker container" +fi + +until echo 'RETURN "Connection successful" as info;' | cypher-shell +do + echo "Connecting to neo4j failed, trying again..." + sleep 1 +done + +echo " + CALL apoc.periodic.iterate(' + CALL apoc.load.csv("out.csv") yield map as row return row + ',' + MATCH (post:Post) where post.image = row.image + set post.imageAspectRatio = row.aspectRatio + ', {batchSize:10000, iterateList:true, parallel:true}); +" | cypher-shell diff --git a/docs/neo4j/.archived/change_disabled_relationship_to_report_node.sh b/docs/neo4j/.archived/change_disabled_relationship_to_report_node.sh new file mode 100644 index 000000000..3227ec63a --- /dev/null +++ b/docs/neo4j/.archived/change_disabled_relationship_to_report_node.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +ENV_FILE=$(dirname "$0")/.env +[[ -f "$ENV_FILE" ]] && source "$ENV_FILE" + +if [ -z "$NEO4J_USERNAME" ] || [ -z "$NEO4J_PASSWORD" ]; then + echo "Please set NEO4J_USERNAME and NEO4J_PASSWORD environment variables." + echo "Database manipulation is not possible without connecting to the database." + echo "E.g. you could \`cp .env.template .env\` unless you run the script in a docker container" +fi + +until echo 'RETURN "Connection successful" as info;' | cypher-shell +do + echo "Connecting to neo4j failed, trying again..." + sleep 1 +done + +echo " +// convert old DISABLED to new REVIEWED-Report-BELONGS_TO structure +MATCH (moderator:User)-[disabled:DISABLED]->(disabledResource) +WHERE disabledResource:User OR disabledResource:Comment OR disabledResource:Post +DELETE disabled +CREATE (moderator)-[review:REVIEWED]->(report:Report)-[:BELONGS_TO]->(disabledResource) +SET review.createdAt = toString(datetime()), review.updatedAt = review.createdAt, review.disable = true +SET report.id = randomUUID(), report.createdAt = toString(datetime()), report.updatedAt = report.createdAt, report.rule = 'latestReviewUpdatedAtRules', report.closed = false +// if disabledResource has no filed report, then create a moderators default filed report +WITH moderator, disabledResource, report +OPTIONAL MATCH (disabledResourceReporter:User)-[existingFiledReport:FILED]->(disabledResource) +FOREACH(disabledResource IN CASE WHEN existingFiledReport IS NULL THEN [1] ELSE [] END | + CREATE (moderator)-[addModeratorReport:FILED]->(report) + SET addModeratorReport.createdAt = toString(datetime()), addModeratorReport.reasonCategory = 'other', addModeratorReport.reasonDescription = 'Old DISABLED relations didn't enforce mandatory reporting !!! Created automatically to ensure database consistency! Creation date is when the database manipulation happened.' +) +FOREACH(disabledResource IN CASE WHEN existingFiledReport IS NOT NULL THEN [1] ELSE [] END | + CREATE (disabledResourceReporter)-[moveModeratorReport:FILED]->(report) + SET moveModeratorReport = existingFiledReport + DELETE existingFiledReport +) +RETURN disabledResource {.id}; +" | cypher-shell + +echo " +// for FILED resources without DISABLED relation which are handled above, create new FILED-Report-BELONGS_TO structure +MATCH (reporter:User)-[oldReport:REPORTED]->(notDisabledResource) +WHERE notDisabledResource:User OR notDisabledResource:Comment OR notDisabledResource:Post +MERGE (report:Report)-[:BELONGS_TO]->(notDisabledResource) +ON CREATE SET report.id = randomUUID(), report.createdAt = toString(datetime()), report.updatedAt = report.createdAt, report.rule = 'latestReviewUpdatedAtRules', report.closed = false +CREATE (reporter)-[filed:FILED]->(report) +SET report = oldReport +DELETE oldReport +RETURN notDisabledResource {.id}; +" | cypher-shell diff --git a/docs/neo4j/.env.template b/docs/neo4j/.env.template new file mode 100644 index 000000000..c58edee0e --- /dev/null +++ b/docs/neo4j/.env.template @@ -0,0 +1,2 @@ +NEO4J_USERNAME=neo4j +NEO4J_PASSWORD=letmein diff --git a/docs/neo4j/.gitignore b/docs/neo4j/.gitignore new file mode 100644 index 000000000..4c49bd78f --- /dev/null +++ b/docs/neo4j/.gitignore @@ -0,0 +1 @@ +.env diff --git a/docs/neo4j/Dockerfile b/docs/neo4j/Dockerfile new file mode 100644 index 000000000..a88c16c09 --- /dev/null +++ b/docs/neo4j/Dockerfile @@ -0,0 +1,45 @@ +################################################################################## +# COMMUNITY ###################################################################### +################################################################################## +FROM amd64/neo4j:4.4-community as community + +# ENVs +## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 +ARG BBUILD_DATE="1970-01-01T00:00:00.00Z" +ENV BUILD_DATE=$BBUILD_DATE +## We cannot do $(yarn run version)-${BUILD_NUMBER} here so we default to 0.0.0-0 +ARG BBUILD_VERSION="0.0.0-0" +ENV BUILD_VERSION=$BBUILD_VERSION +## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 +ARG BBUILD_COMMIT="0000000" +ENV BUILD_COMMIT=$BBUILD_COMMIT + +# Labels +LABEL org.label-schema.build-date="${BUILD_DATE}" +LABEL org.label-schema.name="ocelot.social:backend" +LABEL org.label-schema.description="Neo4J database of the Social Network Software ocelot.social with preinstalled database constraints and indices" +LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md" +LABEL org.label-schema.url="https://ocelot.social" +LABEL org.label-schema.vcs-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/backend" +LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}" +LABEL org.label-schema.vendor="ocelot.social Community" +LABEL org.label-schema.version="${BUILD_VERSION}" +LABEL org.label-schema.schema-version="1.0" +LABEL maintainer="devops@ocelot.social" + +# Install Additional Software +## install: wget, htop (TODO: why do we need htop?) +RUN apt-get update && apt-get -y install wget htop +## install: apoc plugin for neo4j +RUN wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/4.4.0.17/apoc-4.4.0.17-all.jar -P plugins/ + +################################################################################## +# ENTERPRISE ##################################################################### +################################################################################## +FROM neo4j:4.4-enterprise as enterprise + +# Install Additional Software +## install: wget, htop (TODO: why do we need htop?) +RUN apt-get update && apt-get -y install wget htop +## install: apoc plugin for neo4j +RUN wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/4.4.0.17/apoc-4.4.0.17-all.jar -P plugins/ \ No newline at end of file diff --git a/docs/neo4j/index.html b/docs/neo4j/index.html new file mode 100644 index 000000000..d90e4b5fd --- /dev/null +++ b/docs/neo4j/index.html @@ -0,0 +1,622 @@ + + + + + + + Neo4J · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        +
                        + + + + + + + + +
                        + +
                        + +
                        + + + + + + + + +
                        +
                        + +
                        +
                        + +
                        + +

                        Neo4J

                        +

                        Human Connection is a social network. Using a graph based database which can +model nodes and edges natively - a network - feels like an obvious choice. We +decided to use Neo4j, the currently most used graph +database available. The community edition of Neo4J is Free and Open Source and +we try our best to keep our application compatible with the community edition +only.

                        +

                        Installation With Docker

                        +

                        Run:

                        +
                        docker-compose up
                        +
                        +

                        You can access Neo4J through http://localhost:7474/ +for an interactive cypher shell and a visualization of the graph.

                        +

                        Installation Without Docker

                        +

                        Install the community edition of Neo4j along with the plugin +Apoc on your system.

                        +

                        To do so, go to releases, choose +"Community Server", download the installation files for you operation system +and unpack the files.

                        +

                        Download Neo4j Apoc +and drop the .jar file into the plugins folder of the just extracted Neo4j-Server.

                        +

                        Then make sure to allow Apoc procedures by adding the following line to your Neo4j configuration (conf/neo4j.conf):

                        +
                        dbms.security.procedures.unrestricted=apoc.*
                        +

                        Alternatives

                        +

                        You can download Neo4j Desktop and run locally +for development, spin up a +hosted Neo4j Sandbox instance, run Neo4j in one +of the many cloud options, +spin up Neo4j in a Docker container, +on Arch linux you can install neo4j-community from AUR +or on Debian-based systems install Neo4j from the Debian Repository. +Just be sure to update the Neo4j connection string and credentials accordingly +in backend/.env.

                        +

                        Start Neo4J and confirm the database is running at http://localhost:7474.

                        +

                        Commands

                        +

                        Here we describe some rarely used Cypher commands for Neo4j that are needed from time to time:

                        +

                        Index And Constraint Commands

                        +

                        If indexes or constraints are missing or not set correctly, the browser search will not work or the database seed for development will not work.

                        +

                        The indexes and constraints of our database are set in backend/src/db/migrate/store.js. +This is where the magic happens.

                        +

                        It's called by our prod:migrate init command. +This command initializes the Admin user and creates all necessary indexes and constraints in the Neo4j database.

                        +

                        Calls in development

                        +

                        Locally without Docker:

                        +
                        # in backend folder
                        +$ yarn prod:migrate init
                        +
                        +

                        Locally with Docker:

                        +
                        # in main folder
                        +$ docker compose exec backend yarn prod:migrate init
                        +
                        +

                        Calls in production

                        +

                        Locally with Docker:

                        +
                        # in main folder
                        +$ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
                        +
                        +

                        On a server with Kubernetes cluster:

                        +
                        # tested for one backend replica
                        +# !!! be aware of the kubectl context !!!
                        +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "yarn prod:migrate init"
                        +
                        +

                        Cypher commands to show indexes and constraints

                        +
                        # in browser command line or cypher shell
                        +
                        +# show all indexes and constraints
                        +$ :schema
                        +
                        +# show all indexes
                        +$ CALL db.indexes();
                        +
                        +# show all constraints
                        +$ CALL db.constraints();
                        +
                        +

                        Cypher commands to create and drop indexes and constraints

                        +
                        # in browser command line or cypher shell
                        +
                        +# create indexes
                        +$ 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"]);
                        +
                        +# drop an index
                        +$ DROP CONSTRAINT ON ( image:Image ) ASSERT image.url IS UNIQUE
                        +
                        +# drop all indexes and constraints
                        +$ CALL apoc.schema.assert({},{},true) YIELD label, key RETURN * ;
                        +
                        + + +
                        + +
                        +
                        +
                        + +

                        results matching ""

                        +
                          + +
                          +
                          + +

                          No results matching ""

                          + +
                          +
                          +
                          + +
                          +
                          + +
                          + + + + + + + + + + + + + + +
                          + + +
                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..e16abd8f5 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,67 @@ +{ + "name": "ocelot-social", + "version": "3.0.1", + "description": "Free and open source software program code available to run social networks.", + "author": "ocelot.social Community", + "license": "MIT", + "private": false, + "repository": { + "type": "git", + "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social.git" + }, + "cypress-cucumber-preprocessor": { + "stepDefinitions": "cypress/support/step_definitions/**/*.js", + "json": { + "enabled": true, + "output": "cypress/reports/json_logs/cucumber_log.json", + "formatter": "cucumber-json-formatter" + }, + "messages": { + "enabled": true, + "output": "cypress/reports/json_logs/messages.ndjson" + }, + "html": { + "enabled": false + } + }, + "scripts": { + "db:seed": "cd backend && yarn run db:seed", + "db:reset": "cd backend && yarn run db:reset", + "cypress:run": "cypress run --e2e --browser electron --config-file ./cypress/cypress.config.js", + "cypress:open": "cypress open --e2e --browser electron --config-file ./cypress/cypress.config.js", + "cucumber:setup": "cd backend && yarn run dev", + "cucumber": "wait-on tcp:4000 && cucumber-js --require-module @babel/register --exit", + "release": "yarn version --no-git-tag-version --no-commit-hooks --no-commit && auto-changelog --latest-version $(node -p -e \"require('./package.json').version\") && cd backend && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp/maintenance/source && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../../../package.json').version\")" + }, + "devDependencies": { + "@babel/core": "^7.22.5", + "@babel/preset-env": "^7.22.4", + "@babel/register": "^7.12.10", + "@badeball/cypress-cucumber-preprocessor": "^15.1.4", + "@cypress/browserify-preprocessor": "^3.0.2", + "@faker-js/faker": "8.0.2", + "auto-changelog": "^2.3.0", + "bcryptjs": "^2.4.3", + "cross-env": "^7.0.3", + "cucumber": "^6.0.5", + "cypress": "^12.17.0", + "cypress-network-idle": "^1.14.2", + "date-fns": "^2.25.0", + "dotenv": "^8.2.0", + "expect": "^29.5.0", + "graphql-request": "^2.0.0", + "import": "^0.0.6", + "jsonwebtoken": "^8.5.1", + "mock-socket": "^9.0.3", + "multiple-cucumber-html-reporter": "^3.4.0", + "neo4j-driver": "^4.3.4", + "neode": "^0.4.8", + "rosie": "^2.1.0", + "slug": "^6.0.0", + "wait-on": "^7.0.1" + }, + "resolutions": { + "set-value": "^2.0.1", + "nan": "2.17.0" + } +} diff --git a/docs/scripts/.gitkeep b/docs/scripts/.gitkeep new file mode 100644 index 000000000..b0699a3b8 --- /dev/null +++ b/docs/scripts/.gitkeep @@ -0,0 +1 @@ +We will put CI and package.json scripts in here in the future \ No newline at end of file diff --git a/docs/scripts/translations/missing-keys.sh b/docs/scripts/translations/missing-keys.sh new file mode 100644 index 000000000..aaeb1ac87 --- /dev/null +++ b/docs/scripts/translations/missing-keys.sh @@ -0,0 +1,17 @@ +#! /usr/bin/env bash + +ROOT_DIR=$(dirname "$0")/../.. + +sorting="jq -f $ROOT_DIR/scripts/translations/sort_filter.jq" +english="$sorting $ROOT_DIR/webapp/locales/en.json" +german="$sorting $ROOT_DIR/webapp/locales/de.json" +listPaths="jq -c 'path(..)|[.[]|tostring]|join(\".\")'" +diffString="<( $english | $listPaths ) <( $german | $listPaths )" +if eval "diff -q $diffString"; +then + : # all good +else + eval "diff -y $diffString | grep '[|<>]'"; + printf "\nEnglish and German translation keys do not match, see diff above.\n" + exit 1 +fi diff --git a/docs/scripts/translations/sort.sh b/docs/scripts/translations/sort.sh new file mode 100644 index 000000000..35496f27e --- /dev/null +++ b/docs/scripts/translations/sort.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +ROOT_DIR=$(dirname "$0")/../.. +tmp=$(mktemp) +exit_code=0 + +for locale_file in $ROOT_DIR/webapp/locales/*.json +do + jq -f $(dirname "$0")/sort_filter.jq $locale_file > "$tmp" + if [ "$*" == "--fix" ] + then + mv "$tmp" $locale_file + else + if diff -q "$tmp" $locale_file > /dev/null ; + then + : # all good + else + exit_code=$? + echo "$(basename -- $locale_file) is not sorted by keys" + fi + fi +done + +exit $exit_code diff --git a/docs/scripts/translations/sort_filter.jq b/docs/scripts/translations/sort_filter.jq new file mode 100644 index 000000000..9d108f8f0 --- /dev/null +++ b/docs/scripts/translations/sort_filter.jq @@ -0,0 +1,13 @@ +def walk(f): + . as $in + | if type == "object" then + reduce keys_unsorted[] as $key + ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f + elif type == "array" then map( walk(f) ) | f + else f + end; + +def keys_sort_by(f): + to_entries | sort_by(.key|f ) | from_entries; + +walk(if type == "object" then keys_sort_by(ascii_upcase) else . end) \ No newline at end of file diff --git a/docs/search_plus_index.json b/docs/search_plus_index.json new file mode 100644 index 000000000..85145ffaa --- /dev/null +++ b/docs/search_plus_index.json @@ -0,0 +1 @@ +{"./":{"url":"./","title":"Introduction","keywords":"","body":"Ocelot.Social ocelot.social is free and open source software program code to run social networks. Its development is supported by a community of programmers and interested network operators. Our goal is to enable people to participate fairly and equally in online social networks. The equality of opportunity applies both to the fundamental equality of all people and to the possibility of letting their diverse voices be heard. We therefore consider it desirable that operators offer such networks so that people can choose where they want to be on the move. At the same time, it should be possible in the future to link these networks with each other (ActivityPub, Fediverse), so that users can also connect with people from other networks - for example by making friends or following posts or other contributions. In other words, we are interested in a network of networks and in keeping the data as close as possible to the user and the operator they trusts. Screenshots Check out more screenshots here. Features Ocelot.social networks feature: user accounts user roles posts and comments groups maps search filters and more … Check out the full feature list. User Guide and Frequently Asked Questions In the wiki you can find more information. User Guide Frequently Asked Questions Demo Try out our live demo network, see here. Help us If you're wondering how you could help, there are plenty of ways, e.g.: Spread the good word about ocelot.social to make it more popular: Add the link ocelot.social to your website. Give ocelot.social a Like at https://alternativeto.net/software/ocelot-social/. Star our project on GitHub at https://github.com/Ocelot-Social-Community/Ocelot-Social/. Promote it on your social networks. Tell your friends about it by word-of-mouth. Write a press article on ocelot.social or contact the editorial office of your local newspage or radio station. Take a good first issue or issues that need help. Make sure to read CONTRIBUTING.md first though. Testing and reporting bugs. Translating: Please contact us. Reviewing and testing pull requests. Donate Your donation is very welcome and helps to enhance and improve the network. This software is mostly developped and maintained by the association busFaktor() e.V.. Please support us with a donation to busFaktor() e.V.. Thanks a lot! ❤️ Contact Are you interested in operating your own ocelot.social network or becoming a user? Please contact us here: hello@ocelot.social Discord For Developers and Contributors Introduction Have a look into our short video: ocelot.social - GitHub - Developer Welcome - Tutorial (english) Directory Layout There are three important directories: Backend runs on the server and is a middleware between database and frontend Frontend is a server-side-rendered and client-side-rendered web frontend Cypress contains end-to-end tests and executable feature specifications In order to setup the application and start to develop features you have to setup frontend and backend. There are two approaches: Local installation, which means you have to take care of dependencies yourself. Or Install everything through Docker which takes care of dependencies for you. Installation Clone the Repository Clone the repository, this will create a new folder called Ocelot-Social: Using HTTPS: $ git clone https://github.com/Ocelot-Social-Community/Ocelot-Social.git Using SSH: $ git clone git@github.com:Ocelot-Social-Community/Ocelot-Social.git Change into the new folder. $ cd Ocelot-Social Live Demo And Developer Logins Try out our deployed development environment. Visit our staging networks: central staging network: stage.ocelot.social Login Logins for the live demos and developers (local developers after the following installations) in the browser: email password role user@example.org 1234 user moderator@example.org 1234 moderator admin@example.org 1234 admin Docker Installation Docker is a software development container tool that combines software and its dependencies into one standardized unit that contains everything needed to run it. This helps us to avoid problems with dependencies and makes installation easier. General Installation of Docker There are several ways to install Docker CE on your computer or server. install Docker Desktop on macOS install Docker Desktop on Windows install Docker CE on Linux Check the correct Docker installation by checking the version before proceeding. E.g. we have the following versions: $ docker --version Docker version 18.09.2 $ docker-compose --version docker-compose version 1.23.2 Start Ocelot-Social via Docker-Compose Prepare ENVs once beforehand: # in folder webapp/ $ cp .env.template .env # in folder backend/ $ cp .env.template .env For Development: # in main folder $ docker-compose up For Production: # in main folder $ docker-compose -f docker-compose.yml up This will start all required Docker containers.Make sure your database is running on http://localhost:7474/browser/. Prepare database once before you start by running the following command in a second terminal: # in main folder while docker-compose is up $ docker compose exec backend yarn run db:migrate init $ docker compose exec backend yarn run db:migrate up Then clear and seed database by running the following command as well in the second terminal: # in main folder while docker-compose is up $ docker-compose exec backend yarn run db:reset $ docker-compose exec backend yarn run db:seed For a closer description see backend README.md.For a full documentation see SUMMARY. Local Installation For a full documentation see SUMMARY. Contributing Choose an issue (consider our label good-first-issue) and leave a comment there. We will then invite you to join our volunteers team. To have the necessary permission to push directly to this repository, please accept our invitation to join our volunteers team, you will receive via the email, Github will send you, once invited. If we did not invite you yet, please request an invitation via Discord. We are happy if you fork our repository, but we don't recommend it for development. You do not need a fork. Clone this repository locally as described above, create your branch named -, add your code and push your branch to this repository. Then create a PR by comparing it to our master. Please run the following commands before you push: # in folder backend/ $ yarn lint --fix $ yarn test # in folder webapp/ $ yarn lint --fix $ yarn locales --fix $ yarn test Check out our contribution guideline, too! Developer Chat Join our friendly open-source community on Discord :heart_eyes_cat: Just introduce yourself at #introduce-yourself and mention a mentor or @@Mentors to get you onboard :neckbeard: We give write permissions to every developer who asks for it. Just text us on Discord. Deployment Deployment methods can be found in the Ocelot-Social-Deploy-Rebranding repository. The only deployment method in this repository for development purposes as described above is docker-compose. Technology Stack VueJS NuxtJS GraphQL NodeJS Neo4J For Testing Cypress Storybook Jest Vue Test Utils ESLint Attributions Locale Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY. Browser compatibility testing with BrowserStack. License See the LICENSE file for license rights and limitations (MIT). "},"edit-this-documentation.html":{"url":"edit-this-documentation.html","title":"Edit this Documentation","keywords":"","body":"Edit this Documentation Find the table of contents for this documentation on GitHub and navigate to the file you need to update. Click on the edit pencil on the right side directly above the text to edit this file on your fork of Human Connection (HC). You can see a preview of your changes by clicking the Preview changes tab aside the Edit file tab. If you are ready, fill in the Propose file change at the end of the webpage. After that you have to send your change to the HC basis with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our open issues please include the number.) Markdown your documentation To design your documentation see the syntax description at GitBook: https://toolchain.gitbook.com/syntax/markdown.html Some quick Examples Headlines # Main headline ## Smaller headlines ### Small headlines Tabs {% tabs %} {% tab title=\"XXX\" %} XXX {% endtab %} {% tab title=\"XXX\" %} XXX {% endtab %} … {% endtabs %} Commands ``` (for text highlighting) XXX ``` Links [XXX](https://XXX) Screenshots or other Images ![XXX](https://XXX) Hints For ToDos {% hint style=\"info\" %} TODO: XXX {% endhint %} Host The Screenshots Often we need screenshots to explain things. Host On Ocelot-Social GitHub repository TODO: How to host on Ocelot-Social GitHub repository ... Quick Solution To quickly host the screenshots go to: https://imgur.com. There click the green button New post. Drag the image into the appropriate area. Right click on it and choose kind of Open link in new tab. Copy the URL and paste it were you need it. Screenshot modification Add an arrow or some other marking stuff macOSWindowsLinuxIn the Preview AppGot to: Menu + Tools (GER: Werkzeuge) + Annotate (GER: Anmerkungen) + etc. "},"neo4j/":{"url":"neo4j/","title":"Neo4J","keywords":"","body":"Neo4J Human Connection is a social network. Using a graph based database which can model nodes and edges natively - a network - feels like an obvious choice. We decided to use Neo4j, the currently most used graph database available. The community edition of Neo4J is Free and Open Source and we try our best to keep our application compatible with the community edition only. Installation With Docker Run: docker-compose up You can access Neo4J through http://localhost:7474/ for an interactive cypher shell and a visualization of the graph. Installation Without Docker Install the community edition of Neo4j along with the plugin Apoc on your system. To do so, go to releases, choose \"Community Server\", download the installation files for you operation system and unpack the files. Download Neo4j Apoc and drop the .jar file into the plugins folder of the just extracted Neo4j-Server. Then make sure to allow Apoc procedures by adding the following line to your Neo4j configuration (conf/neo4j.conf): dbms.security.procedures.unrestricted=apoc.* Alternatives You can download Neo4j Desktop and run locally for development, spin up a hosted Neo4j Sandbox instance, run Neo4j in one of the many cloud options, spin up Neo4j in a Docker container, on Arch linux you can install neo4j-community from AUR or on Debian-based systems install Neo4j from the Debian Repository. Just be sure to update the Neo4j connection string and credentials accordingly in backend/.env. Start Neo4J and confirm the database is running at http://localhost:7474. Commands Here we describe some rarely used Cypher commands for Neo4j that are needed from time to time: Index And Constraint Commands If indexes or constraints are missing or not set correctly, the browser search will not work or the database seed for development will not work. The indexes and constraints of our database are set in backend/src/db/migrate/store.js. This is where the magic happens. It's called by our prod:migrate init command. This command initializes the Admin user and creates all necessary indexes and constraints in the Neo4j database. Calls in development Locally without Docker: # in backend folder $ yarn prod:migrate init Locally with Docker: # in main folder $ docker compose exec backend yarn prod:migrate init Calls in production Locally with Docker: # in main folder $ docker compose exec backend /bin/sh -c \"yarn prod:migrate init\" On a server with Kubernetes cluster: # tested for one backend replica # !!! be aware of the kubectl context !!! $ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c \"yarn prod:migrate init\" Cypher commands to show indexes and constraints # in browser command line or cypher shell # show all indexes and constraints $ :schema # show all indexes $ CALL db.indexes(); # show all constraints $ CALL db.constraints(); Cypher commands to create and drop indexes and constraints # in browser command line or cypher shell # create indexes $ 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\"]); # drop an index $ DROP CONSTRAINT ON ( image:Image ) ASSERT image.url IS UNIQUE # drop all indexes and constraints $ CALL apoc.schema.assert({},{},true) YIELD label, key RETURN * ; "},"backend/":{"url":"backend/","title":"Backend","keywords":"","body":"Backend Installation with Docker Run the following command to install everything through docker. The installation takes a bit longer on the first pass or on rebuild ... # in main folder $ docker-compose up # or # rebuild the containers for a cleanup $ docker-compose up --build Wait a little until your backend is up and running at http://localhost:4000/. Installation without Docker For the local installation you need a recent version of Node (>= v16.19.0). We are using v19.4.0 and therefore we recommend to use the same version (see some known problems with more recent node versions). You can use the node version manager nvm to switch between different local Node versions: # install Node $ cd backend $ nvm install v19.4.0 $ nvm use v19.4.0 Install node dependencies with yarn: # in main folder $ cd backend $ yarn install # or just $ yarn # or just later on to use version of \".nvmrc\" file $ nvm use && yarn Copy Environment Variables: # in backend/ $ cp .env.template .env Configure the new file according to your needs and your local setup. Make sure a local Neo4J instance is up and running. Start the backend for development with: # in backend/ $ yarn run dev or start the backend in production environment with: # in backend/ $ yarn run start For e-mail delivery, please configure at least SMTP_HOST and SMTP_PORT in your .env configuration file. Your backend is up and running at http://localhost:4000/ This will start the GraphQL service (by default on localhost:4000) where you can issue GraphQL requests or access GraphQL Playground in the browser. More details about our GraphQL playground and how to use it with ocelot.social can be found here. Database Indexes and Constraints Database indexes and constraints need to be created and upgraded when the database and the backend are running: DockerWithout Docker# in main folder while docker-compose is running $ docker exec backend yarn run db:migrate init # only once: init admin user and create indexes and constraints in Neo4j database # for development $ docker compose exec backend yarn prod:migrate init # in production mode use command $ docker compose exec backend /bin/sh -c \"yarn prod:migrate init\" # in main folder with docker compose running $ docker exec backend yarn run db:migrate up # in folder backend/ while database is running # make sure your database is running on http://localhost:7474/browser/ yarn run db:migrate init # in backend/ with database running (In docker or local) yarn run db:migrate up Seed Database If you want your backend to return anything else than an empty response, you need to seed your database: DockerWithout DockerIn another terminal run:# in main folder while docker-compose is running $ docker exec backend yarn run db:seed To reset the database run:# in main folder while docker-compose is running $ docker exec backend yarn run db:reset # you could also wipe out your neo4j database and delete all volumes with: $ docker-compose down -v # if container is not running, run this command to set up your database indexes and constraints $ docker exec backend yarn run db:migrate init # And then upgrade the indexes and const $ docker exec backend yarn run db:migrate up Run:# in backend/ while database is running $ yarn run db:seed To reset the database run:# in backend/ while database is running $ yarn run db:reset Data migrations Although Neo4J is schema-less,you might find yourself in a situation in which you have to migrate your data e.g. because your data modeling has changed. DockerWithout DockerGenerate a data migration file:# in main folder while docker-compose is running $ docker-compose exec backend yarn run db:migrate:create your_data_migration # Edit the file in ./src/db/migrations/ To run the migration:# in main folder while docker-compose is running $ docker exec backend yarn run db:migrate up Generate a data migration file:# in backend/ $ yarn run db:migrate:create your_data_migration # Edit the file in ./src/db/migrations/ To run the migration:# in backend/ while database is running $ yarn run db:migrate up Testing Beware: We have no multiple database setup at the moment. We clean the database after each test, running the tests will wipe out all your data! DockerWithout DockerRun the unit tests:# in main folder while docker-compose is running $ docker exec backend yarn run test Run the unit tests:# in backend/ while database is running $ yarn run test "},"backend/graphql.html":{"url":"backend/graphql.html","title":"GraphQL","keywords":"","body":"GraphQL with Apollo GraphQL is a data query language which provides an alternative to REST and ad-hoc web service architectures. It allows clients to define the structure of the data required, and exactly the same structure of the data is returned from the server. Middleware keeps resolvers clean A well-organized codebase is key for the ability to maintain and easily introduce changes into an app. Figuring out the right structure for your code remains a continuous challenge - especially as an application grows and more developers are joining a project. A common problem in GraphQL servers is that resolvers often get cluttered with business logic, making the entire resolver system harder to understand and maintain. GraphQL Middleware uses the middleware pattern (well-known from Express.js) to pull out repetitive code from resolvers and execute it before or after one of your resolvers is invoked. This improves code modularity and keeps your resolvers clean and simple. "},"backend/neo4j-graphql-js.html":{"url":"backend/neo4j-graphql-js.html","title":"neo4j-graphql-js","keywords":"","body":"neo4j-graphql.js We use an npm package called neo4j-graphql-js as a cypher query builder. This library also generates resolvers for graphql queries, unless we implement them ourselves. Debugging As you can see in their documentation it is possible to log out the generated cypher statements. To do so, run the backend like this: DEBUG=neo4j-graphql-js yarn run dev "},"webapp/":{"url":"webapp/","title":"Webapp","keywords":"","body":"Webapp Installation For preparation we need Node and recommend to use node version manager nvm to switch between different local Node versions: # install Node $ cd webapp $ nvm install v19.4.0 $ nvm use v19.4.0 Install node dependencies with yarn: # install all dependencies $ cd webapp $ yarn install # or just $ yarn # or just later on to use version of \".nvmrc\" file $ nvm use && yarn Copy: # in webapp cp .env.template .env Configure the files according to your needs and your local setup. Build for Development # serve with hot reload at localhost:3000 $ yarn dev Build for Production # build for production and launch server $ yarn build $ yarn start Run tests We ensure the quality of our frontend code by using ESLint for checking our JavaScript code Jest and Vue Test Utils to unit test our components Storybook to document and manually test our components in an isolated playground For more information see our frontend testing guide. Use these commands to run the tests: With DockerWithout DockerAfter starting the application following the above guidelines, open new terminal windows for each of these commands:# run eslint $ docker-compose exec webapp yarn lint # run unit tests $ docker-compose exec webapp yarn test # start storybook $ docker-compose exec webapp yarn storybook You can then visit the Storybook playground on http://localhost:3002After starting the application following the above guidelines, open new terminal windows and navigate to the /webapp directory for each of these commands:# run eslint in /webapp (use option --fix to normalize the files) $ yarn lint # run unit tests in /webapp $ yarn test # run locales in /webapp (use option --fix to sort the locales) $ yarn locales # start storybook in /webapp $ yarn storybook You can then visit the Storybook playground on http://localhost:3002 Maintenance Mode For installing and running the maintenance mode see Maintenance Mode. Styleguide Migration We are currently in the process of migrating our styleguide components and design tokens from the Nitro Styleguide into the main ocelot.social repository and refactoring our components in the process. During this migration, our new components will live in a _new/ folder to separate them from the old, yet untouched components. Folder Structure The folder structure we are following is prescribed by Nuxt.js: assets contains icons, images and logos in svg format and all shared SCSS files such as tokens components separated into two sub-folders: generic are the generic building blocks of the app – small, reusable and usually not coupled to state features are composed of components but tied to a particular function of the app (e.g. comment or post) layouts can use components to create layout templates for pages pages are the entry points for all routes in the app and are composed of layouts, features and components "},"webapp/components.html":{"url":"webapp/components.html","title":"Components","keywords":"","body":"Components – Code Guidelines We adhere to the single responsibility principle Each component does exactly one job. The goal is to end up with many small components that are: easy to understand easy to maintain easy to reuse How do you decide what is a separate component? Try to describe what it does in one sentence! When you find yourself using and and or the code you are talking about should probably be split up into two or more components. On the other hand, when something is easily expressed in a few lines of HTML and SCSS and not likely to be reused this is a good indicator that it should not go into a separate component. We compose with components Usually pages use layouts as templates and will be composed of features. features are composed of components, the smallest building blocks of the app. The further down we go in this hierarchy the simpler and more generic the components become. Here is an example: The index page is responsible for displaying a list of posts. It uses the default layout and the PostList feature. The PostList feature uses a List component to render PostTeaser features. The PostTeaser feature consists of a LayoutCard wrapped around a CardImage, CardTitle and CardContent component. The index page is unique in the app and will never be reused. The PostList knows it is handling post data and can therefore not be used for anything else – but it can display posts on the index as well as the user page. The Card on the other hand does not care about the type of data it needs to handle. It just takes whatever it receives and renders it in a certain way, so it can be reused throughout the app for many different features. We use two-word names We follow the W3C rules for naming custom elements as suggested in the Vue.js docs to differentiate our own components from regular HTML elements in our templates. Names should also be meaningful and unique to avoid confusion and code duplication, and also not too long to make them readable. Therefore: aim for two-word names, such as layout-card, post-list or post-teaser. Recommended reads For a deeper dive into the WHY and HOW have a look at the following resources which the above guidelines are based on: Atomic design CDD – component based design Vue.js component styleguide "},"webapp/html.html":{"url":"webapp/html.html","title":"HTML","keywords":"","body":"HTML – Code Guidelines We write semantic markup We avoid using divs and spans and try to choose more meaningful HTML elements instead. If unsure which element to use this list by MDN can be of help. Why? semantic markup is crucial for accessibility it makes the code more readable for other developers it benefits our SEO For more background see this article. This doesn’t mean you can’t ever use a div – just think twice before you do! We write as little HTML as possible – and as much as necessary HTML is used to structure content on the page and should therefore reflect its complexity. Not more and not less. Most content does not require deep nesting of HTML elements – if you find yourself wrapping container around container or adding an element just to correctly position another element on the page this calls for the use of CSS instead! Why? deep nesting makes it hard to understand, style and maintain components it can lead to performance issues Recommended reads For a deeper dive into the WHY and HOW have a look at the following resources: HTML: a good basis for accessibility Why, how, and when to use semantic HTML and ARIA "},"webapp/scss.html":{"url":"webapp/scss.html","title":"SCSS","keywords":"","body":"SCSS - Code Guidelines We use classes over tags and ids Never apply styles to tags or ids – use classes instead! Why? HTML tags are responsible for the document structure, not the looks targeting HTML tags comes with performance issues ids are responsible for identifying a unique element, not for styling it ids have higher specificity than classes and therefore don't play well together classes can be combined and reused while ids are unique For more background see the following articles on why not to style tags and why not to style ids. We use design tokens instead of magic numbers In order to achieve a consistent look and feel we use a set of pre-defined design tokens to style our components, for example colors, sizes and box-shadows. These tokens are stored as SCSS variables and reused throughout the app. So, instead of typing pixel values or hex codes make sure you use design tokens such as height-header or color-input-border. We name our classes after components Our SCSS styles live within the corresponding component (see the Vue.js docs for single-file components for reference) and should therefore carry the same unique name. Why? it clearly ties the styles to the one component having unique class names means styles will not be accidentally overwritten in other files we can avoid using scoped CSS which comes with performance caveats We use variants instead of overriding styles Components will sometimes need to look different depending on the context in which they are used – a button might for example be green when it represents a call to action and red when it triggers a destructive action. Rather than making the rounded-button component green by default and then overriding the color for, say, the delete-account action – use variants! Pass the rounded-button a prop, such as color: danger, and then apply the respective variant class. Name variant classes with a dash prefix, such as -danger, then target them like this: .rounded-button { /* other css styles */ &.-danger { color: $color-danger; } } We style within the component, we position when we use it In order to make components truly reusable it is important to limit their styles to, well, their actual styling. What color are they, how big is the text, what happens on hover, do they have a rounded border – all that is part of it. Margins, alignment and positioning on the other hand need to be defined in the parent because the same component might sometimes be aligned to the left, sometimes to the right and sometimes float above other content. For more details see the rscss guidelines. To do that, use the child selector, like this: .login-form { /* other css styles */ > .rounded-button { margin: $margin-small; justify-self: flex-end; } } A special case are dimensions like width and height. If it is important that a component always has the same dimensions (the height of a button should be consistent, for example) define it within the component itself, if a component should have flexible dimensions (a card, for example, could stretch over the whole screen in one place and be limited to a certain width in another) define the dimensions in the parent. Recommended reads For a deeper dive into the WHY and HOW have a look at the following resources which the above guidelines are based on: rscss – reasonable system for css stylesheet structure itcss – inverted triangle architecture for css "},"webapp/vue.html":{"url":"webapp/vue.html","title":"Vue","keywords":"","body":"Vue – Code Guidelines We use single-file components Each component lives in a single file, containing: its template (the DOM structure) its script (including props, data and methods among other things) its style (defining the look of the component) See the Vue.js docs for more details. Placed in the same folder are also: the test file (e.g. MyComponent.spec.js) the storybook file (e.g. MyComponent.story.js) We use typed props Vue.js allows us to define component props either as strings or as objects (with type and default or required values). Always go for the second option! Also: only (and always!) define a default for props that are not required. Why? it makes our code more robust – a warning will be shown when passing a wrong prop type it clearly defines the component API and tells other developers how to use it It is as easy as writing: props: { title: { type: String, required: true, }, image: { type: String, default: 'human-connection-logo.png', }, } For more complex use cases see the official Vue.js documentation. We use shorthands For better readability we prefer :something over v-bind:something @click over v-on:click #slotSame over v-slot:slotName #default over v-slot Read more in the official Vue.js docs (for slots) Recommended reads The Vue.js component style guide offers a whole list of best-practices for writing Vue components. "},"testing.html":{"url":"testing.html","title":"Testing Guide","keywords":"","body":"Testing Guide End-to-End Testing To test all the pieces together, from the user perspective, we use integration tests. They also show if the the backend and the frontend are working as expected in conjunction and also if the browser likes our app. more... Component Testing Individual Vue Components should also be documented and tested properly. This guarantees that they are reusable and the api gets more solid in the process. more... Unit Testing Expecially the Backend relies on Unit Tests, as there are no Vue Components. more... "},"cypress/":{"url":"cypress/","title":"End-to-end tests","keywords":"","body":"End-to-End Testing Setup with docker Are you running everything through docker? You're so lucky you don't have to setup anything! Just: $ docker-compose up Setup without docker To start the services that are required for cypress testing manually. You basically need the whole setup to run: backend webapp neo4j Navigate to the corresponding folders and start the services. Install cypress Even if the required services for testing run via docker, depending on your setup, the cypress tests themselves run on your host machine. So with our without docker, you would have to install cypress and its dependencies first: # in the root folder / $ yarn install Open Interactive Test Console The interactive cypress test console allows to run tests and have visual feedback on that. The interactive cypress environment also helps at debugging the tests, you can even time travel between individual steps and see the exact state of the app. To use this feature run: $ yarn cypress:open Run cypress To run cypress without the user interface: $ yarn cypress:run This is used to run cypress in CI or in console Write some Tests Check out the Cypress documentation for further information on how to write tests: Write-a-simple-test "},"webapp/testing.html":{"url":"webapp/testing.html","title":"Frontend tests","keywords":"","body":"Component Testing Linting We use ESLint to make sure all developers follow certain code guidelines when writing JavaScript. Most code editors offer an ESLint plugin which helps detect mistakes already while you are writing code. To run the linter manually before pushing up new code type yarn lint into your terminal. Most minor issues can be fixed automatically with the command yarn lint --fix. Unit tests We write unit tests with the help of Jest and Vue Test Utils to make sure our components work in the way they should. In these tests we usually check that a certain input leads to the expected output. They are used to test functionality. To run all tests use the command yarn test in the /webapp directory. Other useful commands are: yarn test -t test-name to run tests including test-name in their file or test names yarn test -o to run tests related to files that have been changed since the latest commit yarn test path/to/component.spec.js to run a single test file Documentation and manual testing Storybook is a great tool that performs two important functions in our project: Component documentation With Storybook our components can be documented in detail and offer a visual reference to other developers. When all components are properly documented, Storybook can be used as a big component library – where developers can browse through design tokens and components and immediately verify that the component offers the desired functionality. Manual testing in an isolated environment When adding new components or changing existing ones, Storybook can be helpful not only to document the feature for future use, but also to test different use cases (e.g. by passing different types of props) in an isolated playground. With the right addons, Storybook also gives immediate feedback on how well the component complies with accessibility guidelines. To run Storybook, first start the app, then enter the following command in a new terminal window: yarn storybook. The output should look similar to this: The ocelot.social Storybook will then be available on http://localhost:3002. "},"backend/testing.html":{"url":"backend/testing.html","title":"Backend tests","keywords":"","body":"Unit Testing "},"DOCKER_MORE_CLOSELY.html":{"url":"DOCKER_MORE_CLOSELY.html","title":"Docker More Closely","keywords":"","body":"Docker More Closely "},"CONTRIBUTING.html":{"url":"CONTRIBUTING.html","title":"Contributing","keywords":"","body":"CONTRIBUTING Thank you so much for thinking of contributing to the ocelot.social project! It's awesome you're here, we really appreciate it. :-) Getting Set Up Instructions for how to install all the necessary software and some code guidelines can be found in our main Readme or in our documentation. To get you started we recommend that you join forces with a regular contributor. Please join our Discord instance to chat with developers or just get in touch directly on an issue on either Github or Zenhub: We also can have pair programming sessions for you! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions. Development Flow We operate in two week sprints that are planned, estimated and prioritised on Zenhub. All issues are also linked to and synced with Github. Look for the good first issue label if you're not sure where to start! We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use Discord for real-time communication. This is how we solve bugs and implement features, step by step: We find an issue we want to work on, usually during the sprint planning but as an open source contributor this can happen at any time. We communicate with the team to see if the issue is still available. (When you comment on an issue but don't get an answer there within 1-2 days try to mention @Ocelot-Social-Community/core-team to make sure we check in.) We make sure we understand the issue in detail – what problem is it solving and how should it be implemented? We assign ourselves to the issue and move it to In Progress on Zenhub. We start working on it in a new branch and open a pull request prefixed with [WIP] (work in progress) to which we regularly push our changes. When questions come up we clarify them with the team (directly in the issue on Github). When we are happy with our work and our PR is passing all tests we remove the [WIP] from the PR description and ask for reviews (if you're not sure who to ask there is @Ocelot-Social-Community/core-team which pings all core developers). We then incorporate the suggestions from the reviews into our work and once it has been approved it can be merged into master! Every pull request needs to: fix an issue (if there is something you want to work on but there is no issue for it, create one first and discuss it with the team) include tests for the code that is added or changed pass all tests (linter, backend, webapp, code coverage, end-to-end) be approved by at least 1 developer who is not the owner of the PR (when more than 10 files were changed it needs 2 approvals) Contribution Flow For Open Source Contributors See contributing in main README.md The Team There are many volunteers all around the world helping us build this network and without their contributions we wouldn't be where we are today. Big thank you to all of you! You can talk to our core team on Discord. And on Github you will mostly run into our core developers: Ulf (@ulfgebhardt) Moriz (@Mogge) Wolle (@Tirokk) Alex (@ogerly) Meetings and Pair Programming Sessions Times below refer to German Time – that's CET (GMT+1) in winter and CEST (GMT+2) in summer – because most ocelot.social Community core team members are living in Germany. Daily standup every Monday–Thursday 11:30 am (german time see above 👆🏼) in our Discord Office Cube all contributors welcome! everybody shares what they are working on and asks for help if they are blocked Philosophy We practice collective code ownership rather than strong code ownership, which means that: developers can make contributions to other people's PRs (after checking in with them) we avoid blocking because someone else isn't working, so we sometimes take over PRs from other developers everyone should always push their code to branches so others can see it We believe in open source contributions as a learning experience – everyone is welcome to join our team of volunteers and to contribute to the project, no matter their background or level of experience. To support your learning experience we founded the charity association busFaktor() e.V.. We use pair programming sessions as a tool for knowledge sharing. We can learn a lot from each other and only by sharing what we know and overcoming challenges together can we grow as a team and truly own this project collectively. As a volunteer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you! ` which indicate their respective financial compensation in Euros. You can bill us after your pull request got approved and merged into `master`. Payment methods are up to you: Bank transfer or PayPal is fine for us. Just send us your invoice as .pdf file attached to an E-Mail once you are done. Our Open-Source bounty program is a work-in-progress. Based on our future experience we will make changes and improvements. So keep an eye on this contribution guide. --> Programming Localization Quotation Marks The following characters are different from the programming quotation mark: \" or \\\" Please copy and paste the following quotes for the languages: de: „Dies ist ein Beispielsatz.“ en: “This is a sample sentence.” See https://grammar.collinsdictionary.com/easy-learning/when-do-you-use-quotation-marks-or-in-english Docker – More Closely Apple M1 Platform *Attention: For using Docker commands in Apple M1 environments!* Environment Variable For Apple M1 Platform If you encounter trouble building the docker containers on an Apple M1 chip you can try to explicitly define the target platform docker builds and pulls images for: # set env variable for your shell $ export DOCKER_DEFAULT_PLATFORM=linux/amd64 Or alternatively use a YAML docker compose overwrite file with platform: linux/amd64. Analyzing Docker Builds To analyze a Docker build, there is a wonderful tool called dive. Please sponsor if you're using it! The dive build command is exactly the right one to fulfill what we are looking for. We can use it just like the docker build command and get an analysis afterwards. So, in our main folder, we use it in the following way: # in main folder $ dive build --target -t \"ocelotsocialnetwork/:local-\" --build-arg BBUILD_DATE=\"\" --build-arg BBUILD_VERSION=\"\" --build-arg BBUILD_COMMIT=\"\" / The build arguments are optional. For the specific applications, we use them as follows. Backend Production For Backend # in main folder $ dive build --target production -t \"ocelotsocialnetwork/backend:local-production\" backend/ Development For Backend # in main folder $ dive build --target development -t \"ocelotsocialnetwork/backend:local-development\" backend/ Webapp Production For Webapp # in main folder $ dive build --target production -t \"ocelotsocialnetwork/webapp:local-production\" webapp/ Development For Webapp # in main folder $ dive build --target development -t \"ocelotsocialnetwork/webapp:local-development\" webapp/ "},"cypress/features.html":{"url":"cypress/features.html","title":"Feature Specification","keywords":"","body":"Network Specification ocelot.social is free and open-source social network code that connects information to action and promotes positive local and global change in all areas of life. Social: Interact with other people not just by commenting their posts, but by providing Pro & Contra arguments, give a Versus or ask them by integrated Chat or Let's Talk Knowledge: Read articles about interesting topics and find related posts in the More Info tab or by Filtering based on Categories and Tagging or by using the Fulltext Search. Action: Don't just read about how to make the world a better place, but come into Action by following provided suggestions on the Action tab provided by other people or Organisations. Features The following features will be implemented. This gets done in three steps: First we will implement a basic feature set and provide a test system to test the basic network functionality. In a second step we will make our prototype publicly available with an advanced feature set including the technology and organizational structure to drive a bigger public social network. In a third step all the remaining features will be implemented to build the full product. User Account Cucumber Features Sign-up Agree to Data Privacy Statement Agree to Terms of Service Login Logoff Change User Name Change Email Address Change Password Delete Account Download User's Content GDPR-Information about stored Content Choosing Interface Language (e.g. German / English / French) Persistent Links User Profile Cucumber Features Upload and Change Avatar Upload and Change Profile Picture Edit Social Media Accounts Edit Locale information Show and delete Bookmarks (later) Show Posts of a specific User Show Comments of a specific User Dashboard Clickdummy Show Link to own Profile Show Friends Widget Show Favorites Widget Show Get Friends Widget Show popular Hashtags Widget Show Mini-Statistics Widget (all time) Show Chatrooms Widget Show List of Let's Talk requests with online status of requesting people Posts Cucumber Features Creating Posts Persistent Links Upload Teaser Picture for Post Upload additional Pictures Editing Title and Content Allow embedded Conten (Videos, Sound, ...) Choosing a Category Adding Tags Choosing Language (e.g. German / English / French) Choosing Visibility (Public / Friends / Private) Shout Button for Posts Bookmark Posts (later) Optionally provide Let's Talk Feature Optionally provide Commenting Feature Comments Creating Comments Deleting Comments Editing Comments Upvote comments of others Notifications Cucumber features User @-mentionings Notify authors for comments Administrative notifications to all users Contribution List Show Posts by Tiles Show Posts as List Filter by Category (Health and Wellbeing, Global Peace & Non-Violence, ...) Filter by Mood (Funny, Happy, Surprised, Cry, Angry, ...) Filter by Source (Connections, Following, Individuals, Non-Profits, ...) Filter by Posts & Tools (Post, Events, CanDos, ...) Filter by Format Type (Text, Pictures, Video, ...) Extended Filter (Continent, Country, Language, ...) Sort Posts by Date Sort Posts by Shouts Sort Posts by most Comments Sort Posts by Emoji-Count (all Types) Blacklist Video Blacklist Users Blacklist specific Terms Blacklist Tags Switch on/off Adult Content Search Cucumber Features Search for Categories Search for Tags Fulltext Search CanDos Creating CanDos Editing Title and Content Choosing a Category Adding Tags Choosing Language (e.g. German / English / French) Choosing Visibility (Public / Friends / Private) Choosing Difficulty Editing Why - why should you do this Editing Usefulness - what is it good for Versus (interaction on existing Post) Create / edit / delete Versus Jobs Create, edit and delete Jobs by an User Handle Jobs as Part of Projects Handle Jobs done by Organizations Projects Create, edit and delete Projects Edit Title and Description for the Project Set Project Type Set and Edit Timeline for the Project Add Media to the Project Chat about the Project Pro & Contra Create Pro and Con (2-row) Add Arguments on Pro or Con Side Rate up Arguments Add Tags Attach Media Votes Create Votes (Surveys with two or more Choices) Add Title and Description Let Users vote Add Tags Bestlist Create Bestlist Create Votes (Surveys) Add Title and Description Add Tags Let Users vote for Best Item Set Settings (allow Uploads, allow Links, ...) Events Create Events Add Title and Description Choose Date and Location Add Tags More Info Shows automatically related information for existing post. Show related Posts Show Pros and Cons Show Bestlist Show Votes Link to corresponding Chatroom Take Action Shows automatically related actions for existing post. Show related Organisations Show related CanDos Show related Projects Show related Jobs Show related Events Show Map Badges System Importing Badge Information (CSV) Showing Badges Badge Administration by Admins Choosing Badges to display by User Chat Basic 1:1 Chat functionality Let's Talk Request Let's talk with Author of Post Requestor can request private or public Let's Talk Requestor can choose the Chat format (Video, Audio, Text) Interact with interested People 1:1 Approve request from Requestor Organizations Propose Organizations by users Set Name and Details Set Homepage Set Region Set Topic Commit organizations by HC-Org-Team Panel for Organisation Handling by themselfes Choose/Mark Users as authorized to manage an Organization Moderation Cucumber Features Report Button for users for doubtful Content Moderator Panel List of reported Content (later replaced by User-Moderation) Mark verified Users as Moderators Show Posts to be moderated highlighted to User-Moderators Statistics about kinds of reported Content by Time Statistics about Decisions in Moderation Administration Cucumber Features Provide Admin-Interface to send Users Invite Code Static Pages for Data Privacy Statement ... Create, edit and delete Announcements Pin a post to inform users Invitation Allow Users to invite others by Email Allow Users to register with Invite Code Double-opt-in by Email Internationalization Cucumber Features Frontend UI Backend Error Messages Federation Provide Server-Server ActivityPub-API Provide User-Server Activitypub-API Receiving public addressed Article and Note Objects Receiving Like and Follow Activities Receiving Undo and Delete Activities for Articles and Notes Serving Webfinger records and Actor Objects Serving Followers, Following and Outbox collections "},"CODE_OF_CONDUCT.html":{"url":"CODE_OF_CONDUCT.html","title":"Code of conduct","keywords":"","body":"Contributor Covenant Code of Conduct Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. Our Standards Examples of behavior that contributes to creating a positive environment include: Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include: The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at devops@ocelot.social. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. Attribution This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at http://contributor-covenant.org/version/1/4 "},"LICENSE.html":{"url":"LICENSE.html","title":"License","keywords":"","body":"LICENSE MIT License Copyright (c) 2018-2021 Ocelot.Social Community Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. "}} \ No newline at end of file diff --git a/docs/testing.html b/docs/testing.html new file mode 100644 index 000000000..ef11bc642 --- /dev/null +++ b/docs/testing.html @@ -0,0 +1,545 @@ + + + + + + + Testing Guide · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          +
                          + + + + + + + + +
                          + +
                          + +
                          + + + + + + + + +
                          +
                          + +
                          +
                          + +
                          + +

                          Testing Guide

                          +

                          End-to-End Testing

                          +

                          To test all the pieces together, from the user perspective, we use integration tests. They also show if the the backend and the frontend are working as expected in conjunction and also if the browser likes our app.

                          +

                          more...

                          +

                          Component Testing

                          +

                          Individual Vue Components should also be documented and tested properly. This guarantees that they are reusable and the api gets more solid in the process.

                          +

                          more...

                          +

                          Unit Testing

                          +

                          Expecially the Backend relies on Unit Tests, as there are no Vue Components.

                          +

                          more...

                          + + +
                          + +
                          +
                          +
                          + +

                          results matching ""

                          +
                            + +
                            +
                            + +

                            No results matching ""

                            + +
                            +
                            +
                            + +
                            +
                            + +
                            + + + + + + + + + + + + + + +
                            + + +
                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/.babelrc b/docs/webapp/.babelrc new file mode 100644 index 000000000..4538e0ac0 --- /dev/null +++ b/docs/webapp/.babelrc @@ -0,0 +1,28 @@ +{ + "plugins": [ + "@babel/plugin-syntax-dynamic-import" + ], + "presets": [ + [ + "@babel/preset-env", + { + "modules": false + } + ] + ], + "env": { + "test": { + "plugins": ["require-context-hook"], + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "10" + } + } + ] + ] + } + } +} diff --git a/docs/webapp/.dockerignore b/docs/webapp/.dockerignore new file mode 100644 index 000000000..2f7daf103 --- /dev/null +++ b/docs/webapp/.dockerignore @@ -0,0 +1,18 @@ +.vscode/ + +styleguide/ +node_modules/ +npm-debug.log + +Dockerfile +docker-compose*.yml +scripts/ + +.env + +cypress/ + +README.md +.editorconfig + +maintenance/node_modules/ diff --git a/docs/webapp/.editorconfig b/docs/webapp/.editorconfig new file mode 100644 index 000000000..5d1263484 --- /dev/null +++ b/docs/webapp/.editorconfig @@ -0,0 +1,13 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/docs/webapp/.env.template b/docs/webapp/.env.template new file mode 100644 index 000000000..76bc502f9 --- /dev/null +++ b/docs/webapp/.env.template @@ -0,0 +1,8 @@ +SENTRY_DSN_WEBAPP= +COMMIT= +WEBSOCKETS_URI=ws://localhost:3000/api/graphql +GRAPHQL_URI=http://localhost:4000/ +MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" +PUBLIC_REGISTRATION=false +INVITE_REGISTRATION=true +CATEGORIES_ACTIVE=false diff --git a/docs/webapp/.eslintignore b/docs/webapp/.eslintignore new file mode 100644 index 000000000..a90a66efa --- /dev/null +++ b/docs/webapp/.eslintignore @@ -0,0 +1,6 @@ +node_modules +dist +.nuxt +styleguide/ +**/*.min.js +static/sw.js diff --git a/docs/webapp/.eslintrc.js b/docs/webapp/.eslintrc.js new file mode 100644 index 000000000..f5aa82c81 --- /dev/null +++ b/docs/webapp/.eslintrc.js @@ -0,0 +1,33 @@ +module.exports = { + root: true, + env: { + browser: true, + node: true, + jest: true + }, + parserOptions: { + parser: 'babel-eslint' + }, + extends: [ + 'standard', + 'plugin:vue/essential', + 'plugin:prettier/recommended' + ], + // required to lint *.vue files + plugins: [ + 'vue', + 'prettier', + 'jest' + ], + // add your custom rules here + rules: { + //'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-console': ['error'], + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'vue/component-name-in-template-casing': ['error', 'kebab-case'], + 'prettier/prettier': ['error', { + htmlWhitespaceSensitivity: 'ignore' + }], + // 'newline-per-chained-call': [2] + } +} diff --git a/docs/webapp/.gitignore b/docs/webapp/.gitignore new file mode 100644 index 000000000..dca219bb5 --- /dev/null +++ b/docs/webapp/.gitignore @@ -0,0 +1,88 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +styleguide/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# Nuxt generate +dist + +#ignore internal github files +/.github + +# Serverless directories +.serverless + +# IDE +.idea +.vscode + +# TEMORIRY +static/uploads + +cypress/videos +cypress/screenshots/ +cypress.env.json + +# Apple macOS folder attribute file +.DS_Store + +sw.* diff --git a/docs/webapp/.nvmrc b/docs/webapp/.nvmrc new file mode 100644 index 000000000..58b8c2a00 --- /dev/null +++ b/docs/webapp/.nvmrc @@ -0,0 +1 @@ +v20.2.0 \ No newline at end of file diff --git a/docs/webapp/.prettierrc.js b/docs/webapp/.prettierrc.js new file mode 100644 index 000000000..e2cf91e91 --- /dev/null +++ b/docs/webapp/.prettierrc.js @@ -0,0 +1,9 @@ + +module.exports = { + semi: false, + printWidth: 100, + singleQuote: true, + trailingComma: "all", + tabWidth: 2, + bracketSpacing: true +}; diff --git a/docs/webapp/Dockerfile b/docs/webapp/Dockerfile new file mode 100644 index 000000000..b0ecbdd37 --- /dev/null +++ b/docs/webapp/Dockerfile @@ -0,0 +1,108 @@ +################################################################################## +# BASE (Is pushed to DockerHub for rebranding) ################################### +################################################################################## +FROM node:20.2.0-alpine3.17 as base + +# ENVs +## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame +ENV DOCKER_WORKDIR="/app" +## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 +ARG BBUILD_DATE="1970-01-01T00:00:00.00Z" +ENV BUILD_DATE=$BBUILD_DATE +## We cannot do $(yarn run version)-${BUILD_NUMBER} here so we default to 0.0.0-0 +ARG BBUILD_VERSION="0.0.0-0" +ENV BUILD_VERSION=$BBUILD_VERSION +## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 +ARG BBUILD_COMMIT="0000000" +ENV BUILD_COMMIT=$BBUILD_COMMIT +## SET NODE_ENV +ENV NODE_ENV="production" +## App relevant Envs +ENV PORT="3000" + +# Labels +LABEL org.label-schema.build-date="${BUILD_DATE}" +LABEL org.label-schema.name="ocelot.social:backend" +LABEL org.label-schema.description="Web Frontend of the Social Network Software ocelot.social" +LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md" +LABEL org.label-schema.url="https://ocelot.social" +LABEL org.label-schema.vcs-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/backend" +LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}" +LABEL org.label-schema.vendor="ocelot.social Community" +LABEL org.label-schema.version="${BUILD_VERSION}" +LABEL org.label-schema.schema-version="1.0" +LABEL maintainer="devops@ocelot.social" + +# Install Additional Software +## install: git +RUN apk --no-cache add git python3 make g++ + +# Settings +## Expose Container Port +EXPOSE ${PORT} + +## Workdir +RUN mkdir -p ${DOCKER_WORKDIR} +WORKDIR ${DOCKER_WORKDIR} + +################################################################################## +# DEVELOPMENT (Connected to the local environment, to reload on demand) ########## +################################################################################## +FROM base as development + +# We don't need to copy or build anything since we gonna bind to the +# local filesystem which will need a rebuild anyway + +# Run command +# (for development we need to execute yarn install since the +# node_modules are on another volume and need updating) +CMD /bin/sh -c "yarn install && yarn run dev" + +################################################################################## +# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ### +################################################################################## +FROM base as code + +# copy everything, but do not build. +COPY . . + +################################################################################## +# BUILD (Does contain all files and the compilate and is therefore bloated) ###### +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# TEST ########################################################################### +################################################################################## +FROM build as test + +# Run command +CMD /bin/sh -c "yarn run dev" + +################################################################################## +# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) # +################################################################################## +FROM base as production + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js +# Copy static files +# TODO - this seems not be needed anymore for the new rebranding +# TODO - this should be one Folder containign all stuff needed to be copied +COPY --from=build ${DOCKER_WORKDIR}/config/ ./config/ +COPY --from=build ${DOCKER_WORKDIR}/constants ./constants +COPY --from=build ${DOCKER_WORKDIR}/static ./static +COPY --from=build ${DOCKER_WORKDIR}/locales ./locales +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/docs/webapp/Dockerfile.maintenance b/docs/webapp/Dockerfile.maintenance new file mode 100644 index 000000000..91dc1c832 --- /dev/null +++ b/docs/webapp/Dockerfile.maintenance @@ -0,0 +1,93 @@ +################################################################################## +# BASE ########################################################################### +################################################################################## +FROM node:20.3.0-alpine3.17 as base + +# ENVs +## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame +ENV DOCKER_WORKDIR="/app" +## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 +ARG BBUILD_DATE="1970-01-01T00:00:00.00Z" +ENV BUILD_DATE=$BBUILD_DATE +## We cannot do $(yarn run version)-${BUILD_NUMBER} here so we default to 0.0.0-0 +ARG BBUILD_VERSION="0.0.0-0" +ENV BUILD_VERSION=$BBUILD_VERSION +## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 +ARG BBUILD_COMMIT="0000000" +ENV BUILD_COMMIT=$BBUILD_COMMIT +## SET NODE_ENV +ENV NODE_ENV="production" +## App relevant Envs +ENV PORT="3000" + +# Labels +LABEL org.label-schema.build-date="${BUILD_DATE}" +LABEL org.label-schema.name="ocelot.social:backend" +LABEL org.label-schema.description="Maintenance page of the Social Network Software ocelot.social" +LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md" +LABEL org.label-schema.url="https://ocelot.social" +LABEL org.label-schema.vcs-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/backend" +LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}" +LABEL org.label-schema.vendor="ocelot.social Community" +LABEL org.label-schema.version="${BUILD_VERSION}" +LABEL org.label-schema.schema-version="1.0" +LABEL maintainer="devops@ocelot.social" + +# Install Additional Software +## install: git +RUN apk --no-cache add git python3 make g++ + +# Settings +## Expose Container Port +EXPOSE ${PORT} + +## Workdir +RUN mkdir -p ${DOCKER_WORKDIR} +WORKDIR ${DOCKER_WORKDIR} + +CMD ["yarn", "run", "start"] + +################################################################################## +# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ### +################################################################################## +FROM base as code + +COPY package.json yarn.lock ./ +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive + +COPY assets assets +# COPY components/_new/generic/ components/_new/generic +COPY components/LocaleSwitch/ components/LocaleSwitch +COPY components/Dropdown.vue components/Dropdown.vue +# COPY components/Logo/ components/Logo +COPY layouts/blank.vue layouts/blank.vue +COPY locales locales +COPY mixins mixins +COPY plugins/i18n.js plugins/v-tooltip.js plugins/styleguide.js plugins/ +COPY static static +COPY constants constants +COPY nuxt.config.js nuxt.config.js +COPY config/ config/ + +# this is needed in rebranding +COPY maintenance/nginx maintenance/nginx +# this will also ovewrite the existing package.json +COPY maintenance/source ./ + +################################################################################## +# BUILD ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO ## +################################################################################## +FROM code as build + +# yarn generate +RUN yarn run generate + +################################################################################## +# PRODUCTION ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO #### +################################################################################## +FROM nginx:alpine as production + +COPY --from=build ./app/dist/ /usr/share/nginx/html/ +RUN rm /etc/nginx/conf.d/default.conf +COPY maintenance/nginx/custom.conf /etc/nginx/conf.d/ diff --git a/docs/webapp/app/router.scrollBehavior.js b/docs/webapp/app/router.scrollBehavior.js new file mode 100644 index 000000000..a87054048 --- /dev/null +++ b/docs/webapp/app/router.scrollBehavior.js @@ -0,0 +1,10 @@ +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 + // post page you click on 'comments', we avoid a "jumping" scroll behavior, + // ie. jump to the top and scroll back from there + if (to.path === from.path && to.hash !== from.hash) return false + + return { x: 0, y: 0 } +} diff --git a/docs/webapp/assets/_new/icons/index.js b/docs/webapp/assets/_new/icons/index.js new file mode 100644 index 000000000..bc9ef6638 --- /dev/null +++ b/docs/webapp/assets/_new/icons/index.js @@ -0,0 +1,13 @@ +const svgFileList = require.context('./svgs', true, /\.svg/) +const icons = {} +const iconNames = [] + +svgFileList.keys().forEach((fileName) => { + const svgCode = svgFileList(fileName) + const iconName = fileName.replace('./', '').replace('.svg', '') + icons[iconName] = svgCode + iconNames.push(iconName) +}) + +export { iconNames } +export default icons diff --git a/docs/webapp/assets/_new/icons/svgs/align-center.svg b/docs/webapp/assets/_new/icons/svgs/align-center.svg new file mode 100644 index 000000000..4232dff91 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/align-center.svg @@ -0,0 +1,5 @@ + + +align-center + + diff --git a/docs/webapp/assets/_new/icons/svgs/align-justify.svg b/docs/webapp/assets/_new/icons/svgs/align-justify.svg new file mode 100644 index 000000000..ce82c7f0a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/align-justify.svg @@ -0,0 +1,5 @@ + + +align-justify + + diff --git a/docs/webapp/assets/_new/icons/svgs/align-left.svg b/docs/webapp/assets/_new/icons/svgs/align-left.svg new file mode 100644 index 000000000..c76e93dc9 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/align-left.svg @@ -0,0 +1,5 @@ + + +align-left + + diff --git a/docs/webapp/assets/_new/icons/svgs/align-right.svg b/docs/webapp/assets/_new/icons/svgs/align-right.svg new file mode 100644 index 000000000..24972ed83 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/align-right.svg @@ -0,0 +1,5 @@ + + +align-right + + diff --git a/docs/webapp/assets/_new/icons/svgs/angellist.svg b/docs/webapp/assets/_new/icons/svgs/angellist.svg new file mode 100644 index 000000000..34123f5f0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/angellist.svg @@ -0,0 +1,5 @@ + + +angellist + + diff --git a/docs/webapp/assets/_new/icons/svgs/angle-down.svg b/docs/webapp/assets/_new/icons/svgs/angle-down.svg new file mode 100644 index 000000000..aa6f763c8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/angle-down.svg @@ -0,0 +1,5 @@ + + +angle-down + + diff --git a/docs/webapp/assets/_new/icons/svgs/angle-left.svg b/docs/webapp/assets/_new/icons/svgs/angle-left.svg new file mode 100644 index 000000000..826dd8e34 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/angle-left.svg @@ -0,0 +1,5 @@ + + +angle-left + + diff --git a/docs/webapp/assets/_new/icons/svgs/angle-right.svg b/docs/webapp/assets/_new/icons/svgs/angle-right.svg new file mode 100644 index 000000000..1df45a590 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/angle-right.svg @@ -0,0 +1,5 @@ + + +angle-right + + diff --git a/docs/webapp/assets/_new/icons/svgs/angle-up.svg b/docs/webapp/assets/_new/icons/svgs/angle-up.svg new file mode 100644 index 000000000..af58a3f27 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/angle-up.svg @@ -0,0 +1,5 @@ + + +angle-up + + diff --git a/docs/webapp/assets/_new/icons/svgs/archive.svg b/docs/webapp/assets/_new/icons/svgs/archive.svg new file mode 100644 index 000000000..878713822 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/archive.svg @@ -0,0 +1,5 @@ + + +archive + + diff --git a/docs/webapp/assets/_new/icons/svgs/arrow-down.svg b/docs/webapp/assets/_new/icons/svgs/arrow-down.svg new file mode 100644 index 000000000..6cee34766 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/arrow-down.svg @@ -0,0 +1,5 @@ + + +arrow-down + + diff --git a/docs/webapp/assets/_new/icons/svgs/arrow-left.svg b/docs/webapp/assets/_new/icons/svgs/arrow-left.svg new file mode 100644 index 000000000..f7489c43a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/arrow-left.svg @@ -0,0 +1,5 @@ + + +arrow-left + + diff --git a/docs/webapp/assets/_new/icons/svgs/arrow-right.svg b/docs/webapp/assets/_new/icons/svgs/arrow-right.svg new file mode 100644 index 000000000..62d753057 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/arrow-right.svg @@ -0,0 +1,5 @@ + + +arrow-right + + diff --git a/docs/webapp/assets/_new/icons/svgs/arrow-up.svg b/docs/webapp/assets/_new/icons/svgs/arrow-up.svg new file mode 100644 index 000000000..f48c186c0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/arrow-up.svg @@ -0,0 +1,5 @@ + + +arrow-up + + diff --git a/docs/webapp/assets/_new/icons/svgs/at.svg b/docs/webapp/assets/_new/icons/svgs/at.svg new file mode 100644 index 000000000..e046ea75a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/at.svg @@ -0,0 +1,5 @@ + + +at + + diff --git a/docs/webapp/assets/_new/icons/svgs/balance-scale.svg b/docs/webapp/assets/_new/icons/svgs/balance-scale.svg new file mode 100644 index 000000000..f5e446fd2 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/balance-scale.svg @@ -0,0 +1,5 @@ + + +balance-scale + + diff --git a/docs/webapp/assets/_new/icons/svgs/ban.svg b/docs/webapp/assets/_new/icons/svgs/ban.svg new file mode 100644 index 000000000..7dc338541 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/ban.svg @@ -0,0 +1,5 @@ + + +ban + + diff --git a/docs/webapp/assets/_new/icons/svgs/bar-chart.svg b/docs/webapp/assets/_new/icons/svgs/bar-chart.svg new file mode 100644 index 000000000..0c853e737 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bar-chart.svg @@ -0,0 +1,5 @@ + + +bar-chart + + diff --git a/docs/webapp/assets/_new/icons/svgs/bars.svg b/docs/webapp/assets/_new/icons/svgs/bars.svg new file mode 100644 index 000000000..5ea0f464d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bars.svg @@ -0,0 +1,5 @@ + + +bars + + diff --git a/docs/webapp/assets/_new/icons/svgs/bell.svg b/docs/webapp/assets/_new/icons/svgs/bell.svg new file mode 100644 index 000000000..ee58c443c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bell.svg @@ -0,0 +1,5 @@ + + +bell + + diff --git a/docs/webapp/assets/_new/icons/svgs/bold.svg b/docs/webapp/assets/_new/icons/svgs/bold.svg new file mode 100644 index 000000000..c3516808d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bold.svg @@ -0,0 +1,5 @@ + + +bold + + diff --git a/docs/webapp/assets/_new/icons/svgs/book.svg b/docs/webapp/assets/_new/icons/svgs/book.svg new file mode 100644 index 000000000..305e367ac --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/book.svg @@ -0,0 +1,5 @@ + + +book + + diff --git a/docs/webapp/assets/_new/icons/svgs/bookmark.svg b/docs/webapp/assets/_new/icons/svgs/bookmark.svg new file mode 100644 index 000000000..bd3ff4559 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bookmark.svg @@ -0,0 +1,5 @@ + + +bookmark + + diff --git a/docs/webapp/assets/_new/icons/svgs/briefcase.svg b/docs/webapp/assets/_new/icons/svgs/briefcase.svg new file mode 100644 index 000000000..c0f6552a0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/briefcase.svg @@ -0,0 +1,5 @@ + + +briefcase + + diff --git a/docs/webapp/assets/_new/icons/svgs/bug.svg b/docs/webapp/assets/_new/icons/svgs/bug.svg new file mode 100644 index 000000000..66374d8bc --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bug.svg @@ -0,0 +1,5 @@ + + +bug + + diff --git a/docs/webapp/assets/_new/icons/svgs/bullhorn.svg b/docs/webapp/assets/_new/icons/svgs/bullhorn.svg new file mode 100644 index 000000000..95e0d21d3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/bullhorn.svg @@ -0,0 +1,5 @@ + + +bullhorn + + diff --git a/docs/webapp/assets/_new/icons/svgs/calculator.svg b/docs/webapp/assets/_new/icons/svgs/calculator.svg new file mode 100644 index 000000000..657b19919 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/calculator.svg @@ -0,0 +1,5 @@ + + +calculator + + diff --git a/docs/webapp/assets/_new/icons/svgs/calendar.svg b/docs/webapp/assets/_new/icons/svgs/calendar.svg new file mode 100644 index 000000000..5a67a8299 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/calendar.svg @@ -0,0 +1,5 @@ + + +calendar + + diff --git a/docs/webapp/assets/_new/icons/svgs/camera.svg b/docs/webapp/assets/_new/icons/svgs/camera.svg new file mode 100644 index 000000000..793620544 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/camera.svg @@ -0,0 +1,5 @@ + + +camera + + diff --git a/docs/webapp/assets/_new/icons/svgs/cart-plus.svg b/docs/webapp/assets/_new/icons/svgs/cart-plus.svg new file mode 100644 index 000000000..84ea385bd --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cart-plus.svg @@ -0,0 +1,5 @@ + + +cart-plus + + diff --git a/docs/webapp/assets/_new/icons/svgs/certificate.svg b/docs/webapp/assets/_new/icons/svgs/certificate.svg new file mode 100644 index 000000000..341b4af3e --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/certificate.svg @@ -0,0 +1,5 @@ + + +certificate + + diff --git a/docs/webapp/assets/_new/icons/svgs/chain-broken.svg b/docs/webapp/assets/_new/icons/svgs/chain-broken.svg new file mode 100644 index 000000000..4ba13f49c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/chain-broken.svg @@ -0,0 +1,5 @@ + + +chain-broken + + diff --git a/docs/webapp/assets/_new/icons/svgs/chain.svg b/docs/webapp/assets/_new/icons/svgs/chain.svg new file mode 100644 index 000000000..9d390e126 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/chain.svg @@ -0,0 +1,5 @@ + + +chain + + diff --git a/docs/webapp/assets/_new/icons/svgs/chat-bubble.svg b/docs/webapp/assets/_new/icons/svgs/chat-bubble.svg new file mode 100644 index 000000000..377b52f2f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/chat-bubble.svg @@ -0,0 +1,4 @@ + +chat-bubble + + \ No newline at end of file diff --git a/docs/webapp/assets/_new/icons/svgs/check.svg b/docs/webapp/assets/_new/icons/svgs/check.svg new file mode 100644 index 000000000..bf49fe01d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/check.svg @@ -0,0 +1,5 @@ + + +check + + diff --git a/docs/webapp/assets/_new/icons/svgs/child.svg b/docs/webapp/assets/_new/icons/svgs/child.svg new file mode 100644 index 000000000..fcb5651f0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/child.svg @@ -0,0 +1,5 @@ + + +child + + diff --git a/docs/webapp/assets/_new/icons/svgs/clock.svg b/docs/webapp/assets/_new/icons/svgs/clock.svg new file mode 100644 index 000000000..2344dd890 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/clock.svg @@ -0,0 +1,5 @@ + + +clock-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/close.svg b/docs/webapp/assets/_new/icons/svgs/close.svg new file mode 100644 index 000000000..48604d097 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/close.svg @@ -0,0 +1,5 @@ + + +close + + diff --git a/docs/webapp/assets/_new/icons/svgs/cloud-download.svg b/docs/webapp/assets/_new/icons/svgs/cloud-download.svg new file mode 100644 index 000000000..fcc46456b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cloud-download.svg @@ -0,0 +1,5 @@ + + +cloud-download + + diff --git a/docs/webapp/assets/_new/icons/svgs/cloud-upload.svg b/docs/webapp/assets/_new/icons/svgs/cloud-upload.svg new file mode 100644 index 000000000..8a0c486b2 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cloud-upload.svg @@ -0,0 +1,5 @@ + + +cloud-upload + + diff --git a/docs/webapp/assets/_new/icons/svgs/cloud.svg b/docs/webapp/assets/_new/icons/svgs/cloud.svg new file mode 100644 index 000000000..7ee840e92 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cloud.svg @@ -0,0 +1,5 @@ + + +cloud + + diff --git a/docs/webapp/assets/_new/icons/svgs/code.svg b/docs/webapp/assets/_new/icons/svgs/code.svg new file mode 100644 index 000000000..2581fa884 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/code.svg @@ -0,0 +1,5 @@ + + +code + + diff --git a/docs/webapp/assets/_new/icons/svgs/coffee.svg b/docs/webapp/assets/_new/icons/svgs/coffee.svg new file mode 100644 index 000000000..302150d0a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/coffee.svg @@ -0,0 +1,5 @@ + + +coffee + + diff --git a/docs/webapp/assets/_new/icons/svgs/cogs.svg b/docs/webapp/assets/_new/icons/svgs/cogs.svg new file mode 100644 index 000000000..3d0104d19 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cogs.svg @@ -0,0 +1,5 @@ + + +cogs + + diff --git a/docs/webapp/assets/_new/icons/svgs/columns.svg b/docs/webapp/assets/_new/icons/svgs/columns.svg new file mode 100644 index 000000000..f77576ed4 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/columns.svg @@ -0,0 +1,5 @@ + + +columns + + diff --git a/docs/webapp/assets/_new/icons/svgs/comment.svg b/docs/webapp/assets/_new/icons/svgs/comment.svg new file mode 100644 index 000000000..fe848ec20 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/comment.svg @@ -0,0 +1,5 @@ + + +comment + + diff --git a/docs/webapp/assets/_new/icons/svgs/comments.svg b/docs/webapp/assets/_new/icons/svgs/comments.svg new file mode 100644 index 000000000..551f10e4e --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/comments.svg @@ -0,0 +1,5 @@ + + +comments + + diff --git a/docs/webapp/assets/_new/icons/svgs/compass.svg b/docs/webapp/assets/_new/icons/svgs/compass.svg new file mode 100644 index 000000000..935cb5791 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/compass.svg @@ -0,0 +1,5 @@ + + +compass + + diff --git a/docs/webapp/assets/_new/icons/svgs/copy.svg b/docs/webapp/assets/_new/icons/svgs/copy.svg new file mode 100644 index 000000000..1792f2002 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/copy.svg @@ -0,0 +1,5 @@ + + +copy + + diff --git a/docs/webapp/assets/_new/icons/svgs/credit-card.svg b/docs/webapp/assets/_new/icons/svgs/credit-card.svg new file mode 100644 index 000000000..29c1fb96f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/credit-card.svg @@ -0,0 +1,5 @@ + + +credit-card + + diff --git a/docs/webapp/assets/_new/icons/svgs/crop.svg b/docs/webapp/assets/_new/icons/svgs/crop.svg new file mode 100644 index 000000000..069de9d1e --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/crop.svg @@ -0,0 +1,5 @@ + + +crop + + diff --git a/docs/webapp/assets/_new/icons/svgs/crosshairs.svg b/docs/webapp/assets/_new/icons/svgs/crosshairs.svg new file mode 100644 index 000000000..6d8b9aa04 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/crosshairs.svg @@ -0,0 +1,5 @@ + + +crosshairs + + diff --git a/docs/webapp/assets/_new/icons/svgs/cube.svg b/docs/webapp/assets/_new/icons/svgs/cube.svg new file mode 100644 index 000000000..97fbdf121 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cube.svg @@ -0,0 +1,5 @@ + + +cube + + diff --git a/docs/webapp/assets/_new/icons/svgs/cubes.svg b/docs/webapp/assets/_new/icons/svgs/cubes.svg new file mode 100644 index 000000000..aeb3d66d1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cubes.svg @@ -0,0 +1,5 @@ + + +cubes + + diff --git a/docs/webapp/assets/_new/icons/svgs/culture.svg b/docs/webapp/assets/_new/icons/svgs/culture.svg new file mode 100644 index 000000000..d63e38cb4 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/culture.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/cut.svg b/docs/webapp/assets/_new/icons/svgs/cut.svg new file mode 100644 index 000000000..f04b85c3b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/cut.svg @@ -0,0 +1,5 @@ + + +cut + + diff --git a/docs/webapp/assets/_new/icons/svgs/dashboard.svg b/docs/webapp/assets/_new/icons/svgs/dashboard.svg new file mode 100644 index 000000000..74358fd41 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/dashboard.svg @@ -0,0 +1,5 @@ + + +dashboard + + diff --git a/docs/webapp/assets/_new/icons/svgs/desktop.svg b/docs/webapp/assets/_new/icons/svgs/desktop.svg new file mode 100644 index 000000000..ba1ef8431 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/desktop.svg @@ -0,0 +1,5 @@ + + +desktop + + diff --git a/docs/webapp/assets/_new/icons/svgs/diamond.svg b/docs/webapp/assets/_new/icons/svgs/diamond.svg new file mode 100644 index 000000000..5cad085d9 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/diamond.svg @@ -0,0 +1,5 @@ + + +diamond + + diff --git a/docs/webapp/assets/_new/icons/svgs/download.svg b/docs/webapp/assets/_new/icons/svgs/download.svg new file mode 100644 index 000000000..b988fa171 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/download.svg @@ -0,0 +1,5 @@ + + +download + + diff --git a/docs/webapp/assets/_new/icons/svgs/edit.svg b/docs/webapp/assets/_new/icons/svgs/edit.svg new file mode 100644 index 000000000..a80101e6c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/edit.svg @@ -0,0 +1,5 @@ + + +edit + + diff --git a/docs/webapp/assets/_new/icons/svgs/ellipsis-h.svg b/docs/webapp/assets/_new/icons/svgs/ellipsis-h.svg new file mode 100644 index 000000000..eb7deeab0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/ellipsis-h.svg @@ -0,0 +1,5 @@ + + +ellipsis-h + + diff --git a/docs/webapp/assets/_new/icons/svgs/ellipsis-v.svg b/docs/webapp/assets/_new/icons/svgs/ellipsis-v.svg new file mode 100644 index 000000000..89313ddfd --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/ellipsis-v.svg @@ -0,0 +1,5 @@ + + +ellipsis-v + + diff --git a/docs/webapp/assets/_new/icons/svgs/energy.svg b/docs/webapp/assets/_new/icons/svgs/energy.svg new file mode 100644 index 000000000..5035a5586 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/energy.svg @@ -0,0 +1,14 @@ + + + diff --git a/docs/webapp/assets/_new/icons/svgs/envelope.svg b/docs/webapp/assets/_new/icons/svgs/envelope.svg new file mode 100644 index 000000000..92d5320c0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/envelope.svg @@ -0,0 +1,5 @@ + + +envelope + + diff --git a/docs/webapp/assets/_new/icons/svgs/exchange.svg b/docs/webapp/assets/_new/icons/svgs/exchange.svg new file mode 100644 index 000000000..fc8bfaa48 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/exchange.svg @@ -0,0 +1,5 @@ + + +exchange + + diff --git a/docs/webapp/assets/_new/icons/svgs/exclamation-circle.svg b/docs/webapp/assets/_new/icons/svgs/exclamation-circle.svg new file mode 100644 index 000000000..cd658b997 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/exclamation-circle.svg @@ -0,0 +1,5 @@ + + +exclamation-circle + + diff --git a/docs/webapp/assets/_new/icons/svgs/exclamation-triangle.svg b/docs/webapp/assets/_new/icons/svgs/exclamation-triangle.svg new file mode 100644 index 000000000..aa2f7bbac --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/exclamation-triangle.svg @@ -0,0 +1,5 @@ + + +exclamation-triangle + + diff --git a/docs/webapp/assets/_new/icons/svgs/expand.svg b/docs/webapp/assets/_new/icons/svgs/expand.svg new file mode 100644 index 000000000..dc21a7e24 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/expand.svg @@ -0,0 +1,5 @@ + + +expand + + diff --git a/docs/webapp/assets/_new/icons/svgs/external-link.svg b/docs/webapp/assets/_new/icons/svgs/external-link.svg new file mode 100644 index 000000000..3d7f95574 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/external-link.svg @@ -0,0 +1,5 @@ + + +external-link + + diff --git a/docs/webapp/assets/_new/icons/svgs/eye-slash.svg b/docs/webapp/assets/_new/icons/svgs/eye-slash.svg new file mode 100644 index 000000000..4e434ac8d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/eye-slash.svg @@ -0,0 +1,5 @@ + + +eye-slash + + diff --git a/docs/webapp/assets/_new/icons/svgs/eye.svg b/docs/webapp/assets/_new/icons/svgs/eye.svg new file mode 100644 index 000000000..1e3e8fef3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/eye.svg @@ -0,0 +1,5 @@ + + +eye + + diff --git a/docs/webapp/assets/_new/icons/svgs/eyedropper.svg b/docs/webapp/assets/_new/icons/svgs/eyedropper.svg new file mode 100644 index 000000000..6cf4151ed --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/eyedropper.svg @@ -0,0 +1,5 @@ + + +eyedropper + + diff --git a/docs/webapp/assets/_new/icons/svgs/facebook.svg b/docs/webapp/assets/_new/icons/svgs/facebook.svg new file mode 100644 index 000000000..a9e41dfb3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/facebook.svg @@ -0,0 +1,5 @@ + + +facebook + + diff --git a/docs/webapp/assets/_new/icons/svgs/female.svg b/docs/webapp/assets/_new/icons/svgs/female.svg new file mode 100644 index 000000000..2cbe5b470 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/female.svg @@ -0,0 +1,5 @@ + + +female + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-archive.svg b/docs/webapp/assets/_new/icons/svgs/file-archive.svg new file mode 100644 index 000000000..94a1e7ab8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-archive.svg @@ -0,0 +1,5 @@ + + +file-archive-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-audio.svg b/docs/webapp/assets/_new/icons/svgs/file-audio.svg new file mode 100644 index 000000000..e253cbf94 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-audio.svg @@ -0,0 +1,5 @@ + + +file-audio-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-code.svg b/docs/webapp/assets/_new/icons/svgs/file-code.svg new file mode 100644 index 000000000..c241a932b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-code.svg @@ -0,0 +1,5 @@ + + +file-code-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-excel.svg b/docs/webapp/assets/_new/icons/svgs/file-excel.svg new file mode 100644 index 000000000..77a7a73b0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-excel.svg @@ -0,0 +1,5 @@ + + +file-excel-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-image.svg b/docs/webapp/assets/_new/icons/svgs/file-image.svg new file mode 100644 index 000000000..ba296f51b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-image.svg @@ -0,0 +1,5 @@ + + +file-image-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-movie.svg b/docs/webapp/assets/_new/icons/svgs/file-movie.svg new file mode 100644 index 000000000..fd88fd23d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-movie.svg @@ -0,0 +1,5 @@ + + +file-movie-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-pdf.svg b/docs/webapp/assets/_new/icons/svgs/file-pdf.svg new file mode 100644 index 000000000..810128b55 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-pdf.svg @@ -0,0 +1,5 @@ + + +file-pdf-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-photo.svg b/docs/webapp/assets/_new/icons/svgs/file-photo.svg new file mode 100644 index 000000000..c67616527 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-photo.svg @@ -0,0 +1,5 @@ + + +file-photo-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-picture.svg b/docs/webapp/assets/_new/icons/svgs/file-picture.svg new file mode 100644 index 000000000..e16498317 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-picture.svg @@ -0,0 +1,5 @@ + + +file-picture-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-powerpoint.svg b/docs/webapp/assets/_new/icons/svgs/file-powerpoint.svg new file mode 100644 index 000000000..8df8f896b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-powerpoint.svg @@ -0,0 +1,5 @@ + + +file-powerpoint-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-sound.svg b/docs/webapp/assets/_new/icons/svgs/file-sound.svg new file mode 100644 index 000000000..cb9b5dc76 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-sound.svg @@ -0,0 +1,5 @@ + + +file-sound-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-text.svg b/docs/webapp/assets/_new/icons/svgs/file-text.svg new file mode 100644 index 000000000..38d75ef65 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-text.svg @@ -0,0 +1,5 @@ + + +file-text + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-video.svg b/docs/webapp/assets/_new/icons/svgs/file-video.svg new file mode 100644 index 000000000..4a6db285b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-video.svg @@ -0,0 +1,5 @@ + + +file-video-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-word.svg b/docs/webapp/assets/_new/icons/svgs/file-word.svg new file mode 100644 index 000000000..c8447a696 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-word.svg @@ -0,0 +1,5 @@ + + +file-word-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file-zip.svg b/docs/webapp/assets/_new/icons/svgs/file-zip.svg new file mode 100644 index 000000000..c4eb66dd0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file-zip.svg @@ -0,0 +1,5 @@ + + +file-zip-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/file.svg b/docs/webapp/assets/_new/icons/svgs/file.svg new file mode 100644 index 000000000..82d36fe17 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/file.svg @@ -0,0 +1,5 @@ + + +file + + diff --git a/docs/webapp/assets/_new/icons/svgs/files.svg b/docs/webapp/assets/_new/icons/svgs/files.svg new file mode 100644 index 000000000..602a25658 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/files.svg @@ -0,0 +1,5 @@ + + +files-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/film.svg b/docs/webapp/assets/_new/icons/svgs/film.svg new file mode 100644 index 000000000..2318d2f73 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/film.svg @@ -0,0 +1,5 @@ + + +film + + diff --git a/docs/webapp/assets/_new/icons/svgs/filter.svg b/docs/webapp/assets/_new/icons/svgs/filter.svg new file mode 100644 index 000000000..6e9f379b6 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/filter.svg @@ -0,0 +1,5 @@ + + +filter + + diff --git a/docs/webapp/assets/_new/icons/svgs/finance.svg b/docs/webapp/assets/_new/icons/svgs/finance.svg new file mode 100644 index 000000000..74081bc6a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/finance.svg @@ -0,0 +1,13 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/fire.svg b/docs/webapp/assets/_new/icons/svgs/fire.svg new file mode 100644 index 000000000..0d579c495 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/fire.svg @@ -0,0 +1,5 @@ + + +fire + + diff --git a/docs/webapp/assets/_new/icons/svgs/flag.svg b/docs/webapp/assets/_new/icons/svgs/flag.svg new file mode 100644 index 000000000..6d2769808 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/flag.svg @@ -0,0 +1,5 @@ + + +flag + + diff --git a/docs/webapp/assets/_new/icons/svgs/flash.svg b/docs/webapp/assets/_new/icons/svgs/flash.svg new file mode 100644 index 000000000..f3647d420 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/flash.svg @@ -0,0 +1,5 @@ + + +flash + + diff --git a/docs/webapp/assets/_new/icons/svgs/flask.svg b/docs/webapp/assets/_new/icons/svgs/flask.svg new file mode 100644 index 000000000..e1ca6bde6 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/flask.svg @@ -0,0 +1,5 @@ + + +flask + + diff --git a/docs/webapp/assets/_new/icons/svgs/floppy.svg b/docs/webapp/assets/_new/icons/svgs/floppy.svg new file mode 100644 index 000000000..f924d3bb5 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/floppy.svg @@ -0,0 +1,5 @@ + + +floppy-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/folder-open.svg b/docs/webapp/assets/_new/icons/svgs/folder-open.svg new file mode 100644 index 000000000..63a941b71 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/folder-open.svg @@ -0,0 +1,5 @@ + + +folder-open + + diff --git a/docs/webapp/assets/_new/icons/svgs/folder.svg b/docs/webapp/assets/_new/icons/svgs/folder.svg new file mode 100644 index 000000000..287a37768 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/folder.svg @@ -0,0 +1,5 @@ + + +folder + + diff --git a/docs/webapp/assets/_new/icons/svgs/frown.svg b/docs/webapp/assets/_new/icons/svgs/frown.svg new file mode 100644 index 000000000..a03906c69 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/frown.svg @@ -0,0 +1,5 @@ + + +frown-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/gamepad.svg b/docs/webapp/assets/_new/icons/svgs/gamepad.svg new file mode 100644 index 000000000..85a2b7434 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/gamepad.svg @@ -0,0 +1,5 @@ + + +gamepad + + diff --git a/docs/webapp/assets/_new/icons/svgs/gear.svg b/docs/webapp/assets/_new/icons/svgs/gear.svg new file mode 100644 index 000000000..f657c9494 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/gear.svg @@ -0,0 +1,5 @@ + + +gear + + diff --git a/docs/webapp/assets/_new/icons/svgs/gears.svg b/docs/webapp/assets/_new/icons/svgs/gears.svg new file mode 100644 index 000000000..f9727888d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/gears.svg @@ -0,0 +1,5 @@ + + +gears + + diff --git a/docs/webapp/assets/_new/icons/svgs/gift.svg b/docs/webapp/assets/_new/icons/svgs/gift.svg new file mode 100644 index 000000000..355dc7b08 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/gift.svg @@ -0,0 +1,5 @@ + + +gift + + diff --git a/docs/webapp/assets/_new/icons/svgs/github.svg b/docs/webapp/assets/_new/icons/svgs/github.svg new file mode 100644 index 000000000..1d61e0788 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/github.svg @@ -0,0 +1,5 @@ + + +github + + diff --git a/docs/webapp/assets/_new/icons/svgs/glass.svg b/docs/webapp/assets/_new/icons/svgs/glass.svg new file mode 100644 index 000000000..c2a18e99f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/glass.svg @@ -0,0 +1,5 @@ + + +glass + + diff --git a/docs/webapp/assets/_new/icons/svgs/globe-detailed.svg b/docs/webapp/assets/_new/icons/svgs/globe-detailed.svg new file mode 100644 index 000000000..64b5b1573 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/globe-detailed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/assets/_new/icons/svgs/globe.svg b/docs/webapp/assets/_new/icons/svgs/globe.svg new file mode 100644 index 000000000..91bf9bf2b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/globe.svg @@ -0,0 +1,5 @@ + + +globe + + diff --git a/docs/webapp/assets/_new/icons/svgs/graduation-cap.svg b/docs/webapp/assets/_new/icons/svgs/graduation-cap.svg new file mode 100644 index 000000000..5d35226d3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/graduation-cap.svg @@ -0,0 +1,5 @@ + + +graduation-cap + + diff --git a/docs/webapp/assets/_new/icons/svgs/group.svg b/docs/webapp/assets/_new/icons/svgs/group.svg new file mode 100644 index 000000000..efb1c6184 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/group.svg @@ -0,0 +1,5 @@ + + +group + + diff --git a/docs/webapp/assets/_new/icons/svgs/hand-down.svg b/docs/webapp/assets/_new/icons/svgs/hand-down.svg new file mode 100644 index 000000000..1a06a97fd --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hand-down.svg @@ -0,0 +1,5 @@ + + +hand-o-down + + diff --git a/docs/webapp/assets/_new/icons/svgs/hand-left.svg b/docs/webapp/assets/_new/icons/svgs/hand-left.svg new file mode 100644 index 000000000..49fb68314 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hand-left.svg @@ -0,0 +1,5 @@ + + +hand-o-left + + diff --git a/docs/webapp/assets/_new/icons/svgs/hand-pointer.svg b/docs/webapp/assets/_new/icons/svgs/hand-pointer.svg new file mode 100644 index 000000000..e74339724 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hand-pointer.svg @@ -0,0 +1,5 @@ + + +hand-pointer-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/hand-right.svg b/docs/webapp/assets/_new/icons/svgs/hand-right.svg new file mode 100644 index 000000000..c165ea020 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hand-right.svg @@ -0,0 +1,5 @@ + + +hand-o-right + + diff --git a/docs/webapp/assets/_new/icons/svgs/hand-stop.svg b/docs/webapp/assets/_new/icons/svgs/hand-stop.svg new file mode 100644 index 000000000..dbf393138 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hand-stop.svg @@ -0,0 +1,5 @@ + + +hand-stop-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/hand-up.svg b/docs/webapp/assets/_new/icons/svgs/hand-up.svg new file mode 100644 index 000000000..472c8435d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hand-up.svg @@ -0,0 +1,5 @@ + + +hand-o-up + + diff --git a/docs/webapp/assets/_new/icons/svgs/headphones.svg b/docs/webapp/assets/_new/icons/svgs/headphones.svg new file mode 100644 index 000000000..a197eca3a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/headphones.svg @@ -0,0 +1,5 @@ + + +headphones + + diff --git a/docs/webapp/assets/_new/icons/svgs/health.svg b/docs/webapp/assets/_new/icons/svgs/health.svg new file mode 100644 index 000000000..acf50d7c1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/health.svg @@ -0,0 +1,7 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/heart-o.svg b/docs/webapp/assets/_new/icons/svgs/heart-o.svg new file mode 100644 index 000000000..6605b96ac --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/heart-o.svg @@ -0,0 +1,5 @@ + + +heart-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/heart.svg b/docs/webapp/assets/_new/icons/svgs/heart.svg new file mode 100644 index 000000000..64f1195b1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/heart.svg @@ -0,0 +1,5 @@ + + +heart + + diff --git a/docs/webapp/assets/_new/icons/svgs/history.svg b/docs/webapp/assets/_new/icons/svgs/history.svg new file mode 100644 index 000000000..fd5fcc328 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/history.svg @@ -0,0 +1,5 @@ + + +history + + diff --git a/docs/webapp/assets/_new/icons/svgs/home.svg b/docs/webapp/assets/_new/icons/svgs/home.svg new file mode 100644 index 000000000..b1a13b06f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/home.svg @@ -0,0 +1,5 @@ + + +home + + diff --git a/docs/webapp/assets/_new/icons/svgs/hourglass.svg b/docs/webapp/assets/_new/icons/svgs/hourglass.svg new file mode 100644 index 000000000..e5e5ea6a1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/hourglass.svg @@ -0,0 +1,5 @@ + + +hourglass + + diff --git a/docs/webapp/assets/_new/icons/svgs/image.svg b/docs/webapp/assets/_new/icons/svgs/image.svg new file mode 100644 index 000000000..efbd9131f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/image.svg @@ -0,0 +1,5 @@ + + +image + + diff --git a/docs/webapp/assets/_new/icons/svgs/inbox.svg b/docs/webapp/assets/_new/icons/svgs/inbox.svg new file mode 100644 index 000000000..aba1d2eb0 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/inbox.svg @@ -0,0 +1,5 @@ + + +inbox + + diff --git a/docs/webapp/assets/_new/icons/svgs/indent.svg b/docs/webapp/assets/_new/icons/svgs/indent.svg new file mode 100644 index 000000000..35f087427 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/indent.svg @@ -0,0 +1,5 @@ + + +indent + + diff --git a/docs/webapp/assets/_new/icons/svgs/info-circle.svg b/docs/webapp/assets/_new/icons/svgs/info-circle.svg new file mode 100644 index 000000000..f971f5b3a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/info-circle.svg @@ -0,0 +1,5 @@ + + +info-circle + + diff --git a/docs/webapp/assets/_new/icons/svgs/italic.svg b/docs/webapp/assets/_new/icons/svgs/italic.svg new file mode 100644 index 000000000..81d29483c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/italic.svg @@ -0,0 +1,5 @@ + + +italic + + diff --git a/docs/webapp/assets/_new/icons/svgs/keyboard.svg b/docs/webapp/assets/_new/icons/svgs/keyboard.svg new file mode 100644 index 000000000..cf49166d4 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/keyboard.svg @@ -0,0 +1,5 @@ + + +keyboard-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/leaf.svg b/docs/webapp/assets/_new/icons/svgs/leaf.svg new file mode 100644 index 000000000..52b1693ba --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/leaf.svg @@ -0,0 +1,5 @@ + + +leaf + + diff --git a/docs/webapp/assets/_new/icons/svgs/level-down.svg b/docs/webapp/assets/_new/icons/svgs/level-down.svg new file mode 100644 index 000000000..e6455391e --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/level-down.svg @@ -0,0 +1,5 @@ + + +level-down + + diff --git a/docs/webapp/assets/_new/icons/svgs/level-up.svg b/docs/webapp/assets/_new/icons/svgs/level-up.svg new file mode 100644 index 000000000..1c3c82192 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/level-up.svg @@ -0,0 +1,5 @@ + + +level-up + + diff --git a/docs/webapp/assets/_new/icons/svgs/life-ring.svg b/docs/webapp/assets/_new/icons/svgs/life-ring.svg new file mode 100644 index 000000000..64f4aa7e8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/life-ring.svg @@ -0,0 +1,5 @@ + + +life-ring + + diff --git a/docs/webapp/assets/_new/icons/svgs/lightbulb.svg b/docs/webapp/assets/_new/icons/svgs/lightbulb.svg new file mode 100644 index 000000000..1c19c81b1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/lightbulb.svg @@ -0,0 +1,5 @@ + + +lightbulb-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/link.svg b/docs/webapp/assets/_new/icons/svgs/link.svg new file mode 100644 index 000000000..624a255b1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/link.svg @@ -0,0 +1,5 @@ + + +link + + diff --git a/docs/webapp/assets/_new/icons/svgs/list-ol.svg b/docs/webapp/assets/_new/icons/svgs/list-ol.svg new file mode 100644 index 000000000..f3fb101ac --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/list-ol.svg @@ -0,0 +1,5 @@ + + +list-ol + + diff --git a/docs/webapp/assets/_new/icons/svgs/list-ul.svg b/docs/webapp/assets/_new/icons/svgs/list-ul.svg new file mode 100644 index 000000000..d565a8064 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/list-ul.svg @@ -0,0 +1,5 @@ + + +list-ul + + diff --git a/docs/webapp/assets/_new/icons/svgs/list.svg b/docs/webapp/assets/_new/icons/svgs/list.svg new file mode 100644 index 000000000..f07692281 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/list.svg @@ -0,0 +1,5 @@ + + +list + + diff --git a/docs/webapp/assets/_new/icons/svgs/location-arrow.svg b/docs/webapp/assets/_new/icons/svgs/location-arrow.svg new file mode 100644 index 000000000..942a37fa5 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/location-arrow.svg @@ -0,0 +1,5 @@ + + +location-arrow + + diff --git a/docs/webapp/assets/_new/icons/svgs/lock.svg b/docs/webapp/assets/_new/icons/svgs/lock.svg new file mode 100644 index 000000000..31813d729 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/lock.svg @@ -0,0 +1,5 @@ + + +lock + + diff --git a/docs/webapp/assets/_new/icons/svgs/magnet.svg b/docs/webapp/assets/_new/icons/svgs/magnet.svg new file mode 100644 index 000000000..998495351 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/magnet.svg @@ -0,0 +1,5 @@ + + +magnet + + diff --git a/docs/webapp/assets/_new/icons/svgs/male.svg b/docs/webapp/assets/_new/icons/svgs/male.svg new file mode 100644 index 000000000..5c35184b4 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/male.svg @@ -0,0 +1,5 @@ + + +male + + diff --git a/docs/webapp/assets/_new/icons/svgs/map-marker.svg b/docs/webapp/assets/_new/icons/svgs/map-marker.svg new file mode 100644 index 000000000..af7f96727 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/map-marker.svg @@ -0,0 +1,5 @@ + + +map-marker + + diff --git a/docs/webapp/assets/_new/icons/svgs/map-pin.svg b/docs/webapp/assets/_new/icons/svgs/map-pin.svg new file mode 100644 index 000000000..dbba740b1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/map-pin.svg @@ -0,0 +1,5 @@ + + +map-pin + + diff --git a/docs/webapp/assets/_new/icons/svgs/map-signs.svg b/docs/webapp/assets/_new/icons/svgs/map-signs.svg new file mode 100644 index 000000000..0d46cc195 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/map-signs.svg @@ -0,0 +1,5 @@ + + +map-signs + + diff --git a/docs/webapp/assets/_new/icons/svgs/map.svg b/docs/webapp/assets/_new/icons/svgs/map.svg new file mode 100644 index 000000000..157a29ea8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/map.svg @@ -0,0 +1,5 @@ + + +map + + diff --git a/docs/webapp/assets/_new/icons/svgs/media.svg b/docs/webapp/assets/_new/icons/svgs/media.svg new file mode 100644 index 000000000..d63c98610 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/media.svg @@ -0,0 +1,7 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/medkit.svg b/docs/webapp/assets/_new/icons/svgs/medkit.svg new file mode 100644 index 000000000..43076dc9c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/medkit.svg @@ -0,0 +1,5 @@ + + +medkit + + diff --git a/docs/webapp/assets/_new/icons/svgs/microphone-slash.svg b/docs/webapp/assets/_new/icons/svgs/microphone-slash.svg new file mode 100644 index 000000000..9802dbd5f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/microphone-slash.svg @@ -0,0 +1,5 @@ + + +microphone-slash + + diff --git a/docs/webapp/assets/_new/icons/svgs/microphone.svg b/docs/webapp/assets/_new/icons/svgs/microphone.svg new file mode 100644 index 000000000..9a051cebe --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/microphone.svg @@ -0,0 +1,5 @@ + + +microphone + + diff --git a/docs/webapp/assets/_new/icons/svgs/minus.svg b/docs/webapp/assets/_new/icons/svgs/minus.svg new file mode 100644 index 000000000..b7a94beb1 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/minus.svg @@ -0,0 +1,5 @@ + + +minus + + diff --git a/docs/webapp/assets/_new/icons/svgs/miscellaneous.svg b/docs/webapp/assets/_new/icons/svgs/miscellaneous.svg new file mode 100644 index 000000000..07f8dbe3f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/miscellaneous.svg @@ -0,0 +1,13 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/mobile-phone.svg b/docs/webapp/assets/_new/icons/svgs/mobile-phone.svg new file mode 100644 index 000000000..542ad25b8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/mobile-phone.svg @@ -0,0 +1,5 @@ + + +mobile-phone + + diff --git a/docs/webapp/assets/_new/icons/svgs/mobility.svg b/docs/webapp/assets/_new/icons/svgs/mobility.svg new file mode 100644 index 000000000..9e36ec21e --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/mobility.svg @@ -0,0 +1,11 @@ + + + diff --git a/docs/webapp/assets/_new/icons/svgs/money.svg b/docs/webapp/assets/_new/icons/svgs/money.svg new file mode 100644 index 000000000..04a116d2a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/money.svg @@ -0,0 +1,5 @@ + + +money + + diff --git a/docs/webapp/assets/_new/icons/svgs/mouse-pointer.svg b/docs/webapp/assets/_new/icons/svgs/mouse-pointer.svg new file mode 100644 index 000000000..2917ef518 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/mouse-pointer.svg @@ -0,0 +1,5 @@ + + +mouse-pointer + + diff --git a/docs/webapp/assets/_new/icons/svgs/movement.svg b/docs/webapp/assets/_new/icons/svgs/movement.svg new file mode 100644 index 000000000..81052875d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/movement.svg @@ -0,0 +1,19 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/music.svg b/docs/webapp/assets/_new/icons/svgs/music.svg new file mode 100644 index 000000000..b84b87800 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/music.svg @@ -0,0 +1,5 @@ + + +music + + diff --git a/docs/webapp/assets/_new/icons/svgs/nature.svg b/docs/webapp/assets/_new/icons/svgs/nature.svg new file mode 100644 index 000000000..d40250af4 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/nature.svg @@ -0,0 +1,18 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/networking.svg b/docs/webapp/assets/_new/icons/svgs/networking.svg new file mode 100644 index 000000000..b8d35da69 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/networking.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/paint-brush.svg b/docs/webapp/assets/_new/icons/svgs/paint-brush.svg new file mode 100644 index 000000000..03b06aac6 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/paint-brush.svg @@ -0,0 +1,5 @@ + + +paint-brush + + diff --git a/docs/webapp/assets/_new/icons/svgs/paperclip.svg b/docs/webapp/assets/_new/icons/svgs/paperclip.svg new file mode 100644 index 000000000..099453e71 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/paperclip.svg @@ -0,0 +1,5 @@ + + +paperclip + + diff --git a/docs/webapp/assets/_new/icons/svgs/paragraph.svg b/docs/webapp/assets/_new/icons/svgs/paragraph.svg new file mode 100644 index 000000000..26365f984 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/paragraph.svg @@ -0,0 +1,5 @@ + + +paragraph + + diff --git a/docs/webapp/assets/_new/icons/svgs/paste.svg b/docs/webapp/assets/_new/icons/svgs/paste.svg new file mode 100644 index 000000000..32084e808 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/paste.svg @@ -0,0 +1,5 @@ + + +paste + + diff --git a/docs/webapp/assets/_new/icons/svgs/pause.svg b/docs/webapp/assets/_new/icons/svgs/pause.svg new file mode 100644 index 000000000..ce3acef04 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/pause.svg @@ -0,0 +1,5 @@ + + +pause + + diff --git a/docs/webapp/assets/_new/icons/svgs/paw.svg b/docs/webapp/assets/_new/icons/svgs/paw.svg new file mode 100644 index 000000000..364ff1918 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/paw.svg @@ -0,0 +1,5 @@ + + +paw + + diff --git a/docs/webapp/assets/_new/icons/svgs/peace.svg b/docs/webapp/assets/_new/icons/svgs/peace.svg new file mode 100644 index 000000000..408601cae --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/peace.svg @@ -0,0 +1,8 @@ + + + diff --git a/docs/webapp/assets/_new/icons/svgs/pencil.svg b/docs/webapp/assets/_new/icons/svgs/pencil.svg new file mode 100644 index 000000000..0c1b963f8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/pencil.svg @@ -0,0 +1,5 @@ + + +pencil + + diff --git a/docs/webapp/assets/_new/icons/svgs/phone.svg b/docs/webapp/assets/_new/icons/svgs/phone.svg new file mode 100644 index 000000000..413c48f16 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/phone.svg @@ -0,0 +1,5 @@ + + +phone + + diff --git a/docs/webapp/assets/_new/icons/svgs/photo.svg b/docs/webapp/assets/_new/icons/svgs/photo.svg new file mode 100644 index 000000000..abc66b8f3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/photo.svg @@ -0,0 +1,5 @@ + + +photo + + diff --git a/docs/webapp/assets/_new/icons/svgs/pie-chart.svg b/docs/webapp/assets/_new/icons/svgs/pie-chart.svg new file mode 100644 index 000000000..1d942226e --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/pie-chart.svg @@ -0,0 +1,5 @@ + + +pie-chart + + diff --git a/docs/webapp/assets/_new/icons/svgs/play-circle.svg b/docs/webapp/assets/_new/icons/svgs/play-circle.svg new file mode 100644 index 000000000..e8b842bf5 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/play-circle.svg @@ -0,0 +1,5 @@ + + +play-circle + + diff --git a/docs/webapp/assets/_new/icons/svgs/play.svg b/docs/webapp/assets/_new/icons/svgs/play.svg new file mode 100644 index 000000000..a0b1eafa2 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/play.svg @@ -0,0 +1,5 @@ + + +play + + diff --git a/docs/webapp/assets/_new/icons/svgs/plus.svg b/docs/webapp/assets/_new/icons/svgs/plus.svg new file mode 100644 index 000000000..66da52005 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/plus.svg @@ -0,0 +1,5 @@ + + +plus + + diff --git a/docs/webapp/assets/_new/icons/svgs/politics.svg b/docs/webapp/assets/_new/icons/svgs/politics.svg new file mode 100644 index 000000000..35322097d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/politics.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/power-off.svg b/docs/webapp/assets/_new/icons/svgs/power-off.svg new file mode 100644 index 000000000..7b362c167 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/power-off.svg @@ -0,0 +1,5 @@ + + +power-off + + diff --git a/docs/webapp/assets/_new/icons/svgs/print.svg b/docs/webapp/assets/_new/icons/svgs/print.svg new file mode 100644 index 000000000..a9fc409e2 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/print.svg @@ -0,0 +1,5 @@ + + +print + + diff --git a/docs/webapp/assets/_new/icons/svgs/psyche.svg b/docs/webapp/assets/_new/icons/svgs/psyche.svg new file mode 100644 index 000000000..8c285d5ca --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/psyche.svg @@ -0,0 +1,8 @@ + + + diff --git a/docs/webapp/assets/_new/icons/svgs/question-circle.svg b/docs/webapp/assets/_new/icons/svgs/question-circle.svg new file mode 100644 index 000000000..1ae2bbf6b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/question-circle.svg @@ -0,0 +1,5 @@ + + +question-circle + + diff --git a/docs/webapp/assets/_new/icons/svgs/quote-right.svg b/docs/webapp/assets/_new/icons/svgs/quote-right.svg new file mode 100644 index 000000000..4e6469624 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/quote-right.svg @@ -0,0 +1,5 @@ + + +quote-right + + diff --git a/docs/webapp/assets/_new/icons/svgs/recycle.svg b/docs/webapp/assets/_new/icons/svgs/recycle.svg new file mode 100644 index 000000000..9bbdb3ad3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/recycle.svg @@ -0,0 +1,5 @@ + + +recycle + + diff --git a/docs/webapp/assets/_new/icons/svgs/refresh.svg b/docs/webapp/assets/_new/icons/svgs/refresh.svg new file mode 100644 index 000000000..1995ab604 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/refresh.svg @@ -0,0 +1,5 @@ + + +refresh + + diff --git a/docs/webapp/assets/_new/icons/svgs/rocket.svg b/docs/webapp/assets/_new/icons/svgs/rocket.svg new file mode 100644 index 000000000..f83674f15 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/rocket.svg @@ -0,0 +1,5 @@ + + +rocket + + diff --git a/docs/webapp/assets/_new/icons/svgs/save.svg b/docs/webapp/assets/_new/icons/svgs/save.svg new file mode 100644 index 000000000..31c1d8459 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/save.svg @@ -0,0 +1,5 @@ + + +save + + diff --git a/docs/webapp/assets/_new/icons/svgs/science.svg b/docs/webapp/assets/_new/icons/svgs/science.svg new file mode 100644 index 000000000..9d3211223 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/science.svg @@ -0,0 +1,25 @@ + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/search.svg b/docs/webapp/assets/_new/icons/svgs/search.svg new file mode 100644 index 000000000..ddbb4da44 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/search.svg @@ -0,0 +1,5 @@ + + +search + + diff --git a/docs/webapp/assets/_new/icons/svgs/server.svg b/docs/webapp/assets/_new/icons/svgs/server.svg new file mode 100644 index 000000000..fa00771ea --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/server.svg @@ -0,0 +1,5 @@ + + +server + + diff --git a/docs/webapp/assets/_new/icons/svgs/share.svg b/docs/webapp/assets/_new/icons/svgs/share.svg new file mode 100644 index 000000000..b2fee7622 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/share.svg @@ -0,0 +1,5 @@ + + +share + + diff --git a/docs/webapp/assets/_new/icons/svgs/shield.svg b/docs/webapp/assets/_new/icons/svgs/shield.svg new file mode 100644 index 000000000..d897203ad --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/shield.svg @@ -0,0 +1,5 @@ + + +shield + + diff --git a/docs/webapp/assets/_new/icons/svgs/shopping-cart.svg b/docs/webapp/assets/_new/icons/svgs/shopping-cart.svg new file mode 100644 index 000000000..9ca3c5e13 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/shopping-cart.svg @@ -0,0 +1,5 @@ + + +shopping-cart + + diff --git a/docs/webapp/assets/_new/icons/svgs/sign-in.svg b/docs/webapp/assets/_new/icons/svgs/sign-in.svg new file mode 100644 index 000000000..bb300f950 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sign-in.svg @@ -0,0 +1,5 @@ + + +sign-in + + diff --git a/docs/webapp/assets/_new/icons/svgs/sign-out.svg b/docs/webapp/assets/_new/icons/svgs/sign-out.svg new file mode 100644 index 000000000..d185fbe6f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sign-out.svg @@ -0,0 +1,5 @@ + + +sign-out + + diff --git a/docs/webapp/assets/_new/icons/svgs/smile.svg b/docs/webapp/assets/_new/icons/svgs/smile.svg new file mode 100644 index 000000000..7de0ac746 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/smile.svg @@ -0,0 +1,5 @@ + + +smile-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/sort-alpha-asc.svg b/docs/webapp/assets/_new/icons/svgs/sort-alpha-asc.svg new file mode 100644 index 000000000..f96023d0d --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sort-alpha-asc.svg @@ -0,0 +1,5 @@ + + +sort-alpha-asc + + diff --git a/docs/webapp/assets/_new/icons/svgs/sort-alpha-desc.svg b/docs/webapp/assets/_new/icons/svgs/sort-alpha-desc.svg new file mode 100644 index 000000000..461e65611 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sort-alpha-desc.svg @@ -0,0 +1,5 @@ + + +sort-alpha-desc + + diff --git a/docs/webapp/assets/_new/icons/svgs/sort-amount-asc.svg b/docs/webapp/assets/_new/icons/svgs/sort-amount-asc.svg new file mode 100644 index 000000000..6344da1a9 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sort-amount-asc.svg @@ -0,0 +1,5 @@ + + +sort-amount-asc + + diff --git a/docs/webapp/assets/_new/icons/svgs/sort-amount-desc.svg b/docs/webapp/assets/_new/icons/svgs/sort-amount-desc.svg new file mode 100644 index 000000000..7239c1d72 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sort-amount-desc.svg @@ -0,0 +1,5 @@ + + +sort-amount-desc + + diff --git a/docs/webapp/assets/_new/icons/svgs/sort.svg b/docs/webapp/assets/_new/icons/svgs/sort.svg new file mode 100644 index 000000000..d7fc07efd --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sort.svg @@ -0,0 +1,5 @@ + + +sort + + diff --git a/docs/webapp/assets/_new/icons/svgs/spinner.svg b/docs/webapp/assets/_new/icons/svgs/spinner.svg new file mode 100644 index 000000000..b5d0cf71a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/spinner.svg @@ -0,0 +1,5 @@ + + +spinner + + diff --git a/docs/webapp/assets/_new/icons/svgs/spirituality.svg b/docs/webapp/assets/_new/icons/svgs/spirituality.svg new file mode 100644 index 000000000..0c2757071 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/spirituality.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/docs/webapp/assets/_new/icons/svgs/star-half-o.svg b/docs/webapp/assets/_new/icons/svgs/star-half-o.svg new file mode 100644 index 000000000..40070bbef --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/star-half-o.svg @@ -0,0 +1,5 @@ + + +star-half-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/star-o.svg b/docs/webapp/assets/_new/icons/svgs/star-o.svg new file mode 100644 index 000000000..3bc7af681 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/star-o.svg @@ -0,0 +1,5 @@ + + +star-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/star.svg b/docs/webapp/assets/_new/icons/svgs/star.svg new file mode 100644 index 000000000..5b4236991 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/star.svg @@ -0,0 +1,5 @@ + + +star + + diff --git a/docs/webapp/assets/_new/icons/svgs/subscript.svg b/docs/webapp/assets/_new/icons/svgs/subscript.svg new file mode 100644 index 000000000..07663bcc6 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/subscript.svg @@ -0,0 +1,5 @@ + + +subscript + + diff --git a/docs/webapp/assets/_new/icons/svgs/suitcase.svg b/docs/webapp/assets/_new/icons/svgs/suitcase.svg new file mode 100644 index 000000000..ceca5cbad --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/suitcase.svg @@ -0,0 +1,5 @@ + + +suitcase + + diff --git a/docs/webapp/assets/_new/icons/svgs/sun.svg b/docs/webapp/assets/_new/icons/svgs/sun.svg new file mode 100644 index 000000000..bddbcebcc --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/sun.svg @@ -0,0 +1,5 @@ + + +sun-o + + diff --git a/docs/webapp/assets/_new/icons/svgs/superscript.svg b/docs/webapp/assets/_new/icons/svgs/superscript.svg new file mode 100644 index 000000000..08938a2b5 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/superscript.svg @@ -0,0 +1,5 @@ + + +superscript + + diff --git a/docs/webapp/assets/_new/icons/svgs/table.svg b/docs/webapp/assets/_new/icons/svgs/table.svg new file mode 100644 index 000000000..bdb7c8e7b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/table.svg @@ -0,0 +1,5 @@ + + +table + + diff --git a/docs/webapp/assets/_new/icons/svgs/tablet.svg b/docs/webapp/assets/_new/icons/svgs/tablet.svg new file mode 100644 index 000000000..7142d4644 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/tablet.svg @@ -0,0 +1,5 @@ + + +tablet + + diff --git a/docs/webapp/assets/_new/icons/svgs/tag.svg b/docs/webapp/assets/_new/icons/svgs/tag.svg new file mode 100644 index 000000000..875a3be33 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/tag.svg @@ -0,0 +1,5 @@ + + +tag + + diff --git a/docs/webapp/assets/_new/icons/svgs/tags.svg b/docs/webapp/assets/_new/icons/svgs/tags.svg new file mode 100644 index 000000000..f248cc080 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/tags.svg @@ -0,0 +1,5 @@ + + +tags + + diff --git a/docs/webapp/assets/_new/icons/svgs/terminal.svg b/docs/webapp/assets/_new/icons/svgs/terminal.svg new file mode 100644 index 000000000..9f336dc12 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/terminal.svg @@ -0,0 +1,5 @@ + + +terminal + + diff --git a/docs/webapp/assets/_new/icons/svgs/ticket.svg b/docs/webapp/assets/_new/icons/svgs/ticket.svg new file mode 100644 index 000000000..5e7cfb92c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/ticket.svg @@ -0,0 +1,5 @@ + + +ticket + + diff --git a/docs/webapp/assets/_new/icons/svgs/toggle-off.svg b/docs/webapp/assets/_new/icons/svgs/toggle-off.svg new file mode 100644 index 000000000..c69ce1b5f --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/toggle-off.svg @@ -0,0 +1,5 @@ + + +toggle-off + + diff --git a/docs/webapp/assets/_new/icons/svgs/toggle-on.svg b/docs/webapp/assets/_new/icons/svgs/toggle-on.svg new file mode 100644 index 000000000..280c7d249 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/toggle-on.svg @@ -0,0 +1,5 @@ + + +toggle-on + + diff --git a/docs/webapp/assets/_new/icons/svgs/trash.svg b/docs/webapp/assets/_new/icons/svgs/trash.svg new file mode 100644 index 000000000..6475fd236 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/trash.svg @@ -0,0 +1,5 @@ + + +trash + + diff --git a/docs/webapp/assets/_new/icons/svgs/tree.svg b/docs/webapp/assets/_new/icons/svgs/tree.svg new file mode 100644 index 000000000..e0534af45 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/tree.svg @@ -0,0 +1,5 @@ + + +tree + + diff --git a/docs/webapp/assets/_new/icons/svgs/underline.svg b/docs/webapp/assets/_new/icons/svgs/underline.svg new file mode 100644 index 000000000..f4c6e698c --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/underline.svg @@ -0,0 +1,5 @@ + + +underline + + diff --git a/docs/webapp/assets/_new/icons/svgs/undo.svg b/docs/webapp/assets/_new/icons/svgs/undo.svg new file mode 100644 index 000000000..707b60150 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/undo.svg @@ -0,0 +1,5 @@ + + +undo + + diff --git a/docs/webapp/assets/_new/icons/svgs/university.svg b/docs/webapp/assets/_new/icons/svgs/university.svg new file mode 100644 index 000000000..cddb5775a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/university.svg @@ -0,0 +1,5 @@ + + +university + + diff --git a/docs/webapp/assets/_new/icons/svgs/unlink.svg b/docs/webapp/assets/_new/icons/svgs/unlink.svg new file mode 100644 index 000000000..f63b36e9b --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/unlink.svg @@ -0,0 +1,5 @@ + + +unlink + + diff --git a/docs/webapp/assets/_new/icons/svgs/upload.svg b/docs/webapp/assets/_new/icons/svgs/upload.svg new file mode 100644 index 000000000..83dfe5bcf --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/upload.svg @@ -0,0 +1,5 @@ + + +upload + + diff --git a/docs/webapp/assets/_new/icons/svgs/user-plus.svg b/docs/webapp/assets/_new/icons/svgs/user-plus.svg new file mode 100644 index 000000000..dea6ab228 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/user-plus.svg @@ -0,0 +1,5 @@ + + +user-plus + + diff --git a/docs/webapp/assets/_new/icons/svgs/user-times.svg b/docs/webapp/assets/_new/icons/svgs/user-times.svg new file mode 100644 index 000000000..8f4cb905a --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/user-times.svg @@ -0,0 +1,5 @@ + + +user-times + + diff --git a/docs/webapp/assets/_new/icons/svgs/user.svg b/docs/webapp/assets/_new/icons/svgs/user.svg new file mode 100644 index 000000000..04cc45b41 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/user.svg @@ -0,0 +1,5 @@ + + +user + + diff --git a/docs/webapp/assets/_new/icons/svgs/users.svg b/docs/webapp/assets/_new/icons/svgs/users.svg new file mode 100644 index 000000000..7572021ba --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/users.svg @@ -0,0 +1,5 @@ + + +users + + diff --git a/docs/webapp/assets/_new/icons/svgs/video-camera.svg b/docs/webapp/assets/_new/icons/svgs/video-camera.svg new file mode 100644 index 000000000..b6a9cc0df --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/video-camera.svg @@ -0,0 +1,5 @@ + + +video-camera + + diff --git a/docs/webapp/assets/_new/icons/svgs/volume-down.svg b/docs/webapp/assets/_new/icons/svgs/volume-down.svg new file mode 100644 index 000000000..f8b25dc25 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/volume-down.svg @@ -0,0 +1,5 @@ + + +volume-down + + diff --git a/docs/webapp/assets/_new/icons/svgs/volume-off.svg b/docs/webapp/assets/_new/icons/svgs/volume-off.svg new file mode 100644 index 000000000..daaeb19f5 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/volume-off.svg @@ -0,0 +1,5 @@ + + +volume-off + + diff --git a/docs/webapp/assets/_new/icons/svgs/volume-up.svg b/docs/webapp/assets/_new/icons/svgs/volume-up.svg new file mode 100644 index 000000000..03816d0d3 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/volume-up.svg @@ -0,0 +1,5 @@ + + +volume-up + + diff --git a/docs/webapp/assets/_new/icons/svgs/warning.svg b/docs/webapp/assets/_new/icons/svgs/warning.svg new file mode 100644 index 000000000..cd0a7baed --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/warning.svg @@ -0,0 +1,5 @@ + + +warning + + diff --git a/docs/webapp/assets/_new/icons/svgs/wheelchair.svg b/docs/webapp/assets/_new/icons/svgs/wheelchair.svg new file mode 100644 index 000000000..3854969b8 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/wheelchair.svg @@ -0,0 +1,5 @@ + + +wheelchair + + diff --git a/docs/webapp/assets/_new/icons/svgs/wifi.svg b/docs/webapp/assets/_new/icons/svgs/wifi.svg new file mode 100644 index 000000000..0df70f686 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/wifi.svg @@ -0,0 +1,5 @@ + + +wifi + + diff --git a/docs/webapp/assets/_new/icons/svgs/youtube-play.svg b/docs/webapp/assets/_new/icons/svgs/youtube-play.svg new file mode 100644 index 000000000..80370a4e6 --- /dev/null +++ b/docs/webapp/assets/_new/icons/svgs/youtube-play.svg @@ -0,0 +1,5 @@ + + +youtube-play + + diff --git a/docs/webapp/assets/_new/styles/export.scss b/docs/webapp/assets/_new/styles/export.scss new file mode 100644 index 000000000..e29c014e2 --- /dev/null +++ b/docs/webapp/assets/_new/styles/export.scss @@ -0,0 +1,37 @@ + +:export { + colorPrimary: $color-primary; + colorPrimaryActive: $color-primary-active; + colorPrimaryLight: $color-primary-light; + + borderColorSoft: $border-color-soft; + + borderRadiusBase: $border-radius-base; + + textColorBase: $text-color-base; + textColorSoft: $text-color-soft; + textColorInverse: $text-color-inverse; + + boxShadowBase: $box-shadow-base; + + backgroundColorBase: $background-color-base; + backgroundColorSoft: $background-color-soft; + backgroundColorSoftest: $background-color-softest; + backgroundColorPrimary: $background-color-primary; + + colorNeutral30: $color-neutral-30; + + chatMessageColor: $chat-message-color; + + chatMessageBgMe: $chat-message-bg-me; + chatMessageBgOthers: $chat-message-bg-others; + + chatNewMessageColor: $chat-new-message-color; + + chatMessageTimestamp: $chat-message-timestamp; + chatMessageCheckmarkSeen: $chat-message-checkmark-seen; + chatMessageCheckmark: $chat-message-checkmark; + + chatRoomBackgroundCounterBadge: $chat-room-background-counter-badge; + chatRoomColorCounterBadge: $chat-room-color-counter-badge; + } \ No newline at end of file diff --git a/docs/webapp/assets/_new/styles/mixins/buttonStates.scss b/docs/webapp/assets/_new/styles/mixins/buttonStates.scss new file mode 100644 index 000000000..b8e1509a6 --- /dev/null +++ b/docs/webapp/assets/_new/styles/mixins/buttonStates.scss @@ -0,0 +1,65 @@ +@mixin buttonStates($color-scheme: primary, $filled: false) { + $main-color: $color-primary; + $active-color: $color-primary-dark; + $hover-color: $color-primary-light; + + @if $color-scheme == danger { + $main-color: $color-danger; + $active-color: $color-danger-dark; + $hover-color: $color-danger-light; + } + + color: $main-color; + border-color: $main-color; + background-color: transparent; + transition: background-color $duration-short; + + &:focus { + outline: $border-size-base dashed $main-color; + } + + &:enabled { + &:hover { + color: $color-neutral-100; + border-color: $main-color; + background-color: $main-color; + } + + &:active { + color: $color-neutral-100; + border-color: $active-color; + background-color: $active-color; + } + } + + &:disabled { + color: $color-neutral-60; + border-color: $color-neutral-60; + cursor: default; + } + + @if $filled { + color: $color-neutral-100; + border-color: $main-color; + background-color: $main-color; + + &:enabled { + &:hover { + border-color: $hover-color; + background-color: $hover-color; + } + + &:active { + color: $color-neutral-100; + border-color: $active-color; + background-color: $active-color; + } + } + + &:disabled { + color: $color-neutral-100; + background-color: $color-neutral-60; + border-color: $color-neutral-60; + } + } +} diff --git a/docs/webapp/assets/_new/styles/resets.scss b/docs/webapp/assets/_new/styles/resets.scss new file mode 100644 index 000000000..4545634cc --- /dev/null +++ b/docs/webapp/assets/_new/styles/resets.scss @@ -0,0 +1,29 @@ +* { + box-sizing: border-box; +} + +button { + padding: 0; + background: transparent; + border: none; + font-family: inherit; + font-size: inherit; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p, +li { + margin: 0; +} + +ol, +ul { + list-style-type: none; + margin: 0; + padding: 0; +} diff --git a/docs/webapp/assets/_new/styles/tokens.scss b/docs/webapp/assets/_new/styles/tokens.scss new file mode 100644 index 000000000..dd3a042d1 --- /dev/null +++ b/docs/webapp/assets/_new/styles/tokens.scss @@ -0,0 +1,424 @@ +/** + * @tokens Color Brand + * @presenter Color + */ + +$color-primary: rgb(23, 181, 63); +$color-primary-light: rgb(96, 214, 98); +$color-primary-dark: rgb(25, 122, 49); +$color-primary-active: rgb(25, 194, 67); +$color-primary-inverse: rgb(241, 253, 244); +$color-secondary: rgb(0, 142, 230); +$color-secondary-active: rgb(10, 161, 255); +$color-secondary-inverse: rgb(240, 249, 255); +$color-success: rgb(23, 181, 63); +$color-success-active: rgb(26, 203, 71); +$color-success-inverse: rgb(241, 253, 244); +$color-danger: rgb(219, 57, 36); +$color-danger-light: rgb(242, 97, 65); +$color-danger-dark: rgb(158, 43, 28); +$color-danger-active: rgb(224, 81, 62); +$color-danger-inverse: rgb(253, 243, 242); +$color-warning: rgb(230, 121, 25); +$color-warning-active: rgb(233, 137, 53); +$color-warning-inverse: rgb(253, 247, 241); +$color-yellow: rgb(245, 196, 0); +$color-yellow-active: rgb(255, 206, 10); +$color-yellow-inverse: rgb(255, 252, 240); + +/** + * @tokens Color Neutral + * @presenter Color + */ + +$color-neutral-0: rgb(25, 23, 28); +$color-neutral-10: rgb(40, 37, 45); +$color-neutral-20: rgb(75, 69, 84); +$color-neutral-30: rgb(100, 92, 112); +$color-neutral-40: rgb(112, 103, 126); +$color-neutral-50: rgb(151, 143, 163); +$color-neutral-60: rgb(177, 171, 186); +$color-neutral-70: rgb(203, 199, 209); +$color-neutral-80: rgb(229, 227, 232); +$color-neutral-85: rgb(239, 238, 241); +$color-neutral-90: rgb(245, 244, 246); +$color-neutral-95: rgb(250, 249, 250); +$color-neutral-100: rgb(255, 255, 255); + +/** + * @tokens Color Text + * @presenter Color + */ + +$text-color-base: rgb(75, 69, 84); +$text-color-soft: rgb(112, 103, 126); +$text-color-softer: rgb(177, 171, 186); +$text-color-disabled: rgb(177, 171, 186); +$text-color-inverse: rgb(250, 249, 250); +$text-color-link: rgb(23, 181, 63); +$text-color-link-active: rgb(25, 194, 67); +$text-color-primary: rgb(23, 181, 63); +$text-color-primary-inverse: rgb(241, 253, 244); +$text-color-secondary: rgb(0, 142, 230); +$text-color-secondary-inverse: rgb(240, 249, 255); +$text-color-success: rgb(23, 181, 63); +$text-color-success-inverse: rgb(241, 253, 244); +$text-color-warning: rgb(230, 121, 25); +$text-color-warning-inverse: rgb(253, 247, 241); +$text-color-danger: rgb(219, 57, 36); +$text-color-danger-inverse: rgb(253, 243, 242); + +/** + * @tokens Color Background + * @presenter Color + */ + +$background-color-base: rgb(255, 255, 255); +$background-color-soft: rgb(250, 249, 250); +$background-color-softer: rgb(245, 244, 246); +$background-color-softer-active: rgb(250, 249, 250); +$background-color-softest: rgb(239, 238, 241); +$background-color-softest-active: rgb(245, 244, 246); +$background-color-inverse: rgb(25, 23, 28); +$background-color-inverse-soft: rgb(40, 37, 45); +$background-color-inverse-softer: rgb(75, 69, 84); +$background-color-inverse-softer-active: rgb(100, 92, 112); +$background-color-disabled: rgb(245, 244, 246); +$background-color-primary: rgb(23, 181, 63); +$background-color-primary-active: rgb(25, 194, 67); +$background-color-primary-inverse: rgb(241, 253, 244); +$background-color-secondary: rgb(0, 142, 230); +$background-color-secondary-active: rgb(10, 161, 255); +$background-color-secondary-inverse: rgb(240, 249, 255); +$background-color-third: rgb(126, 82, 204); +$background-color-third-active: rgb(160, 103, 255); +$background-color-third-inverse: rgb(239, 230, 255); +$background-color-success: rgb(23, 181, 63); +$background-color-success-active: rgb(26, 203, 71); +$background-color-success-inverse: rgb(241, 253, 244); +$background-color-warning: rgb(230, 121, 25); +$background-color-warning-active: rgb(233, 137, 53); +$background-color-warning-inverse: rgb(253, 247, 241); +$background-color-danger: rgb(219, 57, 36); +$background-color-danger-active: rgb(224, 81, 62); +$background-color-danger-inverse: rgb(253, 243, 242); + +/** + * @tokens Color Border + * @presenter Color + */ + +$border-color-base: rgb(177, 171, 186); +$border-color-soft: rgb(203, 199, 209); +$border-color-softer: rgb(229, 227, 232); +$border-color-softest: rgb(245, 244, 246); +$border-color-active: rgb(23, 181, 63); +$border-color-primary: rgb(23, 181, 63); +$border-color-success: rgb(23, 181, 63); +$border-color-warning: rgb(230, 121, 25); +$border-color-danger: rgb(219, 57, 36); + +/** + * @tokens Border Size + * @presenter Border + */ + +$border-size-base: 1px; +$border-size-large: 3px; +$border-size-x-large: 6px; + +/** + * @tokens Border Radius + * @presenter BorderRadius + */ + +$border-radius-x-large: 5px; +$border-radius-large: 4px; +$border-radius-base: 4px; +$border-radius-small: 2px; +$border-radius-rounded: 2em; +$border-radius-circle: 50%; + +/** + * @tokens Font Size + * @presenter FontSize + */ + +$font-size-xxxx-large: 3rem; +$font-size-xxx-large: 2.5rem; +$font-size-xx-large: 2rem; +$font-size-x-large: 1.5rem; +$font-size-large: 1.25rem; +$font-size-base: 1rem; +$font-size-body: 15px; +$font-size-small: 0.8rem; +$font-size-x-small: 0.7rem; +$font-size-xx-small: 0.6rem; + +/** + * @tokens Font Space + * @presenter Spacing + */ + +$font-space-xxxx-large: 2em; +$font-space-xxx-large: 1.5em; +$font-space-xx-large: 1.2em; +$font-space-x-large: 1em; +$font-space-large: 0.6em; +$font-space-base: 0.5em; +$font-space-small: 0.4em; +$font-space-x-small: 0.3em; +$font-space-xx-small: 0.2em; +$font-space-xxx-small: 0.1em; + +/** + * @tokens Font Family + * @presenter FontFamily + */ + +$font-family-heading: 'LatoWeb', sans-serif; +$font-family-text: 'LatoWeb', sans-serif; +$font-family-serif: 'Gentium Basic', serif; +$font-family-code: inconsolata, monospace; + +/** + * @tokens Font Weight + * @presenter FontWeight + */ + +$font-weight-regular: normal; +$font-weight-bold: 600; + +/** + * @tokens Line Height + * @presenter LineHeight + */ + +$line-height-large: 1.5rem; +$line-height-base: 1.3rem; +$line-height-small: 1.1rem; +$line-height-smaller: 1.0rem; + +/** + * @tokens Letter Spacing + * @presenter Spacing + */ + +$letter-spacing-x-large: 0.1em; +$letter-spacing-large: 0.05em; +$letter-spacing-base: 0; +$letter-spacing-small: -0.01em; +$letter-spacing-x-small: -0.015em; + +/** + * @tokens Opacity + * @presenter Opacity + */ + +$opacity-base: 1; +$opacity-soft: 0.7; +$opacity-disabled: 0.5; + +/** + * @tokens Space + * @presenter Spacing + */ + +$space-xxx-large: 128px; +$space-xx-large: 64px; +$space-x-large: 48px; +$space-large: 32px; +$space-base: 24px; +$space-small: 16px; +$space-x-small: 8px; +$space-xx-small: 4px; +$space-xxx-small: 2px; +$space-none: 0; + +/** + * @tokens Size Height + * @presenter Spacing + */ + +$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; + +/** + * @tokens Size Width + * @presenter Spacing + */ + +$size-width-filter-sidebar: 85px; +$size-width-paginate: 200px; +$size-max-width-filter-menu: 1026px; + +/** + * @tokens Size Avatar + * @presenter Spacing + */ + +$size-avatar-small: 34px; +$size-avatar-base: 44px; +$size-avatar-large: 114px; + +/** + * @tokens Size Buttons + * @presenter Spacing + */ + + $size-button-large: 50px; + $size-button-base: 36px; + $size-button-small: 26px; + +/** + * @tokens Size Images + * @presenter Spacing + */ + +$size-image-max-height: 2000px; +$size-image-cropper-max-height: 600px; +$size-image-cropper-min-height: 400px; +$size-image-uploader-min-height: 250px; + +/** + * @tokens Size Icons + * @presenter Spacing + */ + + $size-icon-base: 16px; + $size-icon-large: 60px; + +/** + * @tokens Shadow + * @presenter Shadow + */ + +$box-shadow-x-large: 0 15px 30px 0 rgba(0,0,0,.11),0 5px 15px 0 rgba(0,0,0,.08); +$box-shadow-large: 0 10px 20px 0 rgba(0,0,0,.11),0 3px 10px 0 rgba(0,0,0,.08); +$box-shadow-base: 0px 12px 26px -4px rgba(0, 0, 0, .1); +$box-shadow-small: 0px 8px 18px -2px rgba(0, 0, 0, .1); +$box-shadow-x-small: 0px 0px 3px 0px rgba(0, 0, 0, .1); +$box-shadow-active: 0 0 6px 1px rgba(20, 100, 160, 0.5); +$box-shadow-inset: inset 0 0 20px 1px rgba(0,0,0,.15); +$box-shadow-small-inset: inset 0 0 0 1px rgba(0,0,0,.05); + +/** + * @tokens Effects + */ + +$blur-radius: 22px; + +/** + * @tokens Animation Duration + */ + +$duration-short: 0.08s; +$duration-base: 0.5s; +$duration-long: 0.75s; +$duration-x-long: 1s; +$duration-xx-long: 2s; + +/** + * @tokens Animation Ease + * @presenter Easing + */ + +$ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94); +$ease-out-sharp: cubic-bezier(0.165, 0.84, 0.44, 1); +$ease-out-bounce: cubic-bezier(.87,-.41,.19,1.44); +$ease-in: cubic-bezier(0.55, 0.085, 0.68, 0.53); +$ease-in-sharp: cubic-bezier(0.895, 0.03, 0.685, 0.22); + +/** + * @tokens Z-Index + */ + +$z-index-modal: 9999; +$z-index-overlay: 9000; +$z-index-dropdown: 8888; +$z-index-page-submenu: 2500; +$z-index-page-header: 2000; +$z-index-page-sidebar: 1500; +$z-index-sticky-float: 150; +$z-index-sticky: 100; +$z-index-post-teaser-link: 5; +$z-index-surface: 1; + +/** + * @tokens Media Query + */ + +$media-query-x-small: (min-width: 480px); +$media-query-small: (min-width: 600px); +$media-query-medium: (min-width: 768px); +$media-query-large: (min-width: 1024px); +$media-query-x-large: (min-width: 1200px); + +/** + * @tokens Background Images + */ + +/** + * @tokens Header Color + */ + +$color-header-background: $color-neutral-100; + +/** + * @tokens Footer Color + */ + +$color-footer-background: $color-neutral-100; +$color-footer-link: $color-primary; + +/** + * @tokens Locale Menu Color + */ + +$color-locale-menu: $text-color-soft; + +/** + * @tokens Donation Bar Color + */ + +$color-donation-bar: $color-primary; +$color-donation-bar-light: $color-primary-light; + +/** + * @tokens Toast Color + */ + +$color-toast-red: $color-danger; +$color-toast-orange: $color-warning; +$color-toast-yellow: $color-yellow; +$color-toast-blue: $color-secondary; +$color-toast-green: $color-success; + +/** + * @tokens Ribbon Color + */ + +$color-ribbon-event: $background-color-third; +$color-ribbon-event-active: $background-color-third-active; +$color-ribbon-article: $background-color-secondary; +$color-ribbon-article-active: $background-color-secondary-active; + +/** + * @tokens Chat Color + */ + +$chat-message-bg-me: $color-primary-light; +$chat-message-color: $text-color-base; +$chat-message-bg-others: $color-neutral-80; +$chat-sidemenu-bg: $color-secondary-active; +$chat-new-message-color: $color-secondary-active; +$chat-message-timestamp: $text-color-soft; +$chat-message-checkmark-seen: $text-color-secondary; +$chat-message-checkmark: $text-color-soft; +$chat-room-color-counter-badge: $text-color-inverse; +$chat-room-background-counter-badge: $color-secondary; diff --git a/docs/webapp/assets/styles/imports/_branding.scss b/docs/webapp/assets/styles/imports/_branding.scss new file mode 100644 index 000000000..75058595d --- /dev/null +++ b/docs/webapp/assets/styles/imports/_branding.scss @@ -0,0 +1,5 @@ +/* + * + * Here, all SCSS variables and classes can be adapted to your custom design. + * +*/ \ No newline at end of file diff --git a/docs/webapp/assets/styles/imports/_toast.scss b/docs/webapp/assets/styles/imports/_toast.scss new file mode 100644 index 000000000..eb593dd6a --- /dev/null +++ b/docs/webapp/assets/styles/imports/_toast.scss @@ -0,0 +1,32 @@ +.iziToast-target, .iziToast { + &, + &:after, + &.iziToast-color-dark:after { + box-shadow: none !important; + } +} + +.iziToast .iziToast-message { + font-weight: 400 !important; +} + +.iziToast.iziToast-color-red { + background: $color-toast-red !important; + border-color: $color-toast-red !important; +} +.iziToast.iziToast-color-orange { + background: $color-toast-orange !important; + border-color: $color-toast-orange !important; +} +.iziToast.iziToast-color-yellow { + background: $color-toast-yellow !important; + border-color: $color-toast-yellow !important; +} +.iziToast.iziToast-color-blue { + background: $color-toast-blue !important; + border-color: $color-toast-blue !important; +} +.iziToast.iziToast-color-green { + background: $color-toast-green !important; + border-color: $color-toast-green !important; +} diff --git a/docs/webapp/assets/styles/imports/_tooltip.scss b/docs/webapp/assets/styles/imports/_tooltip.scss new file mode 100644 index 000000000..f3f51f576 --- /dev/null +++ b/docs/webapp/assets/styles/imports/_tooltip.scss @@ -0,0 +1,129 @@ +@mixin arrow($size, $type, $color) { + + --#{$type}-arrow-size: $size; + + .#{$type}-arrow { + width: 0; + height: 0; + border-style: solid; + position: absolute; + margin: $size; + border-color: $color; + z-index: 1; + } + + &[x-placement^="top"] { + margin-bottom: $size; + + .#{$type}-arrow { + border-width: $size $size 0 $size; + border-left-color: transparent !important; + border-right-color: transparent !important; + border-bottom-color: transparent !important; + bottom: -$size; + left: calc(50% - var(--#{$type}-arrow-size)); + margin-top: 0; + margin-bottom: 0; + } + } + + &[x-placement^="bottom"] { + margin-top: $size; + + .#{$type}-arrow { + border-width: 0 $size $size $size; + border-left-color: transparent !important; + border-right-color: transparent !important; + border-top-color: transparent !important; + top: -$size; + left: calc(50% - var(--#{$type}-arrow-size)); + margin-top: 0; + margin-bottom: 0; + } + } + + &[x-placement^="right"] { + margin-left: $size; + + .#{$type}-arrow { + border-width: $size $size $size 0; + border-left-color: transparent !important; + border-top-color: transparent !important; + border-bottom-color: transparent !important; + left: -$size; + top: calc(50% - var(--#{$type}-arrow-size)); + margin-left: 0; + margin-right: 0; + } + } + + &[x-placement^="left"] { + margin-right: $size; + + .#{$type}-arrow { + border-width: $size 0 $size $size; + border-top-color: transparent !important; + border-right-color: transparent !important; + border-bottom-color: transparent !important; + right: -$size; + top: calc(50% - var(--#{$type}-arrow-size)); + margin-left: 0; + margin-right: 0; + } + } +} + +.tooltip { + display: block !important; + z-index: $z-index-modal - 2; + + .tooltip-inner { + background: $background-color-inverse-soft; + color: $text-color-inverse; + border-radius: $border-radius-base; + padding: $space-x-small $space-small; + box-shadow: $box-shadow-large; + overflow: auto; + max-height: 73.5vh; // magic! fully visible on mobile, no scrolling on wide screen + } + + @include arrow(5px, "tooltip", $background-color-inverse-soft); + + &.popover { + .popover-inner { + background: $background-color-soft; + color: $text-color-base; + border-radius: $border-radius-base; + padding: $space-x-small $space-small; + box-shadow: $box-shadow-x-large; + + nav { + margin-left: -$space-small; + margin-right: -$space-small; + + a { + padding-left: 12px; + } + } + } + + .popover-arrow { + border-color: $background-color-soft; + } + + @include arrow(7px, "popover", $background-color-soft); + } + + + &[aria-hidden='true'] { + visibility: hidden; + opacity: 0; + transition: opacity 60ms; + } + + &[aria-hidden='false'] { + visibility: visible; + opacity: 1; + transition: opacity 60ms; + } +} diff --git a/docs/webapp/assets/styles/main.scss b/docs/webapp/assets/styles/main.scss new file mode 100644 index 000000000..b726758c7 --- /dev/null +++ b/docs/webapp/assets/styles/main.scss @@ -0,0 +1,182 @@ +@import './imports/_tooltip.scss'; +@import './imports/_toast.scss'; + +// Transition Easing +$easeOut: cubic-bezier(0.19, 1, 0.22, 1); + +.disabled-content { + position: relative; + + &::before { + @include border-radius($border-radius-x-large); + box-shadow: inset 0 0 0 5px $color-danger; + content: ''; + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 2; + pointer-events: none; + } +} + +.layout-enter-active { + transition: opacity 80ms ease-out; + transition-delay: 80ms; +} +.layout-leave-active { + transition: opacity 80ms ease-in; +} +.layout-enter, +.layout-leave-active { + opacity: 0; +} + +// slide up ease +.slide-up-enter-active { + transition: all 500ms $easeOut; + transition-delay: 20ms; + opacity: 1; + transform: translate3d(0, 0, 0); +} +.slide-up-enter, +.slide-up-leave-active { + opacity: 0; + box-shadow: none; + transform: translate3d(0, 15px, 0); +} + +.main-navigation { + background: #fff; +} + +body.dropdown-open { + height: 100vh; + overflow: hidden; +} + +blockquote { + display: block; + padding: 15px 20px 15px 45px; + margin: 0 0 20px; + position: relative; + + /*Font*/ + font-size: $font-size-base; + line-height: 1.2; + color: $color-neutral-40; + font-family: $font-family-serif; + font-style: italic; + + border-left: 3px dotted $color-neutral-70; + + &::before { + content: '\201C'; + /*Unicode for Left Double Quote*/ + + /*Font*/ + font-size: $font-size-xxxx-large; + font-weight: bold; + color: $color-neutral-50; + + /*Positioning*/ + position: absolute; + left: 10px; + top: 5px; + } + + p { + margin-top: 0; + } +} +.main-navigation { + box-shadow: $box-shadow-base; + position: fixed; + width: 100%; + z-index: $z-index-page-submenu; + + a { + outline: none; + } +} + +hr { + border: 0; + width: 100%; + color: $color-neutral-80; + background-color: $color-neutral-80; + height: 1px !important; +} + +[class$='menu-trigger'] { + user-select: none; +} +[class$='menu-popover'] { + display: inline-block; + + nav { + margin-left: -17px; + margin-right: -15px; + } +} + +#overlay { + display: block; + opacity: 0; + width: 100%; + height: 100%; + top: 0; + left: 0; + position: fixed; + background: rgba(0, 0, 0, 0.15); + z-index: $z-index-overlay; + pointer-events: none; + transition: opacity 150ms ease-out; + transition-delay: 50ms; + + .dropdown-open & { + opacity: 1; + transition-delay: 0; + transition: opacity 80ms ease-out; + } +} + +.base-card > .ds-section { + padding: 0; + margin: -$space-base; + + .ds-container { + padding: $space-base; + } +} + +[class$='menu-popover'] { + min-width: 130px; + + a, + button { + display: flex; + align-content: center; + align-items: center; + + .base-icon { + padding-right: $space-xx-small; + } + } +} + +.v-popover.open .trigger a { + color: $text-color-link-active; +} + +.hyphenate-text { + hyphens: auto; + overflow-wrap: break-word; + word-wrap: break-word; +} + +.dropdown-arrow { + font-size: $font-size-xx-small; +} \ No newline at end of file diff --git a/docs/webapp/components.html b/docs/webapp/components.html new file mode 100644 index 000000000..4d14ced94 --- /dev/null +++ b/docs/webapp/components.html @@ -0,0 +1,564 @@ + + + + + + + Components · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            +
                            + + + + + + + + +
                            + +
                            + +
                            + + + + + + + + +
                            +
                            + +
                            +
                            + +
                            + +

                            Components – Code Guidelines

                            +

                            We adhere to the single responsibility principle

                            +

                            Each component does exactly one job. The goal is to end up with many small components that are:

                            +
                              +
                            • easy to understand
                            • +
                            • easy to maintain
                            • +
                            • easy to reuse
                            • +
                            +

                            How do you decide what is a separate component? Try to describe what it does in one sentence! When you find yourself using and and or the code you are talking about should probably be split up into two or more components.

                            +

                            On the other hand, when something is easily expressed in a few lines of HTML and SCSS and not likely to be reused this is a good indicator that it should not go into a separate component.

                            +

                            We compose with components

                            +

                            Usually pages use layouts as templates and will be composed of features. features are composed of components, the smallest building blocks of the app. The further down we go in this hierarchy the simpler and more generic the components become. Here is an example:

                            +
                              +
                            • The index page is responsible for displaying a list of posts. It uses the default layout and the PostList feature.
                            • +
                            • The PostList feature uses a List component to render PostTeaser features.
                            • +
                            • The PostTeaser feature consists of a LayoutCard wrapped around a CardImage, CardTitle and CardContent component.
                            • +
                            +

                            The index page is unique in the app and will never be reused. The PostList knows it is handling post data and can therefore not be used for anything else – but it can display posts on the index as well as the user page.

                            +

                            The Card on the other hand does not care about the type of data it needs to handle. It just takes whatever it receives and renders it in a certain way, so it can be reused throughout the app for many different features.

                            +

                            We use two-word names

                            +

                            We follow the W3C rules for naming custom elements as suggested in the Vue.js docs to differentiate our own components from regular HTML elements in our templates.

                            +

                            Names should also be meaningful and unique to avoid confusion and code duplication, and also not too long to make them readable. Therefore: aim for two-word names, such as layout-card, post-list or post-teaser.

                            + +

                            For a deeper dive into the WHY and HOW have a look at the following resources which the above guidelines are based on:

                            + + + +
                            + +
                            +
                            +
                            + +

                            results matching ""

                            +
                              + +
                              +
                              + +

                              No results matching ""

                              + +
                              +
                              +
                              + +
                              +
                              + +
                              + + + + + + + + + + + + + + +
                              + + +
                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/components/AvatarMenu/AvatarMenu.spec.js b/docs/webapp/components/AvatarMenu/AvatarMenu.spec.js new file mode 100644 index 000000000..be34c1804 --- /dev/null +++ b/docs/webapp/components/AvatarMenu/AvatarMenu.spec.js @@ -0,0 +1,175 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import AvatarMenu from './AvatarMenu.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, + 'router-link': true, +} + +describe('AvatarMenu.vue', () => { + let propsData, getters, wrapper, mocks + + beforeEach(() => { + propsData = {} + mocks = { + $route: { + path: '', + }, + $router: { + resolve: jest.fn(() => { + return { href: '/profile/u343/matt' } + }), + }, + $t: jest.fn((a) => a), + } + getters = { + 'auth/user': () => { + return { id: 'u343', name: 'Matt' } + }, + } + }) + + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(AvatarMenu, { propsData, localVue, store, mocks, stubs }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders the ProfileAvatar component', () => { + wrapper.find('.avatar-menu-trigger').trigger('click') + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + describe('given a userName', () => { + it('displays the userName', () => { + expect(wrapper.find('b').text()).toEqual('Matt') + }) + }) + + describe('no userName', () => { + beforeEach(() => { + getters = { + 'auth/user': () => { + return { id: 'u343' } + }, + } + wrapper = Wrapper() + wrapper.find('.avatar-menu-trigger').trigger('click') + }) + + it('displays anonymous user', () => { + expect(wrapper.find('b').text()).toEqual('profile.userAnonym') + }) + }) + + describe('menu items', () => { + beforeEach(() => { + getters = { + 'auth/user': () => { + return { id: 'u343', slug: 'matt' } + }, + 'auth/isModerator': () => false, + 'auth/isAdmin': () => false, + } + wrapper = Wrapper() + wrapper.find('.avatar-menu-trigger').trigger('click') + }) + + describe('role user', () => { + 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')) + expect(profileLink.exists()).toBe(true) + }) + + it('displays a link to "Groups"', () => { + const profileLink = wrapper + .findAll('.ds-menu-item span') + .at(wrapper.vm.routes.findIndex((route) => route.path === '/groups')) + 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')) + 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')) + expect(settingsLink.exists()).toBe(true) + }) + + it('displays a total of 4 links', () => { + const allLinks = wrapper.findAll('.ds-menu-item') + expect(allLinks).toHaveLength(4) + }) + }) + + describe('role moderator', () => { + beforeEach(() => { + getters = { + 'auth/user': () => { + return { id: 'u343', slug: 'matt' } + }, + 'auth/isModerator': () => true, + 'auth/isAdmin': () => false, + } + wrapper = Wrapper() + wrapper.find('.avatar-menu-trigger').trigger('click') + }) + + it('displays a link to moderation page', () => { + const moderationLink = wrapper + .findAll('.ds-menu-item span') + .at(wrapper.vm.routes.findIndex((route) => route.path === '/moderation')) + expect(moderationLink.exists()).toBe(true) + }) + + it('displays a total of 5 links', () => { + const allLinks = wrapper.findAll('.ds-menu-item') + expect(allLinks).toHaveLength(5) + }) + }) + + describe('role admin', () => { + beforeEach(() => { + getters = { + 'auth/user': () => { + return { id: 'u343', slug: 'matt' } + }, + 'auth/isModerator': () => true, + 'auth/isAdmin': () => true, + } + wrapper = Wrapper() + wrapper.find('.avatar-menu-trigger').trigger('click') + }) + + it('displays a link to admin page', () => { + const adminLink = wrapper + .findAll('.ds-menu-item span') + .at(wrapper.vm.routes.findIndex((route) => route.path === '/admin')) + expect(adminLink.exists()).toBe(true) + }) + + it('displays a total of 6 links', () => { + const allLinks = wrapper.findAll('.ds-menu-item') + expect(allLinks).toHaveLength(6) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/AvatarMenu/AvatarMenu.story.js b/docs/webapp/components/AvatarMenu/AvatarMenu.story.js new file mode 100644 index 000000000..9146075cd --- /dev/null +++ b/docs/webapp/components/AvatarMenu/AvatarMenu.story.js @@ -0,0 +1,17 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import StoryRouter from 'storybook-vue-router' +import AvatarMenu from '~/components/AvatarMenu/AvatarMenu' +import helpers from '~/storybook/helpers' + +helpers.init() + +storiesOf('AvatarMenu', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .addDecorator(StoryRouter()) + .add('dropdown', () => ({ + components: { AvatarMenu }, + store: helpers.store, + template: '', + })) diff --git a/docs/webapp/components/AvatarMenu/AvatarMenu.vue b/docs/webapp/components/AvatarMenu/AvatarMenu.vue new file mode 100644 index 000000000..977996092 --- /dev/null +++ b/docs/webapp/components/AvatarMenu/AvatarMenu.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/docs/webapp/components/Badges.spec.js b/docs/webapp/components/Badges.spec.js new file mode 100644 index 000000000..d19c2beb2 --- /dev/null +++ b/docs/webapp/components/Badges.spec.js @@ -0,0 +1,30 @@ +import { shallowMount } from '@vue/test-utils' +import Badges from './Badges.vue' + +describe('Badges.vue', () => { + let propsData + + beforeEach(() => { + propsData = {} + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return shallowMount(Badges, { propsData }) + } + + it('has class "hc-badges"', () => { + expect(Wrapper().find('.hc-badges').exists()).toBe(true) + }) + + describe('given a badge', () => { + beforeEach(() => { + propsData.badges = [{ id: '1', icon: '/path/to/some/icon' }] + }) + + it('proxies badge icon, which is just a URL without metadata', () => { + expect(Wrapper().find('img[src="/api/path/to/some/icon"]').exists()).toBe(true) + }) + }) + }) +}) diff --git a/docs/webapp/components/Badges.vue b/docs/webapp/components/Badges.vue new file mode 100644 index 000000000..936d13adb --- /dev/null +++ b/docs/webapp/components/Badges.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/docs/webapp/components/Button/FollowButton.spec.js b/docs/webapp/components/Button/FollowButton.spec.js new file mode 100644 index 000000000..000745081 --- /dev/null +++ b/docs/webapp/components/Button/FollowButton.spec.js @@ -0,0 +1,47 @@ +import { mount } from '@vue/test-utils' +import FollowButton from './FollowButton.vue' + +const localVue = global.localVue + +describe('FollowButton.vue', () => { + let mocks + let propsData + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + } + propsData = {} + }) + + describe('mount', () => { + let wrapper + const Wrapper = () => { + return mount(FollowButton, { mocks, propsData, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders button and text', () => { + expect(mocks.$t).toHaveBeenCalledWith('followButton.follow') + expect(wrapper.findAll('.base-button')).toHaveLength(1) + }) + + it('renders button and text when followed', () => { + propsData.isFollowed = true + wrapper = Wrapper() + expect(mocks.$t).toHaveBeenCalledWith('followButton.following') + expect(wrapper.findAll('.base-button')).toHaveLength(1) + }) + + it.skip('toggle the button', async () => { + wrapper.find('.base-button').trigger('click') // This does not work since @click.prevent is used + expect(wrapper.vm.isFollowed).toBe(true) + }) + }) +}) diff --git a/docs/webapp/components/Button/FollowButton.vue b/docs/webapp/components/Button/FollowButton.vue new file mode 100644 index 000000000..a0807ed6c --- /dev/null +++ b/docs/webapp/components/Button/FollowButton.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/docs/webapp/components/Button/JoinLeaveButton.vue b/docs/webapp/components/Button/JoinLeaveButton.vue new file mode 100644 index 000000000..f4cc2c009 --- /dev/null +++ b/docs/webapp/components/Button/JoinLeaveButton.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/docs/webapp/components/CategoriesSelect/CategoriesSelect.spec.js b/docs/webapp/components/CategoriesSelect/CategoriesSelect.spec.js new file mode 100644 index 000000000..82f5e61eb --- /dev/null +++ b/docs/webapp/components/CategoriesSelect/CategoriesSelect.spec.js @@ -0,0 +1,115 @@ +import { mount } from '@vue/test-utils' +import CategoriesSelect from './CategoriesSelect' +import Vue from 'vue' + +const localVue = global.localVue + +describe('CategoriesSelect.vue', () => { + let wrapper + let mocks + let provide + let democracyAndPolitics + let environmentAndNature + let consumptionAndSustainablity + + const propsData = { model: 'categoryIds' } + const categories = [ + { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }, + { + id: 'cat4', + name: 'Environment & Nature', + icon: 'tree', + }, + { + id: 'cat15', + name: 'Consumption & Sustainability', + icon: 'shopping-cart', + }, + { + name: 'Cooperation & Development', + icon: 'users', + id: 'cat8', + }, + ] + beforeEach(() => { + provide = { + $parentForm: { + update: jest.fn(), + }, + } + mocks = { + $t: jest.fn(), + } + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return mount(CategoriesSelect, { propsData, mocks, localVue, provide }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('toggleCategory', () => { + beforeEach(async () => { + wrapper.vm.categories = categories + await Vue.nextTick() + democracyAndPolitics = wrapper.findAll('button').at(0) + democracyAndPolitics.trigger('click') + }) + + it('adds categories to selectedCategoryIds when clicked', () => { + expect(wrapper.vm.selectedCategoryIds).toEqual([categories[0].id]) + }) + + it('calls $parent.update with selected category ids', () => { + expect(provide.$parentForm.update).toHaveBeenCalledWith('categoryIds', ['cat9']) + }) + + it('removes categories when clicked a second time', () => { + democracyAndPolitics.trigger('click') + expect(wrapper.vm.selectedCategoryIds).toEqual([]) + }) + + it('changes the selectedCount when selectedCategoryIds is updated', () => { + expect(wrapper.vm.selectedCount).toEqual(1) + democracyAndPolitics.trigger('click') + expect(wrapper.vm.selectedCount).toEqual(0) + }) + + it('sets a category to active when it has been selected', () => { + expect(wrapper.vm.isActive(categories[0].id)).toEqual(true) + }) + + describe('maximum', () => { + beforeEach(() => { + environmentAndNature = wrapper.findAll('button').at(1) + consumptionAndSustainablity = wrapper.findAll('button').at(2) + environmentAndNature.trigger('click') + consumptionAndSustainablity.trigger('click') + }) + + it('allows three categories to be selected', () => { + expect(wrapper.vm.selectedCategoryIds).toEqual([ + categories[0].id, + categories[1].id, + categories[2].id, + ]) + }) + + it('sets reachedMaximum to true after three', () => { + expect(wrapper.vm.reachedMaximum).toEqual(true) + }) + + it('sets other categories to disabled after three', () => { + expect(wrapper.vm.isDisabled(categories[3].id)).toEqual(true) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/CategoriesSelect/CategoriesSelect.vue b/docs/webapp/components/CategoriesSelect/CategoriesSelect.vue new file mode 100644 index 000000000..91fb7704c --- /dev/null +++ b/docs/webapp/components/CategoriesSelect/CategoriesSelect.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/docs/webapp/components/Category/Readme.md b/docs/webapp/components/Category/Readme.md new file mode 100644 index 000000000..50e07f966 --- /dev/null +++ b/docs/webapp/components/Category/Readme.md @@ -0,0 +1,7 @@ +### Example + +Category "IT, Internet & Data Privacy" with icon "mouse-cursor" + +``` + +``` \ No newline at end of file diff --git a/docs/webapp/components/Category/index.spec.js b/docs/webapp/components/Category/index.spec.js new file mode 100644 index 000000000..22a85f6f1 --- /dev/null +++ b/docs/webapp/components/Category/index.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' + +import Category from './index' + +const localVue = global.localVue + +describe('Category', () => { + let icon + let name + + const Wrapper = () => { + return mount(Category, { + localVue, + propsData: { + icon, + name, + }, + }) + } + + describe('given Strings for Icon and Name', () => { + beforeEach(() => { + icon = 'mouse-pointer' + name = 'Peter' + }) + + it('shows Name', () => { + expect(Wrapper().text()).toContain('Peter') + }) + + it('shows base icon', () => { + expect(Wrapper().find('.base-icon').exists()).toBe(true) + }) + }) +}) diff --git a/docs/webapp/components/Category/index.vue b/docs/webapp/components/Category/index.vue new file mode 100644 index 000000000..ebbaae584 --- /dev/null +++ b/docs/webapp/components/Category/index.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/docs/webapp/components/Chat/AddChatRoomByUserSearch.vue b/docs/webapp/components/Chat/AddChatRoomByUserSearch.vue new file mode 100644 index 000000000..8ab21f06f --- /dev/null +++ b/docs/webapp/components/Chat/AddChatRoomByUserSearch.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/docs/webapp/components/Chat/Chat.vue b/docs/webapp/components/Chat/Chat.vue new file mode 100644 index 000000000..37c2b3e06 --- /dev/null +++ b/docs/webapp/components/Chat/Chat.vue @@ -0,0 +1,491 @@ + + + + diff --git a/docs/webapp/components/ChatNotificationMenu/ChatNotificationMenu.vue b/docs/webapp/components/ChatNotificationMenu/ChatNotificationMenu.vue new file mode 100644 index 000000000..dd36b965a --- /dev/null +++ b/docs/webapp/components/ChatNotificationMenu/ChatNotificationMenu.vue @@ -0,0 +1,54 @@ + + + diff --git a/docs/webapp/components/CommentCard/CommentCard.spec.js b/docs/webapp/components/CommentCard/CommentCard.spec.js new file mode 100644 index 000000000..7764afd1e --- /dev/null +++ b/docs/webapp/components/CommentCard/CommentCard.spec.js @@ -0,0 +1,233 @@ +import { mount } from '@vue/test-utils' +import CommentCard from './CommentCard.vue' +import Vuex from 'vuex' + +const localVue = global.localVue +localVue.directive('scrollTo', jest.fn()) + +describe('CommentCard.vue', () => { + let propsData, mocks, stubs, getters, wrapper, Wrapper + + beforeEach(() => { + propsData = { + comment: { + id: 'comment007', + author: { id: 'some-user' }, + }, + postId: 'post42', + } + mocks = { + $t: jest.fn(), + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $i18n: { + locale: () => 'en', + }, + $filters: { + truncate: (a) => a, + removeHtml: (a) => a, + }, + $route: { hash: '' }, + $scrollTo: jest.fn(), + $apollo: { + mutate: jest.fn().mockResolvedValue({ + data: { + DeleteComment: { + id: 'it-is-the-deleted-comment', + }, + }, + }), + }, + } + stubs = { + ContentViewer: true, + 'client-only': true, + 'nuxt-link': true, + } + getters = { + 'auth/user': () => { + return {} + }, + 'auth/isModerator': () => false, + } + }) + + describe('mount', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(CommentCard, { + store, + propsData, + mocks, + localVue, + stubs, + }) + } + + describe('given a comment', () => { + beforeEach(() => { + propsData.comment = { + id: '2', + contentExcerpt: 'Hello I am a comment content', + content: 'Hello I am comment content', + author: { id: 'commentAuthorId', slug: 'ogerly' }, + } + }) + + // skipped for now because of the immense difficulty in testing tiptap editor + it.skip('renders content', () => { + wrapper = Wrapper() + expect(wrapper.text()).toMatch('Hello I am a comment content') + }) + + describe('which is disabled', () => { + beforeEach(() => { + propsData.comment.disabled = true + }) + + it('renders no comment data', () => { + wrapper = Wrapper() + expect(wrapper.text()).not.toMatch('comment content') + }) + + it('has no "disabled-content" css class', () => { + wrapper = Wrapper() + expect(wrapper.classes()).not.toContain('disabled-content') + }) + + it('translates a placeholder', () => { + wrapper = Wrapper() + const calls = mocks.$t.mock.calls + const expected = [['comment.content.unavailable-placeholder']] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + + describe('for a moderator', () => { + beforeEach(() => { + getters['auth/isModerator'] = () => true + }) + + it.skip('renders comment data', () => { + wrapper = Wrapper() + expect(wrapper.text()).toMatch('comment content') + }) + + it('has a "disabled-content" css class', () => { + wrapper = Wrapper() + expect(wrapper.classes()).toContain('disabled-content') + }) + }) + }) + + describe('scrollToAnchor mixin', () => { + describe('$route.hash !== comment.id', () => { + beforeEach(() => { + mocks.$route = { + hash: '', + } + }) + + it('skips $scrollTo', () => { + wrapper = Wrapper() + jest.runAllTimers() + expect(mocks.$scrollTo).not.toHaveBeenCalled() + }) + }) + + describe('$route.hash === comment.id', () => { + beforeEach(() => { + mocks.$route = { + hash: '#commentId-2', + } + }) + + it('calls $scrollTo', () => { + wrapper = Wrapper() + jest.runAllTimers() + expect(mocks.$scrollTo).toHaveBeenCalledWith('#commentId-2') + }) + }) + }) + + describe('test callbacks', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('deletion of Comment from List by invoking "deleteCommentCallback()"', () => { + beforeEach(async () => { + await wrapper.vm.deleteCommentCallback() + }) + + it('emits "deleteComment"', () => { + expect(wrapper.emitted('deleteComment')).toEqual([ + [ + { + id: 'it-is-the-deleted-comment', + }, + ], + ]) + }) + + it('does call mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it('mutation is successful', () => { + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + }) + }) + + describe('test update comment', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('with a given comment', () => { + beforeEach(async () => { + await wrapper.vm.updateComment({ + id: 'it-is-the-updated-comment', + }) + }) + + it('emits "updateComment"', () => { + expect(wrapper.emitted('updateComment')).toEqual([ + [ + { + id: 'it-is-the-updated-comment', + }, + ], + ]) + }) + }) + }) + + describe('click reply button', () => { + beforeEach(async () => { + wrapper = Wrapper() + await wrapper.find('.reply-button').trigger('click') + }) + + it('emits "reply"', () => { + expect(wrapper.emitted('reply')).toEqual([ + [ + { + id: 'commentAuthorId', + slug: 'ogerly', + }, + ], + ]) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/CommentCard/CommentCard.story.js b/docs/webapp/components/CommentCard/CommentCard.story.js new file mode 100644 index 000000000..75078657e --- /dev/null +++ b/docs/webapp/components/CommentCard/CommentCard.story.js @@ -0,0 +1,55 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import CommentCard from './CommentCard' +import helpers from '~/storybook/helpers' + +helpers.init() + +const comment = { + id: '5d42a2277f2725002a449cb3', + content: + '

                              Thank you all!

                              @wolfgang-huss @robert-schafer @greg @human-connection

                              watch my video

                              I think we can all learn a lot from Alex\'s video :)

                              It\'s really great stuff!!

                              Please give him a big smiley face emoticon :D

                              ', + contentExcerpt: + '

                              Thank you all!

                              @wolfgang-huss @robert-schafer @greg @human-connection

                              watch my video

                              I think we can all learn a lot from Alex\'s video :)

                              It\'s really great stuff!!

                              Please give him a …

                              ', + createdAt: '2019-08-01T08:26:15.839Z', + updatedAt: '2019-08-01T08:26:15.839Z', + deleted: false, + disabled: false, + author: { + id: '1', + avatar: { + url: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbc9e03ebcc384b920c31542af2d27dd8eea9dc2_full.jpg', + }, + slug: 'jenny-rostock', + name: 'Rainer Unsinn', + disabled: false, + deleted: false, + contributionsCount: 25, + shoutedCount: 5, + commentedCount: 39, + followedByCount: 2, + followedByCurrentUser: true, + location: null, + badges: [ + { + id: 'indiegogo_en_bear', + icon: '/img/badges/indiegogo_en_bear.svg', + __typename: 'Badge', + }, + ], + __typename: 'User', + }, + __typename: 'Comment', +} + +storiesOf('CommentCard', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('Basic comment', () => ({ + components: { CommentCard }, + store: helpers.store, + data: () => ({ + comment, + }), + template: ``, + })) diff --git a/docs/webapp/components/CommentCard/CommentCard.vue b/docs/webapp/components/CommentCard/CommentCard.vue new file mode 100644 index 000000000..d805d26ee --- /dev/null +++ b/docs/webapp/components/CommentCard/CommentCard.vue @@ -0,0 +1,216 @@ + + + + diff --git a/docs/webapp/components/CommentForm/CommentForm.spec.js b/docs/webapp/components/CommentForm/CommentForm.spec.js new file mode 100644 index 000000000..996e6ecfc --- /dev/null +++ b/docs/webapp/components/CommentForm/CommentForm.spec.js @@ -0,0 +1,202 @@ +import { mount } from '@vue/test-utils' +import CommentForm from './CommentForm' +import Vue from 'vue' +import MutationObserver from 'mutation-observer' + +global.MutationObserver = MutationObserver + +const localVue = global.localVue + +describe('CommentForm.vue', () => { + let mocks + let wrapper + let propsData + let cancelMethodSpy + let closeMethodSpy + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $i18n: { + locale: () => 'en', + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + $filters: { + removeHtml: (a) => a, + }, + } + }) + + describe('mount', () => { + describe('create comment', () => { + beforeEach(() => { + mocks = { + ...mocks, + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { + CreateComment: { + contentExcerpt: 'this is a comment', + }, + }, + }) + .mockRejectedValue({ + message: 'Ouch!', + }), + }, + } + propsData = { + post: { + id: 'p001', + }, + } + const Wrapper = () => { + return mount(CommentForm, { + mocks, + localVue, + propsData, + }) + } + wrapper = Wrapper() + cancelMethodSpy = jest.spyOn(wrapper.vm, 'clear') + }) + + it('calls the apollo mutation when form is submitted', async () => { + wrapper.vm.updateEditorContent('this is a comment') + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it('calls `clear` method when the cancel button is clicked', async () => { + wrapper.vm.updateEditorContent('ok') + await Vue.nextTick() + await wrapper.find('[data-test="cancel-button"]').trigger('submit') + expect(cancelMethodSpy).toHaveBeenCalledTimes(1) + }) + + describe('mutation resolves', () => { + beforeEach(async () => { + wrapper.vm.updateEditorContent('this is a comment') + wrapper.find('form').trigger('submit') + }) + + it('shows a success toaster', async () => { + await mocks.$apollo.mutate + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + + it('clears the editor', () => { + expect(cancelMethodSpy).toHaveBeenCalledTimes(1) + }) + + describe('mutation fails', () => { + it('shows the error toaster', async () => { + await wrapper.find('form').trigger('submit') + await mocks.$apollo.mutate + expect(mocks.$toast.error).toHaveBeenCalledTimes(1) + }) + }) + }) + }) + + describe('update comment', () => { + beforeEach(() => { + mocks = { + ...mocks, + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { + UpdateComment: { + contentExcerpt: 'this is a comment', + }, + }, + }) + .mockRejectedValue({ + message: 'Ouch!', + }), + }, + } + propsData = { + update: true, + comment: { + id: 'c001', + }, + } + const Wrapper = () => { + return mount(CommentForm, { + mocks, + localVue, + propsData, + }) + } + wrapper = Wrapper() + closeMethodSpy = jest.spyOn(wrapper.vm, 'closeEditWindow') + }) + + describe('form submitted', () => { + it('calls the apollo mutation', async () => { + wrapper.vm.updateEditorContent('this is a comment') + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it('calls `closeEditWindow` method', async () => { + wrapper.vm.updateEditorContent('ok') + await wrapper.find('form').trigger('submit') + expect(closeMethodSpy).toHaveBeenCalledTimes(1) + }) + + it('emits `finishEditing` event', async () => { + wrapper.vm.updateEditorContent('ok') + await wrapper.find('form').trigger('submit') + expect(wrapper.emitted('finishEditing')).toBeTruthy() + }) + }) + + describe('cancel button is clicked', () => { + it('calls `closeEditWindow` method', async () => { + wrapper.vm.updateEditorContent('ok') + await wrapper.find('[data-test="cancel-button"]').trigger('submit') + expect(closeMethodSpy).toHaveBeenCalledTimes(1) + }) + + it('emits `finishEditing` event', async () => { + wrapper.vm.updateEditorContent('ok') + await wrapper.find('[data-test="cancel-button"]').trigger('submit') + expect(wrapper.emitted('finishEditing')).toBeTruthy() + }) + }) + + describe('mutation resolves', () => { + beforeEach(async () => { + wrapper.vm.updateEditorContent('this is a comment') + wrapper.find('form').trigger('submit') + }) + + it('shows a success toaster', async () => { + await mocks.$apollo.mutate + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + + it('closes the editor', () => { + expect(closeMethodSpy).toHaveBeenCalledTimes(1) + }) + + describe('mutation fails', () => { + it('shows the error toaster', async () => { + await wrapper.find('form').trigger('submit') + await mocks.$apollo.mutate + expect(mocks.$toast.error).toHaveBeenCalledTimes(1) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/CommentForm/CommentForm.vue b/docs/webapp/components/CommentForm/CommentForm.vue new file mode 100644 index 000000000..6d9b59de6 --- /dev/null +++ b/docs/webapp/components/CommentForm/CommentForm.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/docs/webapp/components/CommentList/CommentList.spec.js b/docs/webapp/components/CommentList/CommentList.spec.js new file mode 100644 index 000000000..f4195aa41 --- /dev/null +++ b/docs/webapp/components/CommentList/CommentList.spec.js @@ -0,0 +1,180 @@ +import { mount } from '@vue/test-utils' +import CommentList from './CommentList' +import Vuex from 'vuex' +import Vue from 'vue' + +const localVue = global.localVue + +localVue.filter('truncate', (string) => string) +localVue.directive('scrollTo', jest.fn()) + +describe('CommentList.vue', () => { + let mocks, store, wrapper, propsData, stubs + + describe('mount', () => { + beforeEach(() => { + propsData = { + post: { + id: 'post42', + comments: [ + { + id: 'comment134', + contentExcerpt: 'this is a comment', + content: 'this is a comment', + author: { + id: 'some-user', + slug: 'some-slug', + }, + }, + { + id: 'comment135', + contentExcerpt: 'this is a deleted comment', + content: 'this is a deleted comment', + deleted: true, + author: { id: 'some-user' }, + }, + { + id: 'comment136', + contentExcerpt: 'this is a disabled comment', + content: 'this is a disabled comment', + disabled: true, + author: { id: 'some-user' }, + }, + ], + }, + } + store = new Vuex.Store({ + getters: { + 'auth/isModerator': () => false, + 'auth/user': () => { + return { id: 'some-user' } + }, + }, + }) + mocks = { + $t: jest.fn(), + $filters: { + truncate: (a) => a, + removeHtml: (a) => a, + }, + $scrollTo: jest.fn(), + $route: { hash: '' }, + $apollo: { + queries: { + Post: { + refetch: jest.fn(), + }, + }, + }, + } + stubs = { + EditorContent: true, + 'v-popover': true, + 'nuxt-link': true, + 'client-only': true, + } + }) + + const Wrapper = () => { + return mount(CommentList, { + store, + mocks, + localVue, + propsData, + stubs, + }) + } + + it('displays a comments counter that ignores disabled and deleted comments', () => { + wrapper = Wrapper() + expect(wrapper.find('.count').text()).toEqual('1') + }) + + describe('scrollToAnchor mixin', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('$route.hash !== `#comments`', () => { + it('skips $scrollTo', () => { + wrapper = Wrapper() + jest.runAllTimers() + expect(mocks.$scrollTo).not.toHaveBeenCalled() + }) + }) + + describe('$route.hash === `#comments`', () => { + beforeEach(() => { + mocks.$route = { + hash: '#comments', + } + }) + + it('calls $scrollTo', () => { + wrapper = Wrapper() + jest.runAllTimers() + expect(mocks.$scrollTo).toHaveBeenCalledWith('#comments') + }) + }) + }) + + describe('Respond to Comment', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('emits reply to comment', () => { + wrapper.find('.reply-button').trigger('click') + expect(wrapper.emitted('reply')).toEqual([ + [ + { + id: 'some-user', + slug: 'some-slug', + }, + ], + ]) + }) + }) + + describe('edit Comment', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('updates comment after edit', () => { + wrapper.vm.updateCommentList({ + id: 'comment134', + contentExcerpt: 'this is an edited comment', + content: 'this is an edited comment', + author: { + id: 'some-user', + slug: 'some-slug', + }, + }) + expect(wrapper.props('post').comments[0].content).toEqual('this is an edited comment') + }) + }) + + describe('delete Comment', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + // TODO: Test does not find .count = 0 but 1. Can't understand why... + it.skip('sets counter to 0', async () => { + wrapper.vm.updateCommentList({ + id: 'comment134', + contentExcerpt: 'this is another deleted comment', + content: 'this is an another deleted comment', + deleted: true, + author: { + id: 'some-user', + slug: 'some-slug', + }, + }) + await Vue.nextTick() + await expect(wrapper.find('.count').text()).toEqual('0') + }) + }) + }) +}) diff --git a/docs/webapp/components/CommentList/CommentList.story.js b/docs/webapp/components/CommentList/CommentList.story.js new file mode 100644 index 000000000..50a2b1d1b --- /dev/null +++ b/docs/webapp/components/CommentList/CommentList.story.js @@ -0,0 +1,45 @@ +import faker from '@faker-js/faker' +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import HcCommentList from './CommentList.vue' +import helpers from '~/storybook/helpers' + +helpers.init() + +const commentMock = (fields) => { + return { + id: faker.random.uuid(), + title: faker.lorem.sentence(), + content: faker.lorem.paragraph(), + createdAt: faker.date.past(), + updatedAt: faker.date.recent(), + deleted: false, + disabled: false, + ...fields, + } +} + +const comments = [ + commentMock(), + commentMock(), + commentMock(), + commentMock(), + commentMock(), + commentMock(), + commentMock(), + commentMock(), + commentMock(), + commentMock(), +] + +storiesOf('CommentList', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('given 10 comments', () => ({ + components: { HcCommentList }, + store: helpers.store, + data: () => ({ + post: { comments }, + }), + template: ``, + })) diff --git a/docs/webapp/components/CommentList/CommentList.vue b/docs/webapp/components/CommentList/CommentList.vue new file mode 100644 index 000000000..b8b6c8a57 --- /dev/null +++ b/docs/webapp/components/CommentList/CommentList.vue @@ -0,0 +1,77 @@ + + + + diff --git a/docs/webapp/components/ComponentSlider/ComponentSlider.spec.js b/docs/webapp/components/ComponentSlider/ComponentSlider.spec.js new file mode 100644 index 000000000..0f1f345e9 --- /dev/null +++ b/docs/webapp/components/ComponentSlider/ComponentSlider.spec.js @@ -0,0 +1,64 @@ +import { mount } from '@vue/test-utils' +import ComponentSlider from './ComponentSlider.vue' + +const localVue = global.localVue + +describe('ComponentSlider.vue', () => { + let wrapper + let mocks + let propsData + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + propsData = { + sliderData: { + sliderIndex: 0, + sliderSelectorCallback: jest.fn().mockResolvedValue(true), + sliders: [ + { + validated: true, + button: { + icon: 'smile', + callback: jest.fn().mockResolvedValue(true), + sliderCallback: jest.fn().mockResolvedValue(true), + }, + }, + { + validated: true, + button: { + icon: 'smile', + callback: jest.fn().mockResolvedValue(true), + sliderCallback: jest.fn().mockResolvedValue(true), + }, + }, + ], + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(ComponentSlider, { + mocks, + localVue, + propsData, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('click on next Button', async () => { + await wrapper.find('.base-button[data-test="next-button"]').trigger('click') + await wrapper.vm.$nextTick() + expect(propsData.sliderData.sliderSelectorCallback).toHaveBeenCalled() + }) + }) +}) diff --git a/docs/webapp/components/ComponentSlider/ComponentSlider.vue b/docs/webapp/components/ComponentSlider/ComponentSlider.vue new file mode 100644 index 000000000..19e82417f --- /dev/null +++ b/docs/webapp/components/ComponentSlider/ComponentSlider.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/docs/webapp/components/ContentMenu/ContentMenu.spec.js b/docs/webapp/components/ContentMenu/ContentMenu.spec.js new file mode 100644 index 000000000..0bd398e41 --- /dev/null +++ b/docs/webapp/components/ContentMenu/ContentMenu.spec.js @@ -0,0 +1,505 @@ +import { mount, createLocalVue } from '@vue/test-utils' +import Vuex from 'vuex' +import VTooltip from 'v-tooltip' +import Styleguide from '@human-connection/styleguide' +import ContentMenu from './ContentMenu.vue' + +const localVue = createLocalVue() + +localVue.use(Styleguide) +localVue.use(VTooltip) +localVue.use(Vuex) + +const stubs = { + 'router-link': { + template: '', + }, +} + +let getters, mutations, mocks, menuToggle, openModalSpy + +describe('ContentMenu.vue', () => { + beforeEach(() => { + mocks = { + $t: jest.fn((str) => str), + $i18n: { + locale: () => 'en', + }, + $router: { + push: jest.fn(), + }, + } + }) + + describe('mount', () => { + mutations = { + 'modal/SET_OPEN': jest.fn(), + } + getters = { + 'auth/isModerator': () => false, + 'auth/isAdmin': () => false, + } + + const openContentMenu = async (values = {}) => { + const store = new Vuex.Store({ mutations, getters }) + const wrapper = mount(ContentMenu, { + propsData: { + ...values, + }, + mocks, + store, + localVue, + stubs, + }) + menuToggle = wrapper.find('[data-test="content-menu-button"]') + await menuToggle.trigger('click') + return wrapper + } + + describe('owner of contribution', () => { + let wrapper + beforeEach(async () => { + wrapper = await openContentMenu({ + isOwner: true, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + }) + + it('can edit the contribution', () => { + expect( + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'post.menu.edit') + .at(0) + .find('span.ds-menu-item-link') + .attributes('to'), + ).toBe('/post-edit-id') + }) + + it('can delete the contribution', () => { + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'post.menu.delete') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('confirm', 'delete') + }) + }) + + describe('admin can', () => { + it('pin unpinned post', async () => { + getters['auth/isAdmin'] = () => true + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + pinnedBy: null, + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'post.menu.pin') + .at(0) + .trigger('click') + expect(wrapper.emitted('pinPost')).toEqual([ + [ + { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + pinnedBy: null, + }, + ], + ]) + }) + + it('unpin pinned post', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + pinnedBy: 'someone', + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'post.menu.unpin') + .at(0) + .trigger('click') + expect(wrapper.emitted('unpinPost')).toEqual([ + [ + { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + pinnedBy: 'someone', + }, + ], + ]) + }) + + it('can delete another user', async () => { + getters['auth/user'] = () => { + return { id: 'some-user', slug: 'some-user' } + } + const wrapper = await openContentMenu({ + resourceType: 'user', + resource: { + id: 'another-user', + slug: 'another-user', + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'settings.deleteUserAccount.name') + .at(0) + .trigger('click') + expect(wrapper.emitted('delete')).toEqual([ + [ + { + id: 'another-user', + slug: 'another-user', + }, + ], + ]) + }) + + it('can not delete the own account', async () => { + const wrapper = await openContentMenu({ + resourceType: 'user', + resource: { + id: 'some-user', + slug: 'some-user', + }, + }) + expect( + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'settings.deleteUserAccount.name'), + ).toEqual({}) + }) + }) + + describe('owner of comment can', () => { + let wrapper + beforeEach(async () => { + wrapper = await openContentMenu({ + isOwner: true, + resourceType: 'comment', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + }) + it('edit the comment', () => { + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'comment.menu.edit') + .at(0) + .trigger('click') + expect(wrapper.emitted('editComment')).toBeTruthy() + }) + it('delete the comment', () => { + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'comment.menu.delete') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('confirm', 'delete') + }) + }) + + describe('reporting', () => { + it('a post of another user is possible', async () => { + getters['auth/isAdmin'] = () => false + getters['auth/isModerator'] = () => false + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'report.contribution.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('report') + }) + + it('a comment of another user is possible', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'comment', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'report.comment.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('report') + }) + + it('another user is possible', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'user', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'report.user.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('report') + }) + + it('another organization is possible', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'organization', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'report.organization.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('report') + }) + }) + + describe('moderator', () => { + it('can disable posts', async () => { + getters['auth/isAdmin'] = () => false + getters['auth/isModerator'] = () => true + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: false, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'disable.contribution.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('disable') + }) + + it('can disable comments', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'comment', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: false, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'disable.comment.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('disable') + }) + + it('can disable users', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'user', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: false, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'disable.user.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('disable') + }) + + it('can disable organizations', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'organization', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: false, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'disable.organization.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('disable') + }) + + it('can release posts', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: true, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'release.contribution.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('release') + }) + + it('can release comments', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'comment', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: true, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'release.comment.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('release') + }) + + it('can release users', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'user', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: true, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'release.user.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('release') + }) + + it('can release organizations', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'organization', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + disabled: true, + }, + }) + openModalSpy = jest.spyOn(wrapper.vm, 'openModal') + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'release.organization.title') + .at(0) + .trigger('click') + expect(openModalSpy).toHaveBeenCalledWith('release') + }) + }) + + describe('user', () => { + it('can access settings', async () => { + getters['auth/isAdmin'] = () => false + getters['auth/isModerator'] = () => false + const wrapper = await openContentMenu({ + isOwner: true, + resourceType: 'user', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + }, + }) + expect( + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'settings.name') + .at(0) + .find('span.ds-menu-item-link') + .attributes('to'), + ).toBe('/settings') + }) + + it('can mute other users', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'user', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + isMuted: false, + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'settings.muted-users.mute') + .at(0) + .trigger('click') + expect(wrapper.emitted('mute')).toEqual([ + [ + { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + isMuted: false, + }, + ], + ]) + }) + + it('can unmute muted users', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'user', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + isMuted: true, + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'settings.muted-users.unmute') + .at(0) + .trigger('click') + expect(wrapper.emitted('unmute')).toEqual([ + [ + { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + isMuted: true, + }, + ], + ]) + }) + }) + }) +}) diff --git a/docs/webapp/components/ContentMenu/ContentMenu.vue b/docs/webapp/components/ContentMenu/ContentMenu.vue new file mode 100644 index 000000000..d723a9667 --- /dev/null +++ b/docs/webapp/components/ContentMenu/ContentMenu.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/docs/webapp/components/ContentMenu/GroupContentMenu.spec.js b/docs/webapp/components/ContentMenu/GroupContentMenu.spec.js new file mode 100644 index 000000000..49a66aaac --- /dev/null +++ b/docs/webapp/components/ContentMenu/GroupContentMenu.spec.js @@ -0,0 +1,42 @@ +import { mount } from '@vue/test-utils' +import GroupContentMenu from './GroupContentMenu.vue' + +const localVue = global.localVue + +const stubs = { + 'router-link': { + template: '', + }, +} + +const propsData = { + usage: 'groupTeaser', + resource: {}, + group: {}, + resourceType: 'group', +} + +describe('GroupContentMenu', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(GroupContentMenu, { propsData, mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.group-content-menu')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/components/ContentMenu/GroupContentMenu.vue b/docs/webapp/components/ContentMenu/GroupContentMenu.vue new file mode 100644 index 000000000..1ca1b5b33 --- /dev/null +++ b/docs/webapp/components/ContentMenu/GroupContentMenu.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/docs/webapp/components/ContributionForm/ContributionForm.spec.js b/docs/webapp/components/ContributionForm/ContributionForm.spec.js new file mode 100644 index 000000000..9095665fc --- /dev/null +++ b/docs/webapp/components/ContributionForm/ContributionForm.spec.js @@ -0,0 +1,384 @@ +import { mount } from '@vue/test-utils' +import ContributionForm from './ContributionForm.vue' +import PostMutations from '~/graphql/PostMutations.js' + +import Vuex from 'vuex' + +import ImageUploader from '~/components/Uploader/ImageUploader' +import MutationObserver from 'mutation-observer' + +global.MutationObserver = MutationObserver + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'nuxt-link': true, + 'v-popover': true, + 'date-picker': true, +} + +describe('ContributionForm.vue', () => { + let wrapper, postTitleInput, expectedParams, cancelBtn, mocks, propsData + const postTitle = 'this is a title for a post' + const postTitleTooShort = 'xx' + let postTitleTooLong = '' + for (let i = 0; i < 101; i++) { + postTitleTooLong += 'x' + } + const postContent = 'this is a post' + const imageUpload = { + file: { + filename: 'avataar.svg', + previewElement: '', + }, + url: 'someUrlToImage', + } + const image = { sensitive: false, url: '/uploads/1562010976466-avataaars', aspectRatio: 1 } + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn().mockResolvedValueOnce({ + data: { + CreatePost: { + title: postTitle, + slug: 'this-is-a-title-for-a-post', + content: postContent, + contentExcerpt: postContent, + postType: ['Article'], + }, + }, + }), + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + $i18n: { + locale: () => 'en', + }, + $router: { + back: jest.fn(), + push: jest.fn(), + }, + $env: { + CATEGORIES_ACTIVE: false, + }, + } + propsData = {} + }) + + describe('mount', () => { + const getters = { + 'editor/placeholder': () => { + return 'some cool placeholder' + }, + 'auth/isModerator': () => false, + 'auth/user': () => { + return { + id: '4711', + name: 'You yourself', + slug: 'you-yourself', + } + }, + } + const store = new Vuex.Store({ + getters, + }) + const Wrapper = () => { + return mount(ContributionForm, { + mocks, + localVue, + store, + propsData, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('CreatePost', () => { + describe('invalid form submission', () => { + beforeEach(async () => { + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitle) + await wrapper.vm.updateEditorContent(postContent) + }) + + it('has no event data block', () => { + expect(wrapper.find('div.eventDatas').exists()).toBe(false) + }) + + it('title cannot be empty', async () => { + postTitleInput.setValue('') + wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('title cannot be too long', async () => { + postTitleInput.setValue(postTitleTooLong) + wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('title cannot be too short', async () => { + postTitleInput.setValue(postTitleTooShort) + wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('content cannot be empty', async () => { + await wrapper.vm.updateEditorContent('') + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + }) + + describe('valid form submission', () => { + beforeEach(async () => { + expectedParams = { + mutation: PostMutations().CreatePost, + variables: { + title: postTitle, + content: postContent, + categoryIds: [], + id: null, + image: null, + groupId: null, + postType: 'Article', + }, + } + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitle) + await wrapper.vm.updateEditorContent(postContent) + }) + + it('creates a post with valid title and content', async () => { + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) + }) + + it('supports adding a teaser image', async () => { + expectedParams.variables.image = { + aspectRatio: null, + sensitive: false, + upload: imageUpload, + type: null, + } + const spy = jest + .spyOn(FileReader.prototype, 'readAsDataURL') + .mockImplementation(function () { + this.onload({ target: { result: 'someUrlToImage' } }) + }) + wrapper.findComponent(ImageUploader).vm.$emit('addHeroImage', imageUpload) + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) + expect(spy).toHaveBeenCalledWith(imageUpload) + spy.mockReset() + }) + + it('content is valid with just a link', async () => { + await wrapper.vm.updateEditorContent( + '', + ) + wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it("pushes the user to the post's page", async () => { + wrapper.find('form').trigger('submit') + await mocks.$apollo.mutate + expect(mocks.$router.push).toHaveBeenCalledTimes(1) + }) + + it('shows a success toaster', async () => { + wrapper.find('form').trigger('submit') + await mocks.$apollo.mutate + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + }) + + describe('cancel', () => { + it('calls $router.back() when cancel button clicked', () => { + cancelBtn = wrapper.find('[data-test="cancel-button"]') + cancelBtn.trigger('click') + expect(mocks.$router.back).toHaveBeenCalledTimes(1) + }) + }) + + describe('handles errors', () => { + beforeEach(async () => { + jest.useFakeTimers() + mocks.$apollo.mutate = jest.fn().mockRejectedValueOnce({ + message: 'Not Authorized!', + }) + wrapper = Wrapper() + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitle) + await wrapper.vm.updateEditorContent(postContent) + }) + + it('shows an error toaster when apollo mutation rejects', async () => { + await wrapper.find('form').trigger('submit') + await mocks.$apollo.mutate + await expect(mocks.$toast.error).toHaveBeenCalledWith('Not Authorized!') + }) + }) + }) + + describe('UpdatePost', () => { + beforeEach(() => { + propsData = { + contribution: { + id: 'p1456', + slug: 'dies-ist-ein-post', + title: 'dies ist ein Post', + content: 'auf Deutsch geschrieben', + image, + }, + } + wrapper = Wrapper() + }) + + it('sets title equal to contribution title', () => { + expect(wrapper.vm.formData.title).toEqual(propsData.contribution.title) + }) + + it('sets content equal to contribution content', () => { + expect(wrapper.vm.formData.content).toEqual(propsData.contribution.content) + }) + + describe('valid update', () => { + beforeEach(() => { + mocks.$apollo.mutate = jest.fn().mockResolvedValueOnce({ + data: { + UpdatePost: { + title: postTitle, + slug: 'this-is-a-title-for-a-post', + content: postContent, + contentExcerpt: postContent, + }, + }, + }) + wrapper = Wrapper() + expectedParams = { + mutation: PostMutations().UpdatePost, + variables: { + title: propsData.contribution.title, + content: propsData.contribution.content, + categoryIds: [], + id: propsData.contribution.id, + groupId: null, + image: { + sensitive: false, + }, + postType: 'Article', + }, + } + }) + + it('calls the UpdatePost apollo mutation', async () => { + expectedParams.variables.content = postContent + wrapper.vm.updateEditorContent(postContent) + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) + }) + + it('supports deleting a teaser image', async () => { + expectedParams.variables.image = null + propsData.contribution.image = { url: '/uploads/someimage.png' } + wrapper = Wrapper() + wrapper.find('[data-test="delete-button"]').trigger('click') + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) + }) + }) + }) + + describe('Events', () => { + beforeEach(() => { + propsData.createEvent = true + wrapper = Wrapper() + }) + + it('has event data block', () => { + expect(wrapper.find('div.eventDatas').exists()).toBe(true) + }) + + describe('is online event', () => { + it('has false as default', () => { + expect(wrapper.vm.formData.eventIsOnline).toBe(false) + }) + + it('has input for event location', () => { + expect(wrapper.find('input[name="eventLocationName"]').exists()).toBe(true) + }) + + describe('click is online event', () => { + beforeEach(() => { + wrapper.find('input[name="eventIsOnline"]').setChecked(true) + }) + + it('has no input for event location', () => { + expect(wrapper.find('input[name="eventLocationName"]').exists()).toBe(false) + }) + }) + + describe('invalid form', () => { + beforeEach(() => { + wrapper.find('input[name="title"]').setValue('Illegaler Kindergeburtstag') + wrapper.vm.updateEditorContent('Elli hat Geburtstag!') + }) + + it('has submit button disabled', () => { + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') + }) + }) + + describe('valid form', () => { + const now = new Date() + + beforeEach(() => { + wrapper.find('input[name="title"]').setValue('Illegaler Kindergeburtstag') + wrapper.vm.updateEditorContent('Elli hat Geburtstag!') + wrapper + .findComponent({ name: 'DatePicker' }) + .vm.$emit('change', new Date(now.getFullYear(), now.getMonth() + 1).toISOString()) + wrapper.find('input[name="eventVenue"]').setValue('Ellis Kinderzimmer') + wrapper.find('input[name="eventLocationName"]').setValue('Deutschland') + }) + + it('has submit button not disabled', () => { + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe(undefined) + }) + + describe('submit', () => { + beforeEach(() => { + wrapper.find('form').trigger('submit') + }) + + it('calls create post', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ + mutation: PostMutations().CreatePost, + variables: expect.objectContaining({ + title: 'Illegaler Kindergeburtstag', + content: 'Elli hat Geburtstag!', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventVenue: 'Ellis Kinderzimmer', + eventLocationName: 'Deutschland', + eventIsOnline: false, + eventEnd: null, + }, + }), + }) + }) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/ContributionForm/ContributionForm.vue b/docs/webapp/components/ContributionForm/ContributionForm.vue new file mode 100644 index 000000000..0a5eba0cd --- /dev/null +++ b/docs/webapp/components/ContributionForm/ContributionForm.vue @@ -0,0 +1,630 @@ + + + + diff --git a/docs/webapp/components/CountTo.vue b/docs/webapp/components/CountTo.vue new file mode 100644 index 000000000..42152b5d4 --- /dev/null +++ b/docs/webapp/components/CountTo.vue @@ -0,0 +1,29 @@ + + + diff --git a/docs/webapp/components/DateTimeRange/DateTimeRange.vue b/docs/webapp/components/DateTimeRange/DateTimeRange.vue new file mode 100644 index 000000000..de9b442c5 --- /dev/null +++ b/docs/webapp/components/DateTimeRange/DateTimeRange.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/docs/webapp/components/DeleteData/DeleteData.spec.js b/docs/webapp/components/DeleteData/DeleteData.spec.js new file mode 100644 index 000000000..f34b2fe6f --- /dev/null +++ b/docs/webapp/components/DeleteData/DeleteData.spec.js @@ -0,0 +1,187 @@ +import { mount } from '@vue/test-utils' +import DeleteData from './DeleteData.vue' +import Vue from 'vue' +import Vuex from 'vuex' + +const localVue = global.localVue + +describe('DeleteData.vue', () => { + let mocks + let wrapper + let getters + let actions + let deleteAccountBtn + let enableDeletionInput + let enableContributionDeletionCheckbox + let enableCommentDeletionCheckbox + const deleteAccountName = 'Delete MyAccount' + + beforeEach(() => { + mocks = { + $t: jest.fn((a) => a), + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { + DeleteData: { + id: 'u343', + }, + }, + }) + .mockRejectedValue({ message: 'Not Authorized!' }), + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + $router: { + history: { + push: jest.fn(), + }, + }, + } + getters = { + 'auth/user': () => { + return { id: 'u343', name: deleteAccountName } + }, + } + actions = { 'auth/logout': jest.fn() } + }) + + describe('mount', () => { + const data = () => { + return { + currentUserCounts: { + contributionsCount: 4, + commentedCount: 2, + }, + } + } + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + actions, + }) + return mount(DeleteData, { mocks, localVue, store, data }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('checkbox deleteContributions defaults be false', () => { + expect(wrapper.vm.deleteContributions).toEqual(false) + }) + + it('checkbox deleteComments defaults be false', () => { + expect(wrapper.vm.deleteComments).toEqual(false) + }) + + it('deleteButton defaults be false', () => { + expect(wrapper.vm.deleteEnabled).toEqual(false) + }) + + it('does not call the delete user mutation if deleteEnabled is false', () => { + deleteAccountBtn = wrapper.find('[data-test="delete-button"]') + deleteAccountBtn.trigger('click') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + describe('calls the delete user mutation', () => { + beforeEach(() => { + enableDeletionInput = wrapper.find('.ds-input') + enableDeletionInput.setValue(deleteAccountName) + deleteAccountBtn = wrapper.find('[data-test="delete-button"]') + }) + + it('if deleteEnabled is true and only deletes user ', () => { + deleteAccountBtn.trigger('click') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { + id: 'u343', + resource: [], + }, + }), + ) + }) + + it("deletes user's posts and comments if requested by default ", () => { + enableContributionDeletionCheckbox = wrapper.find( + '[data-test="contributions-deletion-checkbox"]', + ) + enableContributionDeletionCheckbox.setChecked(true) + enableCommentDeletionCheckbox = wrapper.find('[data-test="comments-deletion-checkbox"]') + enableCommentDeletionCheckbox.setChecked(true) + deleteAccountBtn.trigger('click') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { + id: 'u343', + resource: ['Post', 'Comment'], + }, + }), + ) + }) + + it("deletes a user's posts if requested", () => { + enableContributionDeletionCheckbox = wrapper.find( + '[data-test="contributions-deletion-checkbox"]', + ) + enableContributionDeletionCheckbox.setChecked(true) + deleteAccountBtn.trigger('click') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { + id: 'u343', + resource: ['Post'], + }, + }), + ) + }) + + it("deletes a user's comments if requested", () => { + enableCommentDeletionCheckbox = wrapper.find('[data-test="comments-deletion-checkbox"]') + enableCommentDeletionCheckbox.setChecked(true) + deleteAccountBtn.trigger('click') + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { + id: 'u343', + resource: ['Comment'], + }, + }), + ) + }) + + it('shows a success toaster after successful mutation', async () => { + await deleteAccountBtn.trigger('click') + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + + it('redirect the user to the homepage', async () => { + await deleteAccountBtn.trigger('click') + expect(mocks.$router.history.push).toHaveBeenCalledWith('/') + }) + }) + + describe('error handling', () => { + it('shows an error toaster when the mutation rejects', async () => { + enableDeletionInput = wrapper.find('.ds-input') + enableDeletionInput.setValue(deleteAccountName) + await Vue.nextTick() + deleteAccountBtn = wrapper.find('[data-test="delete-button"]') + await deleteAccountBtn.trigger('click') + // second submission causes mutation to reject + await deleteAccountBtn.trigger('click') + await mocks.$apollo.mutate + expect(mocks.$toast.error).toHaveBeenCalledWith('Not Authorized!') + }) + }) + }) +}) diff --git a/docs/webapp/components/DeleteData/DeleteData.vue b/docs/webapp/components/DeleteData/DeleteData.vue new file mode 100644 index 000000000..a0cdcf29b --- /dev/null +++ b/docs/webapp/components/DeleteData/DeleteData.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/docs/webapp/components/DonationInfo/DonationInfo.spec.js b/docs/webapp/components/DonationInfo/DonationInfo.spec.js new file mode 100644 index 000000000..76aef9444 --- /dev/null +++ b/docs/webapp/components/DonationInfo/DonationInfo.spec.js @@ -0,0 +1,69 @@ +import { mount } from '@vue/test-utils' + +import DonationInfo from './DonationInfo.vue' + +const localVue = global.localVue + +const mockDate = new Date(2019, 11, 6) +global.Date = jest.fn(() => mockDate) + +describe('DonationInfo.vue', () => { + let mocks, wrapper, propsData + + beforeEach(() => { + mocks = { + $t: jest.fn((string) => string), + $i18n: { + locale: () => 'en', + }, + } + propsData = { + goal: 50000, + progress: 10000, + } + }) + + const Wrapper = () => mount(DonationInfo, { mocks, localVue, propsData }) + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('displays the progress bar', () => { + expect(wrapper.find('.progress-bar').exists()).toBe(true) + }) + + it('displays the action button', () => { + expect(wrapper.find('.base-button').text()).toBe('donations.donate-now') + }) + + describe('mount with data', () => { + describe('given german locale', () => { + beforeEach(() => { + mocks.$i18n.locale = () => 'de' + }) + + // it looks to me that toLocaleString for some reason is not working as expected + it.skip('creates a label from the given amounts and a translation string', () => { + expect(mocks.$t).nthCalledWith(1, 'donations.amount-of-total', { + amount: '10.000', + total: '50.000', + }) + }) + }) + + describe('given english locale', () => { + it('creates a label from the given amounts and a translation string', () => { + expect(mocks.$t).toBeCalledWith( + 'donations.amount-of-total', + expect.objectContaining({ + amount: '10,000', + total: '50,000', + }), + ) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/DonationInfo/DonationInfo.vue b/docs/webapp/components/DonationInfo/DonationInfo.vue new file mode 100644 index 000000000..00b9bf584 --- /dev/null +++ b/docs/webapp/components/DonationInfo/DonationInfo.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/docs/webapp/components/Dropdown.vue b/docs/webapp/components/Dropdown.vue new file mode 100644 index 000000000..7e4d21223 --- /dev/null +++ b/docs/webapp/components/Dropdown.vue @@ -0,0 +1,134 @@ + + + diff --git a/docs/webapp/components/DropdownFilter/DropdownFilter.spec.js b/docs/webapp/components/DropdownFilter/DropdownFilter.spec.js new file mode 100644 index 000000000..b7c2be1d7 --- /dev/null +++ b/docs/webapp/components/DropdownFilter/DropdownFilter.spec.js @@ -0,0 +1,75 @@ +import { mount } from '@vue/test-utils' + +import DropdownFilter from './DropdownFilter.vue' + +const localVue = global.localVue + +describe('DropdownFilter.vue', () => { + let propsData, wrapper, mocks + + beforeEach(() => { + propsData = {} + mocks = { + $t: jest.fn((a) => a), + } + }) + + const Wrapper = () => { + return mount(DropdownFilter, { propsData, localVue, mocks }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('selected', () => { + it('displays selected filter', () => { + propsData.selected = 'Read' + wrapper = Wrapper() + expect(wrapper.find('.dropdown-filter label').text()).toEqual(propsData.selected) + }) + }) + + describe('menu items', () => { + let allLink + beforeEach(() => { + propsData.filterOptions = [ + { label: 'All', value: null }, + { label: 'Read', value: true }, + { label: 'Unread', value: false }, + ] + wrapper = Wrapper() + wrapper.find('.dropdown-filter').trigger('click') + allLink = wrapper + .findAll('.dropdown-menu-item') + .at(propsData.filterOptions.findIndex((option) => option.label === 'All')) + }) + + it('displays a link for All', () => { + expect(allLink.text()).toEqual('All') + }) + + it('displays a link for Read', () => { + const readLink = wrapper + .findAll('.dropdown-menu-item') + .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')) + 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'), + ) + }) + }) + }) +}) diff --git a/docs/webapp/components/DropdownFilter/DropdownFilter.story.js b/docs/webapp/components/DropdownFilter/DropdownFilter.story.js new file mode 100644 index 000000000..9bd750ac1 --- /dev/null +++ b/docs/webapp/components/DropdownFilter/DropdownFilter.story.js @@ -0,0 +1,30 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import DropdownFilter from '~/components/DropdownFilter/DropdownFilter' +import helpers from '~/storybook/helpers' + +helpers.init() +const filterOptions = [ + { label: 'All', value: null }, + { label: 'Read', value: true }, + { label: 'Unread', value: false }, +] +storiesOf('DropdownFilter', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('filter dropdown', () => ({ + components: { DropdownFilter }, + data: () => ({ + filterOptions, + selected: filterOptions[0].label, + }), + methods: { + filter: action('filter'), + }, + template: ``, + })) diff --git a/docs/webapp/components/DropdownFilter/DropdownFilter.vue b/docs/webapp/components/DropdownFilter/DropdownFilter.vue new file mode 100644 index 000000000..27d29e5e1 --- /dev/null +++ b/docs/webapp/components/DropdownFilter/DropdownFilter.vue @@ -0,0 +1,80 @@ + + + diff --git a/docs/webapp/components/Editor/ContentViewer.story.js b/docs/webapp/components/Editor/ContentViewer.story.js new file mode 100644 index 000000000..b4997ece4 --- /dev/null +++ b/docs/webapp/components/Editor/ContentViewer.story.js @@ -0,0 +1,78 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import ContentViewer from '~/components/Editor/ContentViewer.vue' +import helpers from '~/storybook/helpers' + +helpers.init() + +storiesOf('ContentViewer', module) + .addDecorator(withA11y) + .addDecorator((storyFn) => { + const ctx = storyFn() + return { + components: { ctx }, + template: ` + + + + `, + } + }) + .addDecorator(helpers.layout) + .add('Basic formatting', () => ({ + components: { ContentViewer }, + store: helpers.store, + data: () => ({ + content: ` +

                              Basic formatting

                              +

                              + Here is some italic, bold and underline text. +
                              + Also do we have some inline links here. +

                              +

                              Heading 3

                              +

                              At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                              +

                              Heading 4

                              +

                              At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                              +
                              Heading 5
                              +

                              At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                              + +

                              Unordered List

                              +
                                +
                              • Also some list

                              • +
                              • with

                              • +
                              • several

                              • +
                              • +

                                points

                                +
                                  +
                                • +

                                  and indentations

                                  +

                                  as well as text parapgraphs

                                  +

                                  At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

                                  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                                  +
                                • +
                                +
                              • +
                              + +

                              Ordered List

                              +
                                +
                              1. +

                                ordered lists

                                +

                                At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsu

                                +
                                  +
                                1. +

                                  can have indentations

                                  +
                                    +
                                  1. +

                                    and text parapgraphs, too

                                    +

                                    At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

                                    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                                    +
                                  2. +
                                  +
                                2. +
                                +
                              2. +
                              + `, + }), + template: ``, + })) diff --git a/docs/webapp/components/Editor/ContentViewer.vue b/docs/webapp/components/Editor/ContentViewer.vue new file mode 100644 index 000000000..d4acacb09 --- /dev/null +++ b/docs/webapp/components/Editor/ContentViewer.vue @@ -0,0 +1,48 @@ + + + + diff --git a/docs/webapp/components/Editor/ContextMenu.vue b/docs/webapp/components/Editor/ContextMenu.vue new file mode 100644 index 000000000..b04add6cc --- /dev/null +++ b/docs/webapp/components/Editor/ContextMenu.vue @@ -0,0 +1,95 @@ + + + diff --git a/docs/webapp/components/Editor/Editor.spec.js b/docs/webapp/components/Editor/Editor.spec.js new file mode 100644 index 000000000..98c287ced --- /dev/null +++ b/docs/webapp/components/Editor/Editor.spec.js @@ -0,0 +1,175 @@ +import { mount } from '@vue/test-utils' +import Editor from './Editor' + +import MutationObserver from 'mutation-observer' +import Vue from 'vue' + +global.MutationObserver = MutationObserver + +const localVue = global.localVue + +describe('Editor.vue', () => { + let wrapper + let propsData + let mocks + + const Wrapper = () => { + return (wrapper = mount(Editor, { + mocks, + propsData, + localVue, + sync: false, + stubs: { + transition: false, + }, + })) + } + + beforeEach(() => { + propsData = {} + mocks = { + $t: () => 'some cool placeholder', + } + wrapper = Wrapper() + }) + + describe('mount', () => { + it('renders', () => { + expect(Wrapper().element.tagName).toBe('DIV') + }) + + describe('given a piece of text', () => { + beforeEach(() => { + propsData.value = 'I am a piece of text' + }) + + it('renders', async () => { + wrapper = Wrapper() + await Vue.nextTick().then(() => { + expect(wrapper.find('.editor-content').text()).toContain(propsData.value) + }) + }) + }) + + it('translates the placeholder', () => { + expect(wrapper.vm.editor.extensions.options.placeholder.emptyNodeText).toEqual( + 'some cool placeholder', + ) + }) + + describe('optional extensions', () => { + it('sets the Mention items to the users', () => { + propsData.users = [ + { + id: 'u345', + }, + ] + wrapper = Wrapper() + expect(wrapper.vm.editor.extensions.options.mention.items()).toEqual(propsData.users) + }) + + it('mentions is not an option when there are no users', () => { + expect(wrapper.vm.editor.extensions.options).toEqual( + expect.not.objectContaining({ + mention: expect.anything(), + }), + ) + }) + + describe('limists suggestion list to 15 users', () => { + beforeEach(() => { + const manyUsersList = [] + for (let i = 0; i < 25; i++) { + manyUsersList.push({ id: `user${i}` }) + } + propsData.users = manyUsersList + wrapper = Wrapper() + }) + + it('when query is empty', () => { + expect( + wrapper.vm.editor.extensions.options.mention.onFilter(propsData.users), + ).toHaveLength(15) + }) + + it('when query is present', () => { + expect( + wrapper.vm.editor.extensions.options.mention.onFilter(propsData.users, 'user'), + ).toHaveLength(15) + }) + }) + + it('suggestion list returns results prefixed by query', () => { + const manyUsersList = [] + for (let i = 0; i < 10; i++) { + manyUsersList.push({ id: `user${i}` }) + manyUsersList.push({ id: `admin${i}` }) + manyUsersList.push({ id: `moderator${i}` }) + } + propsData.users = manyUsersList + wrapper = Wrapper() + const suggestionList = wrapper.vm.editor.extensions.options.mention.onFilter( + propsData.users, + 'moderator', + ) + expect(suggestionList).toHaveLength(10) + for (var i = 0; i < suggestionList.length; i++) { + expect(suggestionList[i].id).toMatch(/^moderator.*/) + } + }) + + it('exact match appears at the top of suggestion list', () => { + const manyUsersList = [] + for (let i = 0; i < 25; i++) { + manyUsersList.push({ id: `user${i}` }) + } + propsData.users = manyUsersList + wrapper = Wrapper() + expect( + wrapper.vm.editor.extensions.options.mention.onFilter(propsData.users, 'user7')[0].id, + ).toMatch('user7') + }) + + it('sets the Hashtag items to the hashtags', () => { + propsData.hashtags = [ + { + id: 'Frieden', + }, + ] + wrapper = Wrapper() + expect(wrapper.vm.editor.extensions.options.hashtag.items()).toEqual(propsData.hashtags) + }) + + it('hashtags is not an option when there are no hashtags', () => { + expect(wrapper.vm.editor.extensions.options).toEqual( + expect.not.objectContaining({ + hashtag: expect.anything(), + }), + ) + }) + + describe('limists suggestion list to 15 hashtags', () => { + beforeEach(() => { + const manyHashtagsList = [] + for (let i = 0; i < 25; i++) { + manyHashtagsList.push({ id: `hashtag${i}` }) + } + propsData.hashtags = manyHashtagsList + wrapper = Wrapper() + }) + + it('when query is empty', () => { + expect( + wrapper.vm.editor.extensions.options.hashtag.onFilter(propsData.hashtags), + ).toHaveLength(15) + }) + + it('when query is present', () => { + expect( + wrapper.vm.editor.extensions.options.hashtag.onFilter(propsData.hashtags, 'hashtag'), + ).toHaveLength(15) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Editor/Editor.story.js b/docs/webapp/components/Editor/Editor.story.js new file mode 100644 index 000000000..6e38eab7f --- /dev/null +++ b/docs/webapp/components/Editor/Editor.story.js @@ -0,0 +1,169 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import HcEditor from '~/components/Editor/Editor.vue' +import helpers from '~/storybook/helpers' +import Vue from 'vue' + +const embed = { + image: 'https://i.ytimg.com/vi/ptCcgLM-p8k/maxresdefault_live.jpg', + title: 'Video Titel', + // html: null, + description: 'Video Description', + html: '', +} + +const plugins = [ + (app = {}) => { + app.$apollo = { + mutate: () => {}, + query: () => { + return { data: { embed } } + }, + } + Vue.prototype.$apollo = app.$apollo + return app + }, +] +helpers.init({ plugins }) + +const users = [ + { id: 1, slug: 'peter' }, + { id: 2, slug: 'sandra' }, + { id: 3, slug: 'jane' }, +] + +storiesOf('Editor', module) + .addDecorator(withA11y) + .addDecorator((storyFn) => { + const ctx = storyFn() + return { + components: { ctx }, + template: ` + + + + `, + } + }) + .addDecorator(helpers.layout) + .add('Empty', () => ({ + components: { HcEditor }, + store: helpers.store, + data: () => ({ + users, + }), + template: ``, + })) + .add('Basic formatting', () => ({ + components: { HcEditor }, + store: helpers.store, + data: () => ({ + users, + content: ` +

                              Basic formatting

                              +

                              + Here is some italic, bold and underline text. +
                              + Also do we have some inline links here. +

                              +

                              Heading 3

                              +

                              At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                              +

                              Heading 4

                              +

                              At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                              +
                              Heading 5
                              +

                              At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                              + +

                              Unordered List

                              +
                                +
                              • Also some list

                              • +
                              • with

                              • +
                              • several

                              • +
                              • +

                                points

                                +
                                  +
                                • +

                                  and indentations

                                  +

                                  as well as text parapgraphs

                                  +

                                  At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

                                  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                                  +
                                • +
                                +
                              • +
                              + +

                              Ordered List

                              +
                                +
                              1. +

                                ordered lists

                                +

                                At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsu

                                +
                                  +
                                1. +

                                  can have indentations

                                  +
                                    +
                                  1. +

                                    and text parapgraphs, too

                                    +

                                    At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

                                    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

                                    +
                                  2. +
                                  +
                                2. +
                                +
                              2. +
                              + `, + }), + template: ``, + })) + .add('@Mentions', () => ({ + components: { HcEditor }, + store: helpers.store, + data: () => ({ + users, + content: ` +

                              + Here you can mention people like + @sandra and others. + Try it out! +

                              + `, + }), + template: ``, + })) + .add('#Hashtags', () => ({ + components: { HcEditor }, + store: helpers.store, + data: () => ({ + users, + content: ` +

                              + This text contains #hashtags for projects like #ocelot-social + Try to add more by typing #. +

                              + `, + }), + template: ``, + })) + .add('Embeds with iframe', () => ({ + components: { HcEditor }, + store: helpers.store, + data: () => ({ + users, + content: ` + + https://www.youtube.com/watch?v=qkdXAtO40Fo + + `, + }), + template: ``, + })) + .add('Embeds with plain link', () => ({ + components: { HcEditor }, + store: helpers.store, + data: () => ({ + users, + content: ` + + https://telegram.org/ + + `, + }), + template: ``, + })) diff --git a/docs/webapp/components/Editor/Editor.vue b/docs/webapp/components/Editor/Editor.vue new file mode 100644 index 000000000..8bc0a04d3 --- /dev/null +++ b/docs/webapp/components/Editor/Editor.vue @@ -0,0 +1,380 @@ + + + + + diff --git a/docs/webapp/components/Editor/LinkInput.vue b/docs/webapp/components/Editor/LinkInput.vue new file mode 100644 index 000000000..dede19302 --- /dev/null +++ b/docs/webapp/components/Editor/LinkInput.vue @@ -0,0 +1,33 @@ + + + diff --git a/docs/webapp/components/Editor/MenuBar.vue b/docs/webapp/components/Editor/MenuBar.vue new file mode 100644 index 000000000..b64cf779e --- /dev/null +++ b/docs/webapp/components/Editor/MenuBar.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/docs/webapp/components/Editor/MenuBarButton.vue b/docs/webapp/components/Editor/MenuBarButton.vue new file mode 100644 index 000000000..e4f11e46d --- /dev/null +++ b/docs/webapp/components/Editor/MenuBarButton.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/components/Editor/MenuLegend.vue b/docs/webapp/components/Editor/MenuLegend.vue new file mode 100644 index 000000000..2d897eeb5 --- /dev/null +++ b/docs/webapp/components/Editor/MenuLegend.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/docs/webapp/components/Editor/SuggestionList.vue b/docs/webapp/components/Editor/SuggestionList.vue new file mode 100644 index 000000000..54b7c7316 --- /dev/null +++ b/docs/webapp/components/Editor/SuggestionList.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/docs/webapp/components/Editor/commands/pasteRule.js b/docs/webapp/components/Editor/commands/pasteRule.js new file mode 100644 index 000000000..c84093d5e --- /dev/null +++ b/docs/webapp/components/Editor/commands/pasteRule.js @@ -0,0 +1,49 @@ +import { Plugin } from 'prosemirror-state' +import { Slice, Fragment } from 'prosemirror-model' + +export default function (regexp, type, getAttrs) { + const handler = (fragment) => { + const nodes = [] + + fragment.forEach((child) => { + if (child.isText) { + const { text } = child + let pos = 0 + let match + + do { + match = regexp.exec(text) + if (match) { + const start = match.index + const end = start + match[0].length + const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs + + if (start > 0) { + nodes.push(child.cut(pos, start)) + } + + // only difference to `pasteRule` of `tiptap-commands`: + // we replace the node instead of adding markup + nodes.push(type.create(attrs, child.cut(start, end))) + + pos = end + } + } while (match) + + if (pos < text.length) { + nodes.push(child.cut(pos)) + } + } else { + nodes.push(child.copy(handler(child.content))) + } + }) + + return Fragment.fromArray(nodes) + } + + return new Plugin({ + props: { + transformPasted: (slice) => new Slice(handler(slice.content), slice.openStart, slice.openEnd), + }, + }) +} diff --git a/docs/webapp/components/Editor/defaultExtensions.js b/docs/webapp/components/Editor/defaultExtensions.js new file mode 100644 index 000000000..63cf8c73f --- /dev/null +++ b/docs/webapp/components/Editor/defaultExtensions.js @@ -0,0 +1,57 @@ +import Embed from '~/components/Editor/nodes/Embed.js' +import LegacyEmbed from '~/components/Editor/nodes/LegacyEmbed.js' +import Link from '~/components/Editor/nodes/Link.js' +import Strike from '~/components/Editor/marks/Strike' +import Italic from '~/components/Editor/marks/Italic' +import Bold from '~/components/Editor/marks/Bold' +import EmbedQuery from '~/graphql/EmbedQuery.js' +import { + Heading, + HardBreak, + Blockquote, + ListItem, + BulletList, + OrderedList, + HorizontalRule, + Placeholder, + Underline, +} from 'tiptap-extensions' + +export default function defaultExtensions(component) { + const { placeholder, $t, $apollo } = component + return [ + new Heading(), + new HardBreak(), + new Blockquote(), + new BulletList(), + new OrderedList(), + new HorizontalRule(), + new Bold(), + new Italic(), + new Strike(), + new Underline(), + new Link(), + new Heading({ levels: [3, 4] }), + new ListItem(), + new Placeholder({ + emptyNodeClass: 'is-empty', + emptyNodeText: placeholder || $t('editor.placeholder'), + }), + new Embed({ + onEmbed: async ({ url }) => { + const { + data: { embed }, + } = await $apollo.query({ query: EmbedQuery(), variables: { url } }) + return embed + }, + }), + new LegacyEmbed({ + onEmbed: async ({ url }) => { + const { + data: { embed }, + } = await $apollo.query({ query: EmbedQuery(), variables: { url } }) + return embed + }, + }), + ] +} diff --git a/docs/webapp/components/Editor/defaultExtensions.spec.js b/docs/webapp/components/Editor/defaultExtensions.spec.js new file mode 100644 index 000000000..97d50b883 --- /dev/null +++ b/docs/webapp/components/Editor/defaultExtensions.spec.js @@ -0,0 +1,94 @@ +import defaultExtensions from './defaultExtensions.js' +import { Editor } from 'tiptap' + +let content +let createEditor + +describe('defaultExtensions', () => { + describe('editor', () => { + createEditor = () => { + const componentStub = { + placeholder: 'placeholder', + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + } + return new Editor({ + content, + extensions: [...defaultExtensions(componentStub)], + }) + } + }) + + it('renders', () => { + content = '' + expect(createEditor().getHTML()).toEqual('

                              ') + }) + + describe('`content` contains a mentioning', () => { + beforeEach(() => { + content = + '

                              This is a post content mentioning @alicia-luettgen.

                              ' + }) + + it('renders mentioning as link', () => { + const editor = createEditor() + const expected = + '

                              This is a post content mentioning @alicia-luettgen.

                              ' + expect(editor.getHTML()).toEqual(expected) + }) + }) + + describe('`content` contains a hashtag', () => { + beforeEach(() => { + content = + '

                              This is a post content with a hashtag #metoo.

                              ' + }) + + it('renders hashtag as link', () => { + const editor = createEditor() + const expected = + '

                              This is a post content with a hashtag #metoo.

                              ' + expect(editor.getHTML()).toEqual(expected) + }) + }) + + describe('`content` contains embed code', () => { + beforeEach(() => { + content = + '

                              Baby loves cat:

                              ' + }) + + it('recognizes embed code', () => { + const editor = createEditor() + const expected = { + type: 'doc', + content: [ + { + content: [ + { + text: 'Baby loves cat:', + type: 'text', + }, + ], + type: 'paragraph', + }, + { + content: [ + { + attrs: { + dataEmbedUrl: 'https://www.youtube.com/watch?v=qkdXAtO40Fo', + }, + type: 'embed', + }, + ], + type: 'paragraph', + }, + ], + } + + expect(editor.getJSON()).toEqual(expected) + }) + }) +}) diff --git a/docs/webapp/components/Editor/marks/Bold.js b/docs/webapp/components/Editor/marks/Bold.js new file mode 100644 index 000000000..f803ff9cc --- /dev/null +++ b/docs/webapp/components/Editor/marks/Bold.js @@ -0,0 +1,7 @@ +import { Bold as TipTapBold } from 'tiptap-extensions' + +export default class Bold extends TipTapBold { + pasteRules() { + return [] + } +} diff --git a/docs/webapp/components/Editor/marks/Italic.js b/docs/webapp/components/Editor/marks/Italic.js new file mode 100644 index 000000000..07493bd39 --- /dev/null +++ b/docs/webapp/components/Editor/marks/Italic.js @@ -0,0 +1,7 @@ +import { Italic as TipTapItalic } from 'tiptap-extensions' + +export default class Italic extends TipTapItalic { + pasteRules() { + return [] + } +} diff --git a/docs/webapp/components/Editor/marks/Strike.js b/docs/webapp/components/Editor/marks/Strike.js new file mode 100644 index 000000000..260ce6a0a --- /dev/null +++ b/docs/webapp/components/Editor/marks/Strike.js @@ -0,0 +1,7 @@ +import { Strike as TipTapStrike } from 'tiptap-extensions' + +export default class Strike extends TipTapStrike { + pasteRules() { + return [] + } +} diff --git a/docs/webapp/components/Editor/nodes/Embed.js b/docs/webapp/components/Editor/nodes/Embed.js new file mode 100644 index 000000000..0cbc4d7ad --- /dev/null +++ b/docs/webapp/components/Editor/nodes/Embed.js @@ -0,0 +1,93 @@ +import { Node } from 'tiptap' +import pasteRule from '../commands/pasteRule' +import { compileToFunctions } from 'vue-template-compiler' +import Vue from 'vue' +import EmbedComponent from '~/components/Embed/EmbedComponent' + +Vue.component(EmbedComponent) +const template = `` + +const compiledTemplate = compileToFunctions(template) + +export default class Embed extends Node { + get name() { + return 'embed' + } + + get defaultOptions() { + return { + onEmbed: () => ({}), + } + } + + pasteRules({ type, schema }) { + return [ + pasteRule( + // source: https://stackoverflow.com/a/3809435 + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/g, + type, + (url) => ({ dataEmbedUrl: url }), + ), + ] + } + + get schema() { + return { + attrs: { + dataEmbedUrl: { + default: null, + }, + }, + group: 'block', + inline: false, + parseDOM: [ + { + tag: 'a[href].embed', + getAttrs: (dom) => ({ + dataEmbedUrl: dom.getAttribute('href'), + }), + }, + ], + toDOM: (node) => [ + 'a', + { + href: node.attrs.dataEmbedUrl, + class: 'embed', + target: '_blank', + }, + ], + } + } + + get view() { + return { + props: ['node', 'updateAttrs', 'options'], + data: () => ({ + embedData: {}, + }), + async created() { + if (this.options) { + this.embedData = await this.options.onEmbed({ url: this.dataEmbedUrl }) + } + }, + computed: { + componentType() { + return EmbedComponent + }, + dataEmbedUrl: { + get() { + return this.node.attrs.dataEmbedUrl + }, + set(dataEmbedUrl) { + this.updateAttrs({ + dataEmbedUrl, + }) + }, + }, + }, + render(createElement) { + return compiledTemplate.render.call(this, createElement) + }, + } + } +} diff --git a/docs/webapp/components/Editor/nodes/Embed.spec.js b/docs/webapp/components/Editor/nodes/Embed.spec.js new file mode 100644 index 000000000..05edb1296 --- /dev/null +++ b/docs/webapp/components/Editor/nodes/Embed.spec.js @@ -0,0 +1,57 @@ +import { shallowMount } from '@vue/test-utils' + +import Embed from './Embed' + +let Wrapper, propsData, component +const someUrl = 'https://www.youtube.com/watch?v=qkdXAtO40Fo' + +describe('Embed.vue', () => { + beforeEach(() => { + propsData = {} + component = new Embed() + Wrapper = ({ propsData }) => { + return shallowMount(component.view, { propsData }) + } + }) + + describe('given a href', () => { + describe('onEmbed returned embed data', () => { + beforeEach(() => { + propsData.options = { + onEmbed: () => ({ + __typename: 'Embed', + type: 'video', + title: 'Baby Loves Cat', + author: 'Merkley Family', + publisher: 'YouTube', + date: '2015-08-16T00:00:00.000Z', + description: + 'She’s incapable of controlling her limbs when her kitty is around. The obsession grows every day. Ps. That’s a sleep sack she’s in. Not a starfish outfit. Al...', + url: someUrl, + image: 'https://i.ytimg.com/vi/qkdXAtO40Fo/maxresdefault.jpg', + audio: null, + video: null, + lang: 'de', + sources: ['resource', 'oembed'], + html: '', + }), + } + }) + + it('renders the given html code', async () => { + propsData.node = { attrs: { href: 'https://www.youtube.com/watch?v=qkdXAtO40Fo' } } + const wrapper = Wrapper({ propsData }) + await wrapper.html() + expect(wrapper.find('embed-component-stub').exists()).toBe(true) + }) + }) + + describe('without embedded html but some meta data instead', () => { + it.todo('renders description and link') + }) + + describe('without any meta data', () => { + it.todo('renders a link without `embed` class') + }) + }) +}) diff --git a/docs/webapp/components/Editor/nodes/Hashtag.js b/docs/webapp/components/Editor/nodes/Hashtag.js new file mode 100644 index 000000000..d591c3e30 --- /dev/null +++ b/docs/webapp/components/Editor/nodes/Hashtag.js @@ -0,0 +1,51 @@ +import { Mention as TipTapMention } from 'tiptap-extensions' + +export default class Hashtag extends TipTapMention { + get name() { + return 'hashtag' + } + + get defaultOptions() { + return { + matcher: { + char: '#', + allowSpaces: false, + startOfLine: false, + }, + mentionClass: 'hashtag', + suggestionClass: 'hashtag-suggestion', + } + } + + get schema() { + return { + ...super.schema, + toDOM: (node) => { + // use a dummy domain because URL cannot handle relative urls + const url = new URL('/', 'https://example.org') + url.searchParams.append('hashtag', node.attrs.id) + + return [ + 'a', + { + class: this.options.mentionClass, + href: `/${url.search}`, + 'data-hashtag-id': node.attrs.id, + target: '_blank', + }, + `${this.options.matcher.char}${node.attrs.label}`, + ] + }, + parseDOM: [ + { + tag: 'a[data-hashtag-id]', + getAttrs: (dom) => { + const id = dom.getAttribute('data-hashtag-id') + const label = dom.innerText.split(this.options.matcher.char).join('') + return { id, label } + }, + }, + ], + } + } +} diff --git a/docs/webapp/components/Editor/nodes/LegacyEmbed.js b/docs/webapp/components/Editor/nodes/LegacyEmbed.js new file mode 100644 index 000000000..0d308a356 --- /dev/null +++ b/docs/webapp/components/Editor/nodes/LegacyEmbed.js @@ -0,0 +1,94 @@ +import { Node } from 'tiptap' +import pasteRule from '../commands/pasteRule' +import { compileToFunctions } from 'vue-template-compiler' +import Vue from 'vue' +import EmbedComponent from '~/components/Embed/EmbedComponent' + +Vue.component(EmbedComponent) +const template = `` + +const compiledTemplate = compileToFunctions(template) + +export default class Embed extends Node { + get name() { + return 'embed' + } + + get defaultOptions() { + return { + onEmbed: () => ({}), + } + } + + pasteRules({ type, schema }) { + return [ + pasteRule( + // source: https://stackoverflow.com/a/3809435 + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/g, + type, + (url) => ({ dataEmbedUrl: url }), + ), + ] + } + + get schema() { + return { + attrs: { + dataEmbedUrl: { + default: null, + }, + }, + group: 'inline', + inline: true, + selectable: false, + parseDOM: [ + { + tag: 'a[href].embed', + getAttrs: (dom) => ({ + dataEmbedUrl: dom.getAttribute('href'), + }), + }, + ], + toDOM: (node) => [ + 'a', + { + href: node.attrs.dataEmbedUrl, + class: 'embed', + target: '_blank', + }, + ], + } + } + + get view() { + return { + props: ['node', 'updateAttrs', 'options'], + data: () => ({ + embedData: {}, + }), + async created() { + if (this.options) { + this.embedData = await this.options.onEmbed({ url: this.dataEmbedUrl }) + } + }, + computed: { + componentType() { + return EmbedComponent + }, + dataEmbedUrl: { + get() { + return this.node.attrs.dataEmbedUrl + }, + set(dataEmbedUrl) { + this.updateAttrs({ + dataEmbedUrl, + }) + }, + }, + }, + render(createElement) { + return compiledTemplate.render.call(this, createElement) + }, + } + } +} diff --git a/docs/webapp/components/Editor/nodes/Link.js b/docs/webapp/components/Editor/nodes/Link.js new file mode 100644 index 000000000..3850a063b --- /dev/null +++ b/docs/webapp/components/Editor/nodes/Link.js @@ -0,0 +1,36 @@ +import { Link as TipTapLink } from 'tiptap-extensions' + +export default class Link extends TipTapLink { + pasteRules({ type }) { + return [] + } + + get schema() { + return { + attrs: { + href: { + default: null, + }, + }, + inclusive: false, + parseDOM: [ + { + // if this is an embed link or a hashtag, ignore + tag: 'a[href]:not(.embed):not([data-hashtag-id])', + getAttrs: (dom) => ({ + href: dom.getAttribute('href'), + }), + }, + ], + toDOM: (node) => [ + 'a', + { + ...node.attrs, + rel: 'noopener noreferrer nofollow', + target: '_blank', + }, + 0, + ], + } + } +} diff --git a/docs/webapp/components/Editor/nodes/Mention.js b/docs/webapp/components/Editor/nodes/Mention.js new file mode 100644 index 000000000..fa1555877 --- /dev/null +++ b/docs/webapp/components/Editor/nodes/Mention.js @@ -0,0 +1,29 @@ +import { Mention as TipTapMention } from 'tiptap-extensions' + +export default class Mention extends TipTapMention { + get name() { + return 'mention' + } + + get schema() { + return { + ...super.schema, + toDOM: (node) => { + return [ + 'a', + { + class: this.options.mentionClass, + href: `/profile/${node.attrs.id}`, + 'data-mention-id': node.attrs.id, + target: '_blank', + }, + `${this.options.matcher.char}${node.attrs.label} `, + ] + }, + parseDOM: [ + // simply don't parse mentions from html + // just treat them as normal links + ], + } + } +} diff --git a/docs/webapp/components/Editor/plugins/eventHandler.js b/docs/webapp/components/Editor/plugins/eventHandler.js new file mode 100644 index 000000000..1d823491a --- /dev/null +++ b/docs/webapp/components/Editor/plugins/eventHandler.js @@ -0,0 +1,80 @@ +import { Extension, Plugin } from 'tiptap' +// import { Slice, Fragment } from 'prosemirror-model' + +export default class EventHandler extends Extension { + get name() { + return 'event_handler' + } + + get plugins() { + return [ + new Plugin({ + props: { + transformPastedText(text) { + /* remove hashtag from d.tube url + * hashtags in url general are not a problem because the following link work like expected: + * http://www.nsosp.org/de/Quanten-Fluss-Theorie/index.php#OM:FrQFT:Home:Inhalt + */ + if (text.search(/d.tube/) > 0) { + text = text.replace(/\/#!\//gim, '/') + } + return text.trim() + }, + transformPastedHTML(html) { + html = html + // remove all tags with "space only" + .replace(/<[a-z-]+>[\s]+<\/[a-z-]+>/gim, '') + // remove all iframes + .replace(/(]*)(>)[^>]*\/*>/gim, '') + .replace(/[\n]{3,}/gim, '\n\n') + .replace(/(\r\n|\n\r|\r|\n)/g, '
                              $1') + + // replace all p tags with line breaks (and spaces) only by single linebreaks + // limit linebreaks to max 2 (equivalent to html "br" linebreak) + .replace(/(
                              \s*){2,}/gim, '
                              ') + // remove additional linebreaks after p tags + .replace(/<\/(p|div|th|tr)>\s*(
                              \s*)+\s*<(p|div|th|tr)>/gim, '

                              ') + // remove additional linebreaks inside p tags + .replace(/<[a-z-]+>(<[a-z-]+>)*\s*(
                              \s*)+\s*(<\/[a-z-]+>)*<\/[a-z-]+>/gim, '') + // remove additional linebreaks when first child inside p tags + .replace(/

                              (\s*
                              \s*)+/gim, '

                              ') + // remove additional linebreaks when last child inside p tags + .replace(/(\s*
                              \s*)+<\/p>/gim, '

                              ') + return html + }, + // transformPasted(slice) { + // // console.log('#### transformPasted', slice.content) + // let content = [] + // let size = 0 + // slice.content.forEach((node, offset, index) => { + // // console.log(node) + // // console.log('isBlock', node.type.isBlock) + // // console.log('childCount', node.content.childCount) + // // console.log('index', index) + // if (node.content.childCount) { + // content.push(node.content) + // size += node.content.size + // } + // }) + // console.log(content) + // console.log(slice.content) + // let fragment = Fragment.fromArray(content) + // fragment.size = size + // console.log('#fragment', fragment, slice.content) + // console.log('----') + // console.log('#1', slice) + // // const newSlice = new Slice(fragment, slice.openStart, slice.openEnd) + // slice.fragment = fragment + // // slice.content.content = fragment.content + // // slice.content.size = fragment.size + // console.log('#2', slice) + // // console.log(newSlice) + // console.log('----') + // return slice + // // return newSlice + // } + }, + }), + ] + } +} diff --git a/docs/webapp/components/Embed/EmbedComponent.spec.js b/docs/webapp/components/Embed/EmbedComponent.spec.js new file mode 100644 index 000000000..0d20f969f --- /dev/null +++ b/docs/webapp/components/Embed/EmbedComponent.spec.js @@ -0,0 +1,202 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' + +import EmbedComponent from './EmbedComponent' + +let wrapper, propsData, getters, mocks +const someUrl = 'https://www.youtube.com/watch?v=qkdXAtO40Fo' +const localVue = global.localVue + +describe('EmbedComponent.vue', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(EmbedComponent, { propsData, localVue, store, mocks }) + } + + beforeEach(() => { + mocks = { + $t: (a) => a, + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ data: { UpdateUser: { allowEmbedIframes: true } } }), + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + } + propsData = {} + getters = { + 'auth/user': () => { + return { id: 'u5', allowEmbedIframes: false } + }, + } + }) + + describe('given a href only for a link ', () => { + beforeEach(() => { + propsData.embedData = { + __typename: 'Embed', + type: 'link', + title: '👻 ✉️ Bruno... le ciel sur répondeur ! 🔮 🧠 - Clément FREZE', + author: null, + publisher: 'PeerTube.social', + date: null, + description: + 'Salut tout le monde ! Aujourd’hui, une vidéo sur le scepticisme, nous allons parler médiumnité avec le cas de Bruno CHARVET : « Bruno, un nouveau message ». Merci de rester respectueux dans les commentaires : SOURCES : Les sources des vi...', + url: 'https://peertube.social/videos/watch/f3cb1945-a8f7-481f-a465-946c6f884e50', + image: 'https://peertube.social/static/thumbnails/f3cb1945-a8f7-481f-a465-946c6f884e50.jpg', + audio: null, + video: null, + lang: 'fr', + sources: ['resource', 'oembed'], + html: null, + } + wrapper = Wrapper() + }) + + it('shows the title', () => { + expect(wrapper.find('h4').text()).toBe( + '👻 ✉️ Bruno... le ciel sur répondeur ! 🔮 🧠 - Clément FREZE', + ) + }) + + it('shows the description', () => { + expect(wrapper.find('.content p').text()).toBe( + 'Salut tout le monde ! Aujourd’hui, une vidéo sur le scepticisme, nous allons parler médiumnité avec le cas de Bruno CHARVET : « Bruno, un nouveau message ». Merci de rester respectueux dans les commentaires : SOURCES : Les sources des vi...', + ) + }) + + it('shows preview Images for link', () => { + expect(wrapper.find('.preview').exists()).toBe(true) + }) + }) + + describe('given a href with embed html', () => { + describe('onEmbed returned title and description', () => { + beforeEach(() => { + propsData.embedData = { + __typename: 'Embed', + title: 'Baby Loves Cat', + description: + 'She’s incapable of controlling her limbs when her kitty is around. The obsession grows every day. Ps. That’s a sleep sack she’s in. Not a starfish outfit. Al...', + } + wrapper = Wrapper() + }) + + it('show the title', () => { + expect(wrapper.find('h4').text()).toBe('Baby Loves Cat') + }) + + it('show the desciption', () => { + expect(wrapper.find('.content p').text()).toBe( + 'She’s incapable of controlling her limbs when her kitty is around. The obsession grows every day. Ps. That’s a sleep sack she’s in. Not a starfish outfit. Al...', + ) + }) + + describe('onEmbed returned embed data with html', () => { + beforeEach(() => { + propsData.embedData = { + __typename: 'Embed', + type: 'video', + title: 'Baby Loves Cat', + author: 'Merkley Family', + publisher: 'YouTube', + date: '2015-08-16T00:00:00.000Z', + description: + 'She’s incapable of controlling her limbs when her kitty is around. The obsession grows every day. Ps. That’s a sleep sack she’s in. Not a starfish outfit. Al...', + url: someUrl, + image: 'https://i.ytimg.com/vi/qkdXAtO40Fo/maxresdefault.jpg', + audio: null, + video: null, + lang: 'de', + sources: ['resource', 'oembed'], + html: '', + } + wrapper = Wrapper() + }) + + it('shows a simple link when a user closes the embed preview', () => { + wrapper.find('.close-button').trigger('click') + expect(wrapper.vm.showLinkOnly).toBe(true) + }) + + it('opens the data privacy overlay when a user clicks on the preview image', () => { + wrapper.find('.preview.--clickable').trigger('click') + expect(wrapper.vm.showOverlay).toBe(true) + }) + + describe('shows iframe', () => { + beforeEach(() => { + wrapper.setData({ showOverlay: true }) + }) + + it('when user agrees', () => { + wrapper.find('[data-test="play-now-button"]').trigger('click') + expect(wrapper.vm.showEmbed).toBe(true) + }) + + it('does not show iframe when user clicks to cancel', () => { + wrapper.find('[data-test="cancel-button"]').trigger('click') + expect(wrapper.vm.showEmbed).toBe(false) + }) + + describe("doesn't set permanently", () => { + beforeEach(() => { + wrapper.find('[data-test="play-now-button"]').trigger('click') + }) + + it("if user doesn't give consent", () => { + expect(wrapper.vm.checkedAlwaysAllowEmbeds).toBe(false) + }) + + it("doesn't update the user's profile", () => { + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + }) + + describe('sets permanently', () => { + beforeEach(() => { + wrapper.find('input[type=checkbox]').setChecked(true) + wrapper.find('[data-test="play-now-button"]').trigger('click') + }) + + it('changes setting permanetly when user requests', () => { + expect(wrapper.vm.checkedAlwaysAllowEmbeds).toBe(true) + }) + + it("updates the user's profile", () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + }) + }) + + describe('immediately shows', () => { + beforeEach(() => { + getters = { + 'auth/user': () => { + return { id: 'u5', allowEmbedIframes: true } + }, + } + wrapper = Wrapper() + }) + + it('sets showEmbed to true', () => { + expect(wrapper.vm.showEmbed).toBe(true) + }) + + it('the iframe returned from oEmbed', () => { + expect(wrapper.find('iframe').html()).toEqual(propsData.embedData.html) + }) + + it('does not display image to click', () => { + expect(wrapper.find('.preview.--clickable').exists()).toBe(false) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Embed/EmbedComponent.vue b/docs/webapp/components/Embed/EmbedComponent.vue new file mode 100644 index 000000000..af9520538 --- /dev/null +++ b/docs/webapp/components/Embed/EmbedComponent.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/docs/webapp/components/EmotionButton/EmotionButton.vue b/docs/webapp/components/EmotionButton/EmotionButton.vue new file mode 100644 index 000000000..f6a4b4938 --- /dev/null +++ b/docs/webapp/components/EmotionButton/EmotionButton.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/docs/webapp/components/Emotions/Emotions.spec.js b/docs/webapp/components/Emotions/Emotions.spec.js new file mode 100644 index 000000000..b7a2bbe34 --- /dev/null +++ b/docs/webapp/components/Emotions/Emotions.spec.js @@ -0,0 +1,124 @@ +import { mount } from '@vue/test-utils' +import Emotions from './Emotions.vue' + +import Vuex from 'vuex' +import PostMutations from '~/graphql/PostMutations.js' + +const localVue = global.localVue + +describe('Emotions.vue', () => { + let wrapper + let mocks + let propsData + let getters + let funnyButton + let funnyImage + const funnyImageSrc = '/img/svg/emoji/funny_color.svg' + + beforeEach(() => { + mocks = { + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { + AddPostEmotions: { + to: { id: 'p143' }, + data: { emotion: 'happy' }, + }, + }, + }) + .mockResolvedValueOnce({ + data: { + RemovePostEmotions: { + from: { id: 'u176' }, + to: { id: 'p143' }, + data: { emotion: 'happy' }, + }, + }, + }), + query: jest.fn().mockResolvedValue({ + data: { + PostsEmotionsCountByEmotion: 1, + }, + }), + }, + $t: jest.fn(), + } + propsData = { + post: { id: 'p143' }, + } + getters = { + 'auth/user': () => { + return { id: 'u176' } + }, + } + }) + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(Emotions, { mocks, propsData, store, localVue }) + } + beforeEach(() => { + wrapper = Wrapper() + }) + + it("queries the post's emotions count for each of the 5 emotions", () => { + expect(mocks.$apollo.query).toHaveBeenCalledTimes(5) + }) + + describe('adding emotions', () => { + let expectedParams + beforeEach(() => { + wrapper.vm.PostsEmotionsCountByEmotion.funny = 0 + funnyButton = wrapper.findAll('button').at(0) + funnyButton.trigger('click') + }) + + it('shows the colored image when the button is active', () => { + funnyImage = wrapper.findAll('img').at(0) + expect(funnyImage.attributes().src).toEqual(funnyImageSrc) + }) + + it('sends the AddPostEmotionsMutation for an emotion when clicked', () => { + expectedParams = { + mutation: PostMutations().AddPostEmotionsMutation, + variables: { to: { id: 'p143' }, data: { emotion: 'funny' } }, + } + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) + }) + + it('increases the PostsEmotionsCountByEmotion for the emotion clicked', () => { + expect(wrapper.vm.PostsEmotionsCountByEmotion.funny).toEqual(1) + }) + + it('adds an emotion to selectedEmotions to show the colored image when the button is active', () => { + expect(wrapper.vm.selectedEmotions).toEqual(['funny']) + }) + + describe('removing emotions', () => { + beforeEach(() => { + funnyButton.trigger('click') + }) + + it('sends the RemovePostEmotionsMutation when a user clicks on an active emotion', () => { + expectedParams = { + mutation: PostMutations().RemovePostEmotionsMutation, + variables: { to: { id: 'p143' }, data: { emotion: 'funny' } }, + } + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) + }) + + it('decreases the PostsEmotionsCountByEmotion for the emotion clicked', async () => { + expect(wrapper.vm.PostsEmotionsCountByEmotion.funny).toEqual(0) + }) + + it('removes an emotion from selectedEmotions to show the default image', async () => { + expect(wrapper.vm.selectedEmotions).toEqual([]) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Emotions/Emotions.vue b/docs/webapp/components/Emotions/Emotions.vue new file mode 100644 index 000000000..b4dc14a61 --- /dev/null +++ b/docs/webapp/components/Emotions/Emotions.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/docs/webapp/components/Empty/Empty.spec.js b/docs/webapp/components/Empty/Empty.spec.js new file mode 100644 index 000000000..6b1a37324 --- /dev/null +++ b/docs/webapp/components/Empty/Empty.spec.js @@ -0,0 +1,53 @@ +import { shallowMount } from '@vue/test-utils' + +import Empty from './Empty.vue' + +const localVue = global.localVue + +describe('Empty.vue', () => { + let propsData, wrapper + + beforeEach(() => { + propsData = {} + }) + + const Wrapper = () => { + return shallowMount(Empty, { propsData, localVue }) + } + + describe('shallowMount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders an image with an alert icon as default', () => { + expect(wrapper.find('img[alt="Empty"]').attributes().src).toBe('/img/empty/alert.svg') + }) + + describe('receives icon prop', () => { + it('renders an image with that icon', () => { + propsData.icon = 'messages' + wrapper = Wrapper() + expect(wrapper.find('img[alt="Empty"]').attributes().src).toBe( + `/img/empty/${propsData.icon}.svg`, + ) + }) + }) + + describe('receives message prop', () => { + it('renders that message', () => { + propsData.message = 'this is a custom message for Empty component' + wrapper = Wrapper() + expect(wrapper.find('.hc-empty-message').text()).toEqual(propsData.message) + }) + }) + + describe('receives margin prop', () => { + it('sets margin to that margin', () => { + propsData.margin = 'xxx-small' + wrapper = Wrapper() + expect(wrapper.find('.hc-empty').attributes().margin).toEqual(propsData.margin) + }) + }) + }) +}) diff --git a/docs/webapp/components/Empty/Empty.story.js b/docs/webapp/components/Empty/Empty.story.js new file mode 100644 index 000000000..44d241df7 --- /dev/null +++ b/docs/webapp/components/Empty/Empty.story.js @@ -0,0 +1,24 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import HcEmpty from '~/components/Empty/Empty' +import helpers from '~/storybook/helpers' + +helpers.init() + +storiesOf('Empty', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add( + 'tasks icon with message', + () => ({ + components: { HcEmpty }, + template: '', + }), + { + notes: "Possible icons include 'messages', 'events', 'alert', 'tasks', 'docs', and 'file'", + }, + ) + .add('default icon, no message', () => ({ + components: { HcEmpty }, + template: '', + })) diff --git a/docs/webapp/components/Empty/Empty.vue b/docs/webapp/components/Empty/Empty.vue new file mode 100644 index 000000000..9d5e075fe --- /dev/null +++ b/docs/webapp/components/Empty/Empty.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/docs/webapp/components/EnterNonce/EnterNonce.spec.js b/docs/webapp/components/EnterNonce/EnterNonce.spec.js new file mode 100644 index 000000000..e75c8cf49 --- /dev/null +++ b/docs/webapp/components/EnterNonce/EnterNonce.spec.js @@ -0,0 +1,52 @@ +import { mount } from '@vue/test-utils' +import EnterNonce from './EnterNonce.vue' + +const localVue = global.localVue + +describe('EnterNonce ', () => { + let wrapper + let Wrapper + let mocks + let propsData + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + propsData = { + email: 'mail@example.org', + } + }) + + describe('mount', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + Wrapper = () => { + return mount(EnterNonce, { + mocks, + localVue, + propsData, + }) + } + + it('renders an enter nonce form', () => { + wrapper = Wrapper() + expect(wrapper.find('form').exists()).toBe(true) + }) + + describe('after nonce entered', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('input#nonce').setValue('12345') + wrapper.find('form').trigger('submit') + }) + + it('emits `nonceEntered`', () => { + const expected = [[{ nonce: '12345', email: 'mail@example.org' }]] + expect(wrapper.emitted('nonceEntered')).toEqual(expected) + }) + }) + }) +}) diff --git a/docs/webapp/components/EnterNonce/EnterNonce.vue b/docs/webapp/components/EnterNonce/EnterNonce.vue new file mode 100644 index 000000000..4785b2c71 --- /dev/null +++ b/docs/webapp/components/EnterNonce/EnterNonce.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/docs/webapp/components/FilterMenu/CategoriesFilter.spec.js b/docs/webapp/components/FilterMenu/CategoriesFilter.spec.js new file mode 100644 index 000000000..e7bf74c40 --- /dev/null +++ b/docs/webapp/components/FilterMenu/CategoriesFilter.spec.js @@ -0,0 +1,102 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import CategoriesFilter from './CategoriesFilter' + +const localVue = global.localVue + +let wrapper, environmentAndNatureButton + +describe('CategoriesFilter.vue', () => { + const mutations = { + 'posts/TOGGLE_CATEGORY': jest.fn(), + 'posts/RESET_CATEGORIES': jest.fn(), + } + const getters = { + 'posts/filteredCategoryIds': jest.fn(() => []), + } + + const apolloMutationMock = jest.fn().mockResolvedValue({ + data: { saveCategorySettings: true }, + }) + + const mocks = { + $t: jest.fn((string) => string), + $apollo: { + mutate: apolloMutationMock, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + } + + const Wrapper = () => { + const store = new Vuex.Store({ mutations, getters }) + const wrapper = mount(CategoriesFilter, { mocks, localVue, store }) + wrapper.setData({ + categories: [ + { id: 'cat4', name: 'Environment & Nature', icon: 'tree', slug: 'environment-nature' }, + { + id: 'cat15', + name: 'Consumption & Sustainability', + icon: 'shopping-cart', + slug: 'consumption-sustainability', + }, + { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + slug: 'democracy-politics', + }, + ], + }) + return wrapper + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('mount', () => { + it('starts with all categories button active', () => { + const allCategoriesButton = wrapper.find('.categories-filter .item-all-topics .base-button') + expect(allCategoriesButton.attributes().class).toContain('--filled') + }) + + // TODO move to FilterMenuComponent.spec.js? + // it('sets category button attribute `filled` when corresponding category is filtered', async () => { + // getters['posts/filteredCategoryIds'] = jest.fn(() => ['cat9']) + // wrapper = await Wrapper() + // democracyAndPoliticsButton = wrapper.find('.categories-filter .item-save-topics .base-button') + // expect(democracyAndPoliticsButton.attributes().class).toContain('--filled') + // }) + + describe('click on an "catetories-buttons" button', () => { + it('calls TOGGLE_CATEGORY when clicked', () => { + environmentAndNatureButton = wrapper.findAll('.category-filter-list .base-button').at(0) + environmentAndNatureButton.trigger('click') + expect(mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat4') + }) + }) + + describe('clears filter', () => { + it('when all button is clicked', async () => { + getters['posts/filteredCategoryIds'] = jest.fn(() => ['cat9']) + wrapper = await Wrapper() + const allCategoriesButton = wrapper.find('.categories-filter .item-all-topics .base-button') + allCategoriesButton.trigger('click') + expect(mutations['posts/RESET_CATEGORIES']).toHaveBeenCalledTimes(1) + }) + }) + + // TODO move to FilterMenuComponent.spec.js? + // describe('save categories', () => { + // it('calls the API', async () => { + // wrapper = await Wrapper() + // const saveButton = wrapper.find('.categories-filter .item-save-topics .base-button') + // saveButton.trigger('click') + // expect(apolloMutationMock).toBeCalled() + // }) + // }) + }) +}) diff --git a/docs/webapp/components/FilterMenu/CategoriesFilter.vue b/docs/webapp/components/FilterMenu/CategoriesFilter.vue new file mode 100644 index 000000000..73170cf4b --- /dev/null +++ b/docs/webapp/components/FilterMenu/CategoriesFilter.vue @@ -0,0 +1,94 @@ + + + + diff --git a/docs/webapp/components/FilterMenu/CategoriesMenu.vue b/docs/webapp/components/FilterMenu/CategoriesMenu.vue new file mode 100644 index 000000000..091aed24f --- /dev/null +++ b/docs/webapp/components/FilterMenu/CategoriesMenu.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/docs/webapp/components/FilterMenu/EmotionsFilter.spec.js.old b/docs/webapp/components/FilterMenu/EmotionsFilter.spec.js.old new file mode 100644 index 000000000..f854c182b --- /dev/null +++ b/docs/webapp/components/FilterMenu/EmotionsFilter.spec.js.old @@ -0,0 +1,79 @@ +import { mount } from '@vue/test-utils' +// import Vuex from 'vuex' +import EmotionsFilter from './EmotionsFilter' + +const localVue = global.localVue + +// let wrapper, happyEmotionButton + +describe('mount', () => { + let wrapper + const Wrapper = () => { + return mount(EmotionsFilter, { localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders button DIV', () => { + expect(wrapper.find('div').exists()).toBe(true) + }) +}) + +// describe('EmotionsFilter', () => { +// const mutations = { +// 'posts/TOGGLE_EMOTION': jest.fn(), +// 'posts/RESET_EMOTIONS': jest.fn(), +// } +// const getters = { +// 'posts/filteredByEmotions': jest.fn(() => []), +// } + +// const mocks = { +// $t: jest.fn((string) => string), +// } + +// const Wrapper = () => { +// const store = new Vuex.Store({ mutations, getters }) +// return mount(EmotionsFilter, { mocks, localVue, store }) +// } + +// beforeEach(() => { +// wrapper = Wrapper() +// }) + +// describe('mount', () => { +// it('starts with all emotions button active', () => { +// const allEmotionsButton = wrapper.find('.emotions-filter .sidebar .base-button') +// expect(allEmotionsButton.attributes().class).toContain('--filled') +// }) + +// describe('click on an "emotion-button" button', () => { +// it('calls TOGGLE_EMOTION when clicked', () => { +// const wrapper = Wrapper() +// happyEmotionButton = wrapper.findAll('.emotion-button > .base-button').at(1) +// happyEmotionButton.trigger('click') +// expect(mutations['posts/TOGGLE_EMOTION']).toHaveBeenCalledWith({}, 'happy') +// }) + +// it('sets the attribute `src` to colorized image', () => { +// getters['posts/filteredByEmotions'] = jest.fn(() => ['happy']) +// const wrapper = Wrapper() +// happyEmotionButton = wrapper.findAll('.emotion-button > .base-button').at(1) +// const happyEmotionButtonImage = happyEmotionButton.find('img') +// expect(happyEmotionButtonImage.attributes().src).toEqual('/img/svg/emoji/happy_color.svg') +// }) +// }) + +// describe('clears filter', () => { +// it('when all button is clicked', async () => { +// getters['posts/filteredByEmotions'] = jest.fn(() => ['happy']) +// wrapper = await Wrapper() +// const allEmotionsButton = wrapper.find('.emotions-filter .sidebar .base-button') +// allEmotionsButton.trigger('click') +// expect(mutations['posts/RESET_EMOTIONS']).toHaveBeenCalledTimes(1) +// }) +// }) +// }) +// }) diff --git a/docs/webapp/components/FilterMenu/EmotionsFilter.vue.old b/docs/webapp/components/FilterMenu/EmotionsFilter.vue.old new file mode 100644 index 000000000..802eaeb57 --- /dev/null +++ b/docs/webapp/components/FilterMenu/EmotionsFilter.vue.old @@ -0,0 +1,61 @@ + + + diff --git a/docs/webapp/components/FilterMenu/EventsByFilter.vue b/docs/webapp/components/FilterMenu/EventsByFilter.vue new file mode 100644 index 000000000..852300725 --- /dev/null +++ b/docs/webapp/components/FilterMenu/EventsByFilter.vue @@ -0,0 +1,61 @@ + + + diff --git a/docs/webapp/components/FilterMenu/FilterMenu.spec.js b/docs/webapp/components/FilterMenu/FilterMenu.spec.js new file mode 100644 index 000000000..30f970b62 --- /dev/null +++ b/docs/webapp/components/FilterMenu/FilterMenu.spec.js @@ -0,0 +1,52 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import FilterMenu from './FilterMenu.vue' + +const localVue = global.localVue +let wrapper + +describe('FilterMenu.vue', () => { + const mocks = { + $t: jest.fn((string) => string), + $env: { + CATEGORIES_ACTIVE: true, + }, + } + + const getters = { + 'posts/isActive': () => false, + 'posts/filteredPostTypes': () => [], + 'posts/orderBy': () => 'createdAt_desc', + } + + const stubs = { + FollowingFilter: true, + PostTypeFilter: true, + CategoriesFilter: true, + EmotionsFilter: true, + LanguagesFilter: true, + } + + const Wrapper = () => { + const store = new Vuex.Store({ getters }) + return mount(FilterMenu, { mocks, localVue, store, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('mount', () => { + it('starts with dropdown button inactive', () => { + const dropdownButton = wrapper.find('.filter-menu .base-button') + expect(dropdownButton.attributes().class).toContain('--ghost') + }) + + it('sets dropdwon button attribute `filled` when a filter is applied', () => { + getters['posts/isActive'] = jest.fn(() => true) + wrapper = Wrapper() + const dropdownButton = wrapper.find('.filter-menu .base-button') + expect(dropdownButton.attributes().class).toContain('--filled') + }) + }) +}) diff --git a/docs/webapp/components/FilterMenu/FilterMenu.vue b/docs/webapp/components/FilterMenu/FilterMenu.vue new file mode 100644 index 000000000..fcd386c38 --- /dev/null +++ b/docs/webapp/components/FilterMenu/FilterMenu.vue @@ -0,0 +1,39 @@ + + + diff --git a/docs/webapp/components/FilterMenu/FilterMenuComponent.vue b/docs/webapp/components/FilterMenu/FilterMenuComponent.vue new file mode 100644 index 000000000..e362e758f --- /dev/null +++ b/docs/webapp/components/FilterMenu/FilterMenuComponent.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/docs/webapp/components/FilterMenu/FilterMenuSection.vue b/docs/webapp/components/FilterMenu/FilterMenuSection.vue new file mode 100644 index 000000000..0970fac9b --- /dev/null +++ b/docs/webapp/components/FilterMenu/FilterMenuSection.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/docs/webapp/components/FilterMenu/FollowingFilter.spec.js b/docs/webapp/components/FilterMenu/FollowingFilter.spec.js new file mode 100644 index 000000000..9dbc5d011 --- /dev/null +++ b/docs/webapp/components/FilterMenu/FollowingFilter.spec.js @@ -0,0 +1,80 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import FollowingFilter from './FollowingFilter' + +const localVue = global.localVue + +let wrapper + +describe('FollowingFilter', () => { + const mutations = { + 'posts/TOGGLE_FILTER_BY_FOLLOWED': jest.fn(), + 'posts/TOGGLE_FILTER_BY_MY_GROUPS': jest.fn(), + 'posts/RESET_FOLLOWERS_FILTER': jest.fn(), + } + const getters = { + 'auth/user': () => { + return { id: 'u34' } + }, + 'posts/filteredByUsersFollowed': jest.fn(), + 'posts/filteredByPostsInMyGroups': jest.fn(), + } + + const mocks = { + $t: jest.fn((string) => string), + } + + const Wrapper = () => { + const store = new Vuex.Store({ mutations, getters }) + const wrapper = mount(FollowingFilter, { mocks, localVue, store }) + return wrapper + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('mount', () => { + it('sets "filter-by-followed" button attribute `filled`', () => { + getters['posts/filteredByUsersFollowed'] = jest.fn(() => true) + getters['posts/filteredByPostsInMyGroups'] = jest.fn(() => true) + const wrapper = Wrapper() + expect( + wrapper + .find('.following-filter .filter-list .follower-item .base-button') + .classes('--filled'), + ).toBe(true) + expect( + wrapper + .find('.following-filter .filter-list .posts-in-my-groups-item .base-button') + .classes('--filled'), + ).toBe(true) + }) + + describe('click "filter-by-followed" button', () => { + it('calls TOGGLE_FILTER_BY_FOLLOWED', () => { + wrapper.find('.following-filter .filter-list .follower-item .base-button').trigger('click') + expect(mutations['posts/TOGGLE_FILTER_BY_FOLLOWED']).toHaveBeenCalledWith({}, 'u34') + }) + }) + + describe('click "filter-by-my-groups" button', () => { + it('calls TOGGLE_FILTER_BY_MY_GROUPS', () => { + wrapper + .find('.following-filter .filter-list .posts-in-my-groups-item .base-button') + .trigger('click') + expect(mutations['posts/TOGGLE_FILTER_BY_MY_GROUPS']).toHaveBeenCalled() + }) + }) + describe('clears follower filter', () => { + it('when all button is clicked', async () => { + wrapper = await Wrapper() + const clearFollowerButton = wrapper.find( + '.following-filter .item-all-follower .base-button', + ) + clearFollowerButton.trigger('click') + expect(mutations['posts/RESET_FOLLOWERS_FILTER']).toHaveBeenCalledTimes(1) + }) + }) + }) +}) diff --git a/docs/webapp/components/FilterMenu/FollowingFilter.vue b/docs/webapp/components/FilterMenu/FollowingFilter.vue new file mode 100644 index 000000000..1df121a39 --- /dev/null +++ b/docs/webapp/components/FilterMenu/FollowingFilter.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/docs/webapp/components/FilterMenu/HeaderButton.vue b/docs/webapp/components/FilterMenu/HeaderButton.vue new file mode 100644 index 000000000..dfacff43f --- /dev/null +++ b/docs/webapp/components/FilterMenu/HeaderButton.vue @@ -0,0 +1,56 @@ + + + diff --git a/docs/webapp/components/FilterMenu/LanguagesFilter.spec.js.old b/docs/webapp/components/FilterMenu/LanguagesFilter.spec.js.old new file mode 100644 index 000000000..41fc72ccd --- /dev/null +++ b/docs/webapp/components/FilterMenu/LanguagesFilter.spec.js.old @@ -0,0 +1,85 @@ +import { mount } from '@vue/test-utils' +// import Vuex from 'vuex' +// import locales from '~/locales' +// import orderBy from 'lodash/orderBy' +import LanguagesFilter from './LanguagesFilter' +const localVue = global.localVue + +// let wrapper, englishButton, spanishButton + +// const languages = orderBy(locales, 'name') + +describe('mount', () => { + let wrapper + const Wrapper = () => { + return mount(LanguagesFilter, { localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders button DIV', () => { + expect(wrapper.find('div').exists()).toBe(true) + }) +}) + +// describe('LanguagesFilter.vue', () => { +// const mutations = { +// 'posts/TOGGLE_LANGUAGE': jest.fn(), +// 'posts/RESET_LANGUAGES': jest.fn(), +// } +// const getters = { +// 'posts/filteredLanguageCodes': jest.fn(() => []), +// } + +// const mocks = { +// $t: jest.fn((string) => string), +// } + +// const Wrapper = () => { +// const store = new Vuex.Store({ mutations, getters }) +// return mount(LanguagesFilter, { mocks, localVue, store }) +// } + +// beforeEach(() => { +// wrapper = Wrapper() +// }) + +// describe('mount', () => { +// it('starts with all categories button active', () => { +// const allLanguagesButton = wrapper.find('.languages-filter .sidebar .base-button') +// expect(allLanguagesButton.attributes().class).toContain('--filled') +// }) + +// it('sets language button attribute `filled` when corresponding language is filtered', () => { +// getters['posts/filteredLanguageCodes'] = jest.fn(() => ['es']) +// const wrapper = Wrapper() +// spanishButton = wrapper +// .findAll('.languages-filter .item .base-button') +// .at(languages.findIndex((l) => l.code === 'es')) +// expect(spanishButton.attributes().class).toContain('--filled') +// }) + +// describe('click on an "language-button" button', () => { +// it('calls TOGGLE_LANGUAGE when clicked', () => { +// const wrapper = Wrapper() +// englishButton = wrapper +// .findAll('.languages-filter .item .base-button') +// .at(languages.findIndex((l) => l.code === 'en')) +// englishButton.trigger('click') +// expect(mutations['posts/TOGGLE_LANGUAGE']).toHaveBeenCalledWith({}, 'en') +// }) +// }) + +// describe('clears filter', () => { +// it('when all button is clicked', async () => { +// getters['posts/filteredLanguageCodes'] = jest.fn(() => ['en']) +// wrapper = await Wrapper() +// const allLanguagesButton = wrapper.find('.languages-filter .sidebar .base-button') +// allLanguagesButton.trigger('click') +// expect(mutations['posts/RESET_LANGUAGES']).toHaveBeenCalledTimes(1) +// }) +// }) +// }) +// }) diff --git a/docs/webapp/components/FilterMenu/LanguagesFilter.vue.old b/docs/webapp/components/FilterMenu/LanguagesFilter.vue.old new file mode 100644 index 000000000..fc67eeb3f --- /dev/null +++ b/docs/webapp/components/FilterMenu/LanguagesFilter.vue.old @@ -0,0 +1,57 @@ + + + diff --git a/docs/webapp/components/FilterMenu/OrderByFilter.spec.js b/docs/webapp/components/FilterMenu/OrderByFilter.spec.js new file mode 100644 index 000000000..46cffe5f0 --- /dev/null +++ b/docs/webapp/components/FilterMenu/OrderByFilter.spec.js @@ -0,0 +1,93 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import OrderByFilter from './OrderByFilter' + +const localVue = global.localVue + +let wrapper + +describe('OrderByFilter', () => { + const mutations = { + 'posts/TOGGLE_ORDER': jest.fn(), + } + const getters = { + 'posts/filteredPostTypes': () => [], + 'posts/orderedByCreationDate': () => true, + 'posts/orderBy': () => 'createdAt_desc', + } + + const mocks = { + $t: jest.fn((string) => string), + } + + const Wrapper = () => { + const store = new Vuex.Store({ mutations, getters }) + const wrapper = mount(OrderByFilter, { mocks, localVue, store }) + return wrapper + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('mount', () => { + describe('if ordered by newest', () => { + it('sets "newest-button" attribute `filled`', () => { + expect( + wrapper + .find('.order-by-filter .filter-list .base-button[data-test="newest-button"]') + .classes('--filled'), + ).toBe(true) + }) + + it('don\'t sets "oldest-button" attribute `filled`', () => { + expect( + wrapper + .find('.order-by-filter .filter-list .base-button[data-test="oldest-button"]') + .classes('--filled'), + ).toBe(false) + }) + }) + + describe('if ordered by oldest', () => { + beforeEach(() => { + getters['posts/orderBy'] = jest.fn(() => 'createdAt_asc') + wrapper = Wrapper() + }) + + it('don\'t sets "newest-button" attribute `filled`', () => { + expect( + wrapper + .find('.order-by-filter .filter-list .base-button[data-test="newest-button"]') + .classes('--filled'), + ).toBe(false) + }) + + it('sets "oldest-button" attribute `filled`', () => { + expect( + wrapper + .find('.order-by-filter .filter-list .base-button[data-test="oldest-button"]') + .classes('--filled'), + ).toBe(true) + }) + }) + + describe('click "newest-button"', () => { + it('calls TOGGLE_ORDER with "createdAt_desc"', () => { + wrapper + .find('.order-by-filter .filter-list .base-button[data-test="newest-button"]') + .trigger('click') + expect(mutations['posts/TOGGLE_ORDER']).toHaveBeenCalledWith({}, 'createdAt_desc') + }) + }) + + describe('click "oldest-button"', () => { + it('calls TOGGLE_ORDER with "createdAt_asc"', () => { + wrapper + .find('.order-by-filter .filter-list .base-button[data-test="oldest-button"]') + .trigger('click') + expect(mutations['posts/TOGGLE_ORDER']).toHaveBeenCalledWith({}, 'createdAt_asc') + }) + }) + }) +}) diff --git a/docs/webapp/components/FilterMenu/OrderByFilter.vue b/docs/webapp/components/FilterMenu/OrderByFilter.vue new file mode 100644 index 000000000..87cdcf897 --- /dev/null +++ b/docs/webapp/components/FilterMenu/OrderByFilter.vue @@ -0,0 +1,97 @@ + + + diff --git a/docs/webapp/components/FilterMenu/PostTypeFilter.vue b/docs/webapp/components/FilterMenu/PostTypeFilter.vue new file mode 100644 index 000000000..6a9b15985 --- /dev/null +++ b/docs/webapp/components/FilterMenu/PostTypeFilter.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/docs/webapp/components/Group/AddGroupMember.vue b/docs/webapp/components/Group/AddGroupMember.vue new file mode 100644 index 000000000..cc3e3b1e8 --- /dev/null +++ b/docs/webapp/components/Group/AddGroupMember.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/docs/webapp/components/Group/GroupButton.vue b/docs/webapp/components/Group/GroupButton.vue new file mode 100644 index 000000000..10275dcca --- /dev/null +++ b/docs/webapp/components/Group/GroupButton.vue @@ -0,0 +1,19 @@ + + + diff --git a/docs/webapp/components/Group/GroupForm.spec.js b/docs/webapp/components/Group/GroupForm.spec.js new file mode 100644 index 000000000..0eb503856 --- /dev/null +++ b/docs/webapp/components/Group/GroupForm.spec.js @@ -0,0 +1,41 @@ +import { mount } from '@vue/test-utils' +import GroupForm from './GroupForm.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, +} + +const propsData = { + update: false, + group: {}, +} + +describe('GroupForm', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $env: { + CATEGORIES_ACTIVE: true, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(GroupForm, { propsData, mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.group-form')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/components/Group/GroupForm.vue b/docs/webapp/components/Group/GroupForm.vue new file mode 100644 index 000000000..52437d644 --- /dev/null +++ b/docs/webapp/components/Group/GroupForm.vue @@ -0,0 +1,436 @@ + + + + + diff --git a/docs/webapp/components/Group/GroupLink.vue b/docs/webapp/components/Group/GroupLink.vue new file mode 100644 index 000000000..4fcc7983d --- /dev/null +++ b/docs/webapp/components/Group/GroupLink.vue @@ -0,0 +1,15 @@ + + diff --git a/docs/webapp/components/Group/GroupList.spec.js b/docs/webapp/components/Group/GroupList.spec.js new file mode 100644 index 000000000..ca6909de7 --- /dev/null +++ b/docs/webapp/components/Group/GroupList.spec.js @@ -0,0 +1,33 @@ +import { mount } from '@vue/test-utils' +import GroupList from './GroupList.vue' + +const localVue = global.localVue + +const propsData = { + groups: [], +} + +describe('GroupList', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(GroupList, { propsData, mocks, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.group-list')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/components/Group/GroupList.vue b/docs/webapp/components/Group/GroupList.vue new file mode 100644 index 000000000..dbde61ac6 --- /dev/null +++ b/docs/webapp/components/Group/GroupList.vue @@ -0,0 +1,31 @@ + + + + diff --git a/docs/webapp/components/Group/GroupMember.spec.js b/docs/webapp/components/Group/GroupMember.spec.js new file mode 100644 index 000000000..ef8b96568 --- /dev/null +++ b/docs/webapp/components/Group/GroupMember.spec.js @@ -0,0 +1,188 @@ +import { mount } from '@vue/test-utils' +import GroupMember from './GroupMember.vue' +import { changeGroupMemberRoleMutation, removeUserFromGroupMutation } from '~/graphql/groups.js' + +const localVue = global.localVue + +const propsData = { + groupId: 'group-id', + groupMembers: [ + { + slug: 'owner', + id: 'owner', + myRoleInGroup: 'owner', + }, + { + slug: 'user', + id: 'user', + myRoleInGroup: 'usual', + }, + ], +} + +const stubs = { + 'nuxt-link': true, +} + +const apolloMock = jest + .fn() + .mockRejectedValueOnce({ message: 'Oh no!' }) + .mockResolvedValue({ + data: { + ChangeGroupMemberRole: { + slug: 'user', + id: 'user', + myRoleInGroup: 'admin', + }, + }, + }) + +const toastErrorMock = jest.fn() +const toastSuccessMock = jest.fn() + +describe('GroupMember', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn((t) => t), + $apollo: { + mutate: apolloMock, + }, + $toast: { + error: toastErrorMock, + success: toastSuccessMock, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(GroupMember, { propsData, mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.group-member')).toHaveLength(1) + }) + + it('has two users in table', () => { + expect(wrapper.find('tbody').findAll('tr')).toHaveLength(2) + }) + + it('has no modal', () => { + expect(wrapper.find('div.ds-modal-wrapper').exists()).toBe(false) + }) + + describe('change user role', () => { + beforeEach(() => { + jest.clearAllMocks() + wrapper + .find('tbody') + .findAll('tr') + .at(1) + .find('select') + .findAll('option') + .at(2) + .setSelected() + wrapper.find('tbody').findAll('tr').at(1).find('select').trigger('change') + }) + + describe('with server error', () => { + it('toasts an error message', () => { + expect(toastErrorMock).toBeCalledWith('Oh no!') + }) + }) + + describe('with server success', () => { + it('calls the API', () => { + expect(apolloMock).toBeCalledWith({ + mutation: changeGroupMemberRoleMutation(), + variables: { groupId: 'group-id', userId: 'user', roleInGroup: 'admin' }, + }) + }) + + it('toasts a success message', () => { + expect(toastSuccessMock).toBeCalledWith('group.changeMemberRole') + }) + }) + }) + + describe('click remove user', () => { + beforeAll(() => { + apolloMock.mockRejectedValueOnce({ message: 'Oh no!!' }).mockResolvedValue({ + data: { + RemoveUserFromGroup: { + slug: 'user', + id: 'user', + myRoleInGroup: null, + }, + }, + }) + }) + + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('tbody').findAll('tr').at(1).find('button').trigger('click') + }) + + it('opens the modal', () => { + expect(wrapper.find('div.ds-modal-wrapper').isVisible()).toBe(true) + }) + + describe('click on cancel', () => { + beforeEach(() => { + wrapper.find('div.ds-modal-wrapper').find('button.ds-button-ghost').trigger('click') + }) + + it('closes the modal', () => { + expect(wrapper.find('div.ds-modal-wrapper').exists()).toBe(false) + }) + }) + + describe('click on confirm with server error', () => { + beforeEach(() => { + wrapper.find('div.ds-modal-wrapper').find('button.ds-button-primary').trigger('click') + }) + + it('toasts an error message', () => { + expect(toastErrorMock).toBeCalledWith('Oh no!!') + }) + + it('closes the modal', () => { + expect(wrapper.find('div.ds-modal-wrapper').exists()).toBe(false) + }) + }) + + describe('click on confirm with success', () => { + beforeEach(() => { + jest.clearAllMocks() + wrapper.find('div.ds-modal-wrapper').find('button.ds-button-primary').trigger('click') + }) + + it('calls the API', () => { + expect(apolloMock).toBeCalledWith({ + mutation: removeUserFromGroupMutation(), + variables: { groupId: 'group-id', userId: 'user' }, + }) + }) + + it('emits load group members', () => { + expect(wrapper.emitted('loadGroupMembers')).toBeTruthy() + }) + + it('toasts a success message', () => { + expect(toastSuccessMock).toBeCalledWith('group.memberRemoved') + }) + + it('closes the modal', () => { + expect(wrapper.find('div.ds-modal-wrapper').exists()).toBe(false) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Group/GroupMember.vue b/docs/webapp/components/Group/GroupMember.vue new file mode 100644 index 000000000..62a2bf187 --- /dev/null +++ b/docs/webapp/components/Group/GroupMember.vue @@ -0,0 +1,172 @@ + + diff --git a/docs/webapp/components/Group/GroupTeaser.vue b/docs/webapp/components/Group/GroupTeaser.vue new file mode 100644 index 000000000..b75036057 --- /dev/null +++ b/docs/webapp/components/Group/GroupTeaser.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/docs/webapp/components/Hashtag/Hashtag.spec.js b/docs/webapp/components/Hashtag/Hashtag.spec.js new file mode 100644 index 000000000..873919e20 --- /dev/null +++ b/docs/webapp/components/Hashtag/Hashtag.spec.js @@ -0,0 +1,33 @@ +import { shallowMount } from '@vue/test-utils' + +import Hashtag from './Hashtag' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, +} + +describe('Hashtag', () => { + let id + + const Wrapper = () => { + return shallowMount(Hashtag, { + localVue, + propsData: { + id, + }, + stubs, + }) + } + + describe('given a String for Name', () => { + beforeEach(() => { + id = 'Liebe' + }) + + it('shows Name', () => { + expect(Wrapper().text()).toContain('Liebe') + }) + }) +}) diff --git a/docs/webapp/components/Hashtag/Hashtag.story.js b/docs/webapp/components/Hashtag/Hashtag.story.js new file mode 100644 index 000000000..179a77a19 --- /dev/null +++ b/docs/webapp/components/Hashtag/Hashtag.story.js @@ -0,0 +1,18 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import Hashtag from './Hashtag.vue' +import helpers from '~/storybook/helpers' + +helpers.init() + +storiesOf('Hashtag', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('clickable', () => ({ + components: { Hashtag }, + store: helpers.store, + data: () => ({ + hashtag: 'SomeHashtag', + }), + template: '', + })) diff --git a/docs/webapp/components/Hashtag/Hashtag.vue b/docs/webapp/components/Hashtag/Hashtag.vue new file mode 100644 index 000000000..44e5319f0 --- /dev/null +++ b/docs/webapp/components/Hashtag/Hashtag.vue @@ -0,0 +1,19 @@ + + + diff --git a/docs/webapp/components/HashtagsFilter/HashtagsFilter.spec.js b/docs/webapp/components/HashtagsFilter/HashtagsFilter.spec.js new file mode 100644 index 000000000..07496c9fc --- /dev/null +++ b/docs/webapp/components/HashtagsFilter/HashtagsFilter.spec.js @@ -0,0 +1,43 @@ +import { mount } from '@vue/test-utils' +import HashtagsFilter from './HashtagsFilter.vue' + +const localVue = global.localVue + +describe('HashtagsFilter.vue', () => { + let wrapper + let mocks + let propsData + + beforeEach(() => { + mocks = { $t: () => {} } + }) + + describe('given a hashtag', () => { + beforeEach(() => { + propsData = { + hashtag: 'Frieden', + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(HashtagsFilter, { mocks, localVue, propsData }) + } + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders a card', () => { + wrapper = Wrapper() + expect(wrapper.classes('base-card')).toBe(true) + }) + + describe('click clear search button', () => { + it('emits clearSearch', () => { + wrapper.find('.base-button').trigger('click') + expect(wrapper.emitted().clearSearch).toHaveLength(1) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/HashtagsFilter/HashtagsFilter.vue b/docs/webapp/components/HashtagsFilter/HashtagsFilter.vue new file mode 100644 index 000000000..9cf853add --- /dev/null +++ b/docs/webapp/components/HashtagsFilter/HashtagsFilter.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/docs/webapp/components/HeaderMenu/HeaderMenu.vue b/docs/webapp/components/HeaderMenu/HeaderMenu.vue new file mode 100644 index 000000000..f4d48220e --- /dev/null +++ b/docs/webapp/components/HeaderMenu/HeaderMenu.vue @@ -0,0 +1,400 @@ + + + + + diff --git a/docs/webapp/components/InviteButton/InviteButton.spec.js b/docs/webapp/components/InviteButton/InviteButton.spec.js new file mode 100644 index 000000000..1282c2bad --- /dev/null +++ b/docs/webapp/components/InviteButton/InviteButton.spec.js @@ -0,0 +1,59 @@ +import { mount } from '@vue/test-utils' +import InviteButton from './InviteButton.vue' + +const localVue = global.localVue + +const stubs = { + 'v-popover': { + template: '', + }, +} + +describe('InviteButton.vue', () => { + let wrapper + let mocks + let propsData + + beforeEach(() => { + mocks = { + $t: jest.fn(), + navigator: { + clipboard: { + writeText: jest.fn(), + }, + }, + } + propsData = {} + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(InviteButton, { mocks, localVue, propsData, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.find('.invite-button').exists()).toBe(true) + }) + + it('open popup', () => { + wrapper.find('.base-button').trigger('click') + expect(wrapper.find('.invite-button').exists()).toBe(true) + }) + + it('invite codes not available', async () => { + wrapper.find('.base-button').trigger('click') // open popup + wrapper.find('.invite-button').trigger('click') // click copy button + expect(mocks.$t).toHaveBeenCalledWith('invite-codes.not-available') + }) + + it.skip('invite codes copied to clipboard', async () => { + wrapper.find('.base-button').trigger('click') // open popup + wrapper.find('.invite-button').trigger('click') // click copy button + expect(mocks.$t).toHaveBeenCalledWith('invite-codes.not-available') + }) + }) +}) diff --git a/docs/webapp/components/InviteButton/InviteButton.vue b/docs/webapp/components/InviteButton/InviteButton.vue new file mode 100644 index 000000000..3042a706a --- /dev/null +++ b/docs/webapp/components/InviteButton/InviteButton.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/docs/webapp/components/LocaleSwitch/LocaleSwitch.spec.js b/docs/webapp/components/LocaleSwitch/LocaleSwitch.spec.js new file mode 100644 index 000000000..158624f18 --- /dev/null +++ b/docs/webapp/components/LocaleSwitch/LocaleSwitch.spec.js @@ -0,0 +1,107 @@ +import { mount } from '@vue/test-utils' + +import LocaleSwitch from './LocaleSwitch.vue' +import Vuex from 'vuex' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, +} + +describe('LocaleSwitch.vue', () => { + let wrapper, mocks, computed, deutschLanguageItem, getters + + beforeEach(() => { + mocks = { + $i18n: { + locale: () => 'en', + set: jest.fn((locale) => locale), + }, + $t: jest.fn(), + $toast: { + success: jest.fn((a) => a), + error: jest.fn((a) => a), + }, + setPlaceholderText: jest.fn(), + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { + UpdateUser: { + locale: 'de', + }, + }, + }) + .mockRejectedValueOnce({ + message: 'Please log in!', + }), + }, + } + computed = { + current: () => { + return { code: 'en' } + }, + routes: () => { + return [ + { + name: 'English', + path: 'en', + }, + { + name: 'Deutsch', + path: 'de', + }, + ] + }, + } + getters = { + 'auth/user': () => { + return { id: 'u35' } + }, + } + }) + + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(LocaleSwitch, { mocks, localVue, computed, store, stubs }) + } + + describe('with current user', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('.locale-menu').trigger('click') + deutschLanguageItem = wrapper.findAll('li').at(1) + deutschLanguageItem.trigger('click') + }) + + it("sets a user's locale", () => { + expect(mocks.$i18n.set).toHaveBeenCalledTimes(1) + }) + + it("updates the user's locale in the database", () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + }) + + describe('no current user', () => { + beforeEach(() => { + getters = { + 'auth/user': () => { + return null + }, + } + wrapper = Wrapper() + wrapper.find('.locale-menu').trigger('click') + deutschLanguageItem = wrapper.findAll('li').at(1) + deutschLanguageItem.trigger('click') + }) + + it('does not send a UpdateUser mutation', () => { + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + }) +}) diff --git a/docs/webapp/components/LocaleSwitch/LocaleSwitch.vue b/docs/webapp/components/LocaleSwitch/LocaleSwitch.vue new file mode 100644 index 000000000..11ecb3c2f --- /dev/null +++ b/docs/webapp/components/LocaleSwitch/LocaleSwitch.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/docs/webapp/components/LocationTeaser/LocationTeaser.vue b/docs/webapp/components/LocationTeaser/LocationTeaser.vue new file mode 100644 index 000000000..ede0457ab --- /dev/null +++ b/docs/webapp/components/LocationTeaser/LocationTeaser.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/docs/webapp/components/LoginButton/LoginButton.spec.js b/docs/webapp/components/LoginButton/LoginButton.spec.js new file mode 100644 index 000000000..d529dbfb6 --- /dev/null +++ b/docs/webapp/components/LoginButton/LoginButton.spec.js @@ -0,0 +1,44 @@ +import { mount } from '@vue/test-utils' +import LoginButton from './LoginButton.vue' + +const stubs = { + 'v-popover': true, + 'nuxt-link': true, +} + +describe('LoginButton.vue', () => { + let wrapper + let mocks + let propsData + + beforeEach(() => { + mocks = { + $t: jest.fn(), + navigator: { + clipboard: { + writeText: jest.fn(), + }, + }, + } + propsData = {} + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(LoginButton, { mocks, propsData, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.find('.login-button').exists()).toBe(true) + }) + + it('open popup', () => { + wrapper.find('.base-button').trigger('click') + expect(wrapper.find('.login-button').exists()).toBe(true) + }) + }) +}) diff --git a/docs/webapp/components/LoginButton/LoginButton.vue b/docs/webapp/components/LoginButton/LoginButton.vue new file mode 100644 index 000000000..39f0fa4ae --- /dev/null +++ b/docs/webapp/components/LoginButton/LoginButton.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/docs/webapp/components/LoginForm/LoginForm.spec.js b/docs/webapp/components/LoginForm/LoginForm.spec.js new file mode 100644 index 000000000..e0972b453 --- /dev/null +++ b/docs/webapp/components/LoginForm/LoginForm.spec.js @@ -0,0 +1,135 @@ +import Vue from 'vue' +import LoginForm from './LoginForm.vue' +import Styleguide from '@human-connection/styleguide' +import Vuex from 'vuex' +import { mount, createLocalVue } from '@vue/test-utils' + +const localVue = createLocalVue() +localVue.use(Vuex) +localVue.use(Styleguide) + +const stubs = { + 'nuxt-link': true, + 'locale-switch': true, + 'client-only': true, +} + +const authUserMock = jest.fn().mockReturnValue({ activeCategories: [] }) + +describe('LoginForm', () => { + let mocks + let propsData + let storeMocks + + beforeEach(() => { + propsData = {} + }) + + describe('mount', () => { + const Wrapper = () => { + storeMocks = { + getters: { + 'auth/pending': () => false, + 'auth/user': authUserMock, + }, + actions: { + 'auth/login': jest.fn(), + }, + mutations: { + 'posts/TOGGLE_CATEGORY': jest.fn(), + 'posts/RESET_CATEGORIES': jest.fn(), + }, + } + const store = new Vuex.Store(storeMocks) + mocks = { + $t: () => {}, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + } + return mount(LoginForm, { mocks, localVue, propsData, store, stubs }) + } + + describe('fill in email and password and submit', () => { + const fillIn = async (wrapper, opts = {}) => { + const { email = 'email@example.org', password = '1234' } = opts + wrapper.find('input[name="email"]').setValue(email) + wrapper.find('input[name="password"]').setValue(password) + await wrapper.find('form').trigger('submit') + } + + it('dispatches login with form data', async () => { + await fillIn(Wrapper()) + expect(storeMocks.actions['auth/login']).toHaveBeenCalledWith(expect.any(Object), { + email: 'email@example.org', + password: '1234', + }) + }) + + describe('setting saved categories', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + describe('no categories saved', () => { + it('resets the categories', async () => { + await fillIn(Wrapper()) + expect(storeMocks.mutations['posts/RESET_CATEGORIES']).toBeCalled() + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).not.toBeCalled() + }) + }) + + describe('categories saved', () => { + it('sets the categories', async () => { + authUserMock.mockReturnValue({ activeCategories: ['cat1', 'cat9', 'cat12'] }) + await fillIn(Wrapper()) + expect(storeMocks.mutations['posts/RESET_CATEGORIES']).toBeCalled() + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toBeCalledTimes(3) + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toBeCalledWith({}, 'cat1') + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toBeCalledWith({}, 'cat9') + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toBeCalledWith({}, 'cat12') + }) + }) + }) + }) + + describe('Visibility of password', () => { + const wrapper = Wrapper() + it('does not show the password by default', () => { + expect(wrapper.find('input[name ="password"]').attributes('type')).toEqual('password') + }) + + it('shows the password after click on show password', async () => { + wrapper.find('span.click-wrapper').trigger('click') + await Vue.nextTick() + await expect(wrapper.find('input[name = "password"]').attributes('type')).toEqual('text') + }) + }) + + describe('Click on show password icon, icon change', () => { + const wrapper = Wrapper() + it('shows eye icon by default', () => { + expect(wrapper.find('span.icon-wrapper').attributes('data-test')).toEqual('eye') + }) + + it('shows the slash-eye icon after click', async () => { + wrapper.find('span.click-wrapper').trigger('click') + await Vue.nextTick() + await expect(wrapper.find('span.icon-wrapper').attributes('data-test')).toEqual('eye-slash') + }) + }) + + describe('Focus on password input container after show-password click', () => { + const wrapper = Wrapper() + const componentToGetFocus = wrapper.find('input[name ="password"]') + it('Focuses on the password field after click', async () => { + wrapper.find('span.click-wrapper').trigger('click', { + relateTarget: componentToGetFocus, + }) + await Vue.nextTick() + await expect(wrapper.emitted('focus')).toBeTruthy() + }) + }) + }) +}) diff --git a/docs/webapp/components/LoginForm/LoginForm.story.js b/docs/webapp/components/LoginForm/LoginForm.story.js new file mode 100644 index 000000000..618b2556c --- /dev/null +++ b/docs/webapp/components/LoginForm/LoginForm.story.js @@ -0,0 +1,75 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import Vuex from 'vuex' +import helpers from '~/storybook/helpers' +import LoginForm from './LoginForm.vue' + +helpers.init() + +const createStore = ({ loginSuccess }) => { + return new Vuex.Store({ + modules: { + auth: { + namespaced: true, + state: () => ({ + pending: false, + }), + mutations: { + SET_PENDING(state, pending) { + state.pending = pending + }, + }, + getters: { + pending(state) { + return !!state.pending + }, + }, + actions: { + async login({ commit, dispatch }, args) { + action('Vuex action `auth/login`')(args) + return new Promise((resolve, reject) => { + commit('SET_PENDING', true) + setTimeout(() => { + commit('SET_PENDING', false) + if (loginSuccess) { + resolve(loginSuccess) + } else { + reject(new Error('Login unsuccessful')) + } + }, 1000) + }) + }, + }, + }, + }, + }) +} + +storiesOf('LoginForm', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('successful login', () => { + return { + components: { LoginForm }, + store: createStore({ loginSuccess: true }), + methods: { + handleSuccess() { + action('Login successful!')() + }, + }, + template: ``, + } + }) + .add('unsuccessful login', () => { + return { + components: { LoginForm }, + store: createStore({ loginSuccess: false }), + methods: { + handleSuccess() { + action('Login successful!')() + }, + }, + template: ``, + } + }) diff --git a/docs/webapp/components/LoginForm/LoginForm.vue b/docs/webapp/components/LoginForm/LoginForm.vue new file mode 100644 index 000000000..59a6d7a24 --- /dev/null +++ b/docs/webapp/components/LoginForm/LoginForm.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/docs/webapp/components/Logo/Logo.spec.js b/docs/webapp/components/Logo/Logo.spec.js new file mode 100644 index 000000000..103158780 --- /dev/null +++ b/docs/webapp/components/Logo/Logo.spec.js @@ -0,0 +1,31 @@ +import { mount } from '@vue/test-utils' +import Logo from './Logo.vue' + +const localVue = global.localVue + +describe('Logo.vue', () => { + let mocks, propsData, wrapper + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + propsData = { + logoType: 'header', + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Logo, { mocks, localVue, propsData }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.ds-logo')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/components/Logo/Logo.vue b/docs/webapp/components/Logo/Logo.vue new file mode 100644 index 000000000..3d7d336ce --- /dev/null +++ b/docs/webapp/components/Logo/Logo.vue @@ -0,0 +1,119 @@ + + + + + + + diff --git a/docs/webapp/components/Logo/demo.md b/docs/webapp/components/Logo/demo.md new file mode 100644 index 000000000..9cd6d0f4d --- /dev/null +++ b/docs/webapp/components/Logo/demo.md @@ -0,0 +1,15 @@ +# Basic usage + +``` + + + +``` + +# Inverse Logo + +``` + + + +``` \ No newline at end of file diff --git a/docs/webapp/components/Logo/style.scss b/docs/webapp/components/Logo/style.scss new file mode 100644 index 000000000..69897422f --- /dev/null +++ b/docs/webapp/components/Logo/style.scss @@ -0,0 +1,11 @@ +.ds-logo { + @include reset; + display: inline-flex; + justify-content: center; + align-items: center; + color: $text-color-primary; +} + +.ds-logo-inverse { + color: $text-color-primary-inverse; +} \ No newline at end of file diff --git a/docs/webapp/components/Map/MapButton.vue b/docs/webapp/components/Map/MapButton.vue new file mode 100644 index 000000000..c0ee361d6 --- /dev/null +++ b/docs/webapp/components/Map/MapButton.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/docs/webapp/components/Map/MapStylesButtons.vue b/docs/webapp/components/Map/MapStylesButtons.vue new file mode 100644 index 000000000..be77a5344 --- /dev/null +++ b/docs/webapp/components/Map/MapStylesButtons.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/docs/webapp/components/MasonryGrid/MasonryGrid.spec.js b/docs/webapp/components/MasonryGrid/MasonryGrid.spec.js new file mode 100644 index 000000000..00e7859d8 --- /dev/null +++ b/docs/webapp/components/MasonryGrid/MasonryGrid.spec.js @@ -0,0 +1,41 @@ +import { mount } from '@vue/test-utils' +import Vue from 'vue' +import MasonryGrid from './MasonryGrid' + +const localVue = global.localVue + +describe('MasonryGrid', () => { + let wrapper + let masonryGridItem + + beforeEach(() => { + wrapper = mount(MasonryGrid, { localVue }) + masonryGridItem = wrapper.vm.$children[0] + }) + + it('adds the "reset-grid-height" class when itemsCalculating is more than 0', async () => { + wrapper.setData({ itemsCalculating: 1 }) + await Vue.nextTick() + expect(wrapper.classes()).toContain('reset-grid-height') + }) + + it('removes the "reset-grid-height" class when itemsCalculating is 0', async () => { + wrapper.setData({ itemsCalculating: 0 }) + await Vue.nextTick() + expect(wrapper.classes()).not.toContain('reset-grid-height') + }) + + it('adds 1 to itemsCalculating when a child emits "calculating-item-height"', async () => { + wrapper.setData({ itemsCalculating: 0 }) + masonryGridItem.$emit('calculating-item-height') + await Vue.nextTick() + expect(wrapper.vm.itemsCalculating).toBe(1) + }) + + it('subtracts 1 from itemsCalculating when a child emits "finished-calculating-item-height"', async () => { + wrapper.setData({ itemsCalculating: 2 }) + masonryGridItem.$emit('finished-calculating-item-height') + await Vue.nextTick() + expect(wrapper.vm.itemsCalculating).toBe(1) + }) +}) diff --git a/docs/webapp/components/MasonryGrid/MasonryGrid.vue b/docs/webapp/components/MasonryGrid/MasonryGrid.vue new file mode 100644 index 000000000..00afa31af --- /dev/null +++ b/docs/webapp/components/MasonryGrid/MasonryGrid.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/docs/webapp/components/MasonryGrid/MasonryGridItem.spec.js b/docs/webapp/components/MasonryGrid/MasonryGridItem.spec.js new file mode 100644 index 000000000..26309f00d --- /dev/null +++ b/docs/webapp/components/MasonryGrid/MasonryGridItem.spec.js @@ -0,0 +1,48 @@ +import { mount } from '@vue/test-utils' +import MasonryGridItem from './MasonryGridItem' + +const localVue = global.localVue + +const stubs = { + 'ds-grid-item': true, +} + +describe('MasonryGridItem', () => { + let wrapper + + describe('given an imageAspectRatio', () => { + it('sets the initial rowSpan to 13 when the ratio is higher than 1.3', () => { + const propsData = { imageAspectRatio: 2 } + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) + + expect(wrapper.vm.rowSpan).toBe(13) + }) + + it('sets the initial rowSpan to 15 when the ratio is between 1.3 and 1', () => { + const propsData = { imageAspectRatio: 1.1 } + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) + + expect(wrapper.vm.rowSpan).toBe(15) + }) + + it('sets the initial rowSpan to 18 when the ratio is between 1 and 0.7', () => { + const propsData = { imageAspectRatio: 0.7 } + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) + + expect(wrapper.vm.rowSpan).toBe(18) + }) + + it('sets the initial rowSpan to 25 when the ratio is lower than 0.7', () => { + const propsData = { imageAspectRatio: 0.3 } + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) + expect(wrapper.vm.rowSpan).toBe(25) + }) + + describe('given no aspect ratio', () => { + it('sets the initial rowSpan to 8 when not given an imageAspectRatio', () => { + wrapper = mount(MasonryGridItem, { localVue, stubs }) + expect(wrapper.vm.rowSpan).toBe(8) + }) + }) + }) +}) diff --git a/docs/webapp/components/MasonryGrid/MasonryGridItem.vue b/docs/webapp/components/MasonryGrid/MasonryGridItem.vue new file mode 100644 index 000000000..fe4edba6e --- /dev/null +++ b/docs/webapp/components/MasonryGrid/MasonryGridItem.vue @@ -0,0 +1,50 @@ + + + diff --git a/docs/webapp/components/Modal.spec.js b/docs/webapp/components/Modal.spec.js new file mode 100644 index 000000000..037e84497 --- /dev/null +++ b/docs/webapp/components/Modal.spec.js @@ -0,0 +1,172 @@ +import { shallowMount } from '@vue/test-utils' +import Modal from './Modal.vue' +import ConfirmModal from './Modal/ConfirmModal.vue' +import DisableModal from './Modal/DisableModal.vue' +import ReportModal from './Modal/ReportModal.vue' +import Vuex from 'vuex' +import { getters, mutations } from '../store/modal' +import Vue from 'vue' + +const localVue = global.localVue + +describe('Modal.vue', () => { + let wrapper + let store + let state + let mocks + + const createWrapper = (mountMethod) => { + return () => { + store = new Vuex.Store({ + state, + getters: { + 'modal/open': getters.open, + 'modal/data': getters.data, + }, + mutations: { + 'modal/SET_OPEN': mutations.SET_OPEN, + }, + }) + return mountMethod(Modal, { + store, + mocks, + localVue, + }) + } + } + + beforeEach(() => { + mocks = { + $filters: { + truncate: (a) => a, + }, + $toast: { + success: () => {}, + error: () => {}, + }, + $t: () => {}, + } + state = { + open: null, + data: {}, + } + }) + + describe('shallowMount', () => { + const Wrapper = createWrapper(shallowMount) + + it('initially empty', () => { + wrapper = Wrapper() + expect(wrapper.findComponent(ConfirmModal).exists()).toBe(false) + expect(wrapper.findComponent(DisableModal).exists()).toBe(false) + expect(wrapper.findComponent(ReportModal).exists()).toBe(false) + }) + + describe('store/modal holds data to disable', () => { + beforeEach(() => { + state = { + open: 'disable', + data: { + type: 'contribution', + resource: { + id: 'c456', + title: 'some title', + }, + }, + } + wrapper = Wrapper() + }) + + it('renders disable modal', () => { + expect(wrapper.findComponent(DisableModal).exists()).toBe(true) + }) + + it('passes data to disable modal', () => { + expect(wrapper.findComponent(DisableModal).props()).toEqual({ + type: 'contribution', + name: 'some title', + id: 'c456', + }) + }) + + describe('child component emits close', () => { + it('turns empty', async () => { + wrapper.findComponent(DisableModal).vm.$emit('close') + await Vue.nextTick() + expect(wrapper.findComponent(DisableModal).exists()).toBe(false) + }) + }) + + describe('store/modal data contains a comment', () => { + it('passes author name to disable modal', () => { + state.data = { + type: 'comment', + resource: { + id: 'c456', + author: { + name: 'Author name', + }, + }, + } + wrapper = Wrapper() + expect(wrapper.findComponent(DisableModal).props()).toEqual({ + type: 'comment', + name: 'Author name', + id: 'c456', + }) + }) + + it('does not crash if author is undefined', () => { + state.data = { + type: 'comment', + resource: { + id: 'c456', + }, + } + wrapper = Wrapper() + expect(wrapper.findComponent(DisableModal).props()).toEqual({ + type: 'comment', + name: '', + id: 'c456', + }) + }) + }) + + describe('store/modal data contains an user', () => { + it('passes user name to report modal', () => { + state.data = { + type: 'user', + resource: { + id: 'u456', + name: 'Username', + }, + } + wrapper = Wrapper() + expect(wrapper.findComponent(DisableModal).props()).toEqual({ + type: 'user', + name: 'Username', + id: 'u456', + }) + }) + }) + + describe('store/modal data contains no valid datatype', () => { + it('passes something as datatype to modal', () => { + state.data = { + type: 'something', + resource: { + id: 's456', + name: 'Username', + }, + } + wrapper = Wrapper() + expect(wrapper.findComponent(DisableModal).props()).toEqual({ + type: 'something', + name: null, + id: 's456', + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Modal.vue b/docs/webapp/components/Modal.vue new file mode 100644 index 000000000..9195ad179 --- /dev/null +++ b/docs/webapp/components/Modal.vue @@ -0,0 +1,84 @@ + + + diff --git a/docs/webapp/components/Modal/ConfirmModal.spec.js b/docs/webapp/components/Modal/ConfirmModal.spec.js new file mode 100644 index 000000000..28fef3058 --- /dev/null +++ b/docs/webapp/components/Modal/ConfirmModal.spec.js @@ -0,0 +1,162 @@ +import { shallowMount, mount } from '@vue/test-utils' + +import ConfirmModal from './ConfirmModal.vue' +import { postMenuModalsData } from '~/components/utils/PostHelpers' + +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, +} + +describe('ConfirmModal.vue', () => { + let Wrapper + let wrapper + let propsData + let mocks + const postName = 'It is a post' + const confirmCallback = jest.fn() + const cancelCallback = jest.fn() + + beforeEach(() => { + propsData = { + type: 'contribution', + id: 'p23', + name: postName, + modalData: postMenuModalsData(postName, confirmCallback, cancelCallback).delete, + } + mocks = { + $t: jest.fn(), + $filters: { + truncate: (a) => a, + }, + } + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + describe('shallowMount', () => { + Wrapper = () => { + return shallowMount(ConfirmModal, { + propsData, + mocks, + localVue, + stubs, + }) + } + + describe('defaults', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('success false', () => { + expect(wrapper.vm.success).toBe(false) + }) + + it('loading false', () => { + expect(wrapper.vm.loading).toBe(false) + }) + }) + + describe('given a post', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'contribution', + id: 'p23', + name: postName, + } + wrapper = Wrapper() + }) + + it('mentions post title', () => { + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'delete.contribution.message', + { + name: postName, + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + }) + + describe('mount', () => { + Wrapper = () => { + return mount(ConfirmModal, { + propsData, + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('given post id', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('click cancel button', () => { + beforeEach(() => { + wrapper.find('button.cancel').trigger('click') + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + it('does call the cancel callback', () => { + expect(cancelCallback).toHaveBeenCalledTimes(1) + }) + + it('emits "close"', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + }) + }) + + describe('click confirm button', () => { + beforeEach(() => { + wrapper.find('button.confirm').trigger('click') + }) + + it('sets success', () => { + expect(wrapper.vm.success).toBe(true) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + it('does call the confirm callback', () => { + expect(confirmCallback).toHaveBeenCalledTimes(1) + }) + + it('emits "close"', () => { + expect(wrapper.emitted().close).toHaveLength(1) + }) + + it('resets success', () => { + expect(wrapper.vm.success).toBe(false) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Modal/ConfirmModal.vue b/docs/webapp/components/Modal/ConfirmModal.vue new file mode 100644 index 000000000..e94bd1f94 --- /dev/null +++ b/docs/webapp/components/Modal/ConfirmModal.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/docs/webapp/components/Modal/DeleteUserModal.spec.js b/docs/webapp/components/Modal/DeleteUserModal.spec.js new file mode 100644 index 000000000..1a1c152cd --- /dev/null +++ b/docs/webapp/components/Modal/DeleteUserModal.spec.js @@ -0,0 +1,122 @@ +import { mount, shallowMount } from '@vue/test-utils' +import Vuex from 'vuex' +import DeleteUserModal from './DeleteUserModal.vue' +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, + 'nuxt-link': true, +} + +localVue.use(DeleteUserModal) + +const getters = { + 'auth/isAdmin': () => true, + 'auth/isModerator': () => false, +} + +describe('DeleteUserModal.vue', () => { + const store = new Vuex.Store({ getters }) + let wrapper + let propsData = { + userdata: { + name: 'another-user', + slug: 'another-user', + createdAt: '2020-08-12T08:34:05.803Z', + contributionsCount: '4', + commentedCount: '2', + }, + } + const mocks = { + $t: jest.fn(), + $filters: { + truncate: (a) => a, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $i18n: { + locale: () => 'en', + }, + } + + afterEach(() => { + jest.clearAllMocks() + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return shallowMount(DeleteUserModal, { + propsData, + mocks, + store, + localVue, + stubs, + }) + } + + describe('defaults', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('success false', () => { + expect(wrapper.vm.success).toBe(false) + }) + + it('loading false', () => { + expect(wrapper.vm.loading).toBe(false) + }) + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(DeleteUserModal, { + propsData, + mocks, + store, + localVue, + stubs, + }) + } + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('given another user', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'user', + id: 'u4711', + } + wrapper = Wrapper() + }) + + describe('click cancel button', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('button.cancel').trigger('click') + }) + + it('does not emit "close" yet', () => { + expect(wrapper.emitted().close).toBeFalsy() + }) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('emits "close"', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Modal/DeleteUserModal.vue b/docs/webapp/components/Modal/DeleteUserModal.vue new file mode 100644 index 000000000..8618582ee --- /dev/null +++ b/docs/webapp/components/Modal/DeleteUserModal.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/docs/webapp/components/Modal/DisableModal.spec.js b/docs/webapp/components/Modal/DisableModal.spec.js new file mode 100644 index 000000000..0a7ffe25b --- /dev/null +++ b/docs/webapp/components/Modal/DisableModal.spec.js @@ -0,0 +1,195 @@ +import { shallowMount, mount } from '@vue/test-utils' +import DisableModal from './DisableModal.vue' + +const localVue = global.localVue + +describe('DisableModal.vue', () => { + let mocks + let propsData + let wrapper + + beforeEach(() => { + propsData = { + type: 'contribution', + id: 'c42', + name: 'blah', + } + mocks = { + $filters: { + truncate: (a) => a, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $t: jest.fn(), + $apollo: { + mutate: jest.fn().mockResolvedValueOnce().mockRejectedValue({ + message: 'Not Authorized!', + }), + }, + location: { + reload: jest.fn(), + }, + } + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return shallowMount(DisableModal, { + propsData, + mocks, + localVue, + }) + } + + describe('given a user', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'user', + name: 'Bob Ross', + id: 'u2', + } + }) + + it('mentions user name', () => { + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'disable.user.message', + { + name: 'Bob Ross', + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + + describe('given a contribution', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'contribution', + name: 'This is some post title.', + id: 'c3', + } + }) + + it('mentions contribution title', () => { + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'disable.contribution.message', + { + name: 'This is some post title.', + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(DisableModal, { + propsData, + mocks, + localVue, + }) + } + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('given id', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'user', + id: 'u4711', + } + }) + + describe('click cancel button', () => { + beforeEach(async () => { + wrapper = Wrapper() + await wrapper.find('button.cancel').trigger('click') + }) + + it('does not emit "close" yet', () => { + expect(wrapper.emitted().close).toBeFalsy() + }) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('does not call mutation', () => { + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('emits close', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + }) + }) + + describe('click confirm button', () => { + beforeEach(async () => { + wrapper = Wrapper() + await wrapper.find('button.confirm').trigger('click') + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('calls mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalled() + }) + + it('passes parameters to mutation', () => { + const calls = mocks.$apollo.mutate.mock.calls + const [[{ variables }]] = calls + expect(variables).toMatchObject({ + resourceId: 'u4711', + disable: true, + closed: false, + }) + }) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('emits close', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + }) + + describe('handles errors', () => { + beforeEach(() => { + wrapper = Wrapper() + // second submission causes mutation to reject + wrapper.find('button.confirm').trigger('click') + }) + + it('shows an error toaster when mutation rejects', async () => { + await expect(mocks.$toast.error).toHaveBeenCalledWith('Not Authorized!') + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Modal/DisableModal.vue b/docs/webapp/components/Modal/DisableModal.vue new file mode 100644 index 000000000..d28033ff8 --- /dev/null +++ b/docs/webapp/components/Modal/DisableModal.vue @@ -0,0 +1,76 @@ + + + diff --git a/docs/webapp/components/Modal/ReportModal.spec.js b/docs/webapp/components/Modal/ReportModal.spec.js new file mode 100644 index 000000000..d993e8103 --- /dev/null +++ b/docs/webapp/components/Modal/ReportModal.spec.js @@ -0,0 +1,200 @@ +import { shallowMount, mount } from '@vue/test-utils' +import ReportModal from './ReportModal.vue' +import Vue from 'vue' + +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, +} + +describe('ReportModal.vue', () => { + let wrapper + let propsData + let mocks + + beforeEach(() => { + propsData = { + type: 'contribution', + id: 'c43', + } + mocks = { + $t: jest.fn((a) => a), + $filters: { + truncate: (a) => a, + }, + $toast: { + success: () => {}, + error: () => {}, + }, + $apollo: { + mutate: jest.fn().mockResolvedValue({ + data: {}, + }), + }, + } + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return shallowMount(ReportModal, { + propsData, + mocks, + localVue, + stubs, + }) + } + + describe('defaults', () => { + it('success false', () => { + expect(Wrapper().vm.success).toBe(false) + }) + + it('loading false', () => { + expect(Wrapper().vm.loading).toBe(false) + }) + }) + + describe('given a user', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'user', + id: 'u4', + name: 'Bob Ross', + } + }) + + it('mentions user name', () => { + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'report.user.message', + { + name: 'Bob Ross', + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + + describe('given a post', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'post', + id: 'p23', + name: 'It is a post', + } + }) + + it('mentions post title', () => { + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'report.post.message', + { + name: 'It is a post', + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(ReportModal, { + propsData, + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + jest.useFakeTimers() + }) + + it('renders', () => { + expect(Wrapper().element.tagName).toBe('DIV') + }) + + describe('given id', () => { + beforeEach(() => { + propsData = { + ...propsData, + type: 'user', + id: 'u4711', + } + wrapper = Wrapper() + }) + + describe('click cancel button', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('button.cancel').trigger('click') + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + it('emits "close"', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + + it('does not call mutation', () => { + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + }) + }) + + describe('click confirm button', () => { + beforeEach(async () => { + wrapper.find('.ds-radio-option-label').trigger('click') + await Vue.nextTick() + wrapper.find('button.confirm').trigger('click') + await Vue.nextTick() + }) + + it('calls report mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalled() + }) + + it('sets success', () => { + expect(wrapper.vm.success).toBe(true) + }) + + it('displays a success message', () => { + const calls = mocks.$t.mock.calls + const expected = [['report.success']] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + it('emits close', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + + it('resets success', () => { + expect(wrapper.vm.success).toBe(false) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Modal/ReportModal.vue b/docs/webapp/components/Modal/ReportModal.vue new file mode 100644 index 000000000..e5cccf2fc --- /dev/null +++ b/docs/webapp/components/Modal/ReportModal.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/docs/webapp/components/Notification/Notification.spec.js b/docs/webapp/components/Notification/Notification.spec.js new file mode 100644 index 000000000..844f78e71 --- /dev/null +++ b/docs/webapp/components/Notification/Notification.spec.js @@ -0,0 +1,200 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' +import Notification from './Notification.vue' + +import Vuex from 'vuex' + +const localVue = global.localVue + +describe('Notification', () => { + let stubs + let getters + let mocks + let propsData + let wrapper + beforeEach(() => { + propsData = {} + mocks = { + $t: (key) => key, + } + stubs = { + NuxtLink: RouterLinkStub, + 'client-only': true, + } + getters = { + 'auth/user': () => { + return {} + }, + 'auth/isModerator': () => false, + } + }) + + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(Notification, { + stubs, + store, + mocks, + propsData, + localVue, + }) + } + + describe('given a notification about a comment on a post', () => { + beforeEach(() => { + propsData.notification = { + reason: 'commented_on_post', + from: { + __typename: 'Comment', + id: 'comment-1', + contentExcerpt: + '@dagobert-duck is the best on this comment.', + post: { + title: "It's a post title", + id: 'post-1', + slug: 'its-a-title', + contentExcerpt: 'Post content.', + }, + }, + } + }) + + it('renders reason', () => { + wrapper = Wrapper() + expect(wrapper.find('.notification > .description').text()).toEqual( + 'notifications.reason.commented_on_post', + ) + }) + it('renders title', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain("It's a post title") + }) + it('renders the identifier "notifications.comment"', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain('notifications.comment') + }) + it('renders the contentExcerpt', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain('@dagobert-duck is the best on this comment.') + }) + it('has no class "--read"', () => { + wrapper = Wrapper() + expect(wrapper.classes()).not.toContain('--read') + }) + + describe('that is read', () => { + beforeEach(() => { + propsData.notification.read = true + wrapper = Wrapper() + }) + + it('has class "--read"', () => { + expect(wrapper.classes()).toContain('--read') + }) + }) + }) + + describe('given a notification about a mention in a post', () => { + beforeEach(() => { + propsData.notification = { + reason: 'mentioned_in_post', + from: { + __typename: 'Post', + title: "It's a post title", + id: 'post-1', + slug: 'its-a-title', + contentExcerpt: + '@jenny-rostock is the best on this post.', + }, + } + }) + + it('renders reason', () => { + wrapper = Wrapper() + expect(wrapper.find('.notification > .description').text()).toEqual( + 'notifications.reason.mentioned_in_post', + ) + }) + it('renders title', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain("It's a post title") + }) + it('renders the contentExcerpt', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain('@jenny-rostock is the best on this post.') + }) + it('has no class "--read"', () => { + wrapper = Wrapper() + expect(wrapper.classes()).not.toContain('--read') + }) + + describe('that is read', () => { + beforeEach(() => { + propsData.notification.read = true + wrapper = Wrapper() + }) + + it('has class "--read"', () => { + expect(wrapper.classes()).toContain('--read') + }) + }) + }) + + describe('given a notification about a mention in a comment', () => { + beforeEach(() => { + propsData.notification = { + reason: 'mentioned_in_comment', + from: { + __typename: 'Comment', + id: 'comment-1', + contentExcerpt: + '@dagobert-duck is the best on this comment.', + post: { + title: "It's a post title", + id: 'post-1', + slug: 'its-a-title', + contentExcerpt: 'Post content.', + }, + }, + } + }) + + it('renders reason', () => { + wrapper = Wrapper() + expect(wrapper.find('.notification > .description').text()).toEqual( + 'notifications.reason.mentioned_in_comment', + ) + }) + it('renders title', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain("It's a post title") + }) + + it('renders the identifier "notifications.comment"', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain('notifications.comment') + }) + + it('renders the contentExcerpt', () => { + wrapper = Wrapper() + expect(wrapper.text()).toContain('@dagobert-duck is the best on this comment.') + }) + + it('has no class "--read"', () => { + wrapper = Wrapper() + expect(wrapper.classes()).not.toContain('--read') + }) + + describe('that is read', () => { + beforeEach(() => { + propsData.notification.read = true + wrapper = Wrapper() + }) + + it('has class "--read"', () => { + expect(wrapper.classes()).toContain('--read') + }) + }) + }) +}) diff --git a/docs/webapp/components/Notification/Notification.vue b/docs/webapp/components/Notification/Notification.vue new file mode 100644 index 000000000..a657b10ba --- /dev/null +++ b/docs/webapp/components/Notification/Notification.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/docs/webapp/components/NotificationList/NotificationList.spec.js b/docs/webapp/components/NotificationList/NotificationList.spec.js new file mode 100644 index 000000000..7f7038d59 --- /dev/null +++ b/docs/webapp/components/NotificationList/NotificationList.spec.js @@ -0,0 +1,103 @@ +import { shallowMount, mount, RouterLinkStub } from '@vue/test-utils' +import NotificationList from './NotificationList' +import Notification from '../Notification/Notification' +import Vuex from 'vuex' + +import { notifications } from '~/components/utils/Notifications' + +const localVue = global.localVue + +localVue.filter('truncate', (string) => string) + +describe('NotificationList.vue', () => { + let wrapper + let mocks + let stubs + let store + let propsData + + beforeEach(() => { + store = new Vuex.Store({ + getters: { + 'auth/isModerator': () => false, + 'auth/user': () => { + return {} + }, + }, + }) + mocks = { + $t: jest.fn(), + } + stubs = { + NuxtLink: RouterLinkStub, + 'client-only': true, + 'v-popover': true, + } + propsData = { notifications } + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return shallowMount(NotificationList, { + propsData, + mocks, + store, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders Notification.vue for each notification of the user', () => { + expect(wrapper.findAllComponents(Notification)).toHaveLength(2) + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(NotificationList, { + propsData, + mocks, + stubs, + store, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('click on a notification', () => { + beforeEach(() => { + wrapper.find('.notification > .link').trigger('click') + }) + + it("emits 'markAsRead' with the id of the notification source", () => { + expect(wrapper.emitted('markAsRead')[0]).toEqual(['post-1']) + }) + }) + }) + + describe('shallowMount with no notifications', () => { + const Wrapper = () => { + return shallowMount(NotificationList, { + propsData: {}, + mocks, + store, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders Notification.vue zero times', () => { + expect(wrapper.findAllComponents(Notification)).toHaveLength(0) + }) + }) +}) diff --git a/docs/webapp/components/NotificationList/NotificationList.vue b/docs/webapp/components/NotificationList/NotificationList.vue new file mode 100644 index 000000000..fd2d6366c --- /dev/null +++ b/docs/webapp/components/NotificationList/NotificationList.vue @@ -0,0 +1,32 @@ + + + diff --git a/docs/webapp/components/NotificationMenu/NotificationMenu.spec.js b/docs/webapp/components/NotificationMenu/NotificationMenu.spec.js new file mode 100644 index 000000000..448ea37e4 --- /dev/null +++ b/docs/webapp/components/NotificationMenu/NotificationMenu.spec.js @@ -0,0 +1,173 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' +import NotificationMenu from './NotificationMenu' + +const localVue = global.localVue + +localVue.filter('truncate', (string) => string) + +describe('NotificationMenu.vue', () => { + let wrapper + let mocks + let data + let stubs + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + data = () => { + return { + notifications: [], + } + } + stubs = { + NuxtLink: RouterLinkStub, + UserTeaser: true, + 'client-only': true, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(NotificationMenu, { + data, + mocks, + localVue, + stubs, + }) + } + + it('renders as link without counter', () => { + wrapper = Wrapper() + expect(wrapper.classes('notifications-menu')).toBe(true) + expect(() => wrapper.get('.count')).toThrow() + }) + + it('no dropdown is rendered', () => { + wrapper = Wrapper() + expect(wrapper.find('.dropdown').exists()).toBe(false) + }) + + describe('given only read notifications', () => { + beforeEach(() => { + data = () => { + return { + notifications: [ + { + id: 'notification-41', + read: true, + post: { + id: 'post-1', + title: 'some post title', + contentExcerpt: 'this is a post content', + author: { + id: 'john-1', + slug: 'john-doe', + name: 'John Doe', + }, + }, + }, + ], + } + } + }) + + it('renders as link without counter', () => { + wrapper = Wrapper() + expect(wrapper.classes('notifications-menu')).toBe(true) + expect(() => wrapper.get('.count')).toThrow() + }) + + it('no dropdown is rendered', () => { + wrapper = Wrapper() + expect(wrapper.find('.dropdown').exists()).toBe(false) + }) + }) + + describe('given some notifications', () => { + beforeEach(() => { + data = () => { + return { + notifications: [ + { + id: 'notification-41', + read: false, + post: { + id: 'post-1', + title: 'some post title', + contentExcerpt: 'this is a post content', + author: { + id: 'john-1', + slug: 'john-doe', + name: 'John Doe', + }, + }, + from: { + title: 'Title', + author: { + id: 'reporter', + slug: 'reporter', + name: 'reporter', + }, + }, + }, + { + id: 'notification-42', + read: false, + post: { + id: 'post-2', + title: 'another post title', + contentExcerpt: 'this is yet another post content', + author: { + id: 'john-1', + slug: 'john-doe', + name: 'John Doe', + }, + }, + from: { + title: 'Title', + author: { + id: 'reporter', + slug: 'reporter', + name: 'reporter', + }, + }, + }, + { + id: 'notification-43', + read: true, + post: { + id: 'post-3', + title: 'read post title', + contentExcerpt: 'this is yet another post content', + author: { + id: 'john-1', + slug: 'john-doe', + name: 'John Doe', + }, + }, + from: { + title: 'Title', + author: { + id: 'reporter', + slug: 'reporter', + name: 'reporter', + }, + }, + }, + ], + } + } + }) + + it('displays the number of unread notifications', () => { + wrapper = Wrapper() + expect(wrapper.find('.count').text()).toEqual('2') + }) + + it('renders the counter in red', () => { + wrapper = Wrapper() + expect(wrapper.find('.count').classes()).toContain('--danger') + }) + }) + }) +}) diff --git a/docs/webapp/components/NotificationMenu/NotificationMenu.vue b/docs/webapp/components/NotificationMenu/NotificationMenu.vue new file mode 100644 index 000000000..d0e21bf96 --- /dev/null +++ b/docs/webapp/components/NotificationMenu/NotificationMenu.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/docs/webapp/components/NotificationsTable/NotificationsTable.spec.js b/docs/webapp/components/NotificationsTable/NotificationsTable.spec.js new file mode 100644 index 000000000..0d3560787 --- /dev/null +++ b/docs/webapp/components/NotificationsTable/NotificationsTable.spec.js @@ -0,0 +1,168 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' + +import Vuex from 'vuex' +import NotificationsTable from './NotificationsTable' + +import { notifications } from '~/components/utils/Notifications' +const localVue = global.localVue + +localVue.filter('truncate', (string) => string) + +describe('NotificationsTable.vue', () => { + let wrapper, mocks, propsData, stubs + const postNotification = notifications[0] + const commentNotification = notifications[1] + + beforeEach(() => { + mocks = { + $t: jest.fn((string) => string), + } + stubs = { + NuxtLink: RouterLinkStub, + 'client-only': true, + } + propsData = {} + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters: { + 'auth/isModerator': () => false, + 'auth/user': () => { + return {} + }, + }, + }) + return mount(NotificationsTable, { + propsData, + mocks, + localVue, + store, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('no notifications', () => { + it('renders HcEmpty component', () => { + expect(wrapper.find('.hc-empty').exists()).toBe(true) + }) + }) + + describe('given notifications', () => { + beforeEach(() => { + propsData.notifications = notifications + wrapper = Wrapper() + }) + + it('renders a grid table', () => { + expect(wrapper.find('.notification-grid').exists()).toBe(true) + }) + + describe('renders 4 columns', () => { + it('for icon', () => { + expect(wrapper.vm.fields.icon).toBeTruthy() + }) + + it('for user', () => { + expect(wrapper.vm.fields.user).toBeTruthy() + }) + + it('for post', () => { + expect(wrapper.vm.fields.post).toBeTruthy() + }) + + it('for content', () => { + expect(wrapper.vm.fields.content).toBeTruthy() + }) + }) + + describe('Post', () => { + let firstRowNotification + beforeEach(() => { + firstRowNotification = wrapper.findAll('.notification-grid-row').at(0) + }) + + it('renders the author', () => { + const userinfo = firstRowNotification.find('.user-teaser > .info') + expect(userinfo.text()).toContain(postNotification.from.author.name) + }) + + it('renders the reason for the notification', () => { + const dsTexts = firstRowNotification.findAll('.ds-text') + const reason = dsTexts.filter( + (element) => element.text() === 'notifications.reason.mentioned_in_post', + ) + expect(reason.exists()).toBe(true) + }) + + it('renders a link to the Post', () => { + const postLink = firstRowNotification.find('a.notification-mention-post') + expect(postLink.text()).toEqual(postNotification.from.title) + }) + + it("renders the Post's content", () => { + const boldTags = firstRowNotification.findAll('b') + const content = boldTags.filter( + (element) => element.text() === postNotification.from.contentExcerpt, + ) + expect(content.exists()).toBe(true) + }) + }) + + describe('Comment', () => { + let secondRowNotification + beforeEach(() => { + secondRowNotification = wrapper.findAll('.notification-grid-row').at(1) + }) + + it('renders the author', () => { + const userinfo = secondRowNotification.find('.user-teaser > .info') + expect(userinfo.text()).toContain(commentNotification.from.author.name) + }) + + it('renders the reason for the notification', () => { + const dsTexts = secondRowNotification.findAll('.ds-text') + const reason = dsTexts.filter( + (element) => element.text() === 'notifications.reason.mentioned_in_comment', + ) + expect(reason.exists()).toBe(true) + }) + + it('renders a link to the Post', () => { + const postLink = secondRowNotification.find('a.notification-mention-post') + expect(postLink.text()).toEqual(commentNotification.from.post.title) + }) + + it("renders the Post's content", () => { + const boldTags = secondRowNotification.findAll('b') + const content = boldTags.filter( + (element) => element.text() === commentNotification.from.contentExcerpt, + ) + expect(content.exists()).toBe(true) + }) + }) + + describe('unread status', () => { + it('does not have class `notification-status`', () => { + expect(wrapper.find('.notification-status').exists()).toBe(false) + }) + + it('clicking on a Post link emits `markNotificationAsRead`', () => { + wrapper.find('a.notification-mention-post').trigger('click') + expect(wrapper.emitted().markNotificationAsRead[0][0]).toEqual(postNotification.from.id) + }) + + it('adds class `notification-status` when read is true', () => { + postNotification.read = true + wrapper = Wrapper() + expect(wrapper.find('.notification-status').exists()).toBe(true) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/NotificationsTable/NotificationsTable.story.js b/docs/webapp/components/NotificationsTable/NotificationsTable.story.js new file mode 100644 index 000000000..1d27f6532 --- /dev/null +++ b/docs/webapp/components/NotificationsTable/NotificationsTable.story.js @@ -0,0 +1,86 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import NotificationsTable from '~/components/NotificationsTable/NotificationsTable' +import helpers from '~/storybook/helpers' +import { post } from '~/components/PostTeaser/PostTeaser.story.js' +import { user } from '~/components/UserTeaser/UserTeaser.story.js' + +helpers.init() +export const notifications = [ + { + read: true, + reason: 'mentioned_in_post', + createdAt: '2019-10-29T15:36:02.106Z', + from: { + __typename: 'Post', + ...post, + }, + __typename: 'NOTIFIED', + index: 9, + }, + { + read: false, + reason: 'commented_on_post', + createdAt: '2019-10-29T15:38:25.199Z', + from: { + __typename: 'Comment', + id: 'b6b38937-3efc-4d5e-b12c-549e4d6551a5', + createdAt: '2019-10-29T15:38:25.184Z', + updatedAt: '2019-10-29T15:38:25.184Z', + disabled: false, + deleted: false, + content: + '

                              @peter-lustig

                              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra magna ac placerat. Tempor id eu nisl nunc mi ipsum faucibus vitae. Nibh praesent tristique magna sit amet purus gravida quis blandit. Magna eget est lorem ipsum dolor. In fermentum posuere urna nec. Eleifend donec pretium vulputate sapien nec sagittis aliquam. Augue interdum velit euismod in pellentesque. Id diam maecenas ultricies mi eget mauris pharetra. Donec pretium vulputate sapien nec. Dolor morbi non arcu risus quis varius quam quisque. Blandit turpis cursus in hac habitasse. Est ultricies integer quis auctor elit sed vulputate mi sit. Nunc consequat interdum varius sit amet mattis vulputate enim. Semper feugiat nibh sed pulvinar. Eget felis eget nunc lobortis mattis aliquam. Ultrices vitae auctor eu augue. Tellus molestie nunc non blandit massa enim nec dui. Pharetra massa massa ultricies mi quis hendrerit dolor. Nisl suscipit adipiscing bibendum est ultricies integer.

                              ', + contentExcerpt: + '

                              @peter-lustig

                              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra …

                              ', + ...post, + author: user, + }, + __typename: 'NOTIFIED', + index: 1, + }, + { + read: false, + reason: 'mentioned_in_comment', + createdAt: '2019-10-29T15:38:13.422Z', + from: { + __typename: 'Comment', + id: 'b91f4d4d-b178-4e42-9764-7fbcbf097f4c', + createdAt: '2019-10-29T15:38:13.41Z', + updatedAt: '2019-10-29T15:38:13.41Z', + disabled: false, + deleted: false, + content: + '

                              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra magna ac placerat. Tempor id eu nisl nunc mi ipsum faucibus vitae. Nibh praesent tristique magna sit amet purus gravida quis blandit. Magna eget est lorem ipsum dolor. In fermentum posuere urna nec. Eleifend donec pretium vulputate sapien nec sagittis aliquam. Augue interdum velit euismod in pellentesque. Id diam maecenas ultricies mi eget mauris pharetra. Donec pretium vulputate sapien nec. Dolor morbi non arcu risus quis varius quam quisque. Blandit turpis cursus in hac habitasse. Est ultricies integer quis auctor elit sed vulputate mi sit. Nunc consequat interdum varius sit amet mattis vulputate enim. Semper feugiat nibh sed pulvinar. Eget felis eget nunc lobortis mattis aliquam. Ultrices vitae auctor eu augue. Tellus molestie nunc non blandit massa enim nec dui. Pharetra massa massa ultricies mi quis hendrerit dolor. Nisl suscipit adipiscing bibendum est ultricies integer.

                              @peter-lustig

                              ', + contentExcerpt: + '

                              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra magna ac …

                              ', + ...post, + author: user, + }, + __typename: 'NOTIFIED', + index: 2, + }, +] +storiesOf('NotificationsTable', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('with notifications', () => ({ + components: { NotificationsTable }, + store: helpers.store, + data: () => ({ + notifications, + }), + methods: { + markNotificationAsRead: action('markNotificationAsRead'), + }, + template: ``, + })) + .add('without notifications', () => ({ + components: { NotificationsTable }, + store: helpers.store, + template: ``, + })) diff --git a/docs/webapp/components/NotificationsTable/NotificationsTable.vue b/docs/webapp/components/NotificationsTable/NotificationsTable.vue new file mode 100644 index 000000000..9ff106e62 --- /dev/null +++ b/docs/webapp/components/NotificationsTable/NotificationsTable.vue @@ -0,0 +1,206 @@ + + + diff --git a/docs/webapp/components/PageFooter/PageFooter.spec.js b/docs/webapp/components/PageFooter/PageFooter.spec.js new file mode 100644 index 000000000..b02541fbf --- /dev/null +++ b/docs/webapp/components/PageFooter/PageFooter.spec.js @@ -0,0 +1,177 @@ +import { mount } from '@vue/test-utils' +import PageFooter from './PageFooter.vue' +import linksDefault from '~/constants/links.js' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': { + template: '', + }, +} + +describe('PageFooter.vue', () => { + let mocks + let wrapper + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $env: { + VERSION: 'v1.0.0', + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(PageFooter, { mocks, localVue, stubs }) + } + + describe('links.js', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders five links', () => { + expect(wrapper.findAll('a')).toHaveLength(5) + }) + + it('renders four nuxt-links', () => { + expect(wrapper.findAll('.nuxt-link')).toHaveLength(4) + }) + + it('renders version', () => { + expect(wrapper.find('.ds-footer').text()).toContain('v1.0.0') + }) + }) + + describe('inflexible links', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders version', () => { + expect(wrapper.find('a[data-test="version-link"]').exists()).toBeTruthy() + }) + }) + + describe('flexible links not set', () => { + beforeEach(async () => { + const links = { + ...linksDefault, + ORGANIZATION: linksDefault.ORGANIZATION.overwrite({ externalLink: null }), + IMPRINT: linksDefault.IMPRINT.overwrite({ externalLink: null }), + TERMS_AND_CONDITIONS: linksDefault.TERMS_AND_CONDITIONS.overwrite({ externalLink: null }), + CODE_OF_CONDUCT: linksDefault.CODE_OF_CONDUCT.overwrite({ externalLink: null }), + DATA_PRIVACY: linksDefault.DATA_PRIVACY.overwrite({ externalLink: null }), + FAQ: linksDefault.FAQ.overwrite({ externalLink: null }), + } + wrapper = Wrapper() + wrapper.setData({ links }) + await wrapper.vm.$nextTick() + }) + + it('renders ORGANIZATION as nuxt-link', () => { + expect(wrapper.find('span[data-test="organization-nuxt-link"]').exists()).toBeTruthy() + }) + + it('renders IMPRINT as nuxt-link', () => { + expect(wrapper.find('span[data-test="imprint-nuxt-link"]').exists()).toBeTruthy() + }) + + it('renders TERMS_AND_CONDITIONS as nuxt-link', () => { + expect( + wrapper.find('span[data-test="terms-and-conditions-nuxt-link"]').exists(), + ).toBeTruthy() + }) + + it('renders CODE_OF_CONDUCT as nuxt-link', () => { + expect(wrapper.find('span[data-test="code-of-conduct-nuxt-link"]').exists()).toBeTruthy() + }) + + it('renders DATA_PRIVACY as nuxt-link', () => { + expect(wrapper.find('span[data-test="data-privacy-nuxt-link"]').exists()).toBeTruthy() + }) + + it('renders FAQ as nuxt-link', () => { + expect(wrapper.find('span[data-test="faq-nuxt-link"]').exists()).toBeTruthy() + }) + }) + + describe('flexible links set', () => { + beforeEach(async () => { + const links = { + ...linksDefault, + ORGANIZATION: linksDefault.ORGANIZATION.overwrite({ + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, + }), + IMPRINT: linksDefault.IMPRINT.overwrite({ + externalLink: { + url: 'https://ocelot.social/IMPRINT', + target: '_blank', + }, + }), + TERMS_AND_CONDITIONS: linksDefault.TERMS_AND_CONDITIONS.overwrite({ + externalLink: { + url: 'https://ocelot.social/TERMS_AND_CONDITIONS', + target: '_blank', + }, + }), + CODE_OF_CONDUCT: linksDefault.CODE_OF_CONDUCT.overwrite({ + externalLink: { + url: 'https://ocelot.social/CODE_OF_CONDUCT', + target: '_blank', + }, + }), + DATA_PRIVACY: linksDefault.DATA_PRIVACY.overwrite({ + externalLink: { + url: 'https://ocelot.social/DATA_PRIVACY', + target: '_blank', + }, + }), + FAQ: linksDefault.FAQ.overwrite({ + externalLink: { + url: 'https://ocelot.social/FAQ', + target: '_blank', + }, + }), + } + wrapper = Wrapper() + wrapper.setData({ links }) + await wrapper.vm.$nextTick() + }) + + it('renders ORGANIZATION as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social"]`).exists()).toBeTruthy() + }) + + it('renders IMPRINT as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/IMPRINT"]`).exists()).toBeTruthy() + }) + + it('renders TERMS_AND_CONDITIONS as "a" tag link', () => { + expect( + wrapper.find(`a[href="https://ocelot.social/TERMS_AND_CONDITIONS"]`).exists(), + ).toBeTruthy() + }) + + it('renders CODE_OF_CONDUCT as "a" tag link', () => { + expect( + wrapper.find(`a[href="https://ocelot.social/CODE_OF_CONDUCT"]`).exists(), + ).toBeTruthy() + }) + + it('renders DATA_PRIVACY as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/DATA_PRIVACY"]`).exists()).toBeTruthy() + }) + + it('renders FAQ as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/FAQ"]`).exists()).toBeTruthy() + }) + }) + }) +}) diff --git a/docs/webapp/components/PageFooter/PageFooter.vue b/docs/webapp/components/PageFooter/PageFooter.vue new file mode 100644 index 000000000..cd279766d --- /dev/null +++ b/docs/webapp/components/PageFooter/PageFooter.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/docs/webapp/components/Password/Change.spec.js b/docs/webapp/components/Password/Change.spec.js new file mode 100644 index 000000000..ea5c392a9 --- /dev/null +++ b/docs/webapp/components/Password/Change.spec.js @@ -0,0 +1,143 @@ +import { mount } from '@vue/test-utils' +import ChangePassword from './Change.vue' + +const localVue = global.localVue + +describe('ChangePassword.vue', () => { + let mocks + + beforeEach(() => { + mocks = { + validate: jest.fn(), + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + $t: jest.fn(), + $store: { + commit: jest.fn(), + }, + $apollo: { + mutate: jest + .fn() + .mockRejectedValue({ message: 'Ouch!' }) + .mockResolvedValueOnce({ data: { changePassword: 'NEWTOKEN' } }), + }, + } + }) + + describe('mount', () => { + let wrapper + const Wrapper = () => { + return mount(ChangePassword, { mocks, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders three input fields', () => { + expect(wrapper.findAll('input')).toHaveLength(3) + }) + + describe('validations', () => { + it('invalid', () => { + expect(wrapper.vm.disabled).toBe(true) + }) + + describe('old password and new password', () => { + describe('match', () => { + beforeEach(() => { + wrapper.find('input#oldPassword').setValue('some secret') + wrapper.find('input#password').setValue('some secret') + }) + + it('invalid', () => { + expect(wrapper.vm.disabled).toBe(true) + }) + + it.skip('displays a warning', () => { + const calls = mocks.validate.mock.calls + const expected = [['change-password.validations.old-and-new-password-match']] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + }) + + describe('new password and confirmation', () => { + describe('mismatch', () => { + it.todo('invalid') + it.todo('displays a warning') + }) + + describe('match', () => { + describe('and old password mismatch', () => { + it.todo('valid') + }) + + describe('clicked', () => { + it.todo('sets loading') + }) + }) + }) + }) + + describe('given valid input', () => { + beforeEach(() => { + wrapper.find('input#oldPassword').setValue('supersecret') + wrapper.find('input#password').setValue('superdupersecret') + wrapper.find('input#passwordConfirmation').setValue('superdupersecret') + }) + + describe('submit form', () => { + beforeEach(async () => { + await wrapper.find('form').trigger('submit') + }) + + it('calls changePassword mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalled() + }) + + it('passes form data as variables', () => { + expect(mocks.$apollo.mutate.mock.calls[0][0]).toEqual( + expect.objectContaining({ + variables: { + oldPassword: 'supersecret', + password: 'superdupersecret', + passwordConfirmation: 'superdupersecret', + }, + }), + ) + }) + + describe('mutation resolves', () => { + beforeEach(() => { + wrapper.find('form').trigger('submit') + }) + + it('calls auth/SET_TOKEN with response', () => { + expect(mocks.$store.commit).toHaveBeenCalledWith('auth/SET_TOKEN', 'NEWTOKEN') + }) + + it('displays success message', () => { + expect(mocks.$t).toHaveBeenCalledWith('settings.security.change-password.success') + expect(mocks.$toast.success).toHaveBeenCalled() + }) + }) + + describe('mutation rejects', () => { + beforeEach(async () => { + await wrapper.find('input#oldPassword').setValue('supersecret') + await wrapper.find('input#password').setValue('supersecret') + await wrapper.find('input#passwordConfirmation').setValue('supersecret') + await wrapper.find('form').trigger('submit') + }) + + it('displays error message', async () => { + expect(mocks.$toast.error).toHaveBeenCalledWith('Ouch!') + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Password/Change.vue b/docs/webapp/components/Password/Change.vue new file mode 100644 index 000000000..94b69a8f6 --- /dev/null +++ b/docs/webapp/components/Password/Change.vue @@ -0,0 +1,91 @@ + + + diff --git a/docs/webapp/components/Password/Strength.vue b/docs/webapp/components/Password/Strength.vue new file mode 100644 index 000000000..7f01cbea9 --- /dev/null +++ b/docs/webapp/components/Password/Strength.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/docs/webapp/components/PasswordReset/ChangePassword.spec.js b/docs/webapp/components/PasswordReset/ChangePassword.spec.js new file mode 100644 index 000000000..f885203c8 --- /dev/null +++ b/docs/webapp/components/PasswordReset/ChangePassword.spec.js @@ -0,0 +1,103 @@ +import { mount } from '@vue/test-utils' +import ChangePassword from './ChangePassword' + +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, +} + +describe('ChangePassword ', () => { + let wrapper + let Wrapper + let mocks + let propsData + + beforeEach(() => { + propsData = {} + mocks = { + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $t: jest.fn(), + $apollo: { + loading: false, + mutate: jest.fn().mockResolvedValue({ data: { resetPassword: true } }), + }, + } + }) + + describe('mount', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + Wrapper = () => { + return mount(ChangePassword, { + mocks, + propsData, + localVue, + stubs, + }) + } + + describe('given email and nonce', () => { + beforeEach(() => { + propsData.email = 'mail@example.org' + propsData.nonce = '12345' + }) + + describe('submitting new password', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('input#password').setValue('supersecret') + wrapper.find('input#passwordConfirmation').setValue('supersecret') + wrapper.find('form').trigger('submit') + }) + + it('calls resetPassword graphql mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalled() + }) + + it('delivers new password to backend', () => { + const expected = expect.objectContaining({ + variables: { nonce: '12345', email: 'mail@example.org', password: 'supersecret' }, + }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + describe('password reset successful', () => { + it('displays success message', () => { + const expected = 'components.password-reset.change-password.success' + expect(mocks.$t).toHaveBeenCalledWith(expected) + }) + + describe('after animation', () => { + beforeEach(jest.runAllTimers) + + it('emits `change-password-sucess`', () => { + expect(wrapper.emitted('passwordResetResponse')).toEqual([['success']]) + }) + }) + }) + + describe('password reset not successful', () => { + beforeEach(() => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ + message: 'Ouch!', + }) + wrapper = Wrapper() + wrapper.find('input#password').setValue('supersecret') + wrapper.find('input#passwordConfirmation').setValue('supersecret') + wrapper.find('form').trigger('submit') + }) + + it('display a toast error', () => { + expect(mocks.$toast.error).toHaveBeenCalled() + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/PasswordReset/ChangePassword.vue b/docs/webapp/components/PasswordReset/ChangePassword.vue new file mode 100644 index 000000000..c53afcc01 --- /dev/null +++ b/docs/webapp/components/PasswordReset/ChangePassword.vue @@ -0,0 +1,121 @@ + + + diff --git a/docs/webapp/components/PasswordReset/Request.spec.js b/docs/webapp/components/PasswordReset/Request.spec.js new file mode 100644 index 000000000..50d6495bd --- /dev/null +++ b/docs/webapp/components/PasswordReset/Request.spec.js @@ -0,0 +1,115 @@ +import { mount } from '@vue/test-utils' +import Request from './Request' + +const localVue = global.localVue + +describe('Request', () => { + let wrapper, Wrapper, mocks, stubs + + beforeEach(() => { + mocks = { + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $t: jest.fn((t) => t), + $apollo: { + loading: false, + mutate: jest.fn().mockResolvedValue({ data: { reqestPasswordReset: true } }), + }, + $i18n: { + locale: () => 'en', + }, + } + stubs = { + LocaleSwitch: true, + 'sweetalert-icon': true, + 'client-only': true, + 'nuxt-link': true, + } + }) + + describe('mount', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + Wrapper = () => { + return mount(Request, { + mocks, + localVue, + stubs, + }) + } + + it('renders a password reset form', () => { + wrapper = Wrapper() + expect(wrapper.find('form').exists()).toBe(true) + }) + + describe('submit', () => { + beforeEach(async () => { + wrapper = Wrapper() + wrapper.find('input#email').setValue('mail@example.org') + await wrapper.find('form').trigger('submit') + }) + + it('calls requestPasswordReset graphql mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalled() + }) + + it('delivers email to backend', () => { + const expected = expect.objectContaining({ variables: { email: 'mail@example.org' } }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + it('hides form to avoid re-submission', () => { + expect(wrapper.find('form').exists()).not.toBeTruthy() + }) + + it('displays a message that a password email was requested', () => { + const expected = [ + 'components.password-reset.request.form.submitted', + { email: 'mail@example.org' }, + ] + expect(mocks.$t).toHaveBeenCalledWith(...expected) + }) + + describe('after animation', () => { + beforeEach(jest.runAllTimers) + + it('emits `handleSubmitted`', () => { + expect(wrapper.emitted('handleSubmitted')).toEqual([[{ email: 'mail@example.org' }]]) + }) + }) + }) + + describe('capital letters in a gmail address', () => { + beforeEach(async () => { + wrapper = Wrapper() + wrapper.find('input#email').setValue('mAiL@gmail.com') + await wrapper.find('form').trigger('submit') + }) + + it('normalizes email to lower case letters', () => { + const expected = expect.objectContaining({ variables: { email: 'mail@gmail.com' } }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + }) + + describe('backend throws an error', () => { + beforeEach(() => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ + message: 'Ouch!', + }) + wrapper = Wrapper() + wrapper.find('input#email').setValue('mail@gmail.com') + wrapper.find('form').trigger('submit') + }) + + it('display a toast error', () => { + expect(mocks.$toast.error).toHaveBeenCalled() + }) + }) + }) +}) diff --git a/docs/webapp/components/PasswordReset/Request.vue b/docs/webapp/components/PasswordReset/Request.vue new file mode 100644 index 000000000..5398c13ed --- /dev/null +++ b/docs/webapp/components/PasswordReset/Request.vue @@ -0,0 +1,106 @@ + + + diff --git a/docs/webapp/components/PostTeaser/PostTeaser.spec.js b/docs/webapp/components/PostTeaser/PostTeaser.spec.js new file mode 100644 index 000000000..0d48729d3 --- /dev/null +++ b/docs/webapp/components/PostTeaser/PostTeaser.spec.js @@ -0,0 +1,140 @@ +import { shallowMount, mount, RouterLinkStub } from '@vue/test-utils' + +import Vuex from 'vuex' + +import PostTeaser from './PostTeaser.vue' + +const localVue = global.localVue + +describe('PostTeaser', () => { + let store + let stubs + let mocks + let propsData + let getters + let Wrapper + let wrapper + + beforeEach(() => { + propsData = { + post: { + id: 'p23', + disabled: false, + shoutedCount: 0, + commentsCount: 0, + clickedCount: 0, + viewedTeaserCount: 0, + name: 'It is a post', + author: { + id: 'u1', + }, + postType: ['Article'], + }, + } + stubs = { + NuxtLink: RouterLinkStub, + 'client-only': true, + 'v-popover': true, + } + mocks = { + $t: jest.fn(), + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $apollo: { + mutate: jest.fn().mockResolvedValue({ + data: { DeletePost: { id: 'deleted-post-id' } }, + }), + }, + $env: { + CATEGORIES_ACTIVE: false, + }, + } + getters = { + 'auth/isModerator': () => false, + 'auth/user': () => { + return {} + }, + } + }) + + describe('shallowMount', () => { + Wrapper = () => { + store = new Vuex.Store({ getters }) + return shallowMount(PostTeaser, { + store, + propsData, + mocks, + localVue, + }) + } + + it('has no validation errors', () => { + const spy = jest.spyOn(global.console, 'error') + Wrapper() + expect(spy).not.toBeCalled() + spy.mockReset() + }) + + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('test Post callbacks', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('deletion of Post from Page by invoking "deletePostCallback()"', () => { + beforeEach(() => { + wrapper.vm.deletePostCallback() + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('does call mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it('mutation is successful', () => { + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + + it('emits "removePostFromList"', () => { + expect(wrapper.emitted('removePostFromList')).toEqual([[{ id: 'deleted-post-id' }]]) + }) + }) + }) + }) + }) + + describe('mount', () => { + Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(PostTeaser, { + stubs, + mocks, + propsData, + store, + localVue, + }) + } + + describe('given a post', () => { + beforeEach(() => { + propsData.post = { + ...propsData.post, + title: "It's a title", + } + }) + + it('renders title', () => { + expect(Wrapper().text()).toContain("It's a title") + }) + }) + }) +}) diff --git a/docs/webapp/components/PostTeaser/PostTeaser.story.js b/docs/webapp/components/PostTeaser/PostTeaser.story.js new file mode 100644 index 000000000..e77e85585 --- /dev/null +++ b/docs/webapp/components/PostTeaser/PostTeaser.story.js @@ -0,0 +1,97 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import PostTeaser from './PostTeaser.vue' +import helpers from '~/storybook/helpers' + +helpers.init() + +export const post = { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + title: 'Very nice Post Title', + contentExcerpt: '

                              My post content

                              ', + createdAt: '2019-06-24T22:08:59.304Z', + disabled: false, + deleted: false, + slug: 'very-nice-post-title', + image: null, + author: { + id: 'u3', + avatar: { + url: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbc9e03ebcc384b920c31542af2d27dd8eea9dc2_full.jpg', + }, + slug: 'jenny-rostock', + name: 'Rainer Unsinn', + disabled: false, + deleted: false, + contributionsCount: 25, + shoutedCount: 5, + commentedCount: 39, + followedByCount: 2, + clickedCount: 42, + followedByCurrentUser: true, + location: null, + badges: [ + { + id: 'b4', + key: 'indiegogo_en_bear', + icon: '/img/badges/indiegogo_en_bear.svg', + __typename: 'Badge', + }, + ], + __typename: 'User', + }, + commentsCount: 12, + categories: [], + shoutedCount: 421, + viewedTeaserCount: 1584, + __typename: 'Post', +} + +storiesOf('PostTeaser', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('without image', () => ({ + components: { PostTeaser }, + store: helpers.store, + data: () => ({ + post, + }), + template: ` + + `, + })) + .add('with image', () => ({ + components: { PostTeaser }, + store: helpers.store, + data: () => ({ + post: { + ...post, + image: 'https://unsplash.com/photos/R4y_E5ZQDPg/download', + }, + }), + template: ` + + `, + })) + .add('pinned by admin', () => ({ + components: { PostTeaser }, + store: helpers.store, + data: () => ({ + post: { + ...post, + pinned: true, + }, + }), + template: ` + + `, + })) diff --git a/docs/webapp/components/PostTeaser/PostTeaser.vue b/docs/webapp/components/PostTeaser/PostTeaser.vue new file mode 100644 index 000000000..d852d9e23 --- /dev/null +++ b/docs/webapp/components/PostTeaser/PostTeaser.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/docs/webapp/components/ProgressBar/ProgressBar.spec.js b/docs/webapp/components/ProgressBar/ProgressBar.spec.js new file mode 100644 index 000000000..f794b36ce --- /dev/null +++ b/docs/webapp/components/ProgressBar/ProgressBar.spec.js @@ -0,0 +1,54 @@ +import { shallowMount } from '@vue/test-utils' +import ProgressBar from './ProgressBar' + +const localVue = global.localVue + +describe('ProgessBar.vue', () => { + let propsData, slots, wrapper + + beforeEach(() => { + propsData = { + goal: 50000, + progress: 10000, + } + slots = {} + }) + + const Wrapper = () => shallowMount(ProgressBar, { localVue, propsData, slots }) + + describe('given only goal and progress', () => { + it('calculates the progress bar width as a percentage of the goal', () => { + wrapper = Wrapper() + expect(wrapper.vm.progressBarWidth).toBe('width: 20%;') + }) + + it('renders no label', () => { + wrapper = Wrapper() + expect(wrapper.find('.progress-bar__label').exists()).toBe(false) + }) + }) + + describe('given a label', () => { + beforeEach(() => { + propsData.label = 'Going well' + }) + + it('renders the label', () => { + wrapper = Wrapper() + expect(wrapper.find('.progress-bar__label').text()).toBe('Going well') + }) + }) + + describe('given a fake-button as slot', () => { + beforeEach(() => { + slots = { + default: '
                              ', + } + }) + + it('renders the fake-button', () => { + wrapper = Wrapper() + expect(wrapper.find('.fake-button').exists()).toBe(true) + }) + }) +}) diff --git a/docs/webapp/components/ProgressBar/ProgressBar.vue b/docs/webapp/components/ProgressBar/ProgressBar.vue new file mode 100644 index 000000000..09fb4b3a2 --- /dev/null +++ b/docs/webapp/components/ProgressBar/ProgressBar.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/docs/webapp/components/Registration/EmailDisplayAndVerify.vue b/docs/webapp/components/Registration/EmailDisplayAndVerify.vue new file mode 100644 index 000000000..5a9a5d030 --- /dev/null +++ b/docs/webapp/components/Registration/EmailDisplayAndVerify.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/docs/webapp/components/Registration/RegistrationSlideCreate.vue b/docs/webapp/components/Registration/RegistrationSlideCreate.vue new file mode 100644 index 000000000..141db1c4a --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlideCreate.vue @@ -0,0 +1,351 @@ + + + + + diff --git a/docs/webapp/components/Registration/RegistrationSlideEmail.vue b/docs/webapp/components/Registration/RegistrationSlideEmail.vue new file mode 100644 index 000000000..6d6454ac9 --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlideEmail.vue @@ -0,0 +1,208 @@ + + + + diff --git a/docs/webapp/components/Registration/RegistrationSlideInvite.vue b/docs/webapp/components/Registration/RegistrationSlideInvite.vue new file mode 100644 index 000000000..723071510 --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlideInvite.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/docs/webapp/components/Registration/RegistrationSlideNoPublic.vue b/docs/webapp/components/Registration/RegistrationSlideNoPublic.vue new file mode 100644 index 000000000..c5f815ef4 --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlideNoPublic.vue @@ -0,0 +1,36 @@ + + + diff --git a/docs/webapp/components/Registration/RegistrationSlideNonce.vue b/docs/webapp/components/Registration/RegistrationSlideNonce.vue new file mode 100644 index 000000000..604d9b132 --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlideNonce.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/docs/webapp/components/Registration/RegistrationSlider.story.js b/docs/webapp/components/Registration/RegistrationSlider.story.js new file mode 100644 index 000000000..ef048db47 --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlider.story.js @@ -0,0 +1,193 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import Vuex from 'vuex' +import helpers from '~/storybook/helpers' +import Vue from 'vue' +import RegistrationSlider from './RegistrationSlider.vue' + +const plugins = [ + (app = {}) => { + app.$apollo = { + mutate: (data) => { + if (JSON.stringify(data).includes('UpdateUser')) { + return { data: { UpdateUser: { id: data.variables.id, locale: data.variables.locale } } } + } + if (JSON.stringify(data).includes('Signup')) { + return { data: { Signup: { email: data.variables.email } } } + } + if (JSON.stringify(data).includes('SignupVerification')) { + return { data: { SignupVerification: { ...data.variables } } } + } + throw new Error(`Mutation name not found!`) + }, + query: (data) => { + if (JSON.stringify(data).includes('isValidInviteCode')) { + return { data: { isValidInviteCode: true } } + } + if (JSON.stringify(data).includes('VerifyNonce')) { + return { data: { VerifyNonce: true } } + } + throw new Error(`Query name not found!`) + }, + } + Vue.prototype.$apollo = app.$apollo + return app + }, +] +helpers.init({ plugins }) + +const createStore = ({ loginSuccess }) => { + return new Vuex.Store({ + modules: { + auth: { + namespaced: true, + state: () => ({ + pending: false, + }), + mutations: { + SET_PENDING(state, pending) { + state.pending = pending + }, + }, + getters: { + pending(state) { + return !!state.pending + }, + }, + actions: { + async login({ commit, dispatch }, args) { + action('Vuex action `auth/login`')(args) + return new Promise((resolve, reject) => { + commit('SET_PENDING', true) + setTimeout(() => { + commit('SET_PENDING', false) + if (loginSuccess) { + resolve(loginSuccess) + } else { + reject(new Error('Login unsuccessful')) + } + }, 1000) + }) + }, + }, + }, + }, + }) +} + +storiesOf('RegistrationSlider', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('invite-code empty', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({}), + template: ` + + `, + })) + .add('invite-code with data', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({ + overwriteSliderData: { + collectedInputData: { + inviteCode: 'INZTBY', + email: 'wolle.huss@pjannto.com', + emailSend: false, + nonce: '47539', + name: 'Wolfgang', + password: 'Hello', + passwordConfirmation: 'Hello', + termsAndConditionsConfirmed: true, + recieveCommunicationAsEmailsEtcConfirmed: true, + }, + }, + }), + template: ` + + `, + })) + .add('public-registration empty', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({}), + template: ` + + `, + })) + .add('public-registration with data', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({ + overwriteSliderData: { + collectedInputData: { + inviteCode: null, + email: 'wolle.huss@pjannto.com', + emailSend: false, + nonce: '47539', + name: 'Wolfgang', + password: 'Hello', + passwordConfirmation: 'Hello', + termsAndConditionsConfirmed: true, + recieveCommunicationAsEmailsEtcConfirmed: true, + }, + }, + }), + template: ` + + `, + })) + .add('invite-mail empty', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({ + overwriteSliderData: { + collectedInputData: { + inviteCode: null, + email: 'wolle.huss@pjannto.com', + emailSend: true, + nonce: null, + name: null, + password: null, + passwordConfirmation: null, + termsAndConditionsConfirmed: null, + recieveCommunicationAsEmailsEtcConfirmed: null, + }, + }, + }), + template: ` + + `, + })) + .add('invite-mail with data', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({ + overwriteSliderData: { + collectedInputData: { + inviteCode: null, + email: 'wolle.huss@pjannto.com', + emailSend: true, + nonce: '47539', + name: 'Wolfgang', + password: 'Hello', + passwordConfirmation: 'Hello', + termsAndConditionsConfirmed: true, + recieveCommunicationAsEmailsEtcConfirmed: true, + }, + }, + }), + template: ` + + `, + })) + .add('no-public-registration', () => ({ + components: { RegistrationSlider }, + store: createStore({ loginSuccess: true }), + data: () => ({}), + template: ` + + `, + })) diff --git a/docs/webapp/components/Registration/RegistrationSlider.vue b/docs/webapp/components/Registration/RegistrationSlider.vue new file mode 100644 index 000000000..6bd704b32 --- /dev/null +++ b/docs/webapp/components/Registration/RegistrationSlider.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/docs/webapp/components/Registration/Signup.spec.js b/docs/webapp/components/Registration/Signup.spec.js new file mode 100644 index 000000000..7ef2dc994 --- /dev/null +++ b/docs/webapp/components/Registration/Signup.spec.js @@ -0,0 +1,109 @@ +import { mount } from '@vue/test-utils' +import Signup, { SignupMutation } from './Signup' + +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, + 'nuxt-link': true, +} + +describe('Signup', () => { + let wrapper + let Wrapper + let mocks + let propsData + + beforeEach(() => { + mocks = { + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $t: jest.fn(), + $apollo: { + loading: false, + mutate: jest.fn().mockResolvedValue({ data: { Signup: { email: 'mail@example.org' } } }), + }, + } + propsData = {} + }) + + describe('mount', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + Wrapper = () => { + return mount(Signup, { + mocks, + propsData, + localVue, + stubs, + }) + } + + describe('without invitation code', () => { + it('renders signup form', () => { + wrapper = Wrapper() + expect(wrapper.find('form').exists()).toBe(true) + }) + + describe('submit', () => { + beforeEach(async () => { + wrapper = Wrapper() + wrapper.find('input#email').setValue('mAIL@exAMPLE.org') + await wrapper.find('form').trigger('submit') + }) + + it('calls Signup graphql mutation', () => { + const expected = expect.objectContaining({ mutation: SignupMutation }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + it('delivers email to backend', () => { + const expected = expect.objectContaining({ + mutation: SignupMutation, + variables: { email: 'mAIL@exAMPLE.org', inviteCode: null }, + }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + it('hides form to avoid re-submission', () => { + expect(wrapper.find('form').exists()).not.toBeTruthy() + }) + + it('displays a message that a mail for email verification was sent', () => { + const expected = [ + 'components.registration.signup.form.success', + { email: 'mail@example.org' }, + ] + expect(mocks.$t).toHaveBeenCalledWith(...expected) + }) + + describe('mutation is rejected', () => { + beforeEach(async () => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ + message: 'Ouch!', + }) + wrapper = Wrapper() + wrapper.find('input#email').setValue('mail@example.org') + await wrapper.find('form').trigger('submit') + }) + + it('displays error message', async () => { + expect(mocks.$toast.error).toHaveBeenCalledWith('Ouch!') + }) + }) + + describe('after animation', () => { + beforeEach(jest.runAllTimers) + + it('emits `submit`', () => { + expect(wrapper.emitted('submit')).toEqual([[{ email: 'mail@example.org' }]]) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/Registration/Signup.vue b/docs/webapp/components/Registration/Signup.vue new file mode 100644 index 000000000..91b9ecd61 --- /dev/null +++ b/docs/webapp/components/Registration/Signup.vue @@ -0,0 +1,150 @@ + + + + diff --git a/docs/webapp/components/RelativeDateTime/Readme.md b/docs/webapp/components/RelativeDateTime/Readme.md new file mode 100644 index 000000000..5e04466f9 --- /dev/null +++ b/docs/webapp/components/RelativeDateTime/Readme.md @@ -0,0 +1,7 @@ +### Example + +Relative time from 08.03.2017 + +``` + +``` \ No newline at end of file diff --git a/docs/webapp/components/RelativeDateTime/index.vue b/docs/webapp/components/RelativeDateTime/index.vue new file mode 100644 index 000000000..19018c24b --- /dev/null +++ b/docs/webapp/components/RelativeDateTime/index.vue @@ -0,0 +1,23 @@ + + + diff --git a/docs/webapp/components/RelativeDateTime/spec.js b/docs/webapp/components/RelativeDateTime/spec.js new file mode 100644 index 000000000..b0dd687b2 --- /dev/null +++ b/docs/webapp/components/RelativeDateTime/spec.js @@ -0,0 +1,78 @@ +import { shallowMount } from '@vue/test-utils' +import RelativeDateTime from './' + +const localVue = global.localVue + +describe('RelativeDateTime', () => { + let mocks + let locale + let dateTime + + beforeEach(() => { + mocks = { + $i18n: { + locale: () => locale, + }, + } + }) + + const Wrapper = () => { + return shallowMount(RelativeDateTime, { + mocks, + localVue, + propsData: { + dateTime, + }, + }) + } + + describe('given a String as dateTime', () => { + beforeEach(() => { + dateTime = '08.03.2017' + }) + + it('translates', () => { + expect(Wrapper().text()).toContain('08/03/2017') + }) + }) + + describe('given a Date object as dateTime', () => { + beforeEach(() => { + dateTime = new Date() + }) + + it('renders', () => { + expect(Wrapper().element.tagName).toBe('SPAN') + }) + + describe("locale == 'en'", () => { + beforeEach(() => { + locale = 'en' + }) + + it('translates', () => { + expect(Wrapper().text()).toContain('today at') + }) + }) + + describe("locale == 'gibberish'", () => { + beforeEach(() => { + locale = 'gibberish' + }) + + it('translates', () => { + expect(Wrapper().text()).toContain('today at') + }) + }) + + describe("locale == 'de'", () => { + beforeEach(() => { + locale = 'de' + }) + + it('translates', () => { + expect(Wrapper().text()).toContain('heute um') + }) + }) + }) +}) diff --git a/docs/webapp/components/ReleaseModal/ReleaseModal.spec.js b/docs/webapp/components/ReleaseModal/ReleaseModal.spec.js new file mode 100644 index 000000000..a976e37e5 --- /dev/null +++ b/docs/webapp/components/ReleaseModal/ReleaseModal.spec.js @@ -0,0 +1,192 @@ +import { shallowMount, mount } from '@vue/test-utils' +import ReleaseModal from './ReleaseModal.vue' + +const localVue = global.localVue + +describe('ReleaseModal.vue', () => { + let mocks + let propsData + let wrapper + let Wrapper + + beforeEach(() => { + propsData = { + type: 'contribution', + name: 'blah', + id: 'c42', + } + mocks = { + $filters: { + truncate: (a) => a, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $t: jest.fn(), + $apollo: { + mutate: jest.fn().mockResolvedValueOnce().mockRejectedValue({ message: 'Not Authorized!' }), + }, + location: { + reload: jest.fn(), + }, + } + }) + + describe('shallowMount', () => { + Wrapper = () => { + return shallowMount(ReleaseModal, { + propsData, + mocks, + localVue, + }) + } + + describe('given a user', () => { + beforeEach(() => { + propsData = { + type: 'user', + id: 'u2', + name: 'Bob Ross', + } + }) + + it('mentions user name', () => { + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'release.user.message', + { + name: 'Bob Ross', + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + + describe('given a contribution', () => { + beforeEach(() => { + propsData = { + type: 'contribution', + id: 'c3', + name: 'This is some post title.', + } + }) + + it('mentions contribution title', () => { + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [ + [ + 'release.contribution.message', + { + name: 'This is some post title.', + }, + ], + ] + expect(calls).toEqual(expect.arrayContaining(expected)) + }) + }) + }) + + describe('mount', () => { + Wrapper = () => { + return mount(ReleaseModal, { + propsData, + mocks, + localVue, + }) + } + + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('given id', () => { + beforeEach(() => { + propsData = { + type: 'user', + id: 'u4711', + } + }) + + describe('click cancel button', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('button.cancel').trigger('click') + }) + + it('does not emit "close" yet', () => { + expect(wrapper.emitted().close).toBeFalsy() + }) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('does not call mutation', () => { + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('emits close', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + }) + }) + + describe('click confirm button', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('button.confirm').trigger('click') + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('calls mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalled() + }) + + it('passes parameters to mutation', () => { + const calls = mocks.$apollo.mutate.mock.calls + const [[{ variables }]] = calls + expect(variables).toMatchObject({ + resourceId: 'u4711', + disable: false, + closed: false, + }) + }) + + it('fades away', () => { + expect(wrapper.vm.isOpen).toBe(false) + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('emits close', () => { + expect(wrapper.emitted().close).toBeTruthy() + }) + }) + + describe('handles errors', () => { + beforeEach(() => { + wrapper = Wrapper() + // second submission causes mutation to reject + wrapper.find('button.confirm').trigger('click') + }) + + it('shows an error toaster when mutation rejects', async () => { + await expect(mocks.$toast.error).toHaveBeenCalledWith('Not Authorized!') + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/ReleaseModal/ReleaseModal.vue b/docs/webapp/components/ReleaseModal/ReleaseModal.vue new file mode 100644 index 000000000..fceb4b7a1 --- /dev/null +++ b/docs/webapp/components/ReleaseModal/ReleaseModal.vue @@ -0,0 +1,75 @@ + + + diff --git a/docs/webapp/components/Ribbon/index.spec.js b/docs/webapp/components/Ribbon/index.spec.js new file mode 100644 index 000000000..5e09db1f2 --- /dev/null +++ b/docs/webapp/components/Ribbon/index.spec.js @@ -0,0 +1,37 @@ +import { shallowMount } from '@vue/test-utils' +import Ribbon from './index' + +const localVue = global.localVue + +describe('Ribbon', () => { + let text + + const Wrapper = () => { + return shallowMount(Ribbon, { + localVue, + propsData: { + text, + }, + }) + } + + describe('given String for Text', () => { + beforeEach(() => { + text = 'Peter Pan' + }) + + it('shows Text', () => { + expect(Wrapper().text()).toContain('Peter Pan') + }) + }) + + describe('given no String for Text', () => { + beforeEach(() => { + text = undefined + }) + + it('shows empty Text', () => { + expect(Wrapper().text()).toContain('') + }) + }) +}) diff --git a/docs/webapp/components/Ribbon/index.vue b/docs/webapp/components/Ribbon/index.vue new file mode 100644 index 000000000..8595c0f5d --- /dev/null +++ b/docs/webapp/components/Ribbon/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/docs/webapp/components/Select/ActionRadiusSelect.spec.js b/docs/webapp/components/Select/ActionRadiusSelect.spec.js new file mode 100644 index 000000000..7629ac788 --- /dev/null +++ b/docs/webapp/components/Select/ActionRadiusSelect.spec.js @@ -0,0 +1,37 @@ +import { shallowMount } from '@vue/test-utils' +import ActionRadiusSelect from './ActionRadiusSelect' + +const localVue = global.localVue +const propsData = { value: 'regional' } + +describe('ActionRadiusSelect.', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return shallowMount(ActionRadiusSelect, { propsData, mocks, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + it('renders the select', () => { + expect(wrapper.findComponent(ActionRadiusSelect).exists()).toBe(true) + }) + + describe('when an option is selected', () => { + it('emits a change event with the new value', () => { + const select = wrapper.find('select') + select.trigger('change') + expect(wrapper.emitted().change[0]).toEqual(['regional']) + }) + }) + }) +}) diff --git a/docs/webapp/components/Select/ActionRadiusSelect.vue b/docs/webapp/components/Select/ActionRadiusSelect.vue new file mode 100644 index 000000000..0a090e0a5 --- /dev/null +++ b/docs/webapp/components/Select/ActionRadiusSelect.vue @@ -0,0 +1,33 @@ + + + diff --git a/docs/webapp/components/ShoutButton.spec.js b/docs/webapp/components/ShoutButton.spec.js new file mode 100644 index 000000000..c3af134c1 --- /dev/null +++ b/docs/webapp/components/ShoutButton.spec.js @@ -0,0 +1,57 @@ +import { mount } from '@vue/test-utils' +import ShoutButton from './ShoutButton.vue' +import Vue from 'vue' + +const localVue = global.localVue + +describe('ShoutButton.vue', () => { + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + } + }) + + describe('mount', () => { + let wrapper + const Wrapper = () => { + return mount(ShoutButton, { mocks, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders button and text', () => { + expect(mocks.$t).toHaveBeenCalledWith('shoutButton.shouted') + expect(wrapper.findAll('.base-button')).toHaveLength(1) + expect(wrapper.findAll('.shout-button-text')).toHaveLength(1) + expect(wrapper.vm.shouted).toBe(false) + expect(wrapper.vm.shoutedCount).toBe(0) + }) + + it('toggle the button', async () => { + mocks.$apollo.mutate = jest.fn().mockResolvedValue({ data: { shout: 'WeDoShout' } }) + wrapper.find('.base-button').trigger('click') + expect(wrapper.vm.shouted).toBe(true) + expect(wrapper.vm.shoutedCount).toBe(1) + await Vue.nextTick() + expect(wrapper.vm.shouted).toBe(true) + expect(wrapper.vm.shoutedCount).toBe(1) + }) + + it('toggle the button, but backend fails', async () => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ message: 'Ouch!' }) + await wrapper.find('.base-button').trigger('click') + expect(wrapper.vm.shouted).toBe(true) + expect(wrapper.vm.shoutedCount).toBe(1) + await Vue.nextTick() + expect(wrapper.vm.shouted).toBe(false) + expect(wrapper.vm.shoutedCount).toBe(0) + }) + }) +}) diff --git a/docs/webapp/components/ShoutButton.vue b/docs/webapp/components/ShoutButton.vue new file mode 100644 index 000000000..4b644bc25 --- /dev/null +++ b/docs/webapp/components/ShoutButton.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/docs/webapp/components/ShowPassword/ShowPassword.spec.js b/docs/webapp/components/ShowPassword/ShowPassword.spec.js new file mode 100644 index 000000000..6eb44f6b2 --- /dev/null +++ b/docs/webapp/components/ShowPassword/ShowPassword.spec.js @@ -0,0 +1,33 @@ +import Vue from 'vue' +import { mount } from '@vue/test-utils' + +import ShowPassword from './ShowPassword.vue' + +describe('ShowPassword', () => { + describe('State of show password icon', () => { + const wrapper = mount(ShowPassword, { + propsData: { + iconName: 'eye', + }, + }) + + it('Shows eye icon by default', () => { + expect(wrapper.find('.icon-wrapper').attributes('data-test')).toEqual('eye') + }) + + describe('After click', () => { + it('Password wrapper emits show-password event', async () => { + wrapper.find('.click-wrapper').trigger('click') + await Vue.nextTick() + expect(wrapper.emitted()).toBeTruthy() + }) + + it('Shows the slash-eye icon after click', async () => { + wrapper.find('.click-wrapper').trigger('click') + wrapper.setProps({ iconName: 'eye-slash' }) + await Vue.nextTick() + expect(wrapper.find('.icon-wrapper').attributes('data-test')).toEqual('eye-slash') + }) + }) + }) +}) diff --git a/docs/webapp/components/ShowPassword/ShowPassword.vue b/docs/webapp/components/ShowPassword/ShowPassword.vue new file mode 100644 index 000000000..c31e01b25 --- /dev/null +++ b/docs/webapp/components/ShowPassword/ShowPassword.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/docs/webapp/components/SocialMedia/SocialMedia.spec.js b/docs/webapp/components/SocialMedia/SocialMedia.spec.js new file mode 100644 index 000000000..5aa8220ae --- /dev/null +++ b/docs/webapp/components/SocialMedia/SocialMedia.spec.js @@ -0,0 +1,99 @@ +import { mount } from '@vue/test-utils' +import SocialMedia from './SocialMedia.vue' + +const stubs = { + 'ds-space': true, + 'ds-text': true, +} + +describe('SocialMedia.vue', () => { + let propsData + let mocks + + beforeEach(() => { + propsData = {} + + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(SocialMedia, { propsData, mocks, stubs }) + } + + describe('socialMedia card title', () => { + beforeEach(() => { + propsData.userName = 'Jenny Rostock' + propsData.user = { + socialMedia: [ + { + id: 'ee1e8ed6-fbef-4bcf-b411-a12926f2ea1e', + url: 'https://www.instagram.com/nimitbhargava', + __typename: 'SocialMedia', + }, + ], + } + }) + + it('renders socialMedia card title', () => { + Wrapper() + expect(mocks.$t).toHaveBeenCalledWith('profile.socialMedia') + }) + }) + + describe('socialMedia links', () => { + let wrapper + + beforeEach(() => { + propsData.userName = 'Jenny Rostock' + propsData.user = { + socialMedia: [ + { + id: 'ee1e8ed6-fbef-4bcf-b411-a12926f2ea1e', + url: 'https://www.instagram.com/nimitbhargava', + __typename: 'SocialMedia', + }, + { + id: 'dc91aecb-3289-47d0-8770-4b24eb24fd9c', + url: 'https://www.facebook.com/NimitBhargava', + __typename: 'SocialMedia', + }, + { + id: 'db1dc400-9303-4b43-9451-87dcac13b913', + url: 'https://www.youtube.com/channel/UCu3GiKBFn5I07V9hBxF2CRA', + __typename: 'SocialMedia', + }, + ], + } + // Now assign wrapper + wrapper = Wrapper() + }) + + it('shows 3 social media links', () => { + expect(wrapper.findAll('a')).toHaveLength(3) + }) + + it('renders a social media link', () => { + const link = wrapper.findAll('a').at(0) + expect(link.attributes('href')).toEqual('https://www.instagram.com/nimitbhargava') + }) + + it('shows the first favicon', () => { + const favicon = wrapper.findAll('a').at(0).find('img') + expect(favicon.attributes('src')).toEqual('https://www.instagram.com/favicon.ico') + }) + + it('shows the second favicon', () => { + const favicon = wrapper.findAll('a').at(1).find('img') + expect(favicon.attributes('src')).toEqual('https://www.facebook.com/favicon.ico') + }) + + it('shows the last favicon', () => { + const favicon = wrapper.findAll('a').at(-1).find('img') + expect(favicon.attributes('src')).toEqual('https://www.youtube.com/favicon.ico') + }) + }) + }) +}) diff --git a/docs/webapp/components/SocialMedia/SocialMedia.vue b/docs/webapp/components/SocialMedia/SocialMedia.vue new file mode 100644 index 000000000..c34bc54c0 --- /dev/null +++ b/docs/webapp/components/SocialMedia/SocialMedia.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/docs/webapp/components/Uploader/AvatarUploader.spec.js b/docs/webapp/components/Uploader/AvatarUploader.spec.js new file mode 100644 index 000000000..070302038 --- /dev/null +++ b/docs/webapp/components/Uploader/AvatarUploader.spec.js @@ -0,0 +1,80 @@ +import { shallowMount } from '@vue/test-utils' +import Vue from 'vue' +import AvatarUploader from './AvatarUploader' + +const localVue = global.localVue + +describe('AvatarUploader', () => { + let wrapper + + const mocks = { + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { UpdateUser: { id: 'upload1', avatar: { url: '/upload/avatar.jpg' } } }, + }) + .mockRejectedValue({ + message: 'File upload unsuccessful! Whatcha gonna do?', + }), + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $t: jest.fn(), + } + + const propsData = { + profile: { + avatar: { url: '/api/generic.jpg' }, + }, + updateMutation: jest.fn(), + } + + beforeEach(() => { + jest.useFakeTimers() + wrapper = shallowMount(AvatarUploader, { localVue, propsData, mocks }) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('sends the UpdateUser mutation when vddrop is called', () => { + wrapper.vm.vddrop([{ filename: 'avatar.jpg' }]) + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + describe('error handling', () => { + const message = 'File upload failed' + const fileError = { status: 'error' } + + it('defaults to error false', () => { + expect(wrapper.vm.error).toEqual(false) + }) + + it('shows an error toaster when verror is called', () => { + wrapper.vm.verror(fileError, message) + expect(mocks.$toast.error).toHaveBeenCalledWith(fileError.status, message) + }) + + it('changes error status from false to true to false', async () => { + wrapper.vm.verror(fileError, message) + await Vue.nextTick() + expect(wrapper.vm.error).toEqual(true) + jest.runAllTimers() + expect(wrapper.vm.error).toEqual(false) + }) + + it('shows an error toaster when the apollo mutation rejects', async () => { + // calls vddrop twice because of how mockResolvedValueOnce works in jest + // the first time the mock function is called it will resolve, calling it a + // second time will cause it to fail(with this implementation) + // https://jestjs.io/docs/en/mock-function-api.html#mockfnmockresolvedvalueoncevalue + await wrapper.vm.vddrop([{ filename: 'avatar.jpg' }]) + await wrapper.vm.vddrop([{ filename: 'avatar.jpg' }]) + expect(mocks.$toast.error).toHaveBeenCalledTimes(1) + }) + }) +}) diff --git a/docs/webapp/components/Uploader/AvatarUploader.vue b/docs/webapp/components/Uploader/AvatarUploader.vue new file mode 100644 index 000000000..eacb44d3a --- /dev/null +++ b/docs/webapp/components/Uploader/AvatarUploader.vue @@ -0,0 +1,173 @@ + + + diff --git a/docs/webapp/components/Uploader/ImageUploader.spec.js b/docs/webapp/components/Uploader/ImageUploader.spec.js new file mode 100644 index 000000000..200369436 --- /dev/null +++ b/docs/webapp/components/Uploader/ImageUploader.spec.js @@ -0,0 +1,36 @@ +import { mount } from '@vue/test-utils' +import ImageUploader from './ImageUploader.vue' + +const localVue = global.localVue + +describe('ImageUploader.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $toast: { + error: jest.fn(), + }, + $t: jest.fn((string) => string), + } + }) + describe('mount', () => { + const Wrapper = () => { + return mount(ImageUploader, { mocks, localVue }) + } + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('handles errors', () => { + beforeEach(() => jest.useFakeTimers()) + const unSupportedFileMessage = 'message' + + it('shows an error toaster when unSupported file is uploaded', () => { + wrapper.vm.onUnSupportedFormat(unSupportedFileMessage) + expect(mocks.$toast.error).toHaveBeenCalledWith(unSupportedFileMessage) + }) + }) + }) +}) diff --git a/docs/webapp/components/Uploader/ImageUploader.vue b/docs/webapp/components/Uploader/ImageUploader.vue new file mode 100644 index 000000000..d885782f3 --- /dev/null +++ b/docs/webapp/components/Uploader/ImageUploader.vue @@ -0,0 +1,261 @@ + + + + diff --git a/docs/webapp/components/UserTeaser/UserTeaser.spec.js b/docs/webapp/components/UserTeaser/UserTeaser.spec.js new file mode 100644 index 000000000..354308109 --- /dev/null +++ b/docs/webapp/components/UserTeaser/UserTeaser.spec.js @@ -0,0 +1,115 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' +import UserTeaser from './UserTeaser.vue' +import Vuex from 'vuex' + +const localVue = global.localVue +const filter = jest.fn((str) => str) + +localVue.filter('truncate', filter) + +describe('UserTeaser', () => { + let propsData + let mocks + let stubs + let getters + + beforeEach(() => { + propsData = {} + + mocks = { + $t: jest.fn(), + } + stubs = { + NuxtLink: RouterLinkStub, + } + getters = { + 'auth/user': () => { + return {} + }, + 'auth/isModerator': () => false, + } + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(UserTeaser, { store, propsData, mocks, stubs, localVue }) + } + + it('renders anonymous user', () => { + const wrapper = Wrapper() + expect(wrapper.text()).toBe('') + expect(mocks.$t).toHaveBeenCalledWith('profile.userAnonym') + }) + + describe('given an user', () => { + beforeEach(() => { + propsData.user = { + name: 'Tilda Swinton', + slug: 'tilda-swinton', + } + }) + + it('renders user name', () => { + const wrapper = Wrapper() + expect(mocks.$t).not.toHaveBeenCalledWith('profile.userAnonym') + expect(wrapper.text()).toMatch('Tilda Swinton') + }) + + describe('user is deleted', () => { + beforeEach(() => { + propsData.user.deleted = true + }) + + it('renders anonymous user', () => { + const wrapper = Wrapper() + expect(wrapper.text()).not.toMatch('Tilda Swinton') + expect(mocks.$t).toHaveBeenCalledWith('profile.userAnonym') + }) + + describe('even if the current user is a moderator', () => { + beforeEach(() => { + getters['auth/isModerator'] = () => true + }) + + it('renders anonymous user', () => { + const wrapper = Wrapper() + expect(wrapper.text()).not.toMatch('Tilda Swinton') + expect(mocks.$t).toHaveBeenCalledWith('profile.userAnonym') + }) + }) + }) + + describe('user is disabled', () => { + beforeEach(() => { + propsData.user.disabled = true + }) + + it('renders anonymous user', () => { + const wrapper = Wrapper() + expect(wrapper.text()).not.toMatch('Tilda Swinton') + expect(mocks.$t).toHaveBeenCalledWith('profile.userAnonym') + }) + + describe('current user is a moderator', () => { + beforeEach(() => { + getters['auth/isModerator'] = () => true + }) + + it('renders user name', () => { + const wrapper = Wrapper() + expect(wrapper.text()).not.toMatch('Anonymous') + expect(wrapper.text()).toMatch('Tilda Swinton') + }) + + it('has "disabled-content" class', () => { + const wrapper = Wrapper() + expect(wrapper.classes()).toContain('disabled-content') + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/UserTeaser/UserTeaser.story.js b/docs/webapp/components/UserTeaser/UserTeaser.story.js new file mode 100644 index 000000000..aa8be58ff --- /dev/null +++ b/docs/webapp/components/UserTeaser/UserTeaser.story.js @@ -0,0 +1,153 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import UserTeaser from '~/components/UserTeaser/UserTeaser.vue' +import helpers from '~/storybook/helpers' + +helpers.init() + +export const user = { + id: 'u6', + slug: 'louie', + name: 'Louie', + avatar: { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/designervzm/128.jpg', + }, + about: + 'Illum in et velit soluta voluptatem architecto consequuntur enim placeat. Eum excepturi est ratione rerum in voluptatum corporis. Illum consequatur minus. Modi incidunt velit.', + disabled: false, + deleted: false, + locationName: null, + location: null, + createdAt: '2019-09-18T14:16:01.695Z', + badges: [], + badgesCount: 0, + shoutedCount: 1, + commentedCount: 2, + contributionsCount: 5, + followingCount: 1, + following: [ + { + id: 'u3', + slug: 'jenny-rostock', + name: 'Jenny Rostock', + avatar: { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/bowbrick/128.jpg', + }, + disabled: false, + deleted: false, + followedByCount: 2, + followedByCurrentUser: false, + contributionsCount: 1, + commentedCount: 3, + badges: [ + { + id: 'indiegogo_en_bear', + icon: '/img/badges/indiegogo_en_bear.svg', + }, + ], + location: { + name: 'Paris', + }, + }, + ], + followedByCount: 0, + followedByCurrentUser: false, + isMuted: false, + followedBy: [], + socialMedia: [], +} +export const group = { + id: 'g2', + name: 'Yoga Practice', + slug: 'yoga-practice', + about: null, + description: `

                              What Is yoga?

                              Yoga is not just about practicing asanas. It's about how we do it.

                              And practicing asanas doesn't have to be yoga, it can be more athletic than yogic.

                              What makes practicing asanas yogic?

                              The important thing is:

                              • Use the exercises (consciously) for your personal development.

                              `, + descriptionExcerpt: `

                              What Is yoga?

                              Yoga is not just about practicing asanas. It's about how we do it.

                              And practicing asanas doesn't have to be yoga, it can be more athletic than yogic.

                              What makes practicing asanas yogic?

                              The important thing is:

                              • Use the exercises …

                              `, + groupType: 'public', + actionRadius: 'interplanetary', + categories: [ + { + id: 'cat4', + icon: 'psyche', + name: 'psyche', + slug: 'psyche', + description: 'Seele, Gefühle, Glück', + }, + { + id: 'cat5', + icon: 'movement', + name: 'body-and-excercise', + slug: 'body-and-excercise', + description: 'Sport, Yoga, Massage, Tanzen, Entspannung', + }, + { + id: 'cat17', + icon: 'spirituality', + name: 'spirituality', + slug: 'spirituality', + description: 'Religion, Werte, Ethik', + }, + ], + locationName: null, + location: null, +} + +storiesOf('UserTeaser', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('user only', () => ({ + components: { UserTeaser }, + store: helpers.store, + data: () => ({ + user, + }), + template: '', + })) + .add('with date', () => ({ + components: { UserTeaser }, + store: helpers.store, + data: () => ({ + user, + }), + template: '', + })) + .add('has edited something', () => ({ + components: { UserTeaser }, + store: helpers.store, + data: () => ({ + user, + }), + template: ` + + + + `, + })) + .add('anonymous', () => ({ + components: { UserTeaser }, + store: helpers.store, + data: () => ({ + user: null, + }), + template: '', + })) + .add('with group and date', () => ({ + components: { UserTeaser }, + store: helpers.store, + data: () => ({ + user, + group, + }), + template: '', + })) + .add('with group and date – wide', () => ({ + components: { UserTeaser }, + store: helpers.store, + data: () => ({ + user, + group, + }), + template: '', + })) diff --git a/docs/webapp/components/UserTeaser/UserTeaser.vue b/docs/webapp/components/UserTeaser/UserTeaser.vue new file mode 100644 index 000000000..a82b91039 --- /dev/null +++ b/docs/webapp/components/UserTeaser/UserTeaser.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/docs/webapp/components/_new/features/InternalPage/InternalPage.vue b/docs/webapp/components/_new/features/InternalPage/InternalPage.vue new file mode 100644 index 000000000..99982e89b --- /dev/null +++ b/docs/webapp/components/_new/features/InternalPage/InternalPage.vue @@ -0,0 +1,34 @@ + + + diff --git a/docs/webapp/components/_new/features/MySomethingList/MySomethingList.spec.js b/docs/webapp/components/_new/features/MySomethingList/MySomethingList.spec.js new file mode 100644 index 000000000..7a588f255 --- /dev/null +++ b/docs/webapp/components/_new/features/MySomethingList/MySomethingList.spec.js @@ -0,0 +1,176 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import MySomethingList from './MySomethingList.vue' + +const localVue = global.localVue + +describe('MySomethingList.vue', () => { + let wrapper + let propsData + let data + let mocks + let mutations + + beforeEach(() => { + propsData = { + useFormData: { dummy: '' }, + useItems: [{ id: 'id', dummy: 'dummy' }], + namePropertyKey: 'dummy', + texts: { + addButton: 'add-button', + addNew: 'add-new-something', + deleteModal: { + titleIdent: 'delete-modal.title', + messageIdent: 'delete-modal.message', + confirm: { icon: 'trash', buttonTextIdent: 'delete-modal.confirm-button' }, + }, + edit: 'edit-something', + }, + callbacks: { edit: jest.fn(), submit: jest.fn(), delete: jest.fn() }, + } + data = () => { + return {} + } + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + mutations = { + 'modal/SET_OPEN': jest.fn().mockResolvedValueOnce(), + } + }) + + describe('mount', () => { + let form, slots + const Wrapper = () => { + slots = { + 'list-item': '
                              ', + 'edit-item': '
                              ', + } + const store = new Vuex.Store({ + mutations, + }) + return mount(MySomethingList, { + propsData, + data, + mocks, + localVue, + slots, + store, + }) + } + + describe('given existing item', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('for each item it', () => { + it('displays the item as slot "list-item"', () => { + expect(wrapper.find('.list-item').exists()).toBe(true) + }) + + it('displays the edit button', () => { + expect(wrapper.find('.base-button[data-test="edit-button"]').exists()).toBe(true) + }) + + it('displays the delete button', () => { + expect(wrapper.find('.base-button[data-test="delete-button"]').exists()).toBe(true) + }) + }) + + describe('editing item', () => { + beforeEach(async () => { + const editButton = wrapper.find('.base-button[data-test="edit-button"]') + editButton.trigger('click') + await Vue.nextTick() + }) + + it('disables adding items while editing', () => { + const submitButton = wrapper.find('.base-button[data-test="add-save-button"]') + expect(submitButton.text()).not.toContain('settings.social-media.submit') + }) + + it('allows the user to cancel editing', async () => { + expect(wrapper.find('.edit-item').exists()).toBe(true) + const cancelButton = wrapper.find('button#cancel') + cancelButton.trigger('click') + await Vue.nextTick() + expect(wrapper.find('.edit-item').exists()).toBe(false) + }) + }) + + describe('calls callback functions', () => { + it('calls edit', async () => { + const editButton = wrapper.find('.base-button[data-test="edit-button"]') + editButton.trigger('click') + await Vue.nextTick() + const expectedItem = expect.objectContaining({ id: 'id', dummy: 'dummy' }) + expect(propsData.callbacks.edit).toHaveBeenCalledTimes(1) + expect(propsData.callbacks.edit).toHaveBeenCalledWith(expect.any(Object), expectedItem) + }) + + it('calls submit', async () => { + form = wrapper.find('form') + form.trigger('submit') + await Vue.nextTick() + form.trigger('submit') + await Vue.nextTick() + const expectedItem = expect.objectContaining({ id: '' }) + expect(propsData.callbacks.submit).toHaveBeenCalledTimes(1) + expect(propsData.callbacks.submit).toHaveBeenCalledWith( + expect.any(Object), + true, + expectedItem, + { dummy: '' }, + ) + }) + + it('calls delete by committing "modal/SET_OPEN"', async () => { + const deleteButton = wrapper.find('.base-button[data-test="delete-button"]') + deleteButton.trigger('click') + await Vue.nextTick() + const expectedModalData = expect.objectContaining({ + name: 'confirm', + data: { + type: '', + resource: { id: '' }, + modalData: { + titleIdent: 'delete-modal.title', + messageIdent: 'delete-modal.message', + messageParams: { + name: 'dummy', + }, + buttons: { + confirm: { + danger: true, + icon: 'trash', + textIdent: 'delete-modal.confirm-button', + callback: expect.any(Function), + }, + cancel: { + icon: 'close', + textIdent: 'actions.cancel', + callback: expect.any(Function), + }, + }, + }, + }, + }) + expect(mutations['modal/SET_OPEN']).toHaveBeenCalledTimes(1) + expect(mutations['modal/SET_OPEN']).toHaveBeenCalledWith( + expect.any(Object), + expectedModalData, + ) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/_new/features/MySomethingList/MySomethingList.vue b/docs/webapp/components/_new/features/MySomethingList/MySomethingList.vue new file mode 100644 index 000000000..5d904675e --- /dev/null +++ b/docs/webapp/components/_new/features/MySomethingList/MySomethingList.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/docs/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue b/docs/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue new file mode 100644 index 000000000..5d7cdeea2 --- /dev/null +++ b/docs/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue @@ -0,0 +1,39 @@ + + + diff --git a/docs/webapp/components/_new/features/SearchResults/SearchResults.spec.js b/docs/webapp/components/_new/features/SearchResults/SearchResults.spec.js new file mode 100644 index 000000000..ace02bd46 --- /dev/null +++ b/docs/webapp/components/_new/features/SearchResults/SearchResults.spec.js @@ -0,0 +1,245 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import SearchResults from './SearchResults' +import helpers from '~/storybook/helpers' + +helpers.init() + +const localVue = global.localVue + +localVue.directive('scrollTo', jest.fn()) + +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} + +describe('SearchResults', () => { + let mocks, getters, propsData, wrapper + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(SearchResults, { mocks, localVue, propsData, store, stubs }) + } + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $env: { + CATEGORIES_ACTIVE: false, + }, + } + getters = { + 'auth/user': () => { + return { id: 'u343', name: 'Matt' } + }, + 'auth/isModerator': () => false, + } + propsData = { + pageSize: 12, + search: '', + } + wrapper = Wrapper() + }) + + describe('mount', () => { + it('renders tab-navigation component', () => { + expect(wrapper.find('.tab-navigation').exists()).toBe(true) + }) + + describe('searchResults', () => { + describe('contains no results', () => { + it('renders hc-empty component', () => { + expect(wrapper.find('.hc-empty').exists()).toBe(true) + }) + }) + + describe('result contains 25 posts, 8 users and 0 hashtags', () => { + // we couldn't get it running with "jest.runAllTimers()" and so we used "setTimeout" + // time is a bit more then 3000 milisec see "webapp/components/CountTo.vue" + const counterTimeout = 3000 + 10 + + beforeEach(async () => { + wrapper.setData({ + posts: helpers.fakePost(12), + postCount: 25, + users: helpers.fakeUser(8), + userCount: 8, + activeTab: 'Post', + }) + }) + + it('shows a total of 33 results', () => { + setTimeout(() => { + expect(wrapper.find('.total-search-results').text()).toContain('33') + }, counterTimeout) + }) + + it('shows tab with 25 posts found', () => { + setTimeout(() => { + expect(wrapper.find('[data-test="Post-tab"]').text()).toContain('25') + }, counterTimeout) + }) + + it('shows tab with 8 users found', () => { + setTimeout(() => { + expect(wrapper.find('[data-test="User-tab"]').text()).toContain('8') + }, counterTimeout) + }) + + it('shows tab with 0 hashtags found', () => { + setTimeout(() => { + expect(wrapper.find('[data-test="Hashtag-tab"]').text()).toContain('0') + }, counterTimeout) + }) + + it('has post tab as active tab', () => { + expect(wrapper.find('[data-test="Post-tab"]').classes('--active')).toBe(true) + }) + + it('has user tab inactive', () => { + expect(wrapper.find('[data-test="User-tab"]').classes('--active')).toBe(false) + }) + + it('has hashtag tab disabled', () => { + expect(wrapper.find('[data-test="Hashtag-tab"]').classes('--disabled')).toBe(true) + }) + + it('displays 12 (pageSize) posts', () => { + expect(wrapper.findAll('.post-teaser')).toHaveLength(12) + }) + + it('has post tab inactive after emitting switch-tab', async () => { + wrapper.find('.tab-navigation').vm.$emit('switch-tab', 'User') // emits direct from tab component to search results + await wrapper.vm.$nextTick() + await expect(wrapper.find('[data-test="Post-tab"]').classes('--active')).toBe(false) + }) + + it('has post tab inactive after clicking on user tab', async () => { + wrapper.find('[data-test="User-tab-click"]').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('[data-test="Post-tab"]').classes('--active')).toBe(false) + }) + + it('has user tab active after clicking on user tab', async () => { + wrapper.find('[data-test="User-tab-click"]').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('[data-test="User-tab"]').classes('--active')).toBe(true) + }) + + it('displays 8 users after clicking on user tab', async () => { + wrapper.find('[data-test="User-tab-click"]').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.findAll('.user-teaser')).toHaveLength(8) + }) + + it('shows the pagination buttons for posts', () => { + expect(wrapper.find('.pagination-buttons').exists()).toBe(true) + }) + + it('shows no pagination buttons for users', async () => { + wrapper.find('[data-test="User-tab-click"]').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.pagination-buttons').exists()).toBe(false) + }) + + it('displays page 1 of 3 for the 25 posts', () => { + expect(wrapper.find('.pagination-pageCount').text().replace(/\s+/g, ' ')).toContain( + '1 / 3', + ) + }) + + it('displays the next page button for the 25 posts', () => { + expect(wrapper.find('.next-button').exists()).toBe(true) + }) + + it('deactivates previous page button for the 25 posts', () => { + const previousButton = wrapper.find('[data-test="previous-button"]') + expect(previousButton.attributes().disabled).toEqual('disabled') + }) + + it('displays page 2 / 3 when next-button is clicked', async () => { + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.pagination-pageCount').text().replace(/\s+/g, ' ')).toContain( + '2 / 3', + ) + }) + + it('sets apollo searchPosts offset to 12 when next-button is clicked', async () => { + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect( + wrapper.vm.$options.apollo.searchPosts.variables.bind(wrapper.vm)(), + ).toMatchObject({ query: '', firstPosts: 12, postsOffset: 12 }) + }) + + it('displays the next page button when next-button is clicked', async () => { + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.next-button').exists()).toBe(true) + }) + + it('displays the previous page button when next-button is clicked', async () => { + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.previous-button').exists()).toBe(true) + }) + + it('displays page 3 / 3 when next-button is clicked twice', async () => { + wrapper.find('.next-button').trigger('click') + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.pagination-pageCount').text().replace(/\s+/g, ' ')).toContain( + '3 / 3', + ) + }) + + it('sets apollo searchPosts offset to 24 when next-button is clicked twice', async () => { + wrapper.find('.next-button').trigger('click') + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect( + wrapper.vm.$options.apollo.searchPosts.variables.bind(wrapper.vm)(), + ).toMatchObject({ query: '', firstPosts: 12, postsOffset: 24 }) + }) + + it('deactivates next page button when next-button is clicked twice', async () => { + const nextButton = wrapper.find('[data-test="next-button"]') + nextButton.trigger('click') + nextButton.trigger('click') + await wrapper.vm.$nextTick() + expect(nextButton.attributes().disabled).toEqual('disabled') + }) + + it('displays the previous page button when next-button is clicked twice', async () => { + wrapper.find('.next-button').trigger('click') + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.previous-button').exists()).toBe(true) + }) + + it('displays page 1 / 3 when previous-button is clicked after next-button', async () => { + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + wrapper.find('.previous-button').trigger('click') + await wrapper.vm.$nextTick() + await expect(wrapper.find('.pagination-pageCount').text().replace(/\s+/g, ' ')).toContain( + '1 / 3', + ) + }) + + it('sets apollo searchPosts offset to 0 when previous-button is clicked after next-button', async () => { + wrapper.find('.next-button').trigger('click') + await wrapper.vm.$nextTick() + wrapper.find('.previous-button').trigger('click') + await wrapper.vm.$nextTick() + await expect( + wrapper.vm.$options.apollo.searchPosts.variables.bind(wrapper.vm)(), + ).toMatchObject({ query: '', firstPosts: 12, postsOffset: 0 }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/_new/features/SearchResults/SearchResults.vue b/docs/webapp/components/_new/features/SearchResults/SearchResults.vue new file mode 100644 index 000000000..20385ce64 --- /dev/null +++ b/docs/webapp/components/_new/features/SearchResults/SearchResults.vue @@ -0,0 +1,442 @@ + + + + + diff --git a/docs/webapp/components/_new/features/SocialMedia/SocialMediaListItem.spec.js b/docs/webapp/components/_new/features/SocialMedia/SocialMediaListItem.spec.js new file mode 100644 index 000000000..c7359d873 --- /dev/null +++ b/docs/webapp/components/_new/features/SocialMedia/SocialMediaListItem.spec.js @@ -0,0 +1,36 @@ +import { shallowMount } from '@vue/test-utils' +import SocialMediaListItem from './SocialMediaListItem.vue' + +describe('SocialMediaListItem.vue', () => { + let wrapper + let propsData + const socialMediaUrl = 'https://freeradical.zone/@mattwr18' + const faviconUrl = 'https://freeradical.zone/favicon.ico' + + beforeEach(() => { + propsData = {} + }) + + describe('shallowMount', () => { + const Wrapper = () => { + return shallowMount(SocialMediaListItem, { propsData }) + } + + describe('given existing social media links', () => { + beforeEach(() => { + propsData = { item: { id: 's1', url: socialMediaUrl, favicon: faviconUrl } } + wrapper = Wrapper() + }) + + describe('for each link item it', () => { + it('displays the favicon', () => { + expect(wrapper.find(`img[src="${faviconUrl}"]`).exists()).toBe(true) + }) + + it('displays the url', () => { + expect(wrapper.find(`a[href="${socialMediaUrl}"]`).exists()).toBe(true) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/_new/features/SocialMedia/SocialMediaListItem.vue b/docs/webapp/components/_new/features/SocialMedia/SocialMediaListItem.vue new file mode 100644 index 000000000..75dea7ba8 --- /dev/null +++ b/docs/webapp/components/_new/features/SocialMedia/SocialMediaListItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/docs/webapp/components/_new/generic/BaseButton/BaseButton.story.js b/docs/webapp/components/_new/generic/BaseButton/BaseButton.story.js new file mode 100644 index 000000000..1b7ffec91 --- /dev/null +++ b/docs/webapp/components/_new/generic/BaseButton/BaseButton.story.js @@ -0,0 +1,85 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import BaseButton from './BaseButton.vue' + +storiesOf('Generic/BaseButton', module) + .addDecorator(helpers.layout) + + .add('default', () => ({ + components: { BaseButton }, + template: ` +
                              + Click me + Disabled + Loading +
                              + `, + })) + + .add('icon', () => ({ + components: { BaseButton }, + template: ` +
                              + With Text + + + +
                              + `, + })) + + .add('circle', () => ({ + components: { BaseButton }, + template: ` +
                              + + EN + + +
                              + `, + })) + + .add('danger', () => ({ + components: { BaseButton }, + template: ` +
                              + Danger + Disabled + Loading +
                              + `, + })) + + .add('filled', () => ({ + components: { BaseButton }, + template: ` +
                              + Filled + Filled Danger + Disabled + Loading +
                              + `, + })) + + .add('small', () => ({ + components: { BaseButton }, + template: ` +
                              + Small + S +
                              + `, + })) + + .add('ghost', () => ({ + // TODO: add documentation --> ghost button should only be used for very special occasions + // e.g. for the ContentMenu + for the EditorMenuBarButtons + components: { BaseButton }, + template: ` +
                              + +
                              + `, + })) diff --git a/docs/webapp/components/_new/generic/BaseButton/BaseButton.vue b/docs/webapp/components/_new/generic/BaseButton/BaseButton.vue new file mode 100644 index 000000000..a51c3101c --- /dev/null +++ b/docs/webapp/components/_new/generic/BaseButton/BaseButton.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/BaseCard/BaseCard.story.js b/docs/webapp/components/_new/generic/BaseCard/BaseCard.story.js new file mode 100644 index 000000000..928aba5e6 --- /dev/null +++ b/docs/webapp/components/_new/generic/BaseCard/BaseCard.story.js @@ -0,0 +1,79 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import logos from '~/constants/logos.js' +import BaseCard from './BaseCard.vue' + +storiesOf('Generic/BaseCard', module) + .addDecorator(helpers.layout) + + .add('default', () => ({ + components: { BaseCard }, + template: ` + +

                              I am a card heading

                              +

                              And I am a paragraph.

                              +
                              + `, + })) + + .add('with slot: hero image', () => ({ + components: { BaseCard }, + template: ` + + +

                              I am a card heading

                              +

                              And I am a paragraph.

                              +
                              + `, + })) + + .add('with slot: image column', () => ({ + components: { BaseCard }, + template: ` + + +

                              I am a card heading

                              +

                              And I am a paragraph.

                              +
                              + `, + })) + + .add('with slot: topMenu', () => ({ + components: { BaseCard }, + template: ` + + +

                              I am a card heading

                              +

                              And I am a paragraph.

                              + +
                              + `, + })) + + .add('with highlight prop', () => ({ + components: { BaseCard }, + template: ` + +

                              I am a card heading

                              +

                              And I am a paragraph.

                              +
                              + `, + })) + + .add('with wideContent prop', () => ({ + components: { BaseCard }, + template: ` + +

                              I am a card heading

                              +

                              And I am a paragraph.

                              +
                              + `, + })) diff --git a/docs/webapp/components/_new/generic/BaseCard/BaseCard.vue b/docs/webapp/components/_new/generic/BaseCard/BaseCard.vue new file mode 100644 index 000000000..86b1a6652 --- /dev/null +++ b/docs/webapp/components/_new/generic/BaseCard/BaseCard.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/BaseIcon/BaseIcon.story.js b/docs/webapp/components/_new/generic/BaseIcon/BaseIcon.story.js new file mode 100644 index 000000000..5ddfe4ff4 --- /dev/null +++ b/docs/webapp/components/_new/generic/BaseIcon/BaseIcon.story.js @@ -0,0 +1,53 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import BaseIcon from './BaseIcon.vue' +import { iconNames } from '~/assets/_new/icons' + +const wrapperStyles = ` + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 100%; +` + +const iconPresenterStyles = ` + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + width: 20%; + max-width: 120px; + height: 120px; + padding: 12px; + margin-right: 20px; + margin-bottom: 20px; + background-color: white; + text-align: center; +` + +const iconStyles = ` + font-size: 20px; +` + +storiesOf('Generic/BaseIcon', module) + .addDecorator(helpers.layout) + + .add('pure icon', () => ({ + components: { BaseIcon }, + template: '', + })) + + .add('all icons', () => ({ + components: { BaseIcon }, + data() { + return { iconNames } + }, + template: ` +
                              +
                              + + {{ name }} +
                              +
                              + `, + })) diff --git a/docs/webapp/components/_new/generic/BaseIcon/BaseIcon.vue b/docs/webapp/components/_new/generic/BaseIcon/BaseIcon.vue new file mode 100644 index 000000000..ef09e2e03 --- /dev/null +++ b/docs/webapp/components/_new/generic/BaseIcon/BaseIcon.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js b/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js new file mode 100644 index 000000000..584a971c4 --- /dev/null +++ b/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js @@ -0,0 +1,45 @@ +import { mount } from '@vue/test-utils' +import CounterIcon from './CounterIcon' +import BaseIcon from '../BaseIcon/BaseIcon' + +const localVue = global.localVue + +describe('CounterIcon.vue', () => { + let propsData, wrapper, count + + const Wrapper = () => { + return mount(CounterIcon, { propsData, localVue }) + } + + describe('given a valid icon name and count below 100', () => { + beforeEach(() => { + propsData = { icon: 'comments', count: 42 } + wrapper = Wrapper() + count = wrapper.find('.count') + }) + + it('renders the icon', () => { + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) + }) + + it('renders the count', () => { + expect(count.text()).toEqual('42') + }) + }) + + describe('given a valid icon name and count above 100', () => { + beforeEach(() => { + propsData = { icon: 'comments', count: 750 } + wrapper = Wrapper() + count = wrapper.find('.count') + }) + + it('renders the icon', () => { + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) + }) + + it('renders the capped count with a plus', () => { + expect(count.text()).toEqual('99+') + }) + }) +}) diff --git a/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.story.js b/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.story.js new file mode 100644 index 000000000..4bc685d62 --- /dev/null +++ b/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.story.js @@ -0,0 +1,41 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import CounterIcon from './CounterIcon.vue' + +storiesOf('Generic/CounterIcon', module) + .addDecorator(helpers.layout) + + .add('default', () => ({ + components: { CounterIcon }, + template: ` + + `, + })) + + .add('high count', () => ({ + components: { CounterIcon }, + template: ` + + `, + })) + + .add('danger', () => ({ + components: { CounterIcon }, + template: ` + + `, + })) + + .add('soft', () => ({ + components: { CounterIcon }, + template: ` + + `, + })) + + .add('count is 0', () => ({ + components: { CounterIcon }, + template: ` + + `, + })) diff --git a/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.vue b/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.vue new file mode 100644 index 000000000..0d97921ce --- /dev/null +++ b/docs/webapp/components/_new/generic/CounterIcon/CounterIcon.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/LabeledButton/LabeledButton.story.js b/docs/webapp/components/_new/generic/LabeledButton/LabeledButton.story.js new file mode 100644 index 000000000..b0f13b885 --- /dev/null +++ b/docs/webapp/components/_new/generic/LabeledButton/LabeledButton.story.js @@ -0,0 +1,22 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import LabeledButton from './LabeledButton.vue' + +helpers.init() + +storiesOf('Generic/LabeledButton', module) + .addDecorator(helpers.layout) + .add('default', () => ({ + components: { LabeledButton }, + data: () => ({ + filled: false, + }), + template: ` + + `, + })) diff --git a/docs/webapp/components/_new/generic/LabeledButton/LabeledButton.vue b/docs/webapp/components/_new/generic/LabeledButton/LabeledButton.vue new file mode 100644 index 000000000..af3ad157f --- /dev/null +++ b/docs/webapp/components/_new/generic/LabeledButton/LabeledButton.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.story.js b/docs/webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.story.js new file mode 100644 index 000000000..d61f02db4 --- /dev/null +++ b/docs/webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.story.js @@ -0,0 +1,11 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import LoadingSpinner from './LoadingSpinner.vue' + +storiesOf('Generic/LoadingSpinner', module) + .addDecorator(helpers.layout) + + .add('default', () => ({ + components: { LoadingSpinner }, + template: '', + })) diff --git a/docs/webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.vue b/docs/webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.vue new file mode 100644 index 000000000..529a029d9 --- /dev/null +++ b/docs/webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.spec.js b/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.spec.js new file mode 100644 index 000000000..03c66e345 --- /dev/null +++ b/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.spec.js @@ -0,0 +1,85 @@ +import { mount } from '@vue/test-utils' + +import PaginationButtons from './PaginationButtons' + +const localVue = global.localVue + +describe('PaginationButtons.vue', () => { + const propsData = { + showPageCounter: true, + activePage: 1, + activeResourceCount: 57, + } + let wrapper + const mocks = { + $t: jest.fn(), + } + + const Wrapper = () => { + return mount(PaginationButtons, { mocks, propsData, localVue }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('next button', () => { + it('is disabled by default', () => { + const nextButton = wrapper.find('[data-test="next-button"]') + expect(nextButton.attributes().disabled).toEqual('disabled') + }) + + it('is enabled if hasNext is true', async () => { + wrapper.setProps({ hasNext: true }) + await wrapper.vm.$nextTick() + const nextButton = wrapper.find('[data-test="next-button"]') + expect(nextButton.attributes().disabled).toBeUndefined() + }) + + it('emits next when clicked', async () => { + wrapper.setProps({ hasNext: true }) + await wrapper.vm.$nextTick() + wrapper.find('[data-test="next-button"]').trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.emitted().next).toHaveLength(1) + }) + }) + + describe('previous button', () => { + it('is disabled by default', () => { + const previousButton = wrapper.find('[data-test="previous-button"]') + expect(previousButton.attributes().disabled).toEqual('disabled') + }) + + it('is enabled if hasPrevious is true', async () => { + wrapper.setProps({ hasPrevious: true }) + await wrapper.vm.$nextTick() + const previousButton = wrapper.find('[data-test="previous-button"]') + expect(previousButton.attributes().disabled).toBeUndefined() + }) + + it('emits back when clicked', async () => { + wrapper.setProps({ hasPrevious: true }) + await wrapper.vm.$nextTick() + wrapper.find('[data-test="previous-button"]').trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.emitted().back).toHaveLength(1) + }) + }) + + describe('page counter', () => { + it('displays the page counter when showPageCount is true', () => { + const paginationPageCount = wrapper.find('[data-test="pagination-pageCount"]') + expect(paginationPageCount.text().replace(/\s+/g, ' ')).toEqual('2 / 3') + }) + + it('does not display the page counter when showPageCount is false', async () => { + wrapper.setProps({ showPageCounter: false }) + await wrapper.vm.$nextTick() + const paginationPageCount = wrapper.find('[data-test="pagination-pageCount"]') + expect(paginationPageCount.exists()).toEqual(false) + }) + }) + }) +}) diff --git a/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.story.js b/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.story.js new file mode 100644 index 000000000..79d0fad69 --- /dev/null +++ b/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.story.js @@ -0,0 +1,28 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import PaginationButtons from '~/components/_new/generic/PaginationButtons/PaginationButtons' +import helpers from '~/storybook/helpers' + +helpers.init() + +storiesOf('PaginationButtons', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('basic pagination', () => ({ + components: { PaginationButtons }, + data: () => ({ + hasNext: true, + hasPrevious: false, + }), + methods: { + back: action('back'), + next: action('next'), + }, + template: ``, + })) diff --git a/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.vue b/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.vue new file mode 100644 index 000000000..b2ebe9139 --- /dev/null +++ b/docs/webapp/components/_new/generic/PaginationButtons/PaginationButtons.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js b/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js new file mode 100644 index 000000000..413af5047 --- /dev/null +++ b/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js @@ -0,0 +1,103 @@ +import { mount } from '@vue/test-utils' +import ProfileAvatar from './ProfileAvatar' +import BaseIcon from '~/components/_new/generic/BaseIcon/BaseIcon' + +const localVue = global.localVue + +describe('ProfileAvatar', () => { + let propsData, wrapper + beforeEach(() => { + propsData = {} + wrapper = Wrapper() + }) + + const Wrapper = () => { + return mount(ProfileAvatar, { propsData, localVue }) + } + + it('renders no image', () => { + expect(wrapper.find('img').exists()).toBe(false) + }) + + it('renders an icon', () => { + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) + }) + + describe('given a profile', () => { + describe('with no image', () => { + beforeEach(() => { + propsData = { + profile: { + name: 'Matt Rider', + }, + } + wrapper = Wrapper() + }) + + describe('no profile name', () => { + it('renders an icon', () => { + propsData = { profile: { name: null } } + wrapper = Wrapper() + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) + }) + }) + + describe("profile name is 'Anonymous'", () => { + it('renders an icon', () => { + propsData = { profile: { name: 'Anonymous' } } + wrapper = Wrapper() + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) + }) + }) + + it('displays profile initials', () => { + expect(wrapper.find('.initials').text()).toEqual('MR') + }) + + it('displays no more than 3 initials', () => { + propsData = { profile: { name: 'Ana Paula Nunes Marques' } } + wrapper = Wrapper() + expect(wrapper.find('.initials').text()).toEqual('APN') + }) + }) + + describe('with a relative avatar url', () => { + beforeEach(() => { + propsData = { + profile: { + name: 'Not Anonymous', + avatar: { + url: '/avatar.jpg', + }, + }, + } + wrapper = Wrapper() + }) + + it('adds a prefix to load the image from the uploads service', () => { + expect(wrapper.find('.image').attributes('src')).toBe('/api/avatar.jpg') + }) + }) + + describe('with an absolute avatar url', () => { + beforeEach(() => { + propsData = { + profile: { + name: 'Not Anonymous', + avatar: { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/sawalazar/128.jpg', + }, + }, + } + wrapper = Wrapper() + }) + + it('keeps the avatar URL as is', () => { + // e.g. our seeds have absolute image URLs + expect(wrapper.find('.image').attributes('src')).toBe( + 'https://s3.amazonaws.com/uifaces/faces/twitter/sawalazar/128.jpg', + ) + }) + }) + }) +}) diff --git a/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.story.js b/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.story.js new file mode 100644 index 000000000..2b4bccd5e --- /dev/null +++ b/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.story.js @@ -0,0 +1,77 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import StoryRouter from 'storybook-vue-router' +import ProfileAvatar from '~/components/_new/generic/ProfileAvatar/ProfileAvatar' +import helpers from '~/storybook/helpers' +import { user } from '~/components/UserTeaser/UserTeaser.story.js' +import imageFile from './storybook/critical-avatar-white-background.png' + +helpers.init() +const anonymousUser = { + ...user, + name: 'Anonymous', + avatar: null, +} +const userWithoutAvatar = { + ...user, + name: 'Ana Paula Nunes Marques', + avatar: null, +} +const userWithAvatar = { + ...user, + name: 'Jochen Image', + avatar: { url: imageFile }, +} +storiesOf('ProfileAvatar', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .addDecorator(StoryRouter()) + .add('normal, with image', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: userWithAvatar, + }), + template: '', + })) + .add('normal without image, anonymous user', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: anonymousUser, + }), + template: '', + })) + .add('normal without image, user initials', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: userWithoutAvatar, + }), + template: '', + })) + .add('small, with image', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: userWithAvatar, + }), + template: '', + })) + .add('small', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: userWithoutAvatar, + }), + template: '', + })) + .add('large, with image', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: userWithAvatar, + }), + template: '', + })) + .add('large', () => ({ + components: { ProfileAvatar }, + data: () => ({ + user: userWithoutAvatar, + }), + template: '', + })) diff --git a/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue b/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue new file mode 100644 index 000000000..d681276b5 --- /dev/null +++ b/docs/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/ProfileAvatar/storybook/critical-avatar-white-background.png b/docs/webapp/components/_new/generic/ProfileAvatar/storybook/critical-avatar-white-background.png new file mode 100644 index 000000000..adfaa5a86 Binary files /dev/null and b/docs/webapp/components/_new/generic/ProfileAvatar/storybook/critical-avatar-white-background.png differ diff --git a/docs/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js b/docs/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js new file mode 100644 index 000000000..f545839ef --- /dev/null +++ b/docs/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js @@ -0,0 +1,107 @@ +import { mount } from '@vue/test-utils' +import TabNavigation from './TabNavigation' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, +} + +describe('TabNavigation', () => { + let mocks, propsData, wrapper + const Wrapper = () => { + return mount(TabNavigation, { mocks, localVue, propsData, stubs }) + } + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + propsData = { + tabs: [ + { + type: 'Post', + title: 'Posts', + count: 12, + disabled: false, + }, + { + type: 'User', + title: 'Users', + count: 9, + disabled: false, + }, + { + type: 'Hashtag', + title: 'Hashtags', + count: 0, + disabled: true, + }, + ], + activeTab: 'Post', + } + wrapper = Wrapper() + }) + + describe('mount', () => { + it('renders tab-navigation component', () => { + expect(wrapper.find('.tab-navigation').exists()).toBe(true) + }) + + describe('displays', () => { + // we couldn't get it running with "jest.runAllTimers()" and so we used "setTimeout" + // time is a bit more then 3000 milisec see "webapp/components/CountTo.vue" + const counterTimeout = 3000 + 10 + + it('shows a total of 17 results', () => { + setTimeout(() => { + expect(wrapper.find('.total-search-results').text()).toContain('17') + }, counterTimeout) + }) + + it('shows tab with 12 posts', () => { + setTimeout(() => { + expect(wrapper.find('[data-test="Post-tab"]').text()).toContain('12') + }, counterTimeout) + }) + + it('shows tab with 9 users', () => { + setTimeout(() => { + expect(wrapper.find('[data-test="User-tab"]').text()).toContain('9') + }, counterTimeout) + }) + + it('shows tab with 0 hashtags', () => { + setTimeout(() => { + expect(wrapper.find('[data-test="Hashtag-tab"]').text()).toContain('0') + }, counterTimeout) + }) + + describe('basic props setting', () => { + it('has post tab as active tab', () => { + expect(wrapper.find('[data-test="Post-tab"]').classes('--active')).toBe(true) + }) + + it('has user tab inactive', () => { + expect(wrapper.find('[data-test="User-tab"]').classes('--active')).toBe(false) + }) + + it('has hashtag tab disabled', () => { + expect(wrapper.find('[data-test="Hashtag-tab"]').classes('--disabled')).toBe(true) + }) + }) + }) + + describe('interactions', () => { + it('emits "switch-tab" with "User" after clicking on user tab', () => { + wrapper.find('[data-test="User-tab-click"]').trigger('click') + expect(wrapper.emitted('switch-tab')).toEqual([['User']]) + }) + + it('emits no "switch-tab" after clicking on inactiv hashtag tab', () => { + wrapper.find('[data-test="Hashtag-tab-click"]').trigger('click') + expect(wrapper.emitted('switch-tab')).toBeFalsy() + }) + }) + }) +}) diff --git a/docs/webapp/components/_new/generic/TabNavigation/TabNavigation.vue b/docs/webapp/components/_new/generic/TabNavigation/TabNavigation.vue new file mode 100644 index 000000000..ff06c42d9 --- /dev/null +++ b/docs/webapp/components/_new/generic/TabNavigation/TabNavigation.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/docs/webapp/components/_new/generic/TabNavigation/TabNavigator.story.js b/docs/webapp/components/_new/generic/TabNavigation/TabNavigator.story.js new file mode 100644 index 000000000..6da7a5763 --- /dev/null +++ b/docs/webapp/components/_new/generic/TabNavigation/TabNavigator.story.js @@ -0,0 +1,188 @@ +import faker from '@faker-js/faker' +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import HcEmpty from '~/components/Empty/Empty' +import MasonryGrid from '~/components/MasonryGrid/MasonryGrid' +import MasonryGridItem from '~/components/MasonryGrid/MasonryGridItem' +import PostTeaser from '~/components/PostTeaser/PostTeaser' +import TabNavigation from '~/components/_new/generic/TabNavigation/TabNavigation' +import UserTeaser from '~/components/UserTeaser/UserTeaser' +import HcHashtag from '~/components/Hashtag/Hashtag' +import helpers from '~/storybook/helpers' +import { post } from '~/components/PostTeaser/PostTeaser.story.js' +import { user } from '~/components/UserTeaser/UserTeaser.story.js' + +helpers.init() + +const postMock = (fields) => { + return { + ...post, + id: faker.random.uuid(), + createdAt: faker.date.past(), + updatedAt: faker.date.recent(), + deleted: false, + disabled: false, + typename: 'Post', + ...fields, + } +} + +const userMock = (fields) => { + return { + ...user, + id: faker.random.uuid(), + createdAt: faker.date.past(), + updatedAt: faker.date.recent(), + deleted: false, + disabled: false, + typename: 'User', + ...fields, + } +} + +const posts = [ + postMock(), + postMock({ author: user }), + postMock({ title: faker.lorem.sentence() }), + postMock({ contentExcerpt: faker.lorem.paragraph() }), + postMock({ author: user }), + postMock({ title: faker.lorem.sentence() }), + postMock({ author: user }), +] + +const users = [ + userMock(), + userMock({ slug: 'louie-rider', name: 'Louie Rider' }), + userMock({ slug: 'louicinda-johnson', name: 'Louicinda Jonhson' }), + userMock({ slug: 'sam-louie', name: 'Sam Louie' }), + userMock({ slug: 'loucette', name: 'Loucette Rider' }), + userMock({ slug: 'louis', name: 'Louis' }), + userMock({ slug: 'louanna', name: 'Louanna' }), +] + +storiesOf('TabNavigator', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('given search results of posts, users, hashtags', () => ({ + components: { + TabNavigation, + HcEmpty, + MasonryGrid, + MasonryGridItem, + PostTeaser, + UserTeaser, + HcHashtag, + }, + store: helpers.store, + data: () => ({ + posts: posts, + users: users, + hashtags: [], + + postCount: posts.length, + userCount: users.length, + hashtagCount: 0, + + activeTab: 'Post', + }), + computed: { + activeResources() { + if (this.activeTab === 'Post') return this.posts + if (this.activeTab === 'User') return this.users + if (this.activeTab === 'Hashtag') return this.hashtags + return [] + }, + activeResourceCount() { + if (this.activeTab === 'Post') return this.postCount + if (this.activeTab === 'User') return this.userCount + if (this.activeTab === 'Hashtag') return this.hashtagCount + return 0 + }, + tabOptions() { + return [ + { + type: 'Post', + title: this.$t('search.heading.Post', {}, this.postCount), + count: this.postCount, + disabled: this.postCount === 0, + }, + { + type: 'User', + title: this.$t('search.heading.User', {}, this.userCount), + count: this.userCount, + disabled: this.userCount === 0, + }, + { + type: 'Hashtag', + title: this.$t('search.heading.Tag', {}, this.hashtagCount), + count: this.hashtagCount, + disabled: this.hashtagCount === 0, + }, + ] + }, + searchCount() { + return this.postCount + this.userCount + this.hashtagCount + }, + }, + methods: { + switchTab(tabType) { + if (this.activeTab !== tabType) { + this.activeTab = tabType + } + }, + }, + template: ` +
                              + + + + + + + + + + + + + + + + + +
                              + `, + })) diff --git a/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js b/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js new file mode 100644 index 000000000..7a99e85aa --- /dev/null +++ b/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js @@ -0,0 +1,92 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' +import Vuex from 'vuex' +import FiledReportsTable from './FiledReportsTable' +import { reports } from '~/components/features/ReportList/ReportList.story.js' + +const localVue = global.localVue + +localVue.filter('truncate', (string) => string) + +describe('FiledReportsTable.vue', () => { + let wrapper, mocks, propsData, stubs, filed + + beforeEach(() => { + mocks = { + $t: jest.fn((string) => string), + } + stubs = { + NuxtLink: RouterLinkStub, + 'client-only': true, + } + propsData = {} + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters: { + 'auth/isModerator': () => true, + 'auth/user': () => { + return { id: 'moderator' } + }, + }, + }) + return mount(FiledReportsTable, { + propsData, + mocks, + localVue, + store, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('given reports', () => { + beforeEach(() => { + filed = reports.map((report) => report.filed) + propsData.filed = filed[0] + wrapper = Wrapper() + }) + + it('renders a table', () => { + expect(wrapper.find('.ds-table').exists()).toBe(true) + }) + + it('has 4 columns', () => { + expect(wrapper.findAll('.ds-table-col')).toHaveLength(4) + }) + + describe('FiledReport', () => { + it('renders the reporting user', () => { + const userSlug = wrapper.find('[data-test="filing-user"]') + expect(userSlug.text()).toContain('@community-moderator') + }) + + it('renders the reported date', () => { + const date = wrapper.find('[data-test="filed-date"]') + expect(date.text()).toEqual('10/02/2019') + }) + + it('renders the category text', () => { + const columns = wrapper.findAll('.ds-table-col') + const reasonCategory = columns.filter( + (category) => + category.text() === 'report.reason.category.options.pornographic_content_links', + ) + expect(reasonCategory.exists()).toBe(true) + }) + + it("renders the Post's content", () => { + const columns = wrapper.findAll('.ds-table-col') + const reasonDescription = columns.filter( + (column) => column.text() === 'This comment is porno!!!', + ) + expect(reasonDescription.exists()).toBe(true) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.story.js b/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.story.js new file mode 100644 index 000000000..ec17b06e3 --- /dev/null +++ b/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.story.js @@ -0,0 +1,25 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import FiledReportsTable from '~/components/features/FiledReportsTable/FiledReportsTable' +import helpers from '~/storybook/helpers' +import { reports } from '~/components/features/ReportList/ReportList.story.js' + +storiesOf('FiledReportsTable', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('with filed reports', () => ({ + components: { FiledReportsTable }, + store: helpers.store, + data: () => ({ + filed: reports[0].filed, + }), + template: ` + + + + + +
                              + +
                              `, + })) diff --git a/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.vue b/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.vue new file mode 100644 index 000000000..363ab0e9e --- /dev/null +++ b/docs/webapp/components/features/FiledReportsTable/FiledReportsTable.vue @@ -0,0 +1,73 @@ + + + + diff --git a/docs/webapp/components/features/ProfileList/FollowList.spec.js b/docs/webapp/components/features/ProfileList/FollowList.spec.js new file mode 100644 index 000000000..3398b0993 --- /dev/null +++ b/docs/webapp/components/features/ProfileList/FollowList.spec.js @@ -0,0 +1,157 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' + +import helpers from '~/storybook/helpers' +import FollowList from './FollowList.vue' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'ds-space': true, + 'nuxt-link': true, +} + +const user = { + ...helpers.fakeUser()[0], + followedByCount: 12, + followingCount: 15, + followedBy: helpers.fakeUser(7), + following: helpers.fakeUser(7), +} + +const allConnectionsUser = { + ...user, + followedBy: [ + ...user.followedBy, + ...helpers.fakeUser(user.followedByCount - user.followedBy.length), + ], + following: [...user.following, ...helpers.fakeUser(user.followingCount - user.following.length)], +} + +const noConnectionsUser = { + ...user, + followedByCount: 0, + followingCount: 0, + followedBy: [], + following: [], +} + +describe('FollowList.vue', () => { + let store, getters + const Wrapper = (customProps) => + mount(FollowList, { + store, + propsData: { user, ...customProps }, + mocks: { + $t: jest.fn((str) => str), + }, + localVue, + stubs, + }) + + beforeAll(() => { + getters = { + 'auth/user': () => { + return {} + }, + 'auth/isModerator': () => false, + } + }) + + describe('mount', () => { + beforeAll(() => { + store = new Vuex.Store({ + getters, + }) + }) + + describe('given a type', () => { + describe('of `following`', () => { + it('uses the `following` data on :user', () => { + const wrapper = Wrapper({ user, type: 'following' }) + wrapper.find('.base-button').trigger('click') + + expect(wrapper.vm.allConnectionsCount).toBe(user.followingCount) + expect(wrapper.findAll('.user-teaser')).toHaveLength(user.following.length) + expect(wrapper.emitted('fetchAllConnections')).toEqual([ + ['following', user.followingCount], + ]) + }) + }) + + describe('of `followedBy`', () => { + it('uses the `followedBy` data on :user', () => { + const wrapper = Wrapper({ type: 'followedBy' }) + wrapper.find('.base-button').trigger('click') + + expect(wrapper.vm.allConnectionsCount).toBe(user.followedByCount) + expect(wrapper.findAll('.user-teaser')).toHaveLength(user.followedBy.length) + expect(wrapper.emitted('fetchAllConnections')).toEqual([ + ['followedBy', user.followedByCount], + ]) + }) + }) + }) + + describe('given no type', () => { + it('defaults type to `following`', () => { + const wrapper = Wrapper() + expect(wrapper.text()).toContain('profile.network.following') + }) + }) + + describe('given a user', () => { + describe('without connections', () => { + it('displays the followingNobody message', () => { + const wrapper = Wrapper({ user: noConnectionsUser }) + expect(wrapper.find('.nobody-message').text()).toContain( + 'profile.network.followingNobody', + ) + }) + + it('displays the followedByNobody message', () => { + const wrapper = Wrapper({ user: noConnectionsUser, type: 'followedBy' }) + expect(wrapper.find('.nobody-message').text()).toContain( + 'profile.network.followedByNobody', + ) + }) + }) + + describe('with up to 7 loaded connections', () => { + let wrapper + beforeAll(() => { + wrapper = Wrapper() + }) + + it(`renders the connections`, () => { + expect(wrapper.findAll('.user-teaser')).toHaveLength(user.following.length) + }) + + it(`has a button to load all remaining connections`, async () => { + wrapper.find('.base-button').trigger('click') + expect(wrapper.emitted('fetchAllConnections')).toBeTruthy() + }) + }) + + describe('with more than 7 loaded connections', () => { + let wrapper + beforeAll(() => { + wrapper = Wrapper({ user: allConnectionsUser }) + }) + + it('renders the connections', () => { + expect(wrapper.findAll('.user-teaser')).toHaveLength(allConnectionsUser.followingCount) + }) + + it('renders the user-teasers as an overflowing list', () => { + expect(wrapper.find('.--overflow').element.tagName).toBe('UL') + }) + + it('renders a filter text input', () => { + expect(wrapper.find('[name="followingFilter"]').element.tagName).toBe('INPUT') + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/features/ProfileList/FollowList.story.js b/docs/webapp/components/features/ProfileList/FollowList.story.js new file mode 100644 index 000000000..78d895fe9 --- /dev/null +++ b/docs/webapp/components/features/ProfileList/FollowList.story.js @@ -0,0 +1,111 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' + +import helpers from '~/storybook/helpers' +import FollowList from './FollowList.vue' + +import fuzzyFilterUser from './FollowList.story.json' + +helpers.init() + +const user = { + name: 'Jenny Rostock', + id: 'u3', + followedByCount: 12, + followedBy: helpers.fakeUser(7), + followingCount: 28, + following: helpers.fakeUser(7), +} + +const lessThanSevenUser = { + ...user, + followedByCount: 3, + followedBy: user.followedBy.slice(0, 3), + followingCount: 3, + following: user.following.slice(0, 3), +} + +const allConnectionsUser = { + ...user, + followedBy: [...user.followedBy, ...helpers.fakeUser(5)], + following: [...user.following, ...helpers.fakeUser(21)], +} + +const noConnectionsUser = { + ...user, + followedBy: [], + followedByCount: 0, + following: [], + followingCount: 0, +} + +storiesOf('FollowList', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('without connections', () => { + return { + components: { FollowList }, + store: helpers.store, + data() { + return { user: noConnectionsUser } + }, + template: '', + } + }) + .add('with all connections loaded', () => { + return { + components: { FollowList }, + store: helpers.store, + data() { + return { user: lessThanSevenUser } + }, + + template: '', + } + }) + + .add('with more connections loadable', () => { + return { + components: { FollowList }, + store: helpers.store, + data() { + return { user: { ...user } } + }, + methods: { + fetchAllConnections(type) { + this.user[type] = allConnectionsUser[type] + action('fetchAllConnections')(type, this.user) + }, + }, + template: '', + } + }) + .add('with 1000 connections loaded', () => { + return { + components: { FollowList }, + store: helpers.store, + data() { + return { + user: { + ...user, + followedByCount: 1000, + followingCount: 1000, + followedBy: helpers.fakeUser(1000), + following: helpers.fakeUser(1000), + }, + } + }, + template: '', + } + }) + .add('Fuzzy Filter', () => { + return { + components: { FollowList }, + store: helpers.store, + data() { + return { user: fuzzyFilterUser } + }, + template: '', + } + }) diff --git a/docs/webapp/components/features/ProfileList/FollowList.story.json b/docs/webapp/components/features/ProfileList/FollowList.story.json new file mode 100644 index 000000000..e3055e6e2 --- /dev/null +++ b/docs/webapp/components/features/ProfileList/FollowList.story.json @@ -0,0 +1,519 @@ +{ + "id": "u3", + "slug": "jenny-rostock", + "name": "Jenny Rostock", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/nessoila/128.jpg?random=16aba55f-48c6-4ef5-966a-af0e31693e6a" + }, + "followedByCount": 32, + "followingCount": 31, + "following": [ + { + "id": "8c0b0191-454a-4806-b0c3-1ed1d9dc5416", + "slug": "wanda-stanton-sr", + "name": "Wanda Stanton Sr.", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolasfolliot/128.jpg?random=be2e59fb-f038-44d5-9e21-28fb123e8c7c" + } + }, + { + "id": "6f4fdb51-fe93-4373-bf44-c36ea17f6535", + "slug": "walter-ohara", + "name": "Walter O'Hara", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/mutlu82/128.jpg?random=0866e1b7-8285-4eaf-a4c8-8509bd99f172" + } + }, + { + "id": "20f5080b-1fc2-4c70-94c7-badbe2aa2370", + "slug": "hannah-bradtke", + "name": "Hannah Bradtke", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/Skyhartman/128.jpg?random=c02415a6-1e7e-488a-acb6-47587399ff07" + } + }, + { + "id": "c5d2c492-5b8c-41a5-a9a2-26f8c866a885", + "slug": "georgia-koss-dvm", + "name": "Georgia Koss DVM", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/lvovenok/128.jpg?random=8e1e75b9-5dad-4fc8-9c52-38b89a3e0484" + } + }, + { + "id": "f4c10451-f367-4afb-97fe-e48f60236655", + "slug": "genevieve-aufderhar-v", + "name": "Genevieve Aufderhar V", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/dss49/128.jpg?random=fc59a664-d2b4-4677-81e9-26ed5d4bc37e" + } + }, + { + "id": "df65a474-b661-4fd8-b49f-2d609bfc4089", + "slug": "wanda-gerlach", + "name": "Wanda Gerlach", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/lewisainslie/128.jpg?random=5f0976d5-7871-4606-a416-6b67b0e67c15" + } + }, + { + "id": "5f2b3c14-07fc-4dfa-978e-9bf21d8586d0", + "slug": "roland-kohler", + "name": "Roland Kohler", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/bcrad/128.jpg?random=4f77c5b2-0214-4342-a18e-424787f04896" + } + }, + { + "id": "a2c49c22-940a-4598-8285-b8ebb34bd045", + "slug": "krista-hammes-dvm", + "name": "Krista Hammes DVM", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/sterlingrules/128.jpg?random=28167137-eee4-42e6-98a3-ec9a7d4b9509" + } + }, + { + "id": "da70bae8-daf2-4481-b2db-506d00b73210", + "slug": "miss-lester-kovacek", + "name": "Miss Lester Kovacek", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/stefvdham/128.jpg?random=7de26019-8114-4caa-9aea-2172ae3c537c" + } + }, + { + "id": "868952d8-c5df-4415-a0bb-930acd26749c", + "slug": "teri-stamm-iii", + "name": "Teri Stamm III", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/salimianoff/128.jpg?random=d2305511-39b2-4207-bee6-90799557546e" + } + }, + { + "id": "7a569786-fbb1-4e27-8f2c-38d2a0963b9d", + "slug": "gerardo-batz", + "name": "Gerardo Batz", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/colirpixoil/128.jpg?random=8536b980-103e-4e5e-8141-31142e3c6330" + } + }, + { + "id": "dca673f2-89b8-46cc-a836-2515f319c02f", + "slug": "carlton-botsford", + "name": "Carlton Botsford", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/cocolero/128.jpg?random=3ef57800-7694-4ec4-a9eb-39abca8d59e4" + } + }, + { + "id": "58ba4ab0-990e-4f44-a7a8-42d10962f8b7", + "slug": "edward-boehm", + "name": "Edward Boehm", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/d_nny_m_cher/128.jpg?random=cf3ba671-4564-4dc1-bf94-a5fc3ea4fafa" + } + }, + { + "id": "u4", + "slug": "huey", + "name": "Huey", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/hellofeverrrr/128.jpg?random=46fef3a9-44a0-4784-9854-03be6b3f37e1" + } + }, + { + "id": "40cf7e21-a4dc-4055-a49d-3137c53dd815", + "slug": "ms-laurie-bergnaum", + "name": "Ms. Laurie Bergnaum", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/kohette/128.jpg?random=45516cde-9073-4ceb-8b42-2bdf66a26c67" + } + }, + { + "id": "4c377f54-72c3-4e13-9532-6d0f2278a794", + "slug": "jeffery-waelchi", + "name": "Jeffery Waelchi", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/128.jpg?random=b643d8ba-5e49-4854-b2a6-2ff609ffcba0" + } + }, + { + "id": "d861e775-2344-40d5-b6e4-8479e7dbe97f", + "slug": "marvin-gutkowski-iii", + "name": "Marvin Gutkowski III", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/kiwiupover/128.jpg?random=d38c1508-0342-46e0-9ef9-e0fd14b33072" + } + }, + { + "id": "3102346c-ea94-41d3-8474-5241e5e473a6", + "slug": "edmund-rolfson-jr", + "name": "Edmund Rolfson Jr.", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg?random=d6f0804c-f38f-4c8b-821d-27a02373c74e" + } + }, + { + "id": "0290fd5e-7ce8-4d70-8c29-f5ed96bfaa1f", + "slug": "bert-oconner", + "name": "Bert O'Conner", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/mangosango/128.jpg?random=03807c6c-c2f6-4ed3-8433-7a1823079eb0" + } + }, + { + "id": "9fe670ff-1968-4b15-ab80-7adee8173dd8", + "slug": "angela-schiller", + "name": "Angela Schiller", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/dudestein/128.jpg?random=0b511fa4-8603-419a-acf0-2a89bc41a71b" + } + }, + { + "id": "63798c79-2476-4eb8-a09c-167420bd05d7", + "slug": "peggy-carter", + "name": "Peggy Carter", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/uxpiper/128.jpg?random=c4dc0de5-99d7-410d-8088-6a2be8358fe9" + } + }, + { + "id": "4d3fbb67-7ddc-4aa9-96d0-57bb20f95f59", + "slug": "krystal-braun", + "name": "Krystal Braun", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/salvafc/128.jpg?random=1dbd4549-a525-4fa3-be41-15db84ceb41a" + } + }, + { + "id": "bcd5f271-bca5-492e-a6b6-7fd490ac37aa", + "slug": "janet-bruen", + "name": "Janet Bruen", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/yigitpinarbasi/128.jpg?random=3c7ab2c0-8e53-4edb-8c74-fd8cdfae5f8e" + } + }, + { + "id": "38ccbf58-305a-4400-a1e4-785661604d5f", + "slug": "ebony-corwin", + "name": "Ebony Corwin", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/128.jpg?random=f2137643-6f58-45b8-8266-d1fb893d0528" + } + }, + { + "id": "5137e045-aef0-4ce1-8327-b516a72fffd6", + "slug": "terrell-gorczany", + "name": "Terrell Gorczany", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg?random=5e61976f-529e-47f2-b4f0-b5e4550942ea" + } + }, + { + "id": "b224eb01-5a71-4126-b811-51b7b35afd51", + "slug": "dr-jamie-romaguera", + "name": "Dr. Jamie Romaguera", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/leonfedotov/128.jpg?random=9179538d-58be-4707-8ad6-485f703bea26" + } + }, + { + "id": "fdbb3e7f-f211-4685-831e-9d7e394b95a1", + "slug": "shannon-schuster", + "name": "Shannon Schuster", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg?random=f8a223ff-d49f-499f-a161-350e8078c353" + } + }, + { + "id": "d7ee00ea-5d22-4a1c-8670-7e4d4bd4ebfa", + "slug": "guadalupe-kessler", + "name": "Guadalupe Kessler", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/128.jpg?random=a87d13e1-ff0e-4a39-a018-e89a04d72572" + } + }, + { + "id": "49b868e3-dba5-48ed-8b6c-e686c70dfcfb", + "slug": "lonnie-rogahn", + "name": "Lonnie Rogahn", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/herbigt/128.jpg?random=fde8a699-624d-4052-96ef-0aaacf217184" + } + }, + { + "id": "fa70eecb-fbae-4133-b447-6c80b335fc01", + "slug": "marcella-ledner", + "name": "Marcella Ledner", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/dawidwu/128.jpg?random=03869abc-1a6b-4f26-8d73-7ba508c148d0" + } + }, + { + "id": "ef4cc540-c784-407f-b646-cff4d8fe666e", + "slug": "darrell-runolfsson", + "name": "Darrell Runolfsson", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/andrewofficer/128.jpg?random=e6c24db9-f1c9-45b5-8507-609fca960e92" + } + } + ], + "followedBy": [ + { + "id": "8c0b0191-454a-4806-b0c3-1ed1d9dc5416", + "slug": "wanda-stanton-sr", + "name": "Wanda Stanton Sr.", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolasfolliot/128.jpg?random=be2e59fb-f038-44d5-9e21-28fb123e8c7c" + } + }, + { + "id": "c5d2c492-5b8c-41a5-a9a2-26f8c866a885", + "slug": "georgia-koss-dvm", + "name": "Georgia Koss DVM", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/lvovenok/128.jpg?random=8e1e75b9-5dad-4fc8-9c52-38b89a3e0484" + } + }, + { + "id": "5f2b3c14-07fc-4dfa-978e-9bf21d8586d0", + "slug": "roland-kohler", + "name": "Roland Kohler", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/bcrad/128.jpg?random=4f77c5b2-0214-4342-a18e-424787f04896" + } + }, + { + "id": "6f4fdb51-fe93-4373-bf44-c36ea17f6535", + "slug": "walter-ohara", + "name": "Walter O'Hara", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/mutlu82/128.jpg?random=0866e1b7-8285-4eaf-a4c8-8509bd99f172" + } + }, + { + "id": "20f5080b-1fc2-4c70-94c7-badbe2aa2370", + "slug": "hannah-bradtke", + "name": "Hannah Bradtke", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/Skyhartman/128.jpg?random=c02415a6-1e7e-488a-acb6-47587399ff07" + } + }, + { + "id": "df65a474-b661-4fd8-b49f-2d609bfc4089", + "slug": "wanda-gerlach", + "name": "Wanda Gerlach", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/lewisainslie/128.jpg?random=5f0976d5-7871-4606-a416-6b67b0e67c15" + } + }, + { + "id": "f4c10451-f367-4afb-97fe-e48f60236655", + "slug": "genevieve-aufderhar-v", + "name": "Genevieve Aufderhar V", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/dss49/128.jpg?random=fc59a664-d2b4-4677-81e9-26ed5d4bc37e" + } + }, + { + "id": "7a569786-fbb1-4e27-8f2c-38d2a0963b9d", + "slug": "gerardo-batz", + "name": "Gerardo Batz", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/colirpixoil/128.jpg?random=8536b980-103e-4e5e-8141-31142e3c6330" + } + }, + { + "id": "da70bae8-daf2-4481-b2db-506d00b73210", + "slug": "miss-lester-kovacek", + "name": "Miss Lester Kovacek", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/stefvdham/128.jpg?random=7de26019-8114-4caa-9aea-2172ae3c537c" + } + }, + { + "id": "a2c49c22-940a-4598-8285-b8ebb34bd045", + "slug": "krista-hammes-dvm", + "name": "Krista Hammes DVM", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/sterlingrules/128.jpg?random=28167137-eee4-42e6-98a3-ec9a7d4b9509" + } + }, + { + "id": "bcd5f271-bca5-492e-a6b6-7fd490ac37aa", + "slug": "janet-bruen", + "name": "Janet Bruen", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/yigitpinarbasi/128.jpg?random=3c7ab2c0-8e53-4edb-8c74-fd8cdfae5f8e" + } + }, + { + "id": "38ccbf58-305a-4400-a1e4-785661604d5f", + "slug": "ebony-corwin", + "name": "Ebony Corwin", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/128.jpg?random=f2137643-6f58-45b8-8266-d1fb893d0528" + } + }, + { + "id": "d7ee00ea-5d22-4a1c-8670-7e4d4bd4ebfa", + "slug": "guadalupe-kessler", + "name": "Guadalupe Kessler", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/128.jpg?random=a87d13e1-ff0e-4a39-a018-e89a04d72572" + } + }, + { + "id": "dca673f2-89b8-46cc-a836-2515f319c02f", + "slug": "carlton-botsford", + "name": "Carlton Botsford", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/cocolero/128.jpg?random=3ef57800-7694-4ec4-a9eb-39abca8d59e4" + } + }, + { + "id": "49b868e3-dba5-48ed-8b6c-e686c70dfcfb", + "slug": "lonnie-rogahn", + "name": "Lonnie Rogahn", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/herbigt/128.jpg?random=fde8a699-624d-4052-96ef-0aaacf217184" + } + }, + { + "id": "4d3fbb67-7ddc-4aa9-96d0-57bb20f95f59", + "slug": "krystal-braun", + "name": "Krystal Braun", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/salvafc/128.jpg?random=1dbd4549-a525-4fa3-be41-15db84ceb41a" + } + }, + { + "id": "58ba4ab0-990e-4f44-a7a8-42d10962f8b7", + "slug": "edward-boehm", + "name": "Edward Boehm", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/d_nny_m_cher/128.jpg?random=cf3ba671-4564-4dc1-bf94-a5fc3ea4fafa" + } + }, + { + "id": "868952d8-c5df-4415-a0bb-930acd26749c", + "slug": "teri-stamm-iii", + "name": "Teri Stamm III", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/salimianoff/128.jpg?random=d2305511-39b2-4207-bee6-90799557546e" + } + }, + { + "id": "fa70eecb-fbae-4133-b447-6c80b335fc01", + "slug": "marcella-ledner", + "name": "Marcella Ledner", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/dawidwu/128.jpg?random=03869abc-1a6b-4f26-8d73-7ba508c148d0" + } + }, + { + "id": "63798c79-2476-4eb8-a09c-167420bd05d7", + "slug": "peggy-carter", + "name": "Peggy Carter", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/uxpiper/128.jpg?random=c4dc0de5-99d7-410d-8088-6a2be8358fe9" + } + }, + { + "id": "9fe670ff-1968-4b15-ab80-7adee8173dd8", + "slug": "angela-schiller", + "name": "Angela Schiller", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/dudestein/128.jpg?random=0b511fa4-8603-419a-acf0-2a89bc41a71b" + } + }, + { + "id": "fdbb3e7f-f211-4685-831e-9d7e394b95a1", + "slug": "shannon-schuster", + "name": "Shannon Schuster", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg?random=f8a223ff-d49f-499f-a161-350e8078c353" + } + }, + { + "id": "5137e045-aef0-4ce1-8327-b516a72fffd6", + "slug": "terrell-gorczany", + "name": "Terrell Gorczany", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg?random=5e61976f-529e-47f2-b4f0-b5e4550942ea" + } + }, + { + "id": "ef4cc540-c784-407f-b646-cff4d8fe666e", + "slug": "darrell-runolfsson", + "name": "Darrell Runolfsson", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/andrewofficer/128.jpg?random=e6c24db9-f1c9-45b5-8507-609fca960e92" + } + }, + { + "id": "b224eb01-5a71-4126-b811-51b7b35afd51", + "slug": "dr-jamie-romaguera", + "name": "Dr. Jamie Romaguera", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/leonfedotov/128.jpg?random=9179538d-58be-4707-8ad6-485f703bea26" + } + }, + { + "id": "u1", + "slug": "peter-lustig", + "name": "Peter Lustig", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/timgthomas/128.jpg?random=189d17f8-02d1-4b01-a000-af7121ae6897" + } + }, + { + "id": "u6", + "slug": "louie", + "name": "Louie", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/yayteejay/128.jpg?random=eefe597c-d49a-494f-b311-d6f2645d2264" + } + }, + { + "id": "3102346c-ea94-41d3-8474-5241e5e473a6", + "slug": "edmund-rolfson-jr", + "name": "Edmund Rolfson Jr.", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg?random=d6f0804c-f38f-4c8b-821d-27a02373c74e" + } + }, + { + "id": "40cf7e21-a4dc-4055-a49d-3137c53dd815", + "slug": "ms-laurie-bergnaum", + "name": "Ms. Laurie Bergnaum", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/kohette/128.jpg?random=45516cde-9073-4ceb-8b42-2bdf66a26c67" + } + }, + { + "id": "d861e775-2344-40d5-b6e4-8479e7dbe97f", + "slug": "marvin-gutkowski-iii", + "name": "Marvin Gutkowski III", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/kiwiupover/128.jpg?random=d38c1508-0342-46e0-9ef9-e0fd14b33072" + } + }, + { + "id": "4c377f54-72c3-4e13-9532-6d0f2278a794", + "slug": "jeffery-waelchi", + "name": "Jeffery Waelchi", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/128.jpg?random=b643d8ba-5e49-4854-b2a6-2ff609ffcba0" + } + }, + { + "id": "0290fd5e-7ce8-4d70-8c29-f5ed96bfaa1f", + "slug": "bert-oconner", + "name": "Bert O'Conner", + "avatar": { + "url": "https://s3.amazonaws.com/uifaces/faces/twitter/mangosango/128.jpg?random=03807c6c-c2f6-4ed3-8433-7a1823079eb0" + } + } + ] +} + diff --git a/docs/webapp/components/features/ProfileList/FollowList.vue b/docs/webapp/components/features/ProfileList/FollowList.vue new file mode 100644 index 000000000..e04b4003e --- /dev/null +++ b/docs/webapp/components/features/ProfileList/FollowList.vue @@ -0,0 +1,41 @@ + + + diff --git a/docs/webapp/components/features/ProfileList/ProfileList.vue b/docs/webapp/components/features/ProfileList/ProfileList.vue new file mode 100644 index 000000000..29fdb2872 --- /dev/null +++ b/docs/webapp/components/features/ProfileList/ProfileList.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/docs/webapp/components/features/ReportList/ReportList.spec.js b/docs/webapp/components/features/ReportList/ReportList.spec.js new file mode 100644 index 000000000..17c609115 --- /dev/null +++ b/docs/webapp/components/features/ReportList/ReportList.spec.js @@ -0,0 +1,79 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import ReportList from './ReportList' +import { reports } from './ReportList.story' +import ReportsTable from '~/components/features/ReportsTable/ReportsTable' +import DropdownFilter from '~/components/DropdownFilter/DropdownFilter' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} + +describe('ReportList', () => { + let mocks, mutations, getters, wrapper + + beforeEach(() => { + mocks = { + $apollo: { + mutate: jest + .fn() + .mockResolvedValueOnce({ + data: { review: { disable: true, resourceId: 'some-resource', closed: true } }, + }) + .mockRejectedValue({ message: 'Unable to review' }), + }, + $t: jest.fn(), + $toast: { + error: jest.fn((message) => message), + }, + } + mutations = { + 'modal/SET_OPEN': jest.fn().mockResolvedValueOnce(), + } + getters = { + 'auth/user': () => { + return { slug: 'awesome-user' } + }, + 'auth/isModerator': () => true, + } + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + mutations, + getters, + }) + return mount(ReportList, { mocks, localVue, store, stubs }) + } + + describe('renders children components', () => { + beforeEach(async () => { + wrapper = Wrapper() + }) + + it('renders DropdownFilter', () => { + expect(wrapper.findComponent(DropdownFilter).exists()).toBe(true) + }) + + it('renders ReportsTable', () => { + expect(wrapper.findComponent(ReportsTable).exists()).toBe(true) + }) + }) + + describe('confirm is emitted by reports table', () => { + beforeEach(async () => { + wrapper = Wrapper() + wrapper.setData({ reports }) + wrapper.findComponent(ReportsTable).vm.$emit('confirm', reports[0]) + }) + + it('calls modal/SET_OPEN', () => { + expect(mutations['modal/SET_OPEN']).toHaveBeenCalledTimes(1) + }) + }) + }) +}) diff --git a/docs/webapp/components/features/ReportList/ReportList.story.js b/docs/webapp/components/features/ReportList/ReportList.story.js new file mode 100644 index 000000000..1572fb203 --- /dev/null +++ b/docs/webapp/components/features/ReportList/ReportList.story.js @@ -0,0 +1,193 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import { post } from '~/components/PostTeaser/PostTeaser.story.js' +import { user } from '~/components/UserTeaser/UserTeaser.story.js' +import helpers from '~/storybook/helpers' +import ReportList from './ReportList' +import DropdownFilter from '~/components/DropdownFilter/DropdownFilter' +import ReportsTable from '~/components/features/ReportsTable/ReportsTable' +helpers.init() + +export const reports = [ + { + __typename: 'Report', + closed: false, + createdAt: '2019-10-29T15:36:02.106Z', + updatedAt: '2019-12-02T15:56:35.651Z', + disable: false, + filed: [ + { + __typename: 'FILED', + createdAt: '2019-10-02T15:56:35.676Z', + reasonCategory: 'pornographic_content_links', + reasonDescription: 'This comment is porno!!!', + submitter: { + ...user, + name: 'Community moderator', + id: 'community-moderator', + slug: 'community-moderator', + }, + }, + ], + resource: { + __typename: 'Comment', + id: 'b6b38937-3efc-4d5e-b12c-549e4d6551a5', + createdAt: '2019-10-29T15:38:25.184Z', + updatedAt: '2019-10-30T15:38:25.184Z', + disabled: false, + deleted: false, + content: + '

                              @peter-lustig

                              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra magna ac placerat. Tempor id eu nisl nunc mi ipsum faucibus vitae. Nibh praesent tristique magna sit amet purus gravida quis blandit. Magna eget est lorem ipsum dolor. In fermentum posuere urna nec. Eleifend donec pretium vulputate sapien nec sagittis aliquam. Augue interdum velit euismod in pellentesque. Id diam maecenas ultricies mi eget mauris pharetra. Donec pretium vulputate sapien nec. Dolor morbi non arcu risus quis varius quam quisque. Blandit turpis cursus in hac habitasse. Est ultricies integer quis auctor elit sed vulputate mi sit. Nunc consequat interdum varius sit amet mattis vulputate enim. Semper feugiat nibh sed pulvinar. Eget felis eget nunc lobortis mattis aliquam. Ultrices vitae auctor eu augue. Tellus molestie nunc non blandit massa enim nec dui. Pharetra massa massa ultricies mi quis hendrerit dolor. Nisl suscipit adipiscing bibendum est ultricies integer.

                              ', + contentExcerpt: + '

                              @peter-lustig

                              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra …

                              ', + post, + author: user, + }, + reviewed: [ + { + updatedAt: '2019-10-30T15:38:25.184Z', + moderator: { + __typename: 'User', + ...user, + name: 'Moderator', + id: 'moderator', + slug: 'moderator', + }, + }, + { + updatedAt: '2019-10-29T15:38:25.184Z', + moderator: { + __typename: 'User', + ...user, + name: 'Peter Lustig', + id: 'u3', + slug: 'peter-lustig', + }, + }, + ], + }, + { + __typename: 'Report', + closed: false, + createdAt: '2019-10-31T15:36:02.106Z', + updatedAt: '2019-12-03T15:56:35.651Z', + disable: true, + filed: [ + { + __typename: 'FILED', + createdAt: '2019-10-31T15:36:02.106Z', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This post is bigoted', + submitter: { + ...user, + name: 'Modertation team', + id: 'moderation-team', + slug: 'moderation-team', + }, + }, + ], + resource: { + __typename: 'Post', + author: { + ...user, + id: 'u7', + name: 'Dagobert', + slug: 'dagobert', + }, + deleted: false, + disabled: false, + id: 'p2', + slug: 'bigoted-post', + title: "I'm a bigoted post!", + }, + reviewed: [], + }, + { + __typename: 'Report', + closed: true, + createdAt: '2019-10-30T15:36:02.106Z', + updatedAt: '2019-12-01T15:56:35.651Z', + disable: true, + filed: [ + { + __typename: 'FILED', + createdAt: '2019-10-30T15:36:02.106Z', + reasonCategory: 'discrimination_etc', + reasonDescription: 'this user is attacking me for who I am!', + submitter: { + ...user, + name: 'Helpful user', + id: 'helpful-user', + slug: 'helpful-user', + }, + }, + ], + resource: { + __typename: 'User', + commentedCount: 0, + contributionsCount: 0, + deleted: false, + disabled: true, + followedByCount: 0, + id: 'u5', + name: 'Abusive user', + slug: 'abusive-user', + }, + reviewed: [ + { + updatedAt: '2019-12-01T15:56:35.651Z', + moderator: { + __typename: 'User', + ...user, + name: 'Peter Lustig', + id: 'u3', + slug: 'peter-lustig', + }, + }, + { + updatedAt: '2019-11-30T15:56:35.651Z', + moderator: { + __typename: 'User', + ...user, + name: 'Moderator', + id: 'moderator', + slug: 'moderator', + }, + }, + ], + }, +] +const unreviewedReports = reports.filter((report) => !report.reviewed) +const reviewedReports = reports.filter((report) => report.reviewed) +const closedReports = reports.filter((report) => report.closed) +const filterOptions = [ + { label: 'All', value: reports }, + { label: 'Unreviewed', value: unreviewedReports }, + { label: 'Reviewed', value: reviewedReports }, + { label: 'Closed', value: closedReports }, +] + +storiesOf('ReportList', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('with reports', () => ({ + components: { ReportList, DropdownFilter, ReportsTable }, + store: helpers.store, + data: () => ({ + filterOptions, + selected: filterOptions[0].label, + reports, + }), + methods: { + openModal: action('openModal'), + filter: action('filter'), + }, + template: ` +
                              +

                              Reports

                              + +
                              + +
                              `, + })) diff --git a/docs/webapp/components/features/ReportList/ReportList.vue b/docs/webapp/components/features/ReportList/ReportList.vue new file mode 100644 index 000000000..0bc752865 --- /dev/null +++ b/docs/webapp/components/features/ReportList/ReportList.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/docs/webapp/components/features/ReportRow/ReportRow.spec.js b/docs/webapp/components/features/ReportRow/ReportRow.spec.js new file mode 100644 index 000000000..a1b405edc --- /dev/null +++ b/docs/webapp/components/features/ReportRow/ReportRow.spec.js @@ -0,0 +1,178 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' +import Vuex from 'vuex' +import ReportRow from './ReportRow.vue' +import BaseIcon from '~/components/_new/generic/BaseIcon/BaseIcon' +import { reports } from '~/components/features/ReportList/ReportList.story.js' + +const localVue = global.localVue + +describe('ReportRow', () => { + let propsData, mocks, stubs, getters, wrapper + + beforeEach(() => { + propsData = {} + mocks = { + $t: jest.fn((string) => string), + } + stubs = { + NuxtLink: RouterLinkStub, + 'client-only': true, + } + getters = { + 'auth/user': () => { + return { slug: 'awesome-user' } + }, + 'auth/isModerator': () => true, + } + }) + + describe('given a report ', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(ReportRow, { propsData, mocks, stubs, localVue, store }) + } + + describe('has not been closed', () => { + let confirmButton + beforeEach(() => { + propsData = { ...propsData, report: reports[1] } + wrapper = Wrapper() + confirmButton = wrapper.find('.base-button.--danger') + }) + + it('renders a confirm button', () => { + expect(confirmButton.exists()).toBe(true) + }) + + it('emits confirm event', () => { + confirmButton.trigger('click') + expect(wrapper.emitted('confirm-report')).toHaveLength(1) + }) + }) + + describe('has been closed', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[2] } + wrapper = Wrapper() + }) + + it('renders a decided text', () => { + const decidedTitle = wrapper + .findAll('.title') + .filter((title) => title.text() === 'moderation.reports.decided') + expect(decidedTitle.exists()).toBe(true) + }) + }) + + describe('has not been reviewed', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[1] } + wrapper = Wrapper() + }) + + it('renders its current status', () => { + expect(wrapper.find('.status-line').text()).toEqual('moderation.reports.enabled') + }) + }) + + describe('has been reviewed', () => { + describe('and disabled', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[2] } + wrapper = Wrapper() + }) + it('renders the disabled icon', () => { + expect(wrapper.find('.status-line').findComponent(BaseIcon).props().name).toEqual( + 'eye-slash', + ) + }) + + it('renders its current status', () => { + expect(wrapper.find('.status-line').text()).toEqual('moderation.reports.disabledBy') + }) + }) + + describe('and enabled', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[0] } + wrapper = Wrapper() + }) + it('renders the enabled icon', () => { + expect(wrapper.find('.status-line').findComponent(BaseIcon).props().name).toEqual('eye') + }) + + it('renders its current status', () => { + expect(wrapper.find('.status-line').text()).toEqual('moderation.reports.enabledBy') + }) + + it('renders the moderator who reviewed the resource', () => { + const username = wrapper.find('[data-test="report-reviewer"]') + expect(username.text()).toContain('@moderator') + }) + }) + }) + + describe('concerns a Comment', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[0] } + wrapper = Wrapper() + }) + + it('renders a comments icon', () => { + const commentsIcon = wrapper.findComponent(BaseIcon).props().name + expect(commentsIcon).toEqual('comments') + }) + + it('renders a link to the post, with the comment contentExcerpt', () => { + const postLink = wrapper.find('.title') + expect(postLink.text()).toEqual('@peter-lustig Lorem ipsum dolor sit amet, …') + }) + + it('renders the author', () => { + const userSlug = wrapper.find('[data-test="report-author"]') + expect(userSlug.text()).toContain('@louie') + }) + }) + + describe('concerns a Post', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[1] } + wrapper = Wrapper() + }) + + it('renders a bookmark icon', () => { + const postIcon = wrapper.findComponent(BaseIcon).props().name + expect(postIcon).toEqual('bookmark') + }) + + it('renders a link to the post', () => { + const postLink = wrapper.find('.title') + expect(postLink.text()).toEqual("I'm a bigoted post!") + }) + + it('renders the author', () => { + const username = wrapper.find('[data-test="report-author"]') + expect(username.text()).toContain('@dagobert') + }) + }) + + describe('concerns a User', () => { + beforeEach(() => { + propsData = { ...propsData, report: reports[2] } + wrapper = Wrapper() + }) + + it('renders a user icon', () => { + const userIcon = wrapper.findComponent(BaseIcon).props().name + expect(userIcon).toEqual('user') + }) + + it('renders a link to the user profile', () => { + const userLink = wrapper.find('[data-test="report-content"]') + expect(userLink.text()).toContain('@abusive-user') + }) + }) + }) +}) diff --git a/docs/webapp/components/features/ReportRow/ReportRow.vue b/docs/webapp/components/features/ReportRow/ReportRow.vue new file mode 100644 index 000000000..72fd8d24e --- /dev/null +++ b/docs/webapp/components/features/ReportRow/ReportRow.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/docs/webapp/components/features/ReportsTable/ReportsTable.spec.js b/docs/webapp/components/features/ReportsTable/ReportsTable.spec.js new file mode 100644 index 000000000..688139eec --- /dev/null +++ b/docs/webapp/components/features/ReportsTable/ReportsTable.spec.js @@ -0,0 +1,64 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import ReportsTable from './ReportsTable.vue' +import { reports } from '~/components/features/ReportList/ReportList.story.js' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} + +describe('ReportsTable', () => { + let propsData, mocks, getters, wrapper, reportsTable + + beforeEach(() => { + propsData = {} + mocks = { + $t: jest.fn((string) => string), + } + getters = { + 'auth/user': () => { + return { slug: 'awesome-user' } + }, + 'auth/isModerator': () => true, + } + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(ReportsTable, { propsData, mocks, localVue, store, stubs }) + } + + describe('given no reports', () => { + beforeEach(() => { + propsData = { ...propsData } + wrapper = Wrapper() + }) + + it('shows a placeholder', () => { + expect(wrapper.text()).toContain('moderation.reports.empty') + }) + }) + + describe('given reports', () => { + beforeEach(() => { + propsData = { ...propsData, reports } + wrapper = Wrapper() + reportsTable = wrapper.find('.ds-table') + }) + + it('renders a table', () => { + expect(reportsTable.exists()).toBe(true) + }) + + it('renders at least one ReportRow component', () => { + expect(wrapper.find('.report-row').exists()).toBe(true) + }) + }) + }) +}) diff --git a/docs/webapp/components/features/ReportsTable/ReportsTable.story.js b/docs/webapp/components/features/ReportsTable/ReportsTable.story.js new file mode 100644 index 000000000..1326b6c37 --- /dev/null +++ b/docs/webapp/components/features/ReportsTable/ReportsTable.story.js @@ -0,0 +1,28 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import { action } from '@storybook/addon-actions' +import ReportsTable from '~/components/features/ReportsTable/ReportsTable' +import helpers from '~/storybook/helpers' +import { reports } from '~/components/features/ReportList/ReportList.story.js' + +helpers.init() + +storiesOf('ReportsTable', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('with reports', () => ({ + components: { ReportsTable }, + store: helpers.store, + data: () => ({ + reports, + }), + methods: { + confirm: action('confirm'), + }, + template: ``, + })) + .add('without reports', () => ({ + components: { ReportsTable }, + store: helpers.store, + template: ``, + })) diff --git a/docs/webapp/components/features/ReportsTable/ReportsTable.vue b/docs/webapp/components/features/ReportsTable/ReportsTable.vue new file mode 100644 index 000000000..3892c0b12 --- /dev/null +++ b/docs/webapp/components/features/ReportsTable/ReportsTable.vue @@ -0,0 +1,47 @@ + + + diff --git a/docs/webapp/components/features/SearchField/SearchField.spec.js b/docs/webapp/components/features/SearchField/SearchField.spec.js new file mode 100644 index 000000000..e66c31938 --- /dev/null +++ b/docs/webapp/components/features/SearchField/SearchField.spec.js @@ -0,0 +1,67 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import SearchField from './SearchField.vue' +import SearchableInput from '~/components/generic/SearchableInput/SearchableInput' +import { searchResults } from '~/components/generic/SearchableInput/SearchableInput.story' +const localVue = global.localVue + +localVue.filter('truncate', () => 'truncated string') +localVue.filter('dateTime', () => Date.now) + +const stubs = { + 'nuxt-link': true, +} + +describe('SearchField.vue', () => { + let mocks, wrapper, getters + beforeEach(() => { + mocks = { + $apollo: { + query: jest.fn(), + }, + $t: jest.fn((string) => string), + } + getters = { 'auth/isModerator': () => false } + wrapper = Wrapper() + }) + + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(SearchField, { mocks, localVue, store, stubs }) + } + + describe('mount', () => { + describe('Emitted events', () => { + let searchableInputComponent + beforeEach(() => { + searchableInputComponent = wrapper.findComponent(SearchableInput) + }) + + describe('query event', () => { + it('calls an apollo query', () => { + searchableInputComponent.vm.$emit('query', 'abcd') + expect(mocks.$apollo.query).toHaveBeenCalledWith( + expect.objectContaining({ variables: { query: 'abcd' } }), + ) + }) + }) + + describe('clearSearch event', () => { + beforeEach(() => { + wrapper.setData({ searchResults, pending: true }) + searchableInputComponent.vm.$emit('clearSearch') + }) + + it('clears searchResults', () => { + expect(wrapper.vm.searchResults).toEqual([]) + }) + + it('set pending to false', () => { + expect(wrapper.vm.pending).toBe(false) + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/features/SearchField/SearchField.vue b/docs/webapp/components/features/SearchField/SearchField.vue new file mode 100644 index 000000000..6aa7db865 --- /dev/null +++ b/docs/webapp/components/features/SearchField/SearchField.vue @@ -0,0 +1,51 @@ + + + diff --git a/docs/webapp/components/generic/SearchGroup/SearchGroup.vue b/docs/webapp/components/generic/SearchGroup/SearchGroup.vue new file mode 100644 index 000000000..652c2743f --- /dev/null +++ b/docs/webapp/components/generic/SearchGroup/SearchGroup.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/docs/webapp/components/generic/SearchHeading/SearchHeading.spec.js b/docs/webapp/components/generic/SearchHeading/SearchHeading.spec.js new file mode 100644 index 000000000..7552b609b --- /dev/null +++ b/docs/webapp/components/generic/SearchHeading/SearchHeading.spec.js @@ -0,0 +1,27 @@ +import { mount } from '@vue/test-utils' +import SearchHeading from './SearchHeading.vue' + +const localVue = global.localVue + +describe('SearchHeading.vue', () => { + let mocks, wrapper, propsData + beforeEach(() => { + mocks = { + $t: jest.fn((string) => string), + } + propsData = { + resourceType: 'Post', + } + wrapper = Wrapper() + }) + + const Wrapper = () => { + return mount(SearchHeading, { mocks, localVue, propsData }) + } + + describe('mount', () => { + it('renders heading', () => { + expect(wrapper.text()).toMatch('search.heading.Post') + }) + }) +}) diff --git a/docs/webapp/components/generic/SearchHeading/SearchHeading.vue b/docs/webapp/components/generic/SearchHeading/SearchHeading.vue new file mode 100644 index 000000000..616237e3e --- /dev/null +++ b/docs/webapp/components/generic/SearchHeading/SearchHeading.vue @@ -0,0 +1,27 @@ + + + diff --git a/docs/webapp/components/generic/SearchPost/SearchPost.spec.js b/docs/webapp/components/generic/SearchPost/SearchPost.spec.js new file mode 100644 index 000000000..3c690e39c --- /dev/null +++ b/docs/webapp/components/generic/SearchPost/SearchPost.spec.js @@ -0,0 +1,55 @@ +import { mount } from '@vue/test-utils' +import SearchPost from './SearchPost.vue' + +const localVue = global.localVue +localVue.filter('dateTime', (d) => d) + +describe('SearchPost.vue', () => { + let mocks, wrapper, propsData, counts + beforeEach(() => { + mocks = { + $t: jest.fn((string) => string), + } + propsData = { + option: { + title: 'Post Title', + commentsCount: 3, + shoutedCount: 6, + clickedCount: 5, + viewedTeaserCount: 15, + createdAt: '23.08.2019', + author: { + name: 'Post Author', + }, + }, + } + wrapper = Wrapper() + counts = wrapper.find('.search-post > .metadata > .counts') + }) + + const Wrapper = () => { + return mount(SearchPost, { mocks, localVue, propsData }) + } + + describe('shallowMount', () => { + it('renders post title', () => { + expect(wrapper.find('.search-post > .label').text()).toMatch('Post Title') + }) + + it('renders post commentsCount', () => { + expect(counts.text()).toContain(propsData.option.commentsCount.toString()) + }) + + it('renders post shoutedCount', () => { + expect(counts.text()).toContain(propsData.option.shoutedCount.toString()) + }) + + it('renders post author', () => { + expect(wrapper.find('.search-post > .metadata').text()).toContain('Post Author') + }) + + it('renders post createdAt', () => { + expect(wrapper.find('.search-post > .metadata').text()).toContain('23.08.2019') + }) + }) +}) diff --git a/docs/webapp/components/generic/SearchPost/SearchPost.vue b/docs/webapp/components/generic/SearchPost/SearchPost.vue new file mode 100644 index 000000000..82bf44d61 --- /dev/null +++ b/docs/webapp/components/generic/SearchPost/SearchPost.vue @@ -0,0 +1,50 @@ + + + + diff --git a/docs/webapp/components/generic/SearchableInput/SearchableInput.spec.js b/docs/webapp/components/generic/SearchableInput/SearchableInput.spec.js new file mode 100644 index 000000000..223ee6186 --- /dev/null +++ b/docs/webapp/components/generic/SearchableInput/SearchableInput.spec.js @@ -0,0 +1,130 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import Vue from 'vue' +import SearchableInput from './SearchableInput' +import { searchResults } from '~/components/generic/SearchableInput/SearchableInput.story' + +const localVue = global.localVue + +localVue.filter('truncate', () => 'truncated string') +localVue.filter('dateTime', () => Date.now) + +const stubs = { + 'nuxt-link': true, +} + +describe('SearchableInput.vue', () => { + let mocks, propsData, getters, wrapper + + beforeEach(() => { + propsData = {} + mocks = { + $router: { + push: jest.fn(), + }, + $t: jest.fn((string) => string), + } + getters = { 'auth/isModerator': () => false } + wrapper = Wrapper() + }) + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + }) + return mount(SearchableInput, { mocks, localVue, propsData, store, stubs }) + } + + describe('mount', () => { + let select + + beforeEach(() => { + select = wrapper.find('.ds-select') + select.trigger('focus') + select.element.value = 'abcd' + }) + + it('opens the dropdown when focused', () => { + expect(wrapper.find('.ds-select-dropdown').isVisible()).toBe(true) + }) + + it('closes the dropdown when blurred', () => { + select.trigger('blur') + expect(wrapper.find('.ds-select-is-open').exists()).toBe(false) + }) + + it('closes the dropdown when cleared with esc key', () => { + select.trigger('input') + select.trigger('keyup.esc') + expect(wrapper.find('.ds-select-is-open').exists()).toBe(false) + }) + + it('changes the unprocessedSearchInput as the value changes', () => { + select.trigger('input') + expect(select.element.value).toBe('abcd') + }) + + describe('navigating to resource', () => { + beforeEach(() => { + propsData = { options: searchResults } + wrapper = Wrapper() + select = wrapper.find('.ds-select') + select.trigger('focus') + }) + + it('pushes to post page', async () => { + select.element.value = 'Post' + select.trigger('input') + const post = wrapper.find('.search-post') + post.trigger('click') + await Vue.nextTick() + expect(mocks.$router.push).toHaveBeenCalledWith({ + name: 'post-id-slug', + params: { id: 'post-by-jenny', slug: 'user-post-by-jenny' }, + }) + }) + + it("pushes to user's profile", async () => { + select.element.value = 'Bob' + select.trigger('input') + const users = wrapper.findAll('.slug') + const bob = users.filter((item) => item.text().match(/@bob-der-baumeister/)) + bob.trigger('click') + await Vue.nextTick() + expect(mocks.$router.push).toHaveBeenCalledWith({ + name: 'profile-id-slug', + params: { id: 'u2', slug: 'bob-der-baumeister' }, + }) + }) + + it('pushes hashtag query params', async () => { + select.element.value = 'Hash' + select.trigger('input') + const tags = wrapper.findAll('.hc-hashtag') + const tag = tags.filter((item) => item.text().match(/#Hashtag/)) + tag.trigger('click') + await Vue.nextTick() + expect(mocks.$router.push).toHaveBeenCalledWith('?hashtag=Hashtag') + }) + }) + + it('opens the search result page when enter is pressed', async () => { + select.element.value = 'ab' + select.trigger('input') + select.trigger('keyup.enter') + expect(mocks.$router.push).toHaveBeenCalledWith({ + path: '/search/search-results', + query: { search: 'ab' }, + }) + }) + + it('replaces irregular whitespace with a single space', async () => { + select.element.value = 'peter lustig' + select.trigger('input') + select.trigger('keyup.enter') + expect(mocks.$router.push).toHaveBeenCalledWith({ + path: '/search/search-results', + query: { search: 'peter lustig' }, + }) + }) + }) +}) diff --git a/docs/webapp/components/generic/SearchableInput/SearchableInput.story.js b/docs/webapp/components/generic/SearchableInput/SearchableInput.story.js new file mode 100644 index 000000000..f483129eb --- /dev/null +++ b/docs/webapp/components/generic/SearchableInput/SearchableInput.story.js @@ -0,0 +1,131 @@ +import { storiesOf } from '@storybook/vue' +import { withA11y } from '@storybook/addon-a11y' +import SearchableInput from './SearchableInput.vue' +import helpers from '~/storybook/helpers' + +helpers.init() + +export const searchResults = [ + { + id: 'post-by-jenny', + __typename: 'Post', + slug: 'user-post-by-jenny', + title: 'User Post by Jenny', + value: 'User Post by Jenny', + shoutedCount: 0, + commentsCount: 4, + clickedCount: 8, + viewedTeaserCount: 15, + createdAt: '2019-11-13T03:03:16.155Z', + author: { + id: 'u3', + name: 'Jenny Rostock', + slug: 'jenny-rostock', + }, + }, + { + id: 'f48f00a0-c412-432f-8334-4276a4e15d1c', + __typename: 'Post', + slug: 'eum-quos-est-molestiae-enim-magni-consequuntur-sed-commodi-eos', + title: 'Eum quos est molestiae enim magni consequuntur sed commodi eos.', + value: 'Eum quos est molestiae enim magni consequuntur sed commodi eos.', + shoutedCount: 0, + commentsCount: 0, + clickedCount: 9, + viewedTeaserCount: 2, + createdAt: '2019-11-13T03:00:45.478Z', + author: { + id: 'u6', + name: 'Louie', + slug: 'louie', + }, + }, + { + id: 'p7', + __typename: 'Post', + slug: 'this-is-post-7', + title: 'This is post #7', + value: 'This is post #7', + shoutedCount: 1, + commentsCount: 1, + clickedCount: 1, + viewedTeaserCount: 4, + createdAt: '2019-11-13T03:00:23.098Z', + author: { + id: 'u6', + name: 'Louie', + slug: 'louie', + }, + }, + { + id: 'p12', + __typename: 'Post', + slug: 'this-is-post-12', + title: 'This is post #12', + value: 'This is post #12', + shoutedCount: 0, + commentsCount: 12, + clickedCount: 14, + viewedTeaserCount: 58, + createdAt: '2019-11-13T03:00:23.098Z', + author: { + id: 'u6', + name: 'Louie', + slug: 'louie', + }, + }, + { + id: 'u1', + __typename: 'User', + avatar: { + url: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbc9e03ebcc384b920c31542af2d27dd8eea9dc2_full.jpg', + }, + name: 'Peter Lustig', + slug: 'peter-lustig', + }, + { + id: 'cdbca762-0632-4564-b646-415a0c42d8b8', + __typename: 'User', + avatar: { + url: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbc9e03ebcc384b920c31542af2d27dd8eea9dc2_full.jpg', + }, + name: 'Herbert Schultz', + slug: 'herbert-schultz', + }, + { + id: 'u2', + __typename: 'User', + avatar: { + url: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbc9e03ebcc384b920c31542af2d27dd8eea9dc2_full.jpg', + }, + name: 'Bob der Baumeister', + slug: 'bob-der-baumeister', + }, + { + id: '7b654f72-f4da-4315-8bed-39de0859754b', + __typename: 'User', + avatar: { + url: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbc9e03ebcc384b920c31542af2d27dd8eea9dc2_full.jpg', + }, + name: 'Tonya Mohr', + slug: 'tonya-mohr', + }, + { + id: 'Hashtag', + __typename: 'Tag', + }, +] + +storiesOf('SearchableInput', module) + .addDecorator(withA11y) + .addDecorator(helpers.layout) + .add('test', () => ({ + components: { SearchableInput }, + store: helpers.store, + data: () => ({ + searchResults, + }), + template: ` + + `, + })) diff --git a/docs/webapp/components/generic/SearchableInput/SearchableInput.vue b/docs/webapp/components/generic/SearchableInput/SearchableInput.vue new file mode 100644 index 000000000..d08655893 --- /dev/null +++ b/docs/webapp/components/generic/SearchableInput/SearchableInput.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/docs/webapp/components/generic/SelectUserSearch/SelectUserSearch.vue b/docs/webapp/components/generic/SelectUserSearch/SelectUserSearch.vue new file mode 100644 index 000000000..841e0b19f --- /dev/null +++ b/docs/webapp/components/generic/SelectUserSearch/SelectUserSearch.vue @@ -0,0 +1,109 @@ + + + diff --git a/docs/webapp/components/utils/InternalPages.js b/docs/webapp/components/utils/InternalPages.js new file mode 100644 index 000000000..dfdc04a6e --- /dev/null +++ b/docs/webapp/components/utils/InternalPages.js @@ -0,0 +1,172 @@ +import { PageParams } from '~/components/utils/PageParams.js' + +export const defaultPageParamsPages = { + ORGANIZATION: new PageParams({ + name: 'organization', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/organization', // static, don't change! internal page in case no external is defined + footerIdent: 'site.made', // localized string identifier + headTitleIdent: 'site.made', // localized string identifier + headlineIdent: 'site.made', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.organization', + }, + }), + DONATE: new PageParams({ + name: 'donate', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/donate', // static, don't change! internal page in case no external is defined + footerIdent: 'site.donate', // localized string identifier + headTitleIdent: 'site.donate', // localized string identifier + headlineIdent: 'site.donate', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.donate', + }, + }), + IMPRINT: new PageParams({ + name: 'imprint', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/imprint', // static, don't change! internal page in case no external is defined + footerIdent: 'site.imprint', // localized string identifier + headTitleIdent: 'site.imprint', // localized string identifier + headlineIdent: 'site.imprint', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.imprint', + }, + }), + TERMS_AND_CONDITIONS: new PageParams({ + name: 'terms-and-conditions', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/terms-and-conditions', // static, don't change! internal page in case no external is defined + footerIdent: 'site.termsAndConditions', // localized string identifier + headTitleIdent: 'site.termsAndConditions', // localized string identifier + headlineIdent: 'site.termsAndConditions', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.termsAndConditions', + }, + }), + CODE_OF_CONDUCT: new PageParams({ + name: 'code-of-conduct', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/code-of-conduct', // static, don't change! internal page in case no external is defined + footerIdent: 'site.code-of-conduct', // localized string identifier + headTitleIdent: 'site.code-of-conduct', // localized string identifier + headlineIdent: 'site.code-of-conduct', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.codeOfConduct', + }, + }), + DATA_PRIVACY: new PageParams({ + name: 'data-privacy', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/data-privacy', // static, don't change! internal page in case no external is defined + footerIdent: 'site.data-privacy', // localized string identifier + headTitleIdent: 'site.data-privacy', // localized string identifier + headlineIdent: 'site.data-privacy', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.dataPrivacy', + }, + }), + FAQ: new PageParams({ + name: 'faq', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/faq', // static, don't change! internal page in case no external is defined + footerIdent: 'site.faq', // localized string identifier + headTitleIdent: 'site.faq', // localized string identifier + headlineIdent: 'site.faq', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.faq', + }, + }), + SUPPORT: new PageParams({ + name: 'support', + + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, // if defined it's dominating + + internalPage: { + pageRoute: '/support', // static, don't change '*/support'! internal page in case no external is defined + footerIdent: 'site.support', // localized string identifier + headTitleIdent: 'site.support', // localized string identifier + headlineIdent: 'site.support', // localized string identifier. on null it's hidden, on empty string default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + htmlIdent: 'html.support', + }, + }), +} diff --git a/docs/webapp/components/utils/NormalizeEmail.js b/docs/webapp/components/utils/NormalizeEmail.js new file mode 100644 index 000000000..45f8126e3 --- /dev/null +++ b/docs/webapp/components/utils/NormalizeEmail.js @@ -0,0 +1,11 @@ +import { normalizeEmail } from 'validator' + +export default (email) => + normalizeEmail(email, { + // gmail_remove_dots: false, default + gmail_remove_subaddress: false, + // gmail_convert_googlemaildotcom: true, default + outlookdotcom_remove_subaddress: false, + yahoo_remove_subaddress: false, + icloud_remove_subaddress: false, + }) diff --git a/docs/webapp/components/utils/Notifications.js b/docs/webapp/components/utils/Notifications.js new file mode 100644 index 000000000..dfbb1b817 --- /dev/null +++ b/docs/webapp/components/utils/Notifications.js @@ -0,0 +1,43 @@ +export const notifications = [ + { + read: false, + reason: 'mentioned_in_post', + from: { + __typename: 'Post', + id: 'post-1', + title: 'some post title', + slug: 'some-post-title', + contentExcerpt: 'this is a post content', + author: { + id: 'john-1', + slug: 'john-doe', + name: 'John Doe', + }, + }, + }, + { + read: false, + reason: 'mentioned_in_comment', + from: { + __typename: 'Comment', + id: 'comment-2', + contentExcerpt: 'this is yet another post content', + post: { + id: 'post-1', + title: 'some post on a comment', + slug: 'some-post-on-a-comment', + contentExcerpt: 'this is a post content', + author: { + id: 'john-1', + slug: 'john-doe', + name: 'John Doe', + }, + }, + author: { + id: 'jane-1', + slug: 'jane-doe', + name: 'Jane Doe', + }, + }, + }, +] diff --git a/docs/webapp/components/utils/PageParams.js b/docs/webapp/components/utils/PageParams.js new file mode 100644 index 000000000..539034a1c --- /dev/null +++ b/docs/webapp/components/utils/PageParams.js @@ -0,0 +1,45 @@ +export class PageParams { + constructor(pageParams) { + this.name = pageParams.name + this.externalLink = pageParams.externalLink + this.internalPage = pageParams.internalPage + } + + overwrite(assignPageParams) { + const pageParams = this + if (assignPageParams.name !== undefined) { + pageParams.name = assignPageParams.name + } + if (assignPageParams.externalLink !== undefined) { + pageParams.externalLink = assignPageParams.externalLink + } + if (assignPageParams.internalPage !== undefined) { + pageParams.internalPage = { ...pageParams.internalPage, ...assignPageParams.internalPage } + } + return pageParams + } + + noStringDefined(string) { + return !string || string.length === 0 + } + + get isInternalPage() { + return !(this.externalLink && !this.noStringDefined(this.externalLink.url)) + } + + get link() { + return this.isInternalPage ? this.internalPage.pageRoute : this.externalLink.url + } + + redirectToPage(thisComponent) { + if (this.isInternalPage) { + thisComponent.$router.push(this.internalPage.pageRoute) + } else if (typeof window !== 'undefined') { + if (this.externalLink.target === '_blank') { + window.open(this.externalLink.url, this.externalLink.target) + } else { + window.location.href = this.externalLink.url + } + } + } +} diff --git a/docs/webapp/components/utils/PasswordFormHelper.js b/docs/webapp/components/utils/PasswordFormHelper.js new file mode 100644 index 000000000..da6cead90 --- /dev/null +++ b/docs/webapp/components/utils/PasswordFormHelper.js @@ -0,0 +1,36 @@ +export default function PasswordForm({ translate }) { + const passwordMismatchMessage = translate( + 'settings.security.change-password.message-new-password-missmatch', + ) + return { + formData: { + password: '', + passwordConfirmation: '', + }, + formSchema: { + password: { + type: 'string', + required: true, + message: translate('settings.security.change-password.message-new-password-required'), + }, + passwordConfirmation: [ + { + validator(_rule, value, callback, source, _options) { + var errors = [] + if (source.password !== value) { + errors.push(new Error(passwordMismatchMessage)) + } + callback(errors) + }, + }, + { + type: 'string', + required: true, + message: translate( + 'settings.security.change-password.message-new-password-confirm-required', + ), + }, + ], + }, + } +} diff --git a/docs/webapp/components/utils/PostHelpers.js b/docs/webapp/components/utils/PostHelpers.js new file mode 100644 index 000000000..403e49622 --- /dev/null +++ b/docs/webapp/components/utils/PostHelpers.js @@ -0,0 +1,50 @@ +import PostMutations from '~/graphql/PostMutations.js' + +export function postMenuModalsData(truncatedPostName, confirmCallback, cancelCallback = () => {}) { + return { + delete: { + titleIdent: 'delete.contribution.title', + messageIdent: 'delete.contribution.message', + messageParams: { + name: truncatedPostName, + }, + buttons: { + confirm: { + danger: true, + icon: 'trash', + textIdent: 'delete.submit', + callback: confirmCallback, + }, + cancel: { + icon: 'close', + textIdent: 'delete.cancel', + callback: cancelCallback, + }, + }, + }, + } +} + +export function deletePostMutation(postId) { + return { + mutation: PostMutations().DeletePost, + variables: { + id: postId, + }, + } +} + +export function sortTagsAlphabetically(tags) { + // Make sure the property is valid. + if (!tags || !tags.length) return false + /* Using .slice(0) to make a shallow copy. Otherwise a vue/no-side-effects-in-computed-properties error + would be thrown because sort() sorts in place. A shallow copy is fine because only first level objects are + affected by the sort, the original tags object remains unchanged. + */ + return tags.slice(0).sort(function (a, b) { + // Converting to lowercase to make sort case insensitive. + const tagA = a.id.toLowerCase() + const tagB = b.id.toLowerCase() + return tagA < tagB ? -1 : tagA > tagB ? 1 : 0 + }) +} diff --git a/docs/webapp/components/utils/ReportModal.js b/docs/webapp/components/utils/ReportModal.js new file mode 100644 index 000000000..da40704ad --- /dev/null +++ b/docs/webapp/components/utils/ReportModal.js @@ -0,0 +1,25 @@ +import { valuesReasonCategoryOptions } from '~/constants/modals.js' + +export default function validReport({ translate }) { + return { + formSchema: { + reasonCategory: { + type: 'object', + required: true, + fields: { + value: { + type: 'enum', + enum: valuesReasonCategoryOptions, + required: true, + message: translate('report.reason.category.invalid'), + }, + }, + }, + reasonDescription: { + type: 'string', + min: 0, + max: 200, + }, + }, + } +} diff --git a/docs/webapp/components/utils/ReportModal.spec.js b/docs/webapp/components/utils/ReportModal.spec.js new file mode 100644 index 000000000..2ce61e65e --- /dev/null +++ b/docs/webapp/components/utils/ReportModal.spec.js @@ -0,0 +1,36 @@ +import validReport from './ReportModal' +import Schema from 'async-validator' + +let translate + +beforeEach(() => { + translate = jest.fn(() => 'Validation error') +}) + +describe('validReport', () => { + const validate = (object) => { + const { formSchema } = validReport({ translate }) + const validator = new Schema(formSchema) + return validator.validate(object, { suppressWarning: true }).catch(({ errors }) => { + throw new Error(errors[0].message) + }) + } + + describe('reasonCategory', () => { + describe('invalid enum', () => { + it('rejects', async () => { + await expect(validate({ reasonCategory: { value: 'invalid_enum' } })).rejects.toThrow( + 'Validation error', + ) + }) + }) + + describe('valid enum', () => { + it('resolves', async () => { + await expect( + validate({ reasonCategory: { value: 'discrimination_etc' } }), + ).resolves.toBeUndefined() + }) + }) + }) +}) diff --git a/docs/webapp/components/utils/TranslateErrorMessage.js b/docs/webapp/components/utils/TranslateErrorMessage.js new file mode 100644 index 000000000..3597f3358 --- /dev/null +++ b/docs/webapp/components/utils/TranslateErrorMessage.js @@ -0,0 +1,12 @@ +export default (message, mapping, translate) => { + let translatedMessage = null + for (const [pattern, ident] of Object.entries(mapping)) { + if (message.includes(pattern)) { + translatedMessage = translate(ident) + } + } + if (!translatedMessage) { + translatedMessage = message + } + return translatedMessage +} diff --git a/docs/webapp/components/utils/UniqueSlugForm.js b/docs/webapp/components/utils/UniqueSlugForm.js new file mode 100644 index 000000000..f8fa07af6 --- /dev/null +++ b/docs/webapp/components/utils/UniqueSlugForm.js @@ -0,0 +1,36 @@ +import { debounce } from 'lodash' +import { checkSlugAvailableQuery } from '~/graphql/User.js' + +export default function UniqueSlugForm({ translate, apollo, currentUser }) { + return { + formSchema: { + slug: [ + { + type: 'string', + required: true, + pattern: /^[a-z0-9_-]+$/, + message: translate('settings.validation.slug.regex'), + }, + { + asyncValidator(rule, value, callback) { + debounce(() => { + const variables = { slug: value } + apollo.query({ query: checkSlugAvailableQuery, variables }).then((response) => { + const { + data: { User }, + } = response + const existingSlug = User && User[0] && User[0].slug + const available = !existingSlug || existingSlug === currentUser.slug + if (!available) { + callback(new Error(translate('settings.validation.slug.alreadyTaken'))) + } else { + callback() + } + }) + }, 500)() + }, + }, + ], + }, + } +} diff --git a/docs/webapp/components/utils/UniqueSlugForm.spec.js b/docs/webapp/components/utils/UniqueSlugForm.spec.js new file mode 100644 index 000000000..6e0d359e9 --- /dev/null +++ b/docs/webapp/components/utils/UniqueSlugForm.spec.js @@ -0,0 +1,80 @@ +import UniqueSlugForm from './UniqueSlugForm' +import Schema from 'async-validator' + +let translate +let apollo +let currentUser + +beforeEach(() => { + translate = jest.fn(() => 'Validation error') + apollo = { + query: jest.fn().mockResolvedValue({ data: { User: [] } }), + } + currentUser = null +}) + +describe('UniqueSlugForm', () => { + const validate = (object) => { + const { formSchema } = UniqueSlugForm({ translate, apollo, currentUser }) + const validator = new Schema(formSchema) + return validator.validate(object, { suppressWarning: true }).catch(({ errors }) => { + throw new Error(errors[0].message) + }) + } + + describe('regex', () => { + describe('non URL-safe characters, e.g. whitespaces', () => { + it('rejects', async () => { + await expect(validate({ slug: 'uh oh' })).rejects.toThrow('Validation error') + }) + }) + + describe('alphanumeric, hyphens or underscores', () => { + it('validates', async () => { + await expect(validate({ slug: '_all-right_' })).resolves.toBeUndefined() + }) + }) + }) + + describe('given a currentUser with a slug', () => { + beforeEach(() => { + currentUser = { slug: 'current-user' } + }) + + describe('backend returns no user for given slug', () => { + beforeEach(() => { + apollo.query.mockResolvedValue({ + data: { User: [] }, + }) + }) + + it('validates', async () => { + await expect(validate({ slug: 'slug' })).resolves.toBeUndefined() + }) + }) + + describe('backend returns user', () => { + let slug + beforeEach(() => { + slug = 'already-taken' + apollo.query.mockResolvedValue({ + data: { User: [{ slug: 'already-taken' }] }, + }) + }) + + it('rejects', async () => { + await expect(validate({ slug: 'uh oh' })).rejects.toThrow('Validation error') + }) + + describe('but it is the current user', () => { + beforeEach(() => { + currentUser = { slug: 'already-taken' } + }) + + it('validates', async () => { + await expect(validate({ slug })).resolves.toBeUndefined() + }) + }) + }) + }) +}) diff --git a/docs/webapp/components/utils/UpdateQuery.js b/docs/webapp/components/utils/UpdateQuery.js new file mode 100644 index 000000000..a1b07a7c1 --- /dev/null +++ b/docs/webapp/components/utils/UpdateQuery.js @@ -0,0 +1,17 @@ +import unionBy from 'lodash/unionBy' + +export default function UpdateQuery(component, { $state, pageKey }) { + if (!pageKey) throw new Error('No key given for the graphql query { data } object') + return (previousResult, { fetchMoreResult }) => { + const oldData = (previousResult && previousResult[pageKey]) || [] + const newData = (fetchMoreResult && fetchMoreResult[pageKey]) || [] + if (newData.length < component.pageSize) { + component.hasMore = false + $state.complete() + } + const result = {} + result[pageKey] = unionBy(oldData, newData, (item) => item.id) + $state.loaded() + return result + } +} diff --git a/docs/webapp/components/utils/UpdateQuery.spec.js b/docs/webapp/components/utils/UpdateQuery.spec.js new file mode 100644 index 000000000..295b256a4 --- /dev/null +++ b/docs/webapp/components/utils/UpdateQuery.spec.js @@ -0,0 +1,86 @@ +import UpdateQuery from './UpdateQuery' + +let $state +let component +let pageKey +let updateQuery +let previousResult +let fetchMoreResult + +beforeEach(() => { + component = { + hasMore: true, + pageSize: 1, + } + + $state = { + complete: jest.fn(), + loaded: jest.fn(), + } + previousResult = { Post: [{ id: 1, foo: 'bar' }] } + fetchMoreResult = { Post: [{ id: 2, foo: 'baz' }] } + updateQuery = () => UpdateQuery(component, { $state, pageKey }) +}) + +describe('UpdateQuery', () => { + it('throws error because no key is given', () => { + expect(() => { + updateQuery()({ Post: [] }, { fetchMoreResult: { Post: [] } }) + }).toThrow(/No key given/) + }) + + describe('with a page key', () => { + beforeEach(() => (pageKey = 'Post')) + + describe('given two arrays of things', () => { + it('merges the arrays', () => { + expect(updateQuery()(previousResult, { fetchMoreResult })).toEqual({ + Post: [ + { id: 1, foo: 'bar' }, + { id: 2, foo: 'baz' }, + ], + }) + }) + + it('does not create duplicates', () => { + fetchMoreResult = { Post: [{ id: 1, foo: 'baz' }] } + expect(updateQuery()(previousResult, { fetchMoreResult })).toEqual({ + Post: [{ id: 1, foo: 'bar' }], + }) + }) + + it('does not call $state.complete()', () => { + expect(updateQuery()(previousResult, { fetchMoreResult })) + expect($state.complete).not.toHaveBeenCalled() + }) + + describe('in case of fewer records than pageSize', () => { + beforeEach(() => (component.pageSize = 10)) + it('calls $state.complete()', () => { + expect(updateQuery()(previousResult, { fetchMoreResult })) + expect($state.complete).toHaveBeenCalled() + }) + + it('changes component.hasMore to `false`', () => { + expect(component.hasMore).toBe(true) + expect(updateQuery()(previousResult, { fetchMoreResult })) + expect(component.hasMore).toBe(false) + }) + }) + }) + + describe('given one array is undefined', () => { + describe('does not crash', () => { + it('neither if the previous data was undefined', () => { + expect(updateQuery()(undefined, { fetchMoreResult })).toEqual({ + Post: [{ id: 2, foo: 'baz' }], + }) + }) + + it('not if the new data is undefined', () => { + expect(updateQuery()(previousResult, {})).toEqual({ Post: [{ id: 1, foo: 'bar' }] }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/config/index.js b/docs/webapp/config/index.js new file mode 100644 index 000000000..5da17010b --- /dev/null +++ b/docs/webapp/config/index.js @@ -0,0 +1,53 @@ +// ATTENTION: DO NOT PUT ANY SECRETS IN HERE (or the .env) + +import dotenv from 'dotenv' +dotenv.config() // we want to synchronize @nuxt-dotenv and nuxt-env + +// Load Package Details for some default values +const pkg = require('../package') + +const environment = { + NODE_ENV: process.env.NODE_ENV, + DEBUG: process.env.NODE_ENV !== 'production' || false, + PRODUCTION: process.env.NODE_ENV === 'production' || false, + NUXT_BUILD: process.env.NUXT_BUILD || '.nuxt', + STYLEGUIDE_DEV: process.env.STYLEGUIDE_DEV || false, +} + +const server = { + GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000', + BACKEND_TOKEN: process.env.BACKEND_TOKEN || 'NULL', + WEBSOCKETS_URI: process.env.WEBSOCKETS_URI || 'ws://localhost:3000/api/graphql', +} + +const sentry = { + SENTRY_DSN_WEBAPP: process.env.SENTRY_DSN_WEBAPP, + COMMIT: process.env.COMMIT, +} + +const options = { + VERSION: process.env.VERSION || pkg.version, + DESCRIPTION: process.env.DESCRIPTION || pkg.description, + MAPBOX_TOKEN: process.env.MAPBOX_TOKEN, + PUBLIC_REGISTRATION: process.env.PUBLIC_REGISTRATION === 'true' || false, + INVITE_REGISTRATION: process.env.INVITE_REGISTRATION !== 'false', // default = true + // Cookies + COOKIE_EXPIRE_TIME: process.env.COOKIE_EXPIRE_TIME || 730, // Two years by default + COOKIE_HTTPS_ONLY: process.env.COOKIE_HTTPS_ONLY || process.env.NODE_ENV === 'production', // ensure true in production if not set explicitly + CATEGORIES_ACTIVE: process.env.CATEGORIES_ACTIVE === 'true' || false, +} + +const CONFIG = { + ...environment, + ...server, + ...sentry, + ...options, +} + +// override process.env with the values here since they contain default values +process.env = { + ...process.env, + ...CONFIG, +} + +export default CONFIG diff --git a/docs/webapp/constants/categories.js b/docs/webapp/constants/categories.js new file mode 100644 index 000000000..64ceb9021 --- /dev/null +++ b/docs/webapp/constants/categories.js @@ -0,0 +1,3 @@ +// this file is duplicated in `backend/src/constants/metadata.js` and `webapp/constants/metadata.js` +export const CATEGORIES_MIN = 1 +export const CATEGORIES_MAX = 3 diff --git a/docs/webapp/constants/chat.js b/docs/webapp/constants/chat.js new file mode 100644 index 000000000..c278dfd62 --- /dev/null +++ b/docs/webapp/constants/chat.js @@ -0,0 +1,299 @@ +import tokens from './../assets/_new/styles/tokens.scss' +// import branding from './../assets/styles/imports/_branding.scss' + +const styleData = tokens + +const STYLE = { + light: { + general: { + color: styleData.textColorBase, + colorButtonClear: '#1976d2', + colorButton: '#fff', + backgroundColorButton: '#1976d2', + backgroundInput: '#fff', + colorPlaceholder: styleData.textColorSoft, + colorCaret: '#1976d2', + colorSpinner: styleData.colorPrimary, + borderStyle: '1px solid #e1e4e8', + backgroundScrollIcon: '#fff', + }, + + container: { + border: 'none', + borderRadius: styleData.borderRadiusBase, + boxShadow: styleData.boxShadowBase, + }, + + header: { + background: styleData.backgroundColorSoft, + colorRoomName: styleData.textColorBase, + colorRoomInfo: styleData.textColorSoft, + }, + + footer: { + background: styleData.backgroundColorSoft, + borderStyleInput: '1px solid #e1e4e8', + borderInputSelected: '#1976d2', + backgroundReply: styleData.backgroundColorSoft, + backgroundTagActive: styleData.backgroundColorSoft, + backgroundTag: styleData.backgroundColorBase, + }, + + content: { + background: styleData.backgroundColorBase, + }, + + sidemenu: { + background: '#fff', + backgroundHover: '#f6f6f6', + backgroundActive: styleData.colorPrimaryLight, + colorActive: '#1976d2', + borderColorSearch: '#e1e5e8', + }, + + dropdown: { + background: '#fff', + backgroundHover: '#f6f6f6', + }, + + message: { + background: styleData.chatMessageBgOthers, + backgroundMe: styleData.chatMessageBgMe, + color: styleData.chatMessageColor, + colorStarted: '#9ca6af', + backgroundDeleted: '#dadfe2', + backgroundSelected: '#c2dcf2', + colorDeleted: '#757e85', + colorUsername: '#9ca6af', + colorTimestamp: styleData.chatMessageTimestamp, + backgroundDate: '#e5effa', + colorDate: '#505a62', + backgroundSystem: '#e5effa', + colorSystem: '#505a62', + backgroundMedia: 'rgba(0, 0, 0, 0.15)', + backgroundReply: 'rgba(0, 0, 0, 0.08)', + colorReplyUsername: '#0a0a0a', + colorReply: '#6e6e6e', + colorTag: '#0d579c', + backgroundImage: '#ddd', + colorNewMessages: styleData.chatNewMessageColor, + backgroundScrollCounter: styleData.chatRoomBackgroundCounterBadge, + colorScrollCounter: styleData.chatRoomColorCounterBadge, + backgroundReaction: '#eee', + borderStyleReaction: '1px solid #eee', + backgroundReactionHover: '#fff', + borderStyleReactionHover: '1px solid #ddd', + colorReactionCounter: '#0a0a0a', + backgroundReactionMe: '#cfecf5', + borderStyleReactionMe: '1px solid #3b98b8', + backgroundReactionHoverMe: '#cfecf5', + borderStyleReactionHoverMe: '1px solid #3b98b8', + colorReactionCounterMe: '#0b59b3', + backgroundAudioRecord: '#eb4034', + backgroundAudioLine: 'rgba(0, 0, 0, 0.15)', + backgroundAudioProgress: '#455247', + backgroundAudioProgressSelector: '#455247', + colorFileExtension: '#757e85', + }, + + markdown: { + background: 'rgba(239, 239, 239, 0.7)', + border: 'rgba(212, 212, 212, 0.9)', + color: '#e01e5a', + colorMulti: '#0a0a0a', + }, + + room: { + colorUsername: '#0a0a0a', + colorMessage: '#67717a', + colorTimestamp: '#a2aeb8', + colorStateOnline: '#4caf50', + colorStateOffline: '#9ca6af', + backgroundCounterBadge: styleData.chatRoomBackgroundCounterBadge, + colorCounterBadge: styleData.chatRoomColorCounterBadge, + }, + + emoji: { + background: '#fff', + }, + + icons: { + search: '#9ca6af', + add: styleData.colorPrimary, + toggle: styleData.colorNeutral30, + menu: styleData.colorNeutral30, + close: '#9ca6af', + closeImage: '#fff', + file: styleData.colorPrimary, + paperclip: styleData.colorPrimary, + closeOutline: '#000', + closePreview: '#fff', + send: styleData.colorPrimary, + sendDisabled: '#9ca6af', + emoji: styleData.colorPrimary, + emojiReaction: 'rgba(0, 0, 0, 0.3)', + document: styleData.colorPrimary, + pencil: '#9e9e9e', + checkmark: styleData.chatMessageCheckmark, + checkmarkSeen: styleData.chatMessageCheckmarkSeen, + eye: '#fff', + dropdownMessage: '#fff', + dropdownMessageBackground: 'rgba(0, 0, 0, 0.25)', + dropdownRoom: '#9e9e9e', + dropdownScroll: '#0a0a0a', + microphone: styleData.colorPrimary, + audioPlay: '#455247', + audioPause: '#455247', + audioCancel: '#eb4034', + audioConfirm: '#1ba65b', + }, + }, + dark: { + general: { + color: '#fff', + colorButtonClear: '#fff', + colorButton: '#fff', + backgroundColorButton: '#1976d2', + backgroundInput: '#202223', + colorPlaceholder: '#596269', + colorCaret: '#fff', + colorSpinner: '#fff', + borderStyle: 'none', + backgroundScrollIcon: '#fff', + }, + + container: { + border: 'none', + borderRadius: '4px', + boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)', + }, + + header: { + background: '#181a1b', + colorRoomName: '#fff', + colorRoomInfo: '#9ca6af', + }, + + footer: { + background: '#131415', + borderStyleInput: 'none', + borderInputSelected: '#1976d2', + backgroundReply: '#1b1c1c', + backgroundTagActive: '#1b1c1c', + backgroundTag: '#131415', + }, + + content: { + background: '#131415', + }, + + sidemenu: { + background: '#181a1b', + backgroundHover: '#202224', + backgroundActive: '#151617', + colorActive: '#fff', + borderColorSearch: '#181a1b', + }, + + dropdown: { + background: '#2a2c33', + backgroundHover: '#26282e', + }, + + message: { + background: '#22242a', + backgroundMe: '#1f7e80', + color: '#fff', + colorStarted: '#9ca6af', + backgroundDeleted: '#1b1c21', + backgroundSelected: '#c2dcf2', + colorDeleted: '#a2a5a8', + colorUsername: '#b3bac9', + colorTimestamp: '#ebedf2', + backgroundDate: 'rgba(0, 0, 0, 0.3)', + colorDate: '#bec5cc', + backgroundSystem: 'rgba(0, 0, 0, 0.3)', + colorSystem: '#bec5cc', + backgroundMedia: 'rgba(0, 0, 0, 0.18)', + backgroundReply: 'rgba(0, 0, 0, 0.18)', + colorReplyUsername: '#fff', + colorReply: '#d6d6d6', + colorTag: '#f0c60a', + backgroundImage: '#ddd', + colorNewMessages: '#fff', + backgroundScrollCounter: '#1976d2', + colorScrollCounter: '#fff', + backgroundReaction: 'none', + borderStyleReaction: 'none', + backgroundReactionHover: '#202223', + borderStyleReactionHover: 'none', + colorReactionCounter: '#fff', + backgroundReactionMe: '#4e9ad1', + borderStyleReactionMe: 'none', + backgroundReactionHoverMe: '#4e9ad1', + borderStyleReactionHoverMe: 'none', + colorReactionCounterMe: '#fff', + backgroundAudioRecord: '#eb4034', + backgroundAudioLine: 'rgba(255, 255, 255, 0.15)', + backgroundAudioProgress: '#b7d4d3', + backgroundAudioProgressSelector: '#b7d4d3', + colorFileExtension: '#a2a5a8', + }, + + markdown: { + background: 'rgba(239, 239, 239, 0.7)', + border: 'rgba(212, 212, 212, 0.9)', + color: '#e01e5a', + colorMulti: '#0a0a0a', + }, + + room: { + colorUsername: '#fff', + colorMessage: '#6c7278', + colorTimestamp: '#6c7278', + colorStateOnline: '#4caf50', + colorStateOffline: '#596269', + backgroundCounterBadge: '#1976d2', + colorCounterBadge: '#fff', + }, + + emoji: { + background: '#343740', + }, + + icons: { + search: '#596269', + add: '#fff', + toggle: '#fff', + menu: '#fff', + close: '#9ca6af', + closeImage: '#fff', + file: '#1976d2', + paperclip: '#fff', + closeOutline: '#fff', + closePreview: '#fff', + send: '#fff', + sendDisabled: '#646a70', + emoji: '#fff', + emojiReaction: '#fff', + document: '#1976d2', + pencil: '#ebedf2', + checkmark: '#ebedf2', + checkmarkSeen: '#f0d90a', + eye: '#fff', + dropdownMessage: '#fff', + dropdownMessageBackground: 'rgba(0, 0, 0, 0.25)', + dropdownRoom: '#fff', + dropdownScroll: '#0a0a0a', + microphone: '#fff', + audioPlay: '#b7d4d3', + audioPause: '#b7d4d3', + audioCancel: '#eb4034', + audioConfirm: '#1ba65b', + }, + }, +} + +export default { + STYLE, +} diff --git a/docs/webapp/constants/comment.js b/docs/webapp/constants/comment.js new file mode 100644 index 000000000..d0a240b49 --- /dev/null +++ b/docs/webapp/constants/comment.js @@ -0,0 +1,3 @@ +export const COMMENT_MIN_LENGTH = 1 +export const COMMENT_MAX_UNTRUNCATED_LENGTH = 1200 +export const COMMENT_TRUNCATE_TO_LENGTH = 180 diff --git a/docs/webapp/constants/donation.js b/docs/webapp/constants/donation.js new file mode 100644 index 000000000..3e36ae9a8 --- /dev/null +++ b/docs/webapp/constants/donation.js @@ -0,0 +1 @@ +export const PROGRESS_BAR_COLOR_TYPE = 'gradient' // 'uni' is the other option diff --git a/docs/webapp/constants/editor.js b/docs/webapp/constants/editor.js new file mode 100644 index 000000000..ac4e53641 --- /dev/null +++ b/docs/webapp/constants/editor.js @@ -0,0 +1,2 @@ +export const HASHTAG = 'hashtag' +export const MENTION = 'mention' diff --git a/docs/webapp/constants/emails.js b/docs/webapp/constants/emails.js new file mode 100644 index 000000000..34daaecb0 --- /dev/null +++ b/docs/webapp/constants/emails.js @@ -0,0 +1,8 @@ +// this file is duplicated in `backend/src/config/` and `webapp/constants/` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ +export default { + SUPPORT_EMAIL: 'devops@ocelot.social', + MODERATION_EMAIL: 'devops@ocelot.social', + // ATTENTION: the following links have to be defined even for internal pages with full URLs as example like 'https://staging.ocelot.social/support', because they are used in e-mails! + ORGANIZATION_LINK: 'https://ocelot.social', + SUPPORT_LINK: 'https://ocelot.social', +} diff --git a/docs/webapp/constants/filter.js b/docs/webapp/constants/filter.js new file mode 100644 index 000000000..00332053b --- /dev/null +++ b/docs/webapp/constants/filter.js @@ -0,0 +1,2 @@ +export const SHOW_CONTENT_FILTER_HEADER_MENU = false +export const SHOW_CONTENT_FILTER_MASONRY_GRID = true diff --git a/docs/webapp/constants/groups.js b/docs/webapp/constants/groups.js new file mode 100644 index 000000000..a634425a4 --- /dev/null +++ b/docs/webapp/constants/groups.js @@ -0,0 +1,5 @@ +// this file is duplicated in `backend/src/constants/group.js` and `webapp/constants/group.js` +export const NAME_LENGTH_MIN = 3 +export const NAME_LENGTH_MAX = 50 +export const DESCRIPTION_WITHOUT_HTML_LENGTH_MIN = 50 // with removed HTML tags +export const SHOW_GROUP_BUTTON_IN_HEADER = true diff --git a/docs/webapp/constants/headerMenu.js b/docs/webapp/constants/headerMenu.js new file mode 100644 index 000000000..aa87a598c --- /dev/null +++ b/docs/webapp/constants/headerMenu.js @@ -0,0 +1,13 @@ +export default { + MENU: [ + // { + // nameIdent: 'nameIdent', + // path: '/', + // }, + // { + // nameIdent: 'nameIdent', + // url: 'https://ocelot.social', + // target: '_blank', + // }, + ], +} diff --git a/docs/webapp/constants/keycodes.js b/docs/webapp/constants/keycodes.js new file mode 100644 index 000000000..b34eb8dbe --- /dev/null +++ b/docs/webapp/constants/keycodes.js @@ -0,0 +1,4 @@ +export const ARROW_UP = 38 +export const ARROW_DOWN = 40 +export const RETURN = 13 +export const SPACE = 32 diff --git a/docs/webapp/constants/links.js b/docs/webapp/constants/links.js new file mode 100644 index 000000000..3af64d374 --- /dev/null +++ b/docs/webapp/constants/links.js @@ -0,0 +1,151 @@ +// this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ + +import { defaultPageParamsPages } from '~/components/utils/InternalPages.js' + +const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ + // if defined it's dominating + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.made', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.made', // localized string identifier, if undefined default is used + // headlineIdent: 'site.made', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const DONATE = defaultPageParamsPages.DONATE.overwrite({ + // if defined it's dominating + externalLink: { + // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + url: 'https://ocelot-social.herokuapp.com/donations', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.donate', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.donate', // localized string identifier, if undefined default is used + // headlineIdent: 'site.donate', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ + externalLink: { + // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + url: 'https://ocelot-social.herokuapp.com/imprint', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.imprint', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.imprint', // localized string identifier, if undefined default is used + // headlineIdent: 'site.imprint', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used + // headlineIdent: 'site.termsAndConditions', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used + // headlineIdent: 'site.code-of-conduct', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.data-privacy', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.data-privacy', // localized string identifier, if undefined default is used + // headlineIdent: 'site.data-privacy', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const FAQ = defaultPageParamsPages.FAQ.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.faq', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.faq', // localized string identifier, if undefined default is used + // headlineIdent: 'site.faq', // on null default is used, on empty string it's hidden + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) +const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ + // if defined it's dominating + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.support', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.support', // localized string identifier, if undefined default is used + // headlineIdent: 'site.support', // on null default is used, on empty string it's hidden + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'webapp/locales/html/' + }, +}) + +export default { + LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization', or external 'https://ocelot.social' + + // you can find and store templates for 👇🏼 at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ + + ORGANIZATION, + DONATE, + IMPRINT, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, + DATA_PRIVACY, + FAQ, + SUPPORT, + + FOOTER_LINK_LIST: [ + ORGANIZATION, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, + DATA_PRIVACY, + FAQ, + DONATE, + SUPPORT, + IMPRINT, + ], +} diff --git a/docs/webapp/constants/logos.js b/docs/webapp/constants/logos.js new file mode 100644 index 000000000..714e78a2c --- /dev/null +++ b/docs/webapp/constants/logos.js @@ -0,0 +1,24 @@ +// this file is duplicated in `backend/src/config/logos.js` and `webapp/constants/logos.js` and replaced on rebranding +// this are the paths in the webapp +export default { + LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', + LOGO_HEADER_WIDTH: '130px', + LOGO_HEADER_CLICK: { + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, + internalPath: { + to: { + name: 'index', + }, + scrollTo: '.main-navigation', + }, + }, + LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', + LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', + LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg', + LOGO_PASSWORD_RESET_PATH: '/img/custom/logo-squared.svg', + LOGO_MAINTENACE_RESET_PATH: '/img/custom/logo-squared.svg', +} diff --git a/docs/webapp/constants/manifest.js b/docs/webapp/constants/manifest.js new file mode 100644 index 000000000..9d05bb700 --- /dev/null +++ b/docs/webapp/constants/manifest.js @@ -0,0 +1,9 @@ +import metadata from './metadata.js' +const { APPLICATION_NAME, APPLICATION_SHORT_NAME, APPLICATION_DESCRIPTION } = metadata +export default { + name: APPLICATION_NAME, + short_name: APPLICATION_SHORT_NAME, + description: APPLICATION_DESCRIPTION, + theme_color: '#17b53f', + lang: 'en', +} diff --git a/docs/webapp/constants/metadata.js b/docs/webapp/constants/metadata.js new file mode 100644 index 000000000..da313c7fb --- /dev/null +++ b/docs/webapp/constants/metadata.js @@ -0,0 +1,9 @@ +// this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding +export default { + APPLICATION_NAME: 'ocelot.social', + APPLICATION_SHORT_NAME: 'ocelot.social', + APPLICATION_DESCRIPTION: 'ocelot.social Community Network', + COOKIE_NAME: 'ocelot-social-token', + ORGANIZATION_NAME: 'ocelot.social Community', + ORGANIZATION_JURISDICTION: 'City of Angels', +} diff --git a/docs/webapp/constants/modals.js b/docs/webapp/constants/modals.js new file mode 100644 index 000000000..6011b8b88 --- /dev/null +++ b/docs/webapp/constants/modals.js @@ -0,0 +1,11 @@ +// this list equals to enums in GraphQL schema file "backend/src/schema/types/type/FILED.gql" +export const valuesReasonCategoryOptions = [ + 'discrimination_etc', + 'pornographic_content_links', + 'glorific_trivia_of_cruel_inhuman_acts', + 'doxing', + 'intentional_intimidation_stalking_persecution', + 'advert_products_services_commercial', + 'criminal_behavior_violation_german_law', + 'other', +] diff --git a/docs/webapp/constants/posts.js b/docs/webapp/constants/posts.js new file mode 100644 index 000000000..93f387c88 --- /dev/null +++ b/docs/webapp/constants/posts.js @@ -0,0 +1,3 @@ +export const first = 12 +export const offset = 0 +export const POST_ADD_BUTTON_POSITION_TOP = true diff --git a/docs/webapp/constants/registration.js b/docs/webapp/constants/registration.js new file mode 100644 index 000000000..9e63e478e --- /dev/null +++ b/docs/webapp/constants/registration.js @@ -0,0 +1,5 @@ +// this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` +export default { + NONCE_LENGTH: 5, + INVITE_CODE_LENGTH: 6, +} diff --git a/docs/webapp/constants/terms-and-conditions-version.js b/docs/webapp/constants/terms-and-conditions-version.js new file mode 100644 index 000000000..754341b11 --- /dev/null +++ b/docs/webapp/constants/terms-and-conditions-version.js @@ -0,0 +1,2 @@ +// please change also version in file "cypress/constants/terms-and-conditions-version.js" +export const VERSION = '0.0.4' diff --git a/docs/webapp/graphql/CategoryQuery.js b/docs/webapp/graphql/CategoryQuery.js new file mode 100644 index 000000000..383a07cba --- /dev/null +++ b/docs/webapp/graphql/CategoryQuery.js @@ -0,0 +1,13 @@ +import gql from 'graphql-tag' + +export default () => { + return gql` + query { + Category(orderBy: slug_asc) { + id + slug + icon + } + } + ` +} diff --git a/docs/webapp/graphql/CommentMutations.js b/docs/webapp/graphql/CommentMutations.js new file mode 100644 index 000000000..191edf217 --- /dev/null +++ b/docs/webapp/graphql/CommentMutations.js @@ -0,0 +1,96 @@ +import gql from 'graphql-tag' + +export default (i18n) => { + const lang = i18n.locale().toUpperCase() + return { + CreateComment: gql` + mutation ($postId: ID!, $content: String!) { + CreateComment(postId: $postId, content: $content) { + id + contentExcerpt + content + createdAt + updatedAt + disabled + deleted + author { + id + slug + name + avatar { + url + } + disabled + deleted + shoutedCount + contributionsCount + commentedCount + followedByCount + followedByCurrentUser + badges { + id + icon + } + } + } + } + `, + UpdateComment: gql` + mutation ($content: String!, $id: ID!) { + UpdateComment(content: $content, id: $id) { + id + contentExcerpt + content + createdAt + updatedAt + disabled + deleted + author { + id + slug + name + avatar { + url + } + disabled + deleted + } + } + } + `, + DeleteComment: gql` + mutation($id: ID!) { + DeleteComment(id: $id) { + id + contentExcerpt + content + createdAt + disabled + deleted + author { + id + slug + name + avatar { + url + } + disabled + deleted + shoutedCount + contributionsCount + commentedCount + followedByCount + followedByCurrentUser + location { + name: name${lang} + } + badges { + id + icon + } + } + } + } + `, + } +} diff --git a/docs/webapp/graphql/CommentQuery.js b/docs/webapp/graphql/CommentQuery.js new file mode 100644 index 000000000..74da415e6 --- /dev/null +++ b/docs/webapp/graphql/CommentQuery.js @@ -0,0 +1,36 @@ +import gql from 'graphql-tag' + +export default (app) => { + const lang = app.$i18n.locale().toUpperCase() + return gql` + query Comment($postId: ID) { + Comment(postId: $postId) { + id + contentExcerpt + createdAt + author { + id + slug + name + avatar { + url + } + disabled + deleted + shoutedCount + contributionsCount + commentedCount + followedByCount + followedByCurrentUser + location { + name: name${lang} + } + badges { + id + icon + } + } + } + } + ` +} diff --git a/docs/webapp/graphql/Donations.js b/docs/webapp/graphql/Donations.js new file mode 100644 index 000000000..573158cbf --- /dev/null +++ b/docs/webapp/graphql/Donations.js @@ -0,0 +1,26 @@ +import gql from 'graphql-tag' + +export const DonationsQuery = () => gql` + query { + Donations { + id + showDonations + goal + progress + } + } +` + +export const UpdateDonations = () => { + return gql` + mutation ($showDonations: Boolean, $goal: Int, $progress: Int) { + UpdateDonations(showDonations: $showDonations, goal: $goal, progress: $progress) { + id + showDonations + goal + progress + updatedAt + } + } + ` +} diff --git a/docs/webapp/graphql/EmailAddress.js b/docs/webapp/graphql/EmailAddress.js new file mode 100644 index 000000000..b3b4df695 --- /dev/null +++ b/docs/webapp/graphql/EmailAddress.js @@ -0,0 +1,20 @@ +import gql from 'graphql-tag' + +export const AddEmailAddressMutation = gql` + mutation ($email: String!) { + AddEmailAddress(email: $email) { + email + createdAt + } + } +` + +export const VerifyEmailAddressMutation = gql` + mutation ($email: String!, $nonce: String!) { + VerifyEmailAddress(email: $email, nonce: $nonce) { + email + verifiedAt + createdAt + } + } +` diff --git a/docs/webapp/graphql/EmbedQuery.js b/docs/webapp/graphql/EmbedQuery.js new file mode 100644 index 000000000..70450722d --- /dev/null +++ b/docs/webapp/graphql/EmbedQuery.js @@ -0,0 +1,23 @@ +import gql from 'graphql-tag' + +export default function () { + return gql` + query ($url: String!) { + embed(url: $url) { + type + title + author + publisher + date + description + url + image + audio + video + lang + sources + html + } + } + ` +} diff --git a/docs/webapp/graphql/Fragments.js b/docs/webapp/graphql/Fragments.js new file mode 100644 index 000000000..4931750b6 --- /dev/null +++ b/docs/webapp/graphql/Fragments.js @@ -0,0 +1,137 @@ +import gql from 'graphql-tag' + +export const userFragment = gql` + fragment user on User { + id + slug + name + avatar { + url + } + disabled + deleted + } +` + +export const locationFragment = (lang) => gql` + fragment location on User { + locationName + location { + name: name${lang} + lng + lat + } + } +` + +export const badgesFragment = gql` + fragment badges on User { + badges { + id + icon + } + } +` + +export const userCountsFragment = gql` + fragment userCounts on User { + shoutedCount + contributionsCount + commentedCount + followedByCount + followingCount + followedByCurrentUser + } +` + +export const postFragment = gql` + fragment post on Post { + id + title + content + contentExcerpt + createdAt + updatedAt + disabled + deleted + slug + language + image { + url + sensitive + aspectRatio + type + } + author { + ...user + } + pinnedAt + pinned + } +` + +export const groupFragment = gql` + fragment group on Group { + id + groupName: name + slug + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + locationName + myRole + } +` + +export const postCountsFragment = gql` + fragment postCounts on Post { + commentsCount + shoutedCount + shoutedByCurrentUser + emotionsCount + clickedCount + viewedTeaserCount + viewedTeaserByCurrentUser + } +` + +export const tagsCategoriesAndPinnedFragment = gql` + fragment tagsCategoriesAndPinned on Post { + tags { + id + } + categories { + id + slug + name + icon + } + pinnedBy { + id + name + role + } + } +` + +export const commentFragment = gql` + fragment comment on Comment { + id + createdAt + updatedAt + disabled + deleted + content + contentExcerpt + } +` diff --git a/docs/webapp/graphql/Messages.js b/docs/webapp/graphql/Messages.js new file mode 100644 index 000000000..ffa2760f9 --- /dev/null +++ b/docs/webapp/graphql/Messages.js @@ -0,0 +1,87 @@ +import gql from 'graphql-tag' + +export const createMessageMutation = () => { + return gql` + mutation ($roomId: ID!, $content: String!) { + CreateMessage(roomId: $roomId, content: $content) { + #_id + id + indexId + content + senderId + author { + id + } + username + avatar + date + room { + id + } + saved + distributed + seen + } + } + ` +} + +export const messageQuery = () => { + return gql` + query ($roomId: ID!, $first: Int, $offset: Int) { + Message(roomId: $roomId, first: $first, offset: $offset, orderBy: indexId_desc) { + _id + id + indexId + content + senderId + author { + id + } + username + avatar + date + room { + id + } + saved + distributed + seen + } + } + ` +} + +export const chatMessageAdded = () => { + return gql` + subscription chatMessageAdded { + chatMessageAdded { + _id + id + indexId + content + senderId + author { + id + } + username + avatar + date + room { + id + } + saved + distributed + seen + } + } + ` +} + +export const markMessagesAsSeen = () => { + return gql` + mutation ($messageIds: [String!]) { + MarkMessagesAsSeen(messageIds: $messageIds) + } + ` +} diff --git a/docs/webapp/graphql/Moderation.js b/docs/webapp/graphql/Moderation.js new file mode 100644 index 000000000..8dc20f987 --- /dev/null +++ b/docs/webapp/graphql/Moderation.js @@ -0,0 +1,117 @@ +import gql from 'graphql-tag' + +export const reportsListQuery = () => { + // no limit for the moment like before: "reports(first: 20, orderBy: createdAt_desc)" + return gql` + query ( + $orderBy: ReportOrdering + $first: Int + $offset: Int + $reviewed: Boolean + $closed: Boolean + ) { + reports( + orderBy: $orderBy + first: $first + offset: $offset + reviewed: $reviewed + closed: $closed + ) { + id + createdAt + updatedAt + closed + reviewed { + createdAt + updatedAt + disable + moderator { + id + slug + name + } + } + resource { + __typename + ... on User { + id + slug + name + disabled + deleted + } + ... on Comment { + id + contentExcerpt + disabled + deleted + author { + id + slug + name + disabled + deleted + } + post { + id + slug + title + disabled + deleted + } + } + ... on Post { + id + slug + title + disabled + deleted + author { + id + slug + name + disabled + deleted + } + } + } + filed { + submitter { + id + slug + name + disabled + deleted + } + createdAt + reasonCategory + reasonDescription + } + } + } + ` +} + +export const reportMutation = () => { + return gql` + mutation ($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + fileReport( + resourceId: $resourceId + reasonCategory: $reasonCategory + reasonDescription: $reasonDescription + ) { + reportId + } + } + ` +} + +export const reviewMutation = () => { + return gql` + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + review(resourceId: $resourceId, disable: $disable, closed: $closed) { + disable + } + } + ` +} diff --git a/docs/webapp/graphql/PostMutations.js b/docs/webapp/graphql/PostMutations.js new file mode 100644 index 000000000..73e9f8ebe --- /dev/null +++ b/docs/webapp/graphql/PostMutations.js @@ -0,0 +1,179 @@ +import gql from 'graphql-tag' + +export default () => { + return { + CreatePost: gql` + mutation ( + $id: ID + $title: String! + $slug: String + $content: String! + $categoryIds: [ID] + $image: ImageInput + $groupId: ID + $postType: PostType + $eventInput: _EventInput + ) { + CreatePost( + id: $id + title: $title + slug: $slug + content: $content + categoryIds: $categoryIds + image: $image + groupId: $groupId + postType: $postType + eventInput: $eventInput + ) { + id + slug + title + content + contentExcerpt + language + image { + url + sensitive + } + disabled + deleted + postType + author { + id + name + } + categories { + id + } + eventStart + eventVenue + eventLocationName + eventLocation { + lng + lat + } + } + } + `, + UpdatePost: gql` + mutation ( + $id: ID! + $title: String! + $content: String! + $image: ImageInput + $categoryIds: [ID] + $postType: PostType + $eventInput: _EventInput + ) { + UpdatePost( + id: $id + title: $title + content: $content + image: $image + categoryIds: $categoryIds + postType: $postType + eventInput: $eventInput + ) { + id + title + slug + content + contentExcerpt + language + image { + url + sensitive + aspectRatio + } + pinnedBy { + id + name + role + } + postType + eventStart + eventLocationName + eventVenue + eventLocation { + lng + lat + } + } + } + `, + DeletePost: gql` + mutation ($id: ID!) { + DeletePost(id: $id) { + id + } + } + `, + AddPostEmotionsMutation: gql` + mutation ($to: _PostInput!, $data: _EMOTEDInput!) { + AddPostEmotions(to: $to, data: $data) { + emotion + from { + id + } + to { + id + } + } + } + `, + RemovePostEmotionsMutation: gql` + mutation ($to: _PostInput!, $data: _EMOTEDInput!) { + RemovePostEmotions(to: $to, data: $data) { + emotion + from { + id + } + to { + id + } + } + } + `, + pinPost: gql` + mutation ($id: ID!) { + pinPost(id: $id) { + id + title + slug + content + contentExcerpt + language + pinnedBy { + id + name + role + } + } + } + `, + unpinPost: gql` + mutation ($id: ID!) { + unpinPost(id: $id) { + id + title + slug + content + contentExcerpt + language + pinnedBy { + id + name + role + } + } + } + `, + markTeaserAsViewed: gql` + mutation ($id: ID!) { + markTeaserAsViewed(id: $id) { + id + } + } + `, + } +} diff --git a/docs/webapp/graphql/PostQuery.js b/docs/webapp/graphql/PostQuery.js new file mode 100644 index 000000000..29b7a1f07 --- /dev/null +++ b/docs/webapp/graphql/PostQuery.js @@ -0,0 +1,189 @@ +import gql from 'graphql-tag' +import { + userFragment, + postFragment, + commentFragment, + postCountsFragment, + userCountsFragment, + locationFragment, + badgesFragment, + tagsCategoriesAndPinnedFragment, +} from './Fragments' + +export default (i18n) => { + const lang = i18n.locale().toUpperCase() + return gql` + ${userFragment} + ${userCountsFragment} + ${locationFragment(lang)} + ${badgesFragment} + ${postFragment} + ${postCountsFragment} + ${tagsCategoriesAndPinnedFragment} + ${commentFragment} + + query Post($id: ID!) { + Post(id: $id) { + postType + eventStart + eventEnd + eventVenue + eventLocationName + eventIsOnline + ...post + ...postCounts + ...tagsCategoriesAndPinned + author { + ...user + ...userCounts + ...location + ...badges + blocked + } + comments(orderBy: createdAt_asc) { + ...comment + author { + ...user + ...userCounts + ...location + ...badges + } + } + group { + id + name + slug + } + } + } + ` +} + +export const filterPosts = (i18n) => { + const lang = i18n.locale().toUpperCase() + return gql` + ${userFragment} + ${userCountsFragment} + ${locationFragment(lang)} + ${badgesFragment} + ${postFragment} + ${postCountsFragment} + ${tagsCategoriesAndPinnedFragment} + + query Post($filter: _PostFilter, $first: Int, $offset: Int, $orderBy: [_PostOrdering]) { + Post(filter: $filter, first: $first, offset: $offset, orderBy: $orderBy) { + postType + eventStart + eventEnd + eventVenue + eventLocationName + eventLocation { + lng + lat + } + eventIsOnline + ...post + ...postCounts + ...tagsCategoriesAndPinned + author { + ...user + ...userCounts + ...location + ...badges + } + group { + id + name + slug + } + } + } + ` +} + +export const profilePagePosts = (i18n) => { + const lang = i18n.locale().toUpperCase() + return gql` + ${userFragment} + ${userCountsFragment} + ${locationFragment(lang)} + ${badgesFragment} + ${postFragment} + ${postCountsFragment} + ${tagsCategoriesAndPinnedFragment} + + query profilePagePosts( + $filter: _PostFilter + $first: Int + $offset: Int + $orderBy: [_PostOrdering] + ) { + profilePagePosts(filter: $filter, first: $first, offset: $offset, orderBy: $orderBy) { + postType + eventStart + eventVenue + eventLocationName + ...post + ...postCounts + ...tagsCategoriesAndPinned + author { + ...user + ...userCounts + ...location + ...badges + } + group { + id + name + slug + } + } + } + ` +} + +export const PostsEmotionsByCurrentUser = () => { + return gql` + query PostsEmotionsByCurrentUser($postId: ID!) { + PostsEmotionsByCurrentUser(postId: $postId) + } + ` +} + +export const relatedContributions = (i18n) => { + const lang = i18n.locale().toUpperCase() + return gql` + ${userFragment} + ${userCountsFragment} + ${locationFragment(lang)} + ${badgesFragment} + ${postFragment} + ${postCountsFragment} + ${tagsCategoriesAndPinnedFragment} + + query Post($slug: String!) { + Post(slug: $slug) { + ...post + ...postCounts + ...tagsCategoriesAndPinned + author { + ...user + ...userCounts + ...location + ...badges + } + relatedContributions(first: 2) { + ...post + ...postCounts + ...tagsCategoriesAndPinned + author { + ...user + ...userCounts + ...location + ...badges + } + } + } + } + ` +} diff --git a/docs/webapp/graphql/Registration.js b/docs/webapp/graphql/Registration.js new file mode 100644 index 000000000..b6cc610d9 --- /dev/null +++ b/docs/webapp/graphql/Registration.js @@ -0,0 +1,28 @@ +import gql from 'graphql-tag' +export const SignupVerificationMutation = gql` + mutation ( + $nonce: String! + $name: String! + $email: String! + $inviteCode: String + $password: String! + $about: String + $termsAndConditionsAgreedVersion: String! + $locale: String + ) { + SignupVerification( + nonce: $nonce + email: $email + inviteCode: $inviteCode + name: $name + password: $password + about: $about + termsAndConditionsAgreedVersion: $termsAndConditionsAgreedVersion + locale: $locale + ) { + id + name + slug + } + } +` diff --git a/docs/webapp/graphql/Rooms.js b/docs/webapp/graphql/Rooms.js new file mode 100644 index 000000000..221f21c86 --- /dev/null +++ b/docs/webapp/graphql/Rooms.js @@ -0,0 +1,73 @@ +import gql from 'graphql-tag' + +export const createRoom = () => gql` + mutation ($userId: ID!) { + CreateRoom(userId: $userId) { + id + roomId + roomName + lastMessageAt + createdAt + unreadCount + #avatar + users { + _id + id + name + avatar { + url + } + } + } + } +` + +export const roomQuery = () => gql` + query Room($first: Int, $offset: Int, $id: ID) { + Room(first: $first, offset: $offset, id: $id, orderBy: [createdAt_desc, lastMessageAt_desc]) { + id + roomId + roomName + avatar + lastMessageAt + createdAt + unreadCount + lastMessage { + _id + id + content + senderId + username + avatar + date + saved + distributed + seen + } + users { + _id + id + name + avatar { + url + } + } + } + } +` + +export const unreadRoomsQuery = () => { + return gql` + query { + UnreadRooms + } + ` +} + +export const roomCountUpdated = () => { + return gql` + subscription roomCountUpdated { + roomCountUpdated + } + ` +} diff --git a/docs/webapp/graphql/SaveCategories.js b/docs/webapp/graphql/SaveCategories.js new file mode 100644 index 000000000..d6db34b8a --- /dev/null +++ b/docs/webapp/graphql/SaveCategories.js @@ -0,0 +1,9 @@ +import gql from 'graphql-tag' + +export default () => { + return gql` + mutation ($activeCategories: [String]) { + saveCategorySettings(activeCategories: $activeCategories) + } + ` +} diff --git a/docs/webapp/graphql/Search.js b/docs/webapp/graphql/Search.js new file mode 100644 index 000000000..b8c4fcb51 --- /dev/null +++ b/docs/webapp/graphql/Search.js @@ -0,0 +1,128 @@ +import gql from 'graphql-tag' +import { + userFragment, + postFragment, + groupFragment, + tagsCategoriesAndPinnedFragment, +} from './Fragments' + +export const searchQuery = gql` + ${userFragment} + ${postFragment} + ${groupFragment} + + query ($query: String!) { + searchResults(query: $query, limit: 5) { + __typename + ... on Post { + ...post + commentsCount + shoutedCount + clickedCount + viewedTeaserCount + author { + ...user + } + } + ... on User { + ...user + } + ... on Tag { + id + } + ... on Group { + ...group + } + } + } +` + +export const searchPosts = gql` + ${userFragment} + ${postFragment} + ${tagsCategoriesAndPinnedFragment} + + query ($query: String!, $firstPosts: Int, $postsOffset: Int) { + searchPosts(query: $query, firstPosts: $firstPosts, postsOffset: $postsOffset) { + postCount + posts { + __typename + ...post + ...tagsCategoriesAndPinned + commentsCount + shoutedCount + clickedCount + viewedTeaserCount + author { + ...user + } + } + } + } +` + +export const searchGroups = (i18n) => { + const lang = i18n ? i18n.locale().toUpperCase() : 'EN' + return gql` + query ($query: String!, $firstGroups: Int, $groupsOffset: Int) { + searchGroups(query: $query, firstGroups: $firstGroups, groupsOffset: $groupsOffset) { + groupCount + groups { + __typename + id + groupName: name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + avatar { + url + } + locationName + location { + name: name${lang} + } + myRole + } + } + } + ` +} + +export const searchUsers = gql` + ${userFragment} + + query ($query: String!, $firstUsers: Int, $usersOffset: Int) { + searchUsers(query: $query, firstUsers: $firstUsers, usersOffset: $usersOffset) { + userCount + users { + __typename + ...user + } + } + } +` + +export const searchHashtags = gql` + query ($query: String!, $firstHashtags: Int, $hashtagsOffset: Int) { + searchHashtags(query: $query, firstHashtags: $firstHashtags, hashtagsOffset: $hashtagsOffset) { + hashtagCount + hashtags { + __typename + id + } + } + } +` diff --git a/docs/webapp/graphql/SocialMedia.js b/docs/webapp/graphql/SocialMedia.js new file mode 100644 index 000000000..62b08859a --- /dev/null +++ b/docs/webapp/graphql/SocialMedia.js @@ -0,0 +1,40 @@ +import gql from 'graphql-tag' + +// ------ mutations + +export const createSocialMediaMutation = () => { + return gql` + mutation ($url: String!) { + CreateSocialMedia(url: $url) { + id + url + } + } + ` +} + +export const updateSocialMediaMutation = () => { + return gql` + mutation ($id: ID!, $url: String!) { + UpdateSocialMedia(id: $id, url: $url) { + id + url + } + } + ` +} + +export const deleteSocialMediaMutation = () => { + return gql` + mutation ($id: ID!) { + DeleteSocialMedia(id: $id) { + id + url + } + } + ` +} + +// ------ queries + +// put the queries here diff --git a/docs/webapp/graphql/User.js b/docs/webapp/graphql/User.js new file mode 100644 index 000000000..4b743a0e3 --- /dev/null +++ b/docs/webapp/graphql/User.js @@ -0,0 +1,440 @@ +import gql from 'graphql-tag' +import { + userCountsFragment, + locationFragment, + badgesFragment, + userFragment, + postFragment, + commentFragment, + groupFragment, +} from './Fragments' + +export const profileUserQuery = (i18n) => { + const lang = i18n.locale().toUpperCase() + return gql` + ${userFragment} + ${userCountsFragment} + ${locationFragment(lang)} + ${badgesFragment} + + query User($id: ID!, $followedByCount: Int!, $followingCount: Int!) { + User(id: $id) { + ...user + ...userCounts + ...location + ...badges + about + createdAt + followedByCurrentUser + isMuted + isBlocked + blocked + following(first: $followingCount) { + ...user + ...userCounts + ...location + ...badges + } + followedBy(first: $followedByCount) { + ...user + ...userCounts + ...location + ...badges + } + socialMedia { + id + url + } + showShoutsPublicly + sendNotificationEmails + } + } + ` +} + +export const minimisedUserQuery = () => { + return gql` + query ($slug: String) { + User(slug: $slug, orderBy: slug_asc) { + id + slug + name + avatar { + url + } + } + } + ` +} + +export const adminUserQuery = () => { + return gql` + query ($filter: _UserFilter, $first: Int, $offset: Int, $email: String) { + User( + email: $email + filter: $filter + first: $first + offset: $offset + orderBy: createdAt_desc + ) { + id + name + slug + email + role + createdAt + contributionsCount + commentedCount + shoutedCount + } + } + ` +} + +export const mapUserQuery = (i18n) => { + const lang = i18n.locale().toUpperCase() + return gql` + ${userFragment} + ${locationFragment(lang)} + ${badgesFragment} + + query { + User { + ...user + about + ...location + ...badges + } + } + ` +} + +export const notificationQuery = (_i18n) => { + return gql` + ${userFragment} + ${commentFragment} + ${postFragment} + ${groupFragment} + + query ($read: Boolean, $orderBy: NotificationOrdering, $first: Int, $offset: Int) { + notifications(read: $read, orderBy: $orderBy, first: $first, offset: $offset) { + id + read + reason + createdAt + updatedAt + to { + ...user + } + from { + __typename + ... on Post { + ...post + author { + ...user + } + } + ... on Comment { + ...comment + author { + ...user + } + post { + ...post + author { + ...user + } + } + } + ... on Group { + ...group + } + } + relatedUser { + ...user + } + } + } + ` +} + +export const markAsReadMutation = (_i18n) => { + return gql` + ${userFragment} + ${commentFragment} + ${postFragment} + ${groupFragment} + + mutation ($id: ID!) { + markAsRead(id: $id) { + id + read + reason + createdAt + updatedAt + from { + __typename + ... on Post { + ...post + author { + ...user + } + } + ... on Comment { + ...comment + post { + ...post + author { + ...user + } + } + } + ... on Group { + ...group + } + } + } + } + ` +} + +export const markAllAsReadMutation = (_i18n) => { + return gql` + ${userFragment} + ${commentFragment} + ${postFragment} + ${groupFragment} + + mutation { + markAllAsRead { + id + read + reason + createdAt + updatedAt + from { + __typename + ... on Post { + ...post + author { + ...user + } + } + ... on Comment { + ...comment + post { + ...post + author { + ...user + } + } + } + ... on Group { + ...group + } + } + } + } + ` +} + +export const notificationAdded = () => { + return gql` + ${userFragment} + ${commentFragment} + ${postFragment} + ${groupFragment} + + subscription notifications { + notificationAdded { + id + read + reason + createdAt + updatedAt + to { + ...user + } + from { + __typename + ... on Post { + ...post + author { + ...user + } + } + ... on Comment { + ...comment + author { + ...user + } + post { + ...post + author { + ...user + } + } + } + ... on Group { + ...group + } + } + relatedUser { + ...user + } + } + } + ` +} +export const followUserMutation = (i18n) => { + return gql` + ${userFragment} + ${userCountsFragment} + + mutation ($id: ID!) { + followUser(id: $id) { + ...user + ...userCounts + followedByCount + followedByCurrentUser + followedBy(first: 7) { + ...user + ...userCounts + } + } + } + ` +} + +export const unfollowUserMutation = (i18n) => { + return gql` + ${userFragment} + ${userCountsFragment} + + mutation ($id: ID!) { + unfollowUser(id: $id) { + ...user + ...userCounts + followedByCount + followedByCurrentUser + followedBy(first: 7) { + ...user + ...userCounts + } + } + } + ` +} + +export const updateUserMutation = () => { + return gql` + mutation ( + $id: ID! + $slug: String + $name: String + $about: String + $allowEmbedIframes: Boolean + $showShoutsPublicly: Boolean + $sendNotificationEmails: Boolean + $termsAndConditionsAgreedVersion: String + $avatar: ImageInput + $locationName: String # empty string '' sets it to null + ) { + UpdateUser( + id: $id + slug: $slug + name: $name + about: $about + allowEmbedIframes: $allowEmbedIframes + showShoutsPublicly: $showShoutsPublicly + sendNotificationEmails: $sendNotificationEmails + termsAndConditionsAgreedVersion: $termsAndConditionsAgreedVersion + avatar: $avatar + locationName: $locationName + ) { + id + slug + name + locationName + about + allowEmbedIframes + showShoutsPublicly + sendNotificationEmails + locale + termsAndConditionsAgreedVersion + avatar { + url + } + } + } + ` +} + +export const checkSlugAvailableQuery = gql` + query ($slug: String!) { + User(slug: $slug) { + slug + } + } +` + +export const currentUserQuery = gql` + ${userFragment} + query { + currentUser { + ...user + email + role + about + locationName + locale + allowEmbedIframes + showShoutsPublicly + sendNotificationEmails + termsAndConditionsAgreedVersion + socialMedia { + id + url + } + activeCategories + } + } +` + +export const currentUserCountQuery = () => gql` + ${userCountsFragment} + query { + currentUser { + ...userCounts + } + } +` + +export const userDataQuery = (i18n) => { + return gql` + ${userFragment} + ${postFragment} + ${commentFragment} + query ($id: ID!) { + userData(id: $id) { + user { + ...user + } + posts { + ...post + categories { + id + name + } + comments { + author { + id + slug + } + ...comment + } + } + } + } + ` +} diff --git a/docs/webapp/graphql/admin/Roles.js b/docs/webapp/graphql/admin/Roles.js new file mode 100644 index 000000000..4015ad06c --- /dev/null +++ b/docs/webapp/graphql/admin/Roles.js @@ -0,0 +1,23 @@ +import gql from 'graphql-tag' + +export const FetchAllRoles = () => { + return gql` + query { + availableRoles + } + ` +} + +export const updateUserRole = (role, id) => { + return gql` + mutation ($role: UserRole!, $id: ID!) { + switchUserRole(role: $role, id: $id) { + name + role + id + updatedAt + email + } + } + ` +} diff --git a/docs/webapp/graphql/admin/Statistics.js b/docs/webapp/graphql/admin/Statistics.js new file mode 100644 index 000000000..94c3f91f0 --- /dev/null +++ b/docs/webapp/graphql/admin/Statistics.js @@ -0,0 +1,15 @@ +import gql from 'graphql-tag' + +export const Statistics = gql` + query { + statistics { + countUsers + countPosts + countComments + countNotifications + countInvites + countFollows + countShouts + } + } +` diff --git a/docs/webapp/graphql/groups.js b/docs/webapp/graphql/groups.js new file mode 100644 index 000000000..6aedc205d --- /dev/null +++ b/docs/webapp/graphql/groups.js @@ -0,0 +1,224 @@ +import gql from 'graphql-tag' +// import { locationFragment } from './Fragments' + +// ------ mutations + +export const createGroupMutation = () => { + return gql` + mutation ( + $id: ID + $name: String! + $slug: String + $about: String + $description: String! + $groupType: GroupType! + $actionRadius: GroupActionRadius! + $categoryIds: [ID] + $locationName: String # empty string '' sets it to null + ) { + CreateGroup( + id: $id + name: $name + slug: $slug + about: $about + description: $description + groupType: $groupType + actionRadius: $actionRadius + categoryIds: $categoryIds + locationName: $locationName + ) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + locationName + myRole + } + } + ` +} + +export const updateGroupMutation = () => { + return gql` + mutation ( + $id: ID! + $name: String + $slug: String + $about: String + $description: String + $actionRadius: GroupActionRadius + $categoryIds: [ID] + $avatar: ImageInput + $locationName: String # empty string '' sets it to null + ) { + UpdateGroup( + id: $id + name: $name + slug: $slug + about: $about + description: $description + actionRadius: $actionRadius + categoryIds: $categoryIds + avatar: $avatar + locationName: $locationName + ) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + avatar { + url + } + locationName + myRole + } + } + ` +} + +export const joinGroupMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!) { + JoinGroup(groupId: $groupId, userId: $userId) { + id + name + slug + myRoleInGroup + } + } + ` +} + +export const leaveGroupMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!) { + LeaveGroup(groupId: $groupId, userId: $userId) { + id + name + slug + myRoleInGroup + } + } + ` +} + +export const changeGroupMemberRoleMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) { + ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) { + id + name + slug + myRoleInGroup + } + } + ` +} + +export const removeUserFromGroupMutation = () => { + return gql` + mutation ($groupId: ID!, $userId: ID!) { + RemoveUserFromGroup(groupId: $groupId, userId: $userId) { + id + name + slug + myRoleInGroup + } + } + ` +} + +// ------ queries + +export const groupQuery = (i18n) => { + const lang = i18n ? i18n.locale().toUpperCase() : 'EN' + // ${locationFragment(lang)} + return gql` + + query ($isMember: Boolean, $id: ID, $slug: String, $first: Int, $offset: Int) { + Group(isMember: $isMember, id: $id, slug: $slug, first: $first, offset: $offset) { + id + name + slug + createdAt + updatedAt + disabled + deleted + about + description + descriptionExcerpt + groupType + actionRadius + categories { + id + slug + name + icon + } + avatar { + url + } + locationName + # ...location + location { + name: name${lang} + lng + lat + } + myRole + } + } + ` +} + +export const groupMembersQuery = () => { + return gql` + query ($id: ID!) { + GroupMembers(id: $id) { + id + name + slug + myRoleInGroup + avatar { + url + } + } + } + ` +} + +export const groupCountQuery = () => { + return gql` + query ($isMember: Boolean) { + GroupCount(isMember: $isMember) + } + ` +} diff --git a/docs/webapp/graphql/location.js b/docs/webapp/graphql/location.js new file mode 100644 index 000000000..1fff64782 --- /dev/null +++ b/docs/webapp/graphql/location.js @@ -0,0 +1,10 @@ +import gql from 'graphql-tag' + +export const queryLocations = () => gql` + query ($place: String!, $lang: String!) { + queryLocations(place: $place, lang: $lang) { + place_name + id + } + } +` diff --git a/docs/webapp/graphql/settings/BlockedUsers.js b/docs/webapp/graphql/settings/BlockedUsers.js new file mode 100644 index 000000000..0c642b352 --- /dev/null +++ b/docs/webapp/graphql/settings/BlockedUsers.js @@ -0,0 +1,45 @@ +import gql from 'graphql-tag' + +export const blockedUsers = () => { + return gql` + { + blockedUsers { + id + name + slug + avatar { + url + } + about + disabled + deleted + } + } + ` +} + +export const blockUser = () => { + return gql` + mutation ($id: ID!) { + blockUser(id: $id) { + id + name + blocked + followedByCurrentUser + } + } + ` +} + +export const unblockUser = () => { + return gql` + mutation ($id: ID!) { + unblockUser(id: $id) { + id + name + blocked + followedByCurrentUser + } + } + ` +} diff --git a/docs/webapp/graphql/settings/MutedUsers.js b/docs/webapp/graphql/settings/MutedUsers.js new file mode 100644 index 000000000..10db085af --- /dev/null +++ b/docs/webapp/graphql/settings/MutedUsers.js @@ -0,0 +1,45 @@ +import gql from 'graphql-tag' + +export const mutedUsers = () => { + return gql` + { + mutedUsers { + id + name + slug + avatar { + url + } + about + disabled + deleted + } + } + ` +} + +export const muteUser = () => { + return gql` + mutation ($id: ID!) { + muteUser(id: $id) { + id + name + isMuted + followedByCurrentUser + } + } + ` +} + +export const unmuteUser = () => { + return gql` + mutation ($id: ID!) { + unmuteUser(id: $id) { + id + name + isMuted + followedByCurrentUser + } + } + ` +} diff --git a/docs/webapp/html.html b/docs/webapp/html.html new file mode 100644 index 000000000..52f4a5c87 --- /dev/null +++ b/docs/webapp/html.html @@ -0,0 +1,559 @@ + + + + + + + HTML · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              +
                              + + + + + + + + +
                              + +
                              + +
                              + + + + + + + + +
                              +
                              + +
                              +
                              + +
                              + +

                              HTML – Code Guidelines

                              +

                              We write semantic markup

                              +

                              We avoid using divs and spans and try to choose more meaningful HTML elements instead. If unsure which element to use this list by MDN can be of help.

                              +

                              Why?

                              +
                                +
                              • semantic markup is crucial for accessibility
                              • +
                              • it makes the code more readable for other developers
                              • +
                              • it benefits our SEO
                              • +
                              +

                              For more background see this article.

                              +

                              This doesn’t mean you can’t ever use a div – just think twice before you do!

                              +

                              We write as little HTML as possible – and as much as necessary

                              +

                              HTML is used to structure content on the page and should therefore reflect its complexity. Not more and not less. Most content does not require deep nesting of HTML elements – if you find yourself wrapping container around container or adding an element just to correctly position another element on the page this calls for the use of CSS instead!

                              +

                              Why?

                              +
                                +
                              • deep nesting makes it hard to understand, style and maintain components
                              • +
                              • it can lead to performance issues
                              • +
                              + +

                              For a deeper dive into the WHY and HOW have a look at the following resources:

                              + + + +
                              + +
                              +
                              +
                              + +

                              results matching ""

                              +
                                + +
                                +
                                + +

                                No results matching ""

                                + +
                                +
                                +
                                + +
                                +
                                + +
                                + + + + + + + + + + + + + + +
                                + + +
                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/index.html b/docs/webapp/index.html new file mode 100644 index 000000000..a38d27066 --- /dev/null +++ b/docs/webapp/index.html @@ -0,0 +1,607 @@ + + + + + + + Webapp · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                +
                                + + + + + + + + +
                                + +
                                + +
                                + + + + + + + + +
                                +
                                + +
                                +
                                + +
                                + +

                                Webapp

                                +

                                UI Screenshot

                                +

                                Installation

                                +

                                For preparation we need Node and recommend to use node version manager nvm to switch +between different local Node versions:

                                +
                                # install Node
                                +$ cd webapp
                                +$ nvm install v19.4.0
                                +$ nvm use v19.4.0
                                +
                                +

                                Install node dependencies with yarn:

                                +
                                # install all dependencies
                                +$ cd webapp
                                +$ yarn install
                                +# or just
                                +$ yarn
                                +# or just later on to use version of ".nvmrc" file
                                +$ nvm use && yarn
                                +
                                +

                                Copy:

                                +
                                # in webapp
                                +cp .env.template .env
                                +
                                +

                                Configure the files according to your needs and your local setup.

                                +

                                Build for Development

                                +
                                # serve with hot reload at localhost:3000
                                +$ yarn dev
                                +
                                +

                                Build for Production

                                +
                                # build for production and launch server
                                +$ yarn build
                                +$ yarn start
                                +
                                +

                                Run tests

                                +

                                We ensure the quality of our frontend code by using

                                +
                                  +
                                • ESLint for checking our JavaScript code
                                • +
                                • Jest and Vue Test Utils to unit test our components
                                • +
                                • Storybook to document and manually test our components in an isolated playground
                                • +
                                +

                                For more information see our frontend testing guide. Use these commands to run the tests:

                                +

                                After starting the application following the above guidelines, open new terminal windows for each of these commands:

                                # run eslint
                                +$ docker-compose exec webapp yarn lint
                                +
                                # run unit tests
                                +$ docker-compose exec webapp yarn test
                                +
                                # start storybook
                                +$ docker-compose exec webapp yarn storybook
                                +

                                You can then visit the Storybook playground on http://localhost:3002

                                After starting the application following the above guidelines, open new terminal windows and navigate to the /webapp directory for each of these commands:

                                # run eslint in /webapp (use option --fix to normalize the files)
                                +$ yarn lint
                                +
                                # run unit tests in /webapp
                                +$ yarn test
                                +
                                # run locales in /webapp (use option --fix to sort the locales)
                                +$ yarn locales
                                +
                                # start storybook in /webapp
                                +$ yarn storybook
                                +

                                You can then visit the Storybook playground on http://localhost:3002

                                +

                                Maintenance Mode

                                +

                                For installing and running the maintenance mode see Maintenance Mode.

                                +

                                Styleguide Migration

                                +

                                We are currently in the process of migrating our styleguide components and design tokens from the Nitro Styleguide into the main ocelot.social repository and refactoring our components in the process. During this migration, our new components will live in a _new/ folder to separate them from the old, yet untouched components.

                                +

                                Folder Structure

                                +

                                The folder structure we are following is prescribed by Nuxt.js:

                                +
                                  +
                                • assets contains icons, images and logos in svg format and all shared SCSS files such as tokens
                                • +
                                • components separated into two sub-folders:
                                    +
                                  • generic are the generic building blocks of the app – small, reusable and usually not coupled to state
                                  • +
                                  • features are composed of components but tied to a particular function of the app (e.g. comment or post)
                                  • +
                                  +
                                • +
                                • layouts can use components to create layout templates for pages
                                • +
                                • pages are the entry points for all routes in the app and are composed of layouts, features and components
                                • +
                                + + +
                                + +
                                +
                                +
                                + +

                                results matching ""

                                +
                                  + +
                                  +
                                  + +

                                  No results matching ""

                                  + +
                                  +
                                  +
                                  + +
                                  +
                                  + +
                                  + + + + + + + + + + + + + + +
                                  + + +
                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/jest.config.js b/docs/webapp/jest.config.js new file mode 100644 index 000000000..e9185f60e --- /dev/null +++ b/docs/webapp/jest.config.js @@ -0,0 +1,41 @@ +module.exports = { + verbose: true, + collectCoverage: true, + collectCoverageFrom: [ + '**/*.{js,vue}', + '!**/?(*.)+(spec|test|story).js?(x)', + '!**/node_modules/**', + '!**/.nuxt/**', + '!**/storybook/**', + '!**/coverage/**', + '!**/config/**', + '!**/maintenance/**', + '!**/plugins/**', + '!**/.eslintrc.js', + '!**/.prettierrc.js', + '!**/nuxt.config.js', + ], + coverageThreshold: { + global: { + lines: 83, + }, + }, + coverageProvider: 'v8', + setupFiles: ['/test/registerContext.js', '/test/testSetup.js'], + transform: { + '.*\\.(vue)$': '@vue/vue2-jest', + '^.+\\.js$': 'babel-jest', + }, + testMatch: ['**/?(*.)+(spec|test).js?(x)'], + modulePathIgnorePatterns: ['/dist/'], + moduleNameMapper: { + '\\.(svg)$': '/test/fileMock.js', + '\\.(scss|css|less)$': 'identity-obj-proxy', + '@mapbox/mapbox-gl-geocoder': 'identity-obj-proxy', + 'vue2-datepicker/locale/undefined': 'vue2-datepicker/locale/en', + '^@/(.*)$': '/src/$1', + '^~/(.*)$': '/$1', + }, + moduleFileExtensions: ['js', 'json', 'vue'], + testEnvironment: 'jest-environment-jsdom', +} diff --git a/docs/webapp/layouts/basic.spec.js b/docs/webapp/layouts/basic.spec.js new file mode 100644 index 000000000..c87fc103b --- /dev/null +++ b/docs/webapp/layouts/basic.spec.js @@ -0,0 +1,47 @@ +import Vuex from 'vuex' +import { shallowMount } from '@vue/test-utils' +import Basic from './basic.vue' + +const localVue = global.localVue + +const stubs = { + nuxt: { + template: '', + }, +} + +describe('basic.vue', () => { + let wrapper + let mocks + let store + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + store = new Vuex.Store({ + getters: { + 'auth/isLoggedIn': () => true, + }, + }) + }) + + describe('shallow mount', () => { + const Wrapper = () => { + return shallowMount(Basic, { + store, + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('layout-blank')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/layouts/basic.vue b/docs/webapp/layouts/basic.vue new file mode 100644 index 000000000..5eadb42af --- /dev/null +++ b/docs/webapp/layouts/basic.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/docs/webapp/layouts/blank.spec.js b/docs/webapp/layouts/blank.spec.js new file mode 100644 index 000000000..f4c33cd9c --- /dev/null +++ b/docs/webapp/layouts/blank.spec.js @@ -0,0 +1,39 @@ +import { shallowMount } from '@vue/test-utils' +import Blank from './blank.vue' + +const localVue = global.localVue + +const stubs = { + nuxt: { + template: '', + }, +} + +describe('blank.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('shallow mount', () => { + const Wrapper = () => { + return shallowMount(Blank, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('layout-blank')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/layouts/blank.vue b/docs/webapp/layouts/blank.vue new file mode 100644 index 000000000..bd8d4f29a --- /dev/null +++ b/docs/webapp/layouts/blank.vue @@ -0,0 +1,17 @@ + + + diff --git a/docs/webapp/layouts/default.spec.js b/docs/webapp/layouts/default.spec.js new file mode 100644 index 000000000..cce8c2eca --- /dev/null +++ b/docs/webapp/layouts/default.spec.js @@ -0,0 +1,64 @@ +import Vuex from 'vuex' +import { shallowMount } from '@vue/test-utils' +import Default from './default.vue' + +const localVue = global.localVue +localVue.directive('scrollTo', jest.fn()) + +const stubs = { + nuxt: { + template: '', + }, + 'client-only': { + template: '', + }, + 'nuxt-link': { + template: '', + }, +} + +describe('default.vue', () => { + let wrapper + let mocks + let store + + beforeEach(() => { + mocks = { + $route: { + matched: [{ name: 'index' }], + }, + $scrollTo: jest.fn(), + $t: jest.fn(), + $env: { + INVITE_REGISTRATION: true, + }, + } + store = new Vuex.Store({ + getters: { + 'auth/isLoggedIn': () => true, + 'chat/showChat': () => { + return { showChat: false, roomID: null } + }, + }, + }) + }) + + describe('shallow mount', () => { + const Wrapper = () => { + return shallowMount(Default, { + store, + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('layout-default')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/layouts/default.vue b/docs/webapp/layouts/default.vue new file mode 100644 index 000000000..a75535a84 --- /dev/null +++ b/docs/webapp/layouts/default.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/docs/webapp/layouts/error.spec.js b/docs/webapp/layouts/error.spec.js new file mode 100644 index 000000000..95b54c965 --- /dev/null +++ b/docs/webapp/layouts/error.spec.js @@ -0,0 +1,51 @@ +import { shallowMount } from '@vue/test-utils' +import Error from './error.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': { + template: '', + }, +} + +describe('error.vue', () => { + let mocks, wrapper + + beforeEach(() => { + mocks = { + $t: jest.fn((key) => key), + } + }) + + const Wrapper = (propsData = {}) => { + return shallowMount(Error, { mocks, propsData, localVue, stubs }) + } + + describe('shallowMount', () => { + it('renders default error message', () => { + wrapper = Wrapper({ error: {} }) + expect(wrapper.find('.error-message').text()).toBe('error-pages.default') + }) + + it('renders error message to given statusCode', () => { + wrapper = Wrapper({ error: { statusCode: 404 } }) + expect(wrapper.find('.error-message').text()).toBe('error-pages.404-default') + }) + + it('renders error message to given custom key', () => { + wrapper = Wrapper({ error: { statusCode: 404, key: 'my-custom-key' } }) + expect(wrapper.find('.error-message').text()).toBe('my-custom-key') + }) + + it('has a link to index page', () => { + wrapper = Wrapper({ error: {} }) + expect(wrapper.find('span[to="/"]').text()).toBe('error-pages.back-to-index') + }) + + it('has an image related to the status code', () => { + wrapper = Wrapper({ error: { statusCode: 404 } }) + expect(wrapper.find('.error-image').attributes('src')).toBe('/img/svg/errors/error404.svg') + }) + }) +}) diff --git a/docs/webapp/layouts/error.vue b/docs/webapp/layouts/error.vue new file mode 100644 index 000000000..9143a7ff1 --- /dev/null +++ b/docs/webapp/layouts/error.vue @@ -0,0 +1,47 @@ + + + + diff --git a/docs/webapp/layouts/no-header.vue b/docs/webapp/layouts/no-header.vue new file mode 100644 index 000000000..249275b3f --- /dev/null +++ b/docs/webapp/layouts/no-header.vue @@ -0,0 +1,28 @@ + + + diff --git a/docs/webapp/locales/de.json b/docs/webapp/locales/de.json new file mode 100644 index 000000000..62860ae13 --- /dev/null +++ b/docs/webapp/locales/de.json @@ -0,0 +1,1114 @@ +{ + "actions": { + "cancel": "Abbrechen", + "create": "Erstellen", + "delete": "Löschen", + "edit": "Bearbeiten", + "loading": "wird geladen", + "loadMore": "mehr laden", + "save": "Speichern", + "saveCategories": "Themen speichern" + }, + "admin": { + "categories": { + "categoryName": "Name", + "name": "Themen", + "postCount": "Beiträge" + }, + "dashboard": { + "comments": "Kommentare", + "follows": "Folgen", + "invites": "Einladungen", + "name": "Startzentrale", + "notifications": "Benachrichtigungen", + "organizations": "Organisationen", + "posts": "Beiträge", + "projects": "Projekte", + "shouts": "Empfehlungen", + "users": "Nutzer" + }, + "donations": { + "goal": "Monatlich benötigte Spenden", + "name": "Spendeninfo", + "progress": "Bereits gesammelte Spenden", + "showDonationsCheckboxLabel": "Spendenfortschritt anzeigen", + "successfulUpdate": "Spenden-Info erfolgreich aktualisiert!" + }, + "hashtags": { + "name": "Hashtags", + "nameOfHashtag": "Name", + "number": "Nr.", + "tagCount": "Beiträge", + "tagCountUnique": "Nutzer" + }, + "invites": { + "description": "Einladungen sind eine wunderbare Möglichkeit, Deine Freunde in Deinem Netzwerk zu haben …", + "name": "Nutzer einladen", + "title": "Leute einladen" + }, + "name": "Systemverwaltung", + "notifications": { + "name": "Benachrichtigungen" + }, + "organizations": { + "name": "Organisationen" + }, + "pages": { + "name": "Seiten" + }, + "settings": { + "name": "Einstellungen" + }, + "users": { + "empty": "Keine Nutzer gefunden", + "form": { + "placeholder": "E-Mail, Name oder Beschreibung" + }, + "name": "Nutzer", + "roleChanged": "Rolle erfolgreich geändert!", + "table": { + "columns": { + "createdAt": "Erstellt am", + "email": "E-Mail", + "name": "Name", + "number": "Nr.", + "role": "Rolle", + "slug": "Alias" + } + } + } + }, + "chat": { + "addRoomHeadline": "Suche Nutzer für neuen Chat", + "cancelSelectMessage": "Abbrechen", + "conversationStarted": "Unterhaltung startete am:", + "isOnline": "online", + "isTyping": "tippt...", + "lastSeen": "zuletzt gesehen ", + "messageDeleted": "Diese Nachricht wuerde gelöscht", + "messagesEmpty": "Keine Nachrichten", + "newMessages": "Neue Nachrichten", + "page": { + "headline": "Chat" + }, + "roomEmpty": "Keinen Raum selektiert", + "roomsEmpty": "Keine Räume", + "search": "Chat-Räume filtern", + "typeMessage": "Nachricht schreiben", + "userProfileButton": { + "label": "Chat", + "tooltip": "Chatte mit „{name}“" + } + }, + "client-only": { + "loading": "Lade …" + }, + "code-of-conduct": { + "subheader": "für das Soziale Netzwerk von {ORGANIZATION_NAME}" + }, + "comment": { + "content": { + "unavailable-placeholder": "… dieser Kommentar ist nicht mehr verfügbar" + }, + "edited": "bearbeitet", + "menu": { + "delete": "Kommentar löschen", + "edit": "Kommentar bearbeiten" + }, + "show": { + "less": "weniger anzeigen", + "more": "mehr anzeigen" + } + }, + "common": { + "category": "Thema ::: Themen", + "comment": "Kommentar ::: Kommentare", + "letsTalk": "Miteinander reden", + "loading": "wird geladen", + "loadMore": "mehr laden", + "name": "Name", + "organization": "Organisation ::: Organisationen", + "post": "Beitrag ::: Beiträge", + "project": "Projekt ::: Projekte", + "reportContent": "Melden", + "shout": "Empfehlung ::: Empfehlungen", + "tag": "Schlagwort ::: Schlagwörter", + "takeAction": "Aktiv werden", + "user": "Nutzer ::: Nutzer", + "validations": { + "categories": "es müssen eine bis drei Themen ausgewählt werden", + "email": "muss eine gültige E-Mail-Adresse sein", + "eventLocationNameLength": "Minimum {min}, Maximum {max} Zeichen", + "eventLocationNameNotEmpty": "es dürfen nicht nur Freizeichen eingetragen werden", + "eventVenueLength": "Minimum {min}, Maximum {max} Zeichen", + "eventVenueNotEmpty": "es dürfen nicht nur Freizeichen eingetragen werden", + "url": "muss eine gültige URL sein" + }, + "versus": "Versus" + }, + "components": { + "dateTimeRange": { + "hourMinute": "HH:mm", + "monthDay": "dd.MM.", + "yearMonthDay": "dd.MM.yyyy" + }, + "password-reset": { + "change-password": { + "error": "Passwort Änderung fehlgeschlagen. Möglicherweise falscher Sicherheitscode?", + "help": "Falls Probleme auftreten, schreib uns gerne eine Mail an:", + "success": "Änderung des Passworts war erfolgreich!" + }, + "request": { + "form": { + "description": "Eine E-Mail zum Zurücksetzen des Passworts wird an die angegebene Adresse geschickt.", + "submit": "E-Mail anfordern", + "submitted": "Eine E-Mail mit weiteren Hinweisen wurde verschickt an {email}" + }, + "title": "Passwort zurücksetzen" + } + }, + "registration": { + "create-user-account": { + "buttonTitle": "Erstellen", + "error": "Es konnte kein Nutzerkonto erstellt werden!", + "help": "Vielleicht war der Bestätigungscode falsch oder abgelaufen? Wenn das Problem weiterhin besteht, schicke uns gerne eine E-Mail an:", + "recieveCommunicationAsEmailsEtcConfirmed": "Ich stimme auch dem Erhalt von E-Mails und anderen Formen der Kommunikation (z.B. Push-Benachrichtigungen) zu.", + "success": "Dein Nutzerkonto wurde erstellt!", + "termsAndCondsEtcConfirmed": "Ich habe folgendes gelesen, verstanden und stimme zu:", + "title": "Nutzerkonto anlegen" + }, + "email": { + "buttonTitle": { + "resend": "Erneut senden", + "send": "Sende E-Mail", + "skipResend": "Nicht senden" + }, + "form": { + "sendEmailAgain": "E-Mail erneut senden", + "success": "Verifikations-E-Mail gesendet an {email}!" + }, + "title": "E-Mail" + }, + "email-display": { + "warningFormat": "⚠️ E-Mail hat ein ungültiges Format!", + "warningUndef": "⚠️ Keine E-Mail definiert!", + "yourEmail": "Deine E-Mail-Adresse:" + }, + "email-nonce": { + "buttonTitle": "Bestätigen", + "form": { + "description": "Öffne Dein E-Mail Postfach und gib den Code ein, den wir geschickt haben.", + "next": "Weiter", + "nonce": "E-Mail-Code: 32143", + "validations": { + "error": "Ungültiger Bestätigungs-Code {nonce} für E-Mail {email}!", + "length": "muss genau {nonceLength} Buchstaben lang sein", + "success": "Gültiger Bestätigungs-Code {nonce} für E-Mail {email}!" + } + }, + "title": "E-Mail Bestätigung" + }, + "invite-code": { + "buttonTitle": "Weiter", + "form": { + "description": "Gib den Einladungs-Code ein, den du bekommen hast.", + "invite-code": "Einladungs-Code: ACJERB", + "next": "Weiter", + "validations": { + "error": "Ungültiger Einladungs-Code {inviteCode}!", + "length": "muss genau {inviteCodeLength} Buchstaben lang sein", + "success": "Gültiger Einladungs-Code {inviteCode}!" + } + } + }, + "no-public-registrstion": { + "title": "Keine öffentliche Registrierung möglich" + }, + "signup": { + "form": { + "data-privacy": "Ich habe die Datenschutzerklärung gelesen und verstanden.", + "description": "Um loszulegen, kannst Du Dich hier kostenfrei registrieren:", + "errors": { + "email-exists": "Es gibt schon ein Nutzerkonto mit dieser E-Mail-Adresse!" + }, + "submit": "Konto erstellen", + "success": "Eine E-Mail mit einem Link zum Abschließen Deiner Registrierung wurde an {email} geschickt", + "terms-and-condition": "Ich stimme den Nutzungsbedingungen zu." + }, + "title": "Mach mit bei {APPLICATION_NAME}!", + "unavailable": "Leider ist die öffentliche Registrierung von Nutzerkonten auf diesem Server derzeit nicht möglich." + } + } + }, + "contribution": { + "amount-clicks": "{amount} clicks", + "amount-comments": "{amount} comments", + "amount-shouts": "{amount} recommendations", + "amount-views": "{amount} views", + "categories": { + "infoSelectedNoOfMaxCategories": "{chosen} von {max} Themen ausgewählt" + }, + "category": { + "description": { + "body-and-excercise": "Sport, Yoga, Massage, Tanzen, Entspannung", + "children": "Familie, Pädagogik, Schule, Prägung", + "culture": "Kunst, Theater, Musik, Fotografie, Film", + "economy": "Handel, Konsum, Marketing, Lieferketten", + "energy": "Öl, Gas, Kohle, Wind, Wasserkraft, Biogas, Atomenergie", + "finance": "Geld, Finanzsystem, Alternativwährungen", + "health": "Medizin, Ernährung, WHO, Impfungen, Schadstoffe", + "home": "Bauen, Lebensgemeinschaften, Tiny Houses, Gemüsegarten", + "it-and-media": "Nachrichten, Manipulation, Datenschutz, Überwachung, Datenkraken, KI, Software, Apps", + "law": "Menschenrechte, Gesetze, Verordnungen", + "miscellaneous": "Sonstiges", + "mobility": "Reise, Verkehr, Elektromobilität", + "nature": "Tiere, Pflanzen, Landwirtschaft, Ökologie, Artenvielfalt", + "networking": "Kooperation, Aktionsbündnisse, Solidarität, Hilfe", + "peace": "Krieg, Militär, soziale Verteidigung, Waffen, Cyberattacken", + "politics": "Demokratie, Mitbestimmung, Wahlen, Korruption, Parteien", + "psyche": "Seele, Gefühle, Glück", + "science": "Bildung, Hochschule, Publikationen", + "spirituality": "Religion, Werte, Ethik" + }, + "name": { + "body-and-excercise": "Körper & Bewegung", + "children": "Kinder", + "culture": "Kultur", + "economy": "Wirtschaft", + "energy": "Energie", + "finance": "Finanzen", + "health": "Gesundheit", + "home": "Wohnen", + "it-and-media": "IT & Medien", + "law": "Recht", + "miscellaneous": "Sonstiges", + "mobility": "Mobilität", + "nature": "Natur", + "networking": "Vernetzung", + "peace": "Frieden", + "politics": "Politik", + "psyche": "Psyche", + "science": "Wissenschaft", + "spirituality": "Spiritualität" + } + }, + "emotions-label": { + "angry": "Verärgert", + "cry": "Zum Weinen", + "funny": "Lustig", + "happy": "Glücklich", + "surprised": "Erstaunt" + }, + "filterFollow": "Nutzern, denen ich folge", + "filterMasonryGrid": { + "myFriends": "Nutzer, denen ich folge", + "myGroups": "Aus meinen Gruppen", + "myTopics": "Meine Themen", + "noFilter": "Inhalte filtern", + "onlyArticles": "Beiträge", + "onlyEvents": "Veranstaltungen" + }, + "filterMyGroups": "Meine Gruppen", + "inappropriatePicture": "Dieses Bild kann für einige Menschen unangemessen sein.", + "languageSelectLabel": "Sprache Deines Beitrags", + "languageSelectText": "Sprache wählen", + "newEvent": "Erstelle einen neue Veranstaltung", + "newPost": "Erstelle einen neuen Beitrag", + "success": "Gespeichert!", + "teaserImage": { + "cropImage": "Bild zuschneiden", + "cropperConfirm": "Bestätigen", + "errors": { + "aspect-ratio-too-small": "Dieses Bild ist zu hoch.", + "unSupported-file-format": "Bitte lade ein Bild in den folgenden Formaten hoch: JPG, JPEG, PNG or GIF!" + }, + "supportedFormats": "Füge ein Bild im Dateiformat JPG, PNG oder GIF ein" + }, + "title": "Titel", + "visibleOnlyForMembersOfGroup": "Dieser Beitrag wird nur für Mitglieder der Gruppe „{name}“ sichtbar sein." + }, + "delete": { + "cancel": "Abbrechen", + "comment": { + "message": "Bist Du sicher, dass Du den Kommentar „{name}“ löschen möchtest?", + "success": "Kommentar erfolgreich gelöscht!", + "title": "Lösche Kommentar", + "type": "Kommentar" + }, + "contribution": { + "message": "Bist Du sicher, dass Du den Beitrag „{name}“ löschen möchtest?", + "success": "Beitrag erfolgreich gelöscht!", + "title": "Lösche Beitrag", + "type": "Beitrag" + }, + "submit": "Löschen" + }, + "disable": { + "cancel": "Abbrechen", + "comment": { + "message": "Bist Du sicher, dass Du den Kommentar „{name}“ deaktivieren möchtest?", + "title": "Kommentar sperren", + "type": "Kommentar" + }, + "contribution": { + "message": "Bist Du sicher, dass Du den Beitrag von „{name}“ deaktivieren möchtest?", + "title": "Beitrag sperren", + "type": "Beitrag" + }, + "submit": "Deaktivieren", + "success": "Erfolgreich deaktiviert", + "user": { + "message": "Bist Du sicher, dass Du den Nutzer „{name}“ sperren möchtest?", + "title": "Nutzer sperren", + "type": "Nutzer" + } + }, + "donations": { + "amount-of-total": "{amount} von {total} € erreicht", + "donate-now": "Jetzt spenden" + }, + "editor": { + "embed": { + "always_allow": "Einzubettende Inhalte von Drittanbietern immer erlauben (diese Einstellung ist jederzeit änderbar)", + "data_privacy_info": "Deine Daten wurden noch nicht an Drittanbieter weitergegeben. Wenn Du diesen Inhalt jetzt abspielst, registriert der folgende Anbieter wahrscheinlich Deine Nutzerdaten:", + "data_privacy_warning": "Achte auf Deine Daten!", + "play_now": "Jetzt ansehen" + }, + "hashtag": { + "addHashtag": "Neuer Hashtag", + "addLetter": "Tippe einen Buchstaben", + "noHashtagsFound": "Keine Hashtags gefunden" + }, + "legend": { + "bold": "Fett", + "heading3": "Überschrift 3", + "heading4": "Überschrift 4", + "italic": "Kursiv", + "legendTitle": "Tastaturkürzel und Markdown-Code", + "link": "Verlinkung", + "orderedList": "Geordnete Liste", + "paragraph": "Absatz", + "quote": "Zitat", + "ruler": "Linie", + "underline": "Unterstrichen", + "unorderedList": "Ungeordnete Liste" + }, + "mention": { + "noUsersFound": "Keine Nutzer gefunden" + }, + "placeholder": "Schreib etwas Inspirierendes …" + }, + "error-pages": { + "403-default": "Kein Zugang zu dieser Seite!", + "404-default": "Diese Seite konnte nicht gefunden werden!", + "500-default": "Internal Server Error!", + "503-default": "Dienst steht nicht zur Verfügung!", + "back-to-index": "Zurück zur Startseite!", + "cannot-edit-post": "Dieser Beitrag kann nicht editiert werden!", + "default": "Ein Fehler ist aufgetreten!", + "group-not-found": "Dieses Gruppenprofil konnte nicht gefunden werden!", + "post-not-found": "Dieser Beitrag konnte nicht gefunden werden!", + "profile-not-found": "Dieses Profil konnte nicht gefunden werden!" + }, + "filter-menu": { + "all": "Alle", + "article": "Beitrag", + "categories": "Themen", + "creationDate": "Erstellungszeitpunkt", + "deleteFilter": "Filter löschen", + "emotions": "Emotionen", + "ended": { + "all": { + "hint": "Zeige alle, auch zukünftige", + "label": "Alle" + }, + "onlyEnded": { + "hint": "Zeige nur noch zukünftige", + "label": "Zukünftige" + } + }, + "event": "Veranstaltung", + "eventsBy": "Veranstaltungen – zeige ...", + "eventsEnded": "Beendet", + "filter-by": "Filtern nach ...", + "following": "Nutzer, denen ich folge", + "following-title": "Quellen", + "languages": "Sprachen", + "my-groups": "Meine Gruppen", + "order": { + "last": { + "hint": "Sortiere die Letzten nach vorn", + "label": "Letzte zuerst" + }, + "newest": { + "hint": "Sortiere die Neuesten nach vorn", + "label": "Neueste zuerst" + }, + "next": { + "hint": "Sortiere die Nächsten nach vorn", + "label": "Nächste zuerst" + }, + "oldest": { + "hint": "Sortiere die Ältesten nach vorn", + "label": "Älteste zuerst" + } + }, + "order-by": "Sortieren nach ...", + "post-type": "Inhaltstyp", + "save": { + "error": "Themen konnten nicht gespeichert werden!", + "success": "Themen gespeichert!" + }, + "startDate": "Anfangszeitpunkt" + }, + "followButton": { + "follow": "Folgen", + "following": "Folge Ich" + }, + "group": { + "actionRadii": { + "continental": "Kontinental", + "global": "Global oder nur virtuell", + "interplanetary": "Interplanetar", + "national": "National", + "regional": "Regional" + }, + "actionRadius": "Aktionsradius der Gruppe", + "addMemberToGroup": "Zur Gruppe hinzufügen", + "addMemberToGroupSuccess": "„{name}“ wurde der Gruppe mit der Rolle „{role}“ hinzugefügt!", + "addUser": "Nutzer hinzufügen", + "addUserNoOptions": "Keine Nutzer gefunden!", + "addUserPlaceholder": "Nutzername", + "allGroups": "Alle Gruppen", + "button": { + "tooltip": "Gruppen anzeigen" + }, + "categories": "Thema ::: Themen", + "categoriesTitle": "Themen der Gruppe", + "changeMemberRole": "Die Rolle wurde auf „{role}“ geändert!", + "contentMenu": { + "visitGroupPage": "Gruppe anzeigen" + }, + "createNewGroup": { + "title": "Erstelle eine neue Gruppe", + "tooltip": "Erstelle eine neue Gruppe" + }, + "description": "Beschreibung", + "editGroupSettings": { + "groupName": "Einstellungen für „{name}“", + "title": "Meine Gruppe ändern" + }, + "errors": { + "userAlreadyMember": "Nutzer „{name}“ ist bereits Mitglied!" + }, + "follow": "Folge", + "foundation": "Gründung", + "general": "Allgemein", + "goal": "Ziel der Gruppe", + "groupCreated": "Die Gruppe wurde angelegt!", + "in": "in", + "joinLeaveButton": { + "iAmMember": "Bin Mitglied", + "join": "Beitreten", + "leave": "Verlassen", + "pendingMember": "Ausstehendes Mitglied", + "tooltip": "Der Gruppeninhaber muss dich noch bestätigen." + }, + "labelSlug": "Eindeutiger Gruppenname", + "leaveModal": { + "confirmButton": "Verlassen", + "message": "Eine Gruppe zu verlassen ist möglicherweise nicht rückgängig zu machen!
                                  Gruppe „{name}“ verlassen!", + "title": "Möchtest du wirklich die Gruppe verlassen?" + }, + "memberRemoved": "Nutzer „{name}“ wurde aus der Gruppe entfernt!", + "members": "Mitglieder", + "membersAdministrationList": { + "avatar": "Avatar", + "name": "Name", + "roleInGroup": "Rolle", + "slug": "Eindeutiger Name" + }, + "membersCount": "Mitglied ::: Mitglieder", + "membersListTitle": "Gruppenmitglieder", + "membersListTitleNotAllowedSeeingGroupMembers": "Gruppenmitglieder unsichtbar", + "modal": { + "cancel": "Abbrechen", + "confirm": "Bestätigen", + "confirmAddGroupMemberText": "Nutzer „{name}“ zur Gruppe hinzufügen?", + "confirmAddGroupMemberTitle": "Bestätigen" + }, + "myGroups": "Meine Gruppen", + "name": "Gruppenname", + "radius": "Radius", + "removeMember": "Mitglied aus der Gruppe entfernen?", + "removeMemberButton": "Entfernen", + "role": "Deine Rolle in der Gruppe", + "roles": { + "admin": "Administrator", + "owner": "Inhaber", + "pending": "Ausstehendes Mitglied", + "usual": "Mitglied" + }, + "save": "Neue Gruppe anlegen", + "type": "Öffentlichkeit der Gruppe", + "types": { + "closed": "Geschlossen", + "hidden": "Geheim", + "public": "Öffentlich" + }, + "typesOptions": { + "closed": "Geschlossen — Alle Beiträge nur für Gruppenmitglieder sichtbar", + "hidden": "Geheim — Gruppe (auch der Name) komplett unsichtbar", + "public": "Öffentlich — Gruppe und alle Beiträge für registrierte Nutzer sichtbar" + }, + "update": "Änderung speichern", + "updatedGroup": "Die Gruppendaten wurden geändert!" + }, + "hashtags-filter": { + "clearSearch": "Suche löschen", + "hashtag-search": "Suche nach #{hashtag}", + "title": "Deine Filterblase" + }, + "header": { + "avatarMenu": { + "button": { + "tooltip": "Mein Profil" + }, + "groups": "Gruppen", + "myProfile": "Mein Profil" + }, + "chat": { + "tooltip": "Meine Chats" + } + }, + "index": { + "change-filter-settings": "Verändere die Filter-Einstellungen, um mehr Ergebnisse zu erhalten.", + "no-results": "Keine Beiträge gefunden." + }, + "invite-codes": { + "button": { + "tooltip": "Freunde einladen" + }, + "copy-code": "Einladungslink kopieren", + "copy-success": "Einladungscode erfolgreich in die Zwischenablage kopiert", + "not-available": "Du hast keinen Einladungscode zur Verfügung!", + "your-code": "Sende diesen Link per E-Mail oder in sozialen Medien, um deine Freunde einzuladen:" + }, + "localeSwitch": { + "tooltip": "Sprache wählen" + }, + "login": { + "email": "Deine E-Mail", + "failure": "Fehlerhafte E-Mail-Adresse oder Passwort.", + "forgotPassword": "Passwort vergessen?", + "hello": "Hallo", + "login": "Anmelden", + "logout": "Abmelden", + "moreInfo": "Was ist {APPLICATION_NAME}?", + "moreInfoHint": "zur Präsentationsseite", + "no-account": "Du hast noch kein Nutzerkonto?", + "no-cookie": "Es kann kein Cookie angelegt werden. Du musst Cookies akzeptieren.", + "password": "Dein Passwort", + "register": "Nutzerkonto erstellen", + "success": "Du bist eingeloggt!" + }, + "maintenance": { + "explanation": "Derzeit führen wir einige geplante Wartungsarbeiten durch, bitte versuche es später erneut.", + "questions": "Bei Fragen oder Problemen erreichst Du uns per E-Mail an", + "title": "{APPLICATION_NAME} befindet sich in der Wartung" + }, + "map": { + "alertMessage": "Es kann nicht auf die Karte zugegriffen werden: Der Mapbox-Token ist auf dem Server nicht gesetzt!", + "button": { + "tooltip": "Landkarte anzeigen" + }, + "legend": { + "event": "Veranstaltung", + "group": "Gruppe", + "theUser": "Meine Position", + "user": "Nutzer" + }, + "markerTypes": { + "event": "Veranstaltung", + "group": "Gruppe", + "theUser": "meine Position", + "user": "Nutzer" + }, + "pageTitle": "Landkarte", + "styles": { + "dark": "Dunkel", + "outdoors": "Landschaft", + "satellite": "Satellit", + "streets": "Straßen" + } + }, + "modals": { + "deleteUser": { + "created": "Erstellt" + } + }, + "moderation": { + "name": "Moderation", + "reports": { + "author": "Autor", + "content": "Inhalt", + "decideButton": "Bestätige", + "decided": "Entschieden", + "decideModal": { + "cancel": "Abbruch", + "Comment": { + "disable": { + "message": "Möchtest Du den Kommentar „{name}“ wirklich gesperrt lassen?", + "title": "Sperre den Kommentar abschließend" + }, + "enable": { + "message": "Möchtest Du den Kommentar „{name}“ wirklich entsperrt lassen?", + "title": "Entsperre den Kommentar abschließend" + } + }, + "Post": { + "disable": { + "message": "Möchtest Du den Beitrag „{name}“ wirklich gesperrt lassen?", + "title": "Sperre den Beitrag abschließend" + }, + "enable": { + "message": "Möchtest Du den Beitrag „{name}“ wirklich entsperrt lassen?", + "title": "Entsperre den Beitrag abschließend" + } + }, + "submit": "Bestätige Entscheidung", + "User": { + "disable": { + "message": "Möchtest Du den Nutzer „{name}“ wirklich gesperrt lassen?", + "title": "Sperre den Nutzer abschließend" + }, + "enable": { + "message": "Möchtest Du den Nutzer „{name}“ wirklich entsperrt lassen?", + "title": "Entsperre den Nutzer abschließend" + } + } + }, + "decision": "Entscheidung", + "DecisionSuccess": "Erfolgreich entschieden!", + "disabled": "Gesperrt", + "disabledAt": "Gesperrt am", + "disabledBy": "Gesperrt von", + "empty": "Glückwunsch, es gibt nichts zu moderieren.", + "enabled": "Entsperrt", + "enabledAt": "Entsperrt am", + "enabledBy": "Entsperrt von", + "filterLabel": { + "all": "Alle", + "closed": "Abgeschlossen", + "reviewed": "Bearbeitet", + "unreviewed": "Nicht bearbeitet" + }, + "moreDetails": "Details öffnen", + "name": "Meldungen", + "noDecision": "Keine Entscheidung!", + "numberOfUsers": "{count} Nutzern", + "previousDecision": "Vorherige Entscheidung:", + "reasonCategory": "Thema", + "reasonDescription": "Beschreibung", + "reportedOn": "Datum", + "status": "Aktueller Status", + "submitter": "Gemeldet von" + } + }, + "notifications": { + "comment": "Kommentar", + "content": "Inhalt oder Beschreibung", + "empty": "Bedaure, Du hast momentan keinerlei Benachrichtigungen.", + "filterLabel": { + "all": "Alle", + "read": "Gelesen", + "unread": "Ungelesen" + }, + "group": "Beschreibung", + "headerMenuButton": { + "tooltip": "Meine Banachrichtigungen" + }, + "markAllAsRead": "Markiere alle als gelesen", + "pageLink": "Alle Benachrichtigungen", + "post": "Beitrag oder Gruppe", + "reason": { + "changed_group_member_role": "Hat Deine Rolle in der Gruppe geändert …", + "commented_on_post": "Hat Deinen Beitrag kommentiert …", + "mentioned_in_comment": "Hat Dich in einem Kommentar erwähnt …", + "mentioned_in_post": "Hat Dich in einem Beitrag erwähnt …", + "removed_user_from_group": "Hat Dich aus der Gruppe entfernt …", + "user_joined_group": "Ist Deiner Gruppe beigetreten …", + "user_left_group": "Hat deine Gruppe verlassen …" + }, + "title": "Benachrichtigungen", + "user": "Nutzer" + }, + "post": { + "comment": { + "reply": "Antworten", + "submit": "Kommentiere", + "submitted": "Kommentar gesendet", + "updated": "Änderungen gespeichert" + }, + "createNewEvent": { + "forGroup": { + "title": "Für die Gruppe „{name}“" + }, + "title": "Erstelle eine Veranstaltung" + }, + "createNewPost": { + "forGroup": { + "title": "Für die Gruppe „{name}“" + }, + "title": "Erstelle einen Beitrag" + }, + "edited": "bearbeitet", + "editPost": { + "event": "Bearbeite deine Veranstaltung", + "forGroup": { + "title": "Für die Gruppe „{name}“" + }, + "title": "Bearbeite deinen Beitrag" + }, + "event": "Veranstaltung", + "menu": { + "delete": "Beitrag löschen", + "edit": "Beitrag bearbeiten", + "pin": "Beitrag anheften", + "pinnedSuccessfully": "Beitrag erfolgreich angeheftet!", + "unpin": "Beitrag loslösen", + "unpinnedSuccessfully": "Angehefteten Beitrag erfolgreich losgelöst!" + }, + "name": "Beitrag", + "pinned": "Meldung", + "takeAction": { + "name": "Aktiv werden" + }, + "viewEvent": { + "eventEnd": "Ende", + "eventIsOnline": "Online", + "eventLocationName": "Stadt — z.B. Musterstraße 1, 12345 Musterstadt", + "eventStart": "Beginn", + "eventVenue": "Veranstaltungsort — z.B. Hinterhof, 1. OG, …", + "title": "Veranstaltung" + }, + "viewPost": { + "forGroup": { + "title": "In der Gruppe „{name}“" + }, + "title": "Beitrag" + } + }, + "profile": { + "avatar": { + "submitted": "Erfolgreich hochgeladen!" + }, + "commented": "Kommentiert", + "follow": "Folgen", + "followers": "Folgen", + "following": "Folge Ich", + "invites": { + "description": "Zur Einladung die E-Mail-Adresse hier eintragen.", + "emailPlaceholder": "E-Mail-Adresse für die Einladung", + "title": "Lade jemanden zu {APPLICATION_NAME} ein!" + }, + "memberSince": "Mitglied seit", + "network": { + "andMore": "und {number} weitere …", + "followedBy": "wird gefolgt von:", + "followedByNobody": "wird von niemandem gefolgt.", + "following": "folgt:", + "followingNobody": "folgt niemandem.", + "title": "Netzwerk" + }, + "shouted": "Empfohlen", + "socialMedia": "Wo sonst finde ich", + "userAnonym": "Anonymus" + }, + "quotes": { + "african": { + "author": "Afrikanisches Sprichwort", + "quote": "Viele kleine Leute an vielen kleinen Orten, die viele kleine Dinge tun, werden das Antlitz dieser Welt verändern." + } + }, + "release": { + "cancel": "Abbrechen", + "comment": { + "error": "Den Kommentar hast Du schon gemeldet!", + "message": "Bist Du sicher, dass Du den Kommentar „{name}“ freigeben möchtest?", + "title": "Kommentar freigeben", + "type": "Kommentar" + }, + "contribution": { + "error": "Den Beitrag hast Du schon gemeldet!", + "message": "Bist Du sicher, dass Du den Beitrag „{name}“ freigeben möchtest?", + "title": "Beitrag freigeben", + "type": "Beitrag" + }, + "submit": "freigeben", + "success": "Erfolgreich freigegeben!", + "user": { + "error": "Den Nutzer hast Du schon gemeldet!", + "message": "Bist Du sicher, dass Du den Nutzer „{name}“ freigeben möchtest?", + "title": "Nutzer freigeben", + "type": "Nutzer" + } + }, + "report": { + "cancel": "Abbrechen", + "comment": { + "error": "Du hast den Kommentar bereits gemeldet!", + "message": "Bist Du sicher, dass Du den Kommentar von „{name}“ melden möchtest?", + "title": "Kommentar melden", + "type": "Kommentar" + }, + "contribution": { + "error": "Du hast den Beitrag bereits gemeldet!", + "message": "Bist Du sicher, dass Du den Beitrag „{name}“ melden möchtest?", + "title": "Beitrag melden", + "type": "Beitrag" + }, + "reason": { + "category": { + "invalid": "Bitte wähle ein gültiges Thema aus", + "label": "Wähle ein Thema:", + "options": { + "advert_products_services_commercial": "Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht.", + "criminal_behavior_violation_german_law": "Strafbares Verhalten bzw. Verstoß gegen deutsches Recht.", + "discrimination_etc": "Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen.", + "doxing": "Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen („Doxing“).", + "glorific_trivia_of_cruel_inhuman_acts": "Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten.", + "intentional_intimidation_stalking_persecution": "Absichtliche Einschüchterung, Stalking oder Verfolgung.", + "other": "Andere …", + "pornographic_content_links": "Das Senden oder Verlinken eindeutig pornografischen Materials." + }, + "placeholder": "Thema …" + }, + "description": { + "label": "Bitte erkläre: Warum möchtest Du dies melden?", + "placeholder": "Zusätzliche Information …" + } + }, + "submit": "Meldung senden", + "success": "Vielen Dank für diese Meldung!", + "user": { + "error": "Du hast den Nutzer bereits gemeldet!", + "message": "Bist Du sicher, dass Du den Nutzer „{name}“ melden möchtest?", + "title": "Nutzer melden", + "type": "Nutzer" + } + }, + "search": { + "failed": "Nichts gefunden", + "for": "Suche nach ", + "heading": { + "Group": "Gruppe ::: Gruppen", + "Post": "Beitrag ::: Beiträge", + "Tag": "Hashtag ::: Hashtags", + "User": "Nutzer ::: Nutzer" + }, + "hint": "!... sucht Beiträge, @... sucht Nutzer, &... sucht Gruppen, #… sucht Hashtags", + "no-results": "Keine Ergebnisse für \"{search}\" gefunden. Versuch' es mit einem anderen Begriff!", + "page": "Seite", + "placeholder": "Suchen", + "results": "Ergebnis gefunden ::: Ergebnisse gefunden", + "title": "Suchergebnisse" + }, + "settings": { + "blocked-users": { + "block": "Nutzer blockieren", + "columns": { + "name": "Name", + "slug": "Alias", + "unblock": "Entsperren" + }, + "empty": "Bislang hast Du niemanden blockiert.", + "explanation": { + "closing": "Das sollte fürs Erste genügen, damit blockierte Nutzer Dich nicht mehr länger belästigen können.", + "commenting-disabled": "Du kannst den Beitrag derzeit nicht kommentieren.", + "commenting-explanation": "Dafür kann es mehrere Gründe geben, bitte schau in unsere ", + "intro": "Wenn ein anderer Nutzer durch Dich blockiert wurde, dann passiert Folgendes:", + "notifications": "Von Dir blockierte Nutzer werden keine Benachrichtigungen mehr erhalten, falls sie in Deinen Beiträgen erwähnt werden.", + "their-perspective": "Umgekehrt das gleiche: Die blockierte Person bekommt auch in ihren Benachrichtigungen Deine Beiträge nicht mehr zu sehen.", + "your-perspective": "In Deinen Benachrichtigungen tauchen keine Beiträge der blockierten Person mehr auf." + }, + "how-to": "Du kannst andere Nutzer auf deren Profilseite über das Inhaltsmenü blockieren.", + "name": "Blockierte Nutzer", + "unblock": "Blockierten Nutzer freigeben", + "unblocked": "{name} ist wieder entsperrt" + }, + "data": { + "labelBio": "Über Dich", + "labelCity": "Deine Stadt oder Region", + "labelCityHint": "(zeigt ungefähre Position auf der Landkarte)", + "labelName": "Dein Name", + "labelSlug": "Dein eindeutiger Nutzername", + "name": "Deine Daten", + "namePlaceholder": "Petra Lustig", + "success": "Deine Daten wurden erfolgreich aktualisiert!" + }, + "deleteUserAccount": { + "accountDescription": "Sei dir bewusst, dass deine Beiträge und Kommentare für unsere Community wichtig sind. Wenn du sie trotzdem löschen möchtest, musst du sie unten markieren.", + "accountWarning": "Dein Konto, deine Beiträge oder Kommentare kannst du nach dem Löschen WEDER VERWALTEN NOCH WIEDERHERSTELLEN!", + "accountWarningAdmin": "Das Konto, die Beiträge oder Kommentare können nach dem Löschen WEDER VERWALTET NOCH WIEDERHERGESTELLT WERDEN!", + "accountWarningIsAdmin": "Achtung! Du löschst jetzt ein Nutzerkonto!", + "commentedCount": "Meinen {count} Kommentar löschen ::: Meine {count} Kommentare löschen", + "confirmDeleting": "Nutzerkonto jetzt löschen", + "contributionsCount": "Meinen {count} Beitrag löschen ::: Meine {count} Beiträge löschen", + "infoAdmin": "Alle Beiträge und Kommentare des Users werden zusätzlich gelöscht!", + "name": "Nutzerkonto löschen", + "pleaseConfirm": "Zerstörerische Aktion! Gib „{confirm}“ ein, um zu bestätigen.", + "success": "Konto erfolgreich gelöscht!" + }, + "download": { + "description": "Klicke auf den Knopf oben, um den Inhalt deiner Beiträge und Kommentare herunterzuladen. Um die Bilder der Beiträge herunterzuladen, musst du auf den jeweiligen Link unten klicken.", + "json": "als JSON", + "name": "Daten herunterladen" + }, + "email": { + "change-successful": "Deine E-Mail-Adresse wurde erfolgreich geändert.", + "labelEmail": "E-Mail-Adresse ändern", + "labelNewEmail": "Neue E-Mail-Adresse", + "labelNonce": "Bestätigungscode eingeben", + "name": "Deine E-Mail", + "submitted": "Eine E-Mail zur Bestätigung Deiner Adresse wurde an {email} gesendet.", + "success": "Eine neue E-Mail-Adresse wurde registriert.", + "validation": { + "same-email": "Das ist Deine aktuelle E-Mail-Adresse" + }, + "verification-error": { + "explanation": "Das kann verschiedene Ursachen haben:", + "message": "Deine E-Mail-Adresse konnte nicht verifiziert werden.", + "reason": { + "invalid-nonce": "Ist der Bestätigungscode falsch?", + "no-email-request": "Bist Du Dir sicher, dass Du eine Änderung Deiner E-Mail-Adresse angefragt hattest?" + }, + "support": "Wenn das Problem weiterhin besteht, kontaktiere uns gerne per E-Mail an" + } + }, + "embeds": { + "info-description": "Hier ist die Liste der Drittanbieter, deren Inhalte, z.B. in Form eingebetteter Videos, mittels Drittanbieter-Programmcode angezeigt werden kann:", + "name": "Drittanbieter", + "status": { + "change": { + "allow": "Na klar", + "deny": "Lieber nicht", + "question": "Soll einzubettender Programmcode der Drittanbieter Dir immer zur Anzeige gebracht werden?" + }, + "description": "Als Grundeinstellung wird Dir der einzubettende Code der Drittanbieter", + "disabled": { + "off": "zunächst nicht angezeigt", + "on": "sofort angezeigt" + } + } + }, + "invites": { + "name": "Einladungen" + }, + "languages": { + "name": "Sprachen" + }, + "muted-users": { + "columns": { + "name": "Name", + "slug": "Alias", + "unmute": "Entsperren" + }, + "empty": "Bislang hast du niemanden stummgeschaltet.", + "explanation": { + "intro": "Wenn ein anderer Nutzer von dir stummgeschaltet wurde, dann passiert folgendes:", + "search": "Die Beiträge von stummgeschalteten Personen verschwinden aus deinen Suchergebnissen.", + "your-perspective": "In deiner Beitragsübersicht tauchen keine Beiträge der stummgeschalteten Person mehr auf." + }, + "how-to": "Du kannst andere Nutzer auf deren Profilseite über das Inhaltsmenü stummschalten.", + "mute": "Stumm schalten", + "name": "Stummgeschaltete Nutzer", + "unmute": "Stummschaltung aufheben", + "unmuted": "{name} ist nicht mehr stummgeschaltet" + }, + "name": "Einstellungen", + "notifications": { + "name": "Benachrichtigungen", + "send-email-notifications": "Sende E-Mail-Benachrichtigungen", + "success-update": "Benachrichtigungs-Einstellungen gespeichert!" + }, + "organizations": { + "name": "Meine Organisationen" + }, + "privacy": { + "make-shouts-public": "Teile von mir empfohlene Artikel öffentlich auf meinem Profil", + "name": "Privatsphäre", + "success-update": "Privatsphäre-Einstellungen gespeichert!" + }, + "security": { + "change-password": { + "button": "Passwort ändern", + "label-new-password": "Dein neues Passwort", + "label-new-password-confirm": "Bestätige Dein neues Passwort", + "label-old-password": "Dein altes Passwort", + "message-new-password-confirm-required": "Bestätige Dein neues Passwort", + "message-new-password-missmatch": "Gib dasselbe Passwort nochmals ein", + "message-new-password-required": "Gib ein neues Passwort ein", + "message-old-password-required": "Gib Dein altes Passwort ein", + "passwordSecurity": "Passwortsicherheit", + "passwordStrength0": "Sehr unsicheres Passwort", + "passwordStrength1": "Unsicheres Passwort", + "passwordStrength2": "Mittelmäßiges Passwort", + "passwordStrength3": "Sicheres Passwort", + "passwordStrength4": "Sehr sicheres Passwort", + "success": "Passwort erfolgreich geändert!" + }, + "name": "Sicherheit" + }, + "social-media": { + "add-new-link": "Neuen Link hinzufügen", + "delete-modal": { + "confirm-button": "Löschen", + "message": "Lösche „{name}“.", + "title": "Möchtest du wirklich deinen Link löschen?" + }, + "edit-link": "Ändere den Link", + "name": "Soziale Medien", + "placeholder": "Deine Webadresse des Sozialen Netzwerkes", + "requireUnique": "Dieser Link existiert bereits", + "submit": "Link hinzufügen", + "successAdd": "Soziales Netzwerk hinzugefügt. Profil wurde aktualisiert!", + "successDelete": "Soziales Netzwerk entfernt. Profil wurde aktualisiert!" + }, + "validation": { + "slug": { + "alreadyTaken": "Dieser Nutzername ist schon vergeben.", + "regex": "Es sind nur Kleinbuchstaben, Zahlen, Unterstriche oder Bindestriche erlaubt." + } + } + }, + "shoutButton": { + "shouted": "empfohlen" + }, + "site": { + "back-to-login": "Zurück zur Anmeldung", + "bank": "Bankverbindung", + "code-of-conduct": "Verhaltenscodex", + "contact": "Kontakt", + "data-privacy": "Datenschutzerklärung", + "director": "Geschäftsführer", + "donate": "Spenden", + "error-occurred": "Ein Fehler ist aufgetreten.", + "faq": "FAQ", + "germany": "Deutschland", + "imprint": "Impressum", + "made": "Mit ❤️ gemacht", + "register": "Registernummer", + "responsible": "Verantwortlich für Inhalte dieser Seite (§ 55 Abs. 2 RStV)", + "support": "Support", + "taxident": "Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz (Deutschland)", + "termsAndConditions": "Nutzungsbedingungen", + "thanks": "Danke!", + "tribunal": "Registergericht" + }, + "termsAndConditions": { + "newTermsAndConditions": "Neue Nutzungsbedingungen", + "termsAndConditionsNewConfirm": "Ich habe die neuen Nutzungsbedingungen durchgelesen und stimme zu.", + "termsAndConditionsNewConfirmText": "Bitte lies Dir die neuen Nutzungsbedingungen jetzt durch!" + } +} diff --git a/docs/webapp/locales/en.json b/docs/webapp/locales/en.json new file mode 100644 index 000000000..a6060f3a0 --- /dev/null +++ b/docs/webapp/locales/en.json @@ -0,0 +1,1114 @@ +{ + "actions": { + "cancel": "Cancel", + "create": "Create", + "delete": "Delete", + "edit": "Edit", + "loading": "loading", + "loadMore": "load more", + "save": "Save", + "saveCategories": "Save topics" + }, + "admin": { + "categories": { + "categoryName": "Name", + "name": "Topics", + "postCount": "Posts" + }, + "dashboard": { + "comments": "Comments", + "follows": "Follows", + "invites": "Invites", + "name": "Dashboard", + "notifications": "Notifications", + "organizations": "Organizations", + "posts": "Posts", + "projects": "Projects", + "shouts": "Shouts", + "users": "Users" + }, + "donations": { + "goal": "Monthly donations needed", + "name": "Donations info", + "progress": "Donations collected so far", + "showDonationsCheckboxLabel": "Show donations progress bar", + "successfulUpdate": "Donations info updated successfully!" + }, + "hashtags": { + "name": "Hashtags", + "nameOfHashtag": "Name", + "number": "No.", + "tagCount": "Posts", + "tagCountUnique": "Users" + }, + "invites": { + "description": "Invitations are a wonderful way to have your friends in your network …", + "name": "Invite users", + "title": "Invite people" + }, + "name": "Admin", + "notifications": { + "name": "Notifications" + }, + "organizations": { + "name": "Organizations" + }, + "pages": { + "name": "Pages" + }, + "settings": { + "name": "Settings" + }, + "users": { + "empty": "No users found", + "form": { + "placeholder": "e-mail, name or description" + }, + "name": "Users", + "roleChanged": "Role changed successfully!", + "table": { + "columns": { + "createdAt": "Created at", + "email": "E-mail", + "name": "Name", + "number": "No.", + "role": "Role", + "slug": "Slug" + } + } + } + }, + "chat": { + "addRoomHeadline": "Search User for new Chat", + "cancelSelectMessage": "Cancel", + "conversationStarted": "Conversation started on:", + "isOnline": "is online", + "isTyping": "is writing...", + "lastSeen": "last seen ", + "messageDeleted": "This message was deleted", + "messagesEmpty": "No messages", + "newMessages": "New Messages", + "page": { + "headline": "Chat" + }, + "roomEmpty": "No room selected", + "roomsEmpty": "No rooms", + "search": "Filter chat rooms", + "typeMessage": "Type message", + "userProfileButton": { + "label": "Chat", + "tooltip": "Chat with “{name}”" + } + }, + "client-only": { + "loading": "Loading …" + }, + "code-of-conduct": { + "subheader": "for the social network of {ORGANIZATION_NAME}" + }, + "comment": { + "content": { + "unavailable-placeholder": "… this comment is not available anymore" + }, + "edited": "edited", + "menu": { + "delete": "Delete Comment", + "edit": "Edit Comment" + }, + "show": { + "less": "show less", + "more": "show more" + } + }, + "common": { + "category": "Topic ::: Topics", + "comment": "Comment ::: Comments", + "letsTalk": "Let`s Talk", + "loading": "loading", + "loadMore": "load more", + "name": "Name", + "organization": "Organization ::: Organizations", + "post": "Post ::: Posts", + "project": "Project ::: Projects", + "reportContent": "Report", + "shout": "Shout ::: Shouts", + "tag": "Tag ::: Tags", + "takeAction": "Take Action", + "user": "User ::: Users", + "validations": { + "categories": "at least one and at most three topics must be selected", + "email": "must be a valid e-mail address", + "eventLocationNameLength": "minimum {min} or maximum {max} characters", + "eventLocationNameNotEmpty": "only empty characters are not allowed", + "eventVenueLength": "minimum {min} or maximum {max} characters", + "eventVenueNotEmpty": "only empty characters are not allowed", + "url": "must be a valid URL" + }, + "versus": "Versus" + }, + "components": { + "dateTimeRange": { + "hourMinute": "HH:mm", + "monthDay": "MM/dd/", + "yearMonthDay": "MM/dd/yyyy" + }, + "password-reset": { + "change-password": { + "error": "Changing your password failed. Maybe the security code was not correct?", + "help": "In case of problems, feel free to ask for help by sending us a mail to:", + "success": "Changing your password was successful!" + }, + "request": { + "form": { + "description": "A password reset e-mail will be sent to the given e-mail address.", + "submit": "Request e-mail", + "submitted": "An e-mail with further instructions has been sent to {email}" + }, + "title": "Reset your password" + } + }, + "registration": { + "create-user-account": { + "buttonTitle": "Create", + "error": "No user account could be created!", + "help": " Maybe the confirmation was invalid? In case of problems, feel free to ask for help by sending us a mail to:", + "recieveCommunicationAsEmailsEtcConfirmed": "I also agree to receive e-mails and other forms of communication (e.g. push notifications).", + "success": "Your account has been created!", + "termsAndCondsEtcConfirmed": "I have read, understand and agree to the following:", + "title": "Create user account" + }, + "email": { + "buttonTitle": { + "resend": "Resend e-mail", + "send": "Send e-mail", + "skipResend": "Skip resend" + }, + "form": { + "sendEmailAgain": "Send e-mail again", + "success": "Verification e-mail send to {email}!" + }, + "title": "E-Mail" + }, + "email-display": { + "warningFormat": "⚠️ E-mail has wrong format!", + "warningUndef": "⚠️ No e-mail defined!", + "yourEmail": "Your e-mail address:" + }, + "email-nonce": { + "buttonTitle": "Confirm", + "form": { + "description": "Open your inbox and enter the code that we've sent to you.", + "next": "Continue", + "nonce": "E-mail code: 32143", + "validations": { + "error": "Invalid verification code {nonce} for e-mail {email}!", + "length": "must be {nonceLength} characters long", + "success": "Valid verification code {nonce} for e-mail {email}!" + } + }, + "title": "E-Mail Confirmation" + }, + "invite-code": { + "buttonTitle": "Next", + "form": { + "description": "Enter the invitation code you received.", + "invite-code": "Invite code: ACJERB", + "next": "Continue", + "validations": { + "error": "Invalid invite code {inviteCode}!", + "length": "must be {inviteCodeLength} characters long", + "success": "Valid invite code {inviteCode}!" + } + } + }, + "no-public-registrstion": { + "title": "No Public Registration" + }, + "signup": { + "form": { + "data-privacy": "I have read and understood the privacy statement.", + "description": "To get started, you can register here for free:", + "errors": { + "email-exists": "There is already a user account with this e-mail address!" + }, + "submit": "Create an account", + "success": "A mail with a link to complete your registration has been sent to {email}", + "terms-and-condition": "I confirm to the Terms and conditions." + }, + "title": "Join {APPLICATION_NAME}!", + "unavailable": "Unfortunately, public registration of user accounts is not available right now on this server." + } + } + }, + "contribution": { + "amount-clicks": "{amount} clicks", + "amount-comments": "{amount} comments", + "amount-shouts": "{amount} recommendations", + "amount-views": "{amount} views", + "categories": { + "infoSelectedNoOfMaxCategories": "{chosen} of {max} topics selected" + }, + "category": { + "description": { + "body-and-excercise": "Sports, yoga, massage, relaxation", + "children": "Family, education, school, imprinting", + "culture": "Art, theatre, music, photography, film", + "economy": "Trade, consumption, marketing, supply chains", + "energy": "Oil, gas, coal, wind, hydrodynamic power, biogas, atomic energy", + "finance": "Money, financial system, alternative currencies", + "health": "Medicine, nutrition, WHO, vaccination, harmful substances", + "home": "Construction, communities, tiny houses, kitchen garden", + "it-and-media": "News, manipulation, privacy, control, data leeches, AI, software, apps", + "law": "Human rights, laws, decrees", + "miscellaneous": "Miscellaneous", + "mobility": "Travel, traffic, electric mobility", + "nature": "Animals, plants, agriculture, ecologu, biodiversity", + "networking": "Cooperation, action alliances, solidarity, help", + "peace": "War, military, social defence, arms, cyber attacks", + "politics": "Democracy, participation, elections, corruption, parties", + "psyche": "Soul, feelings, happiness", + "science": "Education, university, publications", + "spirituality": "Religion, values, ethics" + }, + "name": { + "body-and-excercise": "Body & Excercise", + "children": "Children", + "culture": "Culture", + "economy": "Economy", + "energy": "Energy", + "finance": "Finance", + "health": "Health", + "home": "Home", + "it-and-media": "IT & Media", + "law": "Law", + "miscellaneous": "Miscellaneous", + "mobility": "Mobility", + "nature": "Nature", + "networking": "Networking", + "peace": "Peace", + "politics": "Politics", + "psyche": "Psyche", + "science": "Science", + "spirituality": "Spirituality" + } + }, + "emotions-label": { + "angry": "Angry", + "cry": "Cry", + "funny": "Funny", + "happy": "Happy", + "surprised": "Surprised" + }, + "filterFollow": "Users I follow", + "filterMasonryGrid": { + "myFriends": "Users I follow", + "myGroups": "By my groups", + "myTopics": "My topics", + "noFilter": "Filter content", + "onlyArticles": "Articles", + "onlyEvents": "Events" + }, + "filterMyGroups": "My groups", + "inappropriatePicture": "This image may be inappropriate for some people.", + "languageSelectLabel": "Language of your contribution", + "languageSelectText": "Select Language", + "newEvent": "Create a new Event", + "newPost": "Create a new Post", + "success": "Saved!", + "teaserImage": { + "cropImage": "Crop image", + "cropperConfirm": "Confirm", + "errors": { + "aspect-ratio-too-small": "This image is too high.", + "unSupported-file-format": "Please upload an image of file format: JPG, JPEG, PNG or GIF!" + }, + "supportedFormats": "Insert a picture of file format JPG, PNG or GIF" + }, + "title": "Title", + "visibleOnlyForMembersOfGroup": "This post will only be visible to members of the “{name}” group." + }, + "delete": { + "cancel": "Cancel", + "comment": { + "message": "Do you really want to delete the comment \"{name}\"?", + "success": "Comment successfully deleted!", + "title": "Delete Comment", + "type": "Comment" + }, + "contribution": { + "message": "Do you really want to delete the post \"{name}\"?", + "success": "Post successfully deleted!", + "title": "Delete Post", + "type": "Contribution" + }, + "submit": "Delete" + }, + "disable": { + "cancel": "Cancel", + "comment": { + "message": "Do you really want to disable the comment from \"{name}\"?", + "title": "Disable Comment", + "type": "Comment" + }, + "contribution": { + "message": "Do you really want to disable the contribution \"{name}\"?", + "title": "Disable Contribution", + "type": "Contribution" + }, + "submit": "Disable", + "success": "Disabled successfully!", + "user": { + "message": "Do you really want to disable the user \"{name}\"?", + "title": "Disable User", + "type": "User" + } + }, + "donations": { + "amount-of-total": "{amount} of {total} € collected", + "donate-now": "Donate now" + }, + "editor": { + "embed": { + "always_allow": "Always allow embedded content by third party providers (this setting can be changed any time)", + "data_privacy_info": "Your data has not yet been shared with any third party providers. If you proceed to play this content the following provider will likely collect user data:", + "data_privacy_warning": "Data Privacy Warning!", + "play_now": "Continue" + }, + "hashtag": { + "addHashtag": "New hashtag", + "addLetter": "Type a letter", + "noHashtagsFound": "No hashtags found" + }, + "legend": { + "bold": "Bold", + "heading3": "Heading 3", + "heading4": "Heading 4", + "italic": "Italic", + "legendTitle": "Keyboard shortcuts and markdown code", + "link": "Link", + "orderedList": "Ordered list", + "paragraph": "Paragraph", + "quote": "Quote", + "ruler": "Ruler", + "underline": "Underline", + "unorderedList": "Unordered list" + }, + "mention": { + "noUsersFound": "No users found" + }, + "placeholder": "Leave your inspirational thoughts …" + }, + "error-pages": { + "403-default": "Not authorized to this page!", + "404-default": "This page could not be found!", + "500-default": "Internal Server Error!", + "503-default": "Service Unavailable!", + "back-to-index": "Back to index page!", + "cannot-edit-post": "This post cannot be edited!", + "default": "An error occurred!", + "group-not-found": "This group profile could not be found!", + "post-not-found": "This post could not be found!", + "profile-not-found": "This profile could not be found!" + }, + "filter-menu": { + "all": "All", + "article": "Article", + "categories": "Topics", + "creationDate": "Creation date", + "deleteFilter": "Delete filter", + "emotions": "Emotions", + "ended": { + "all": { + "hint": "Show all, also ended", + "label": "All" + }, + "onlyEnded": { + "hint": "Show only not ended", + "label": "Not ended" + } + }, + "event": "Event", + "eventsBy": "Events – show ...", + "eventsEnded": "Ended", + "filter-by": "Filter by ...", + "following": "Users I follow", + "following-title": "Sources", + "languages": "Languages", + "my-groups": "My groups", + "order": { + "last": { + "hint": "Sort posts by the last first", + "label": "Last first" + }, + "newest": { + "hint": "Sort posts by the newest first", + "label": "Newest first" + }, + "next": { + "hint": "Sort posts by the next first", + "label": "Next first" + }, + "oldest": { + "hint": "Sort posts by the oldest first", + "label": "Oldest first" + } + }, + "order-by": "Order by ...", + "post-type": "Content type", + "save": { + "error": "Failed saving topic settings!", + "success": "Topics saved!" + }, + "startDate": "Start date" + }, + "followButton": { + "follow": "Follow", + "following": "Following" + }, + "group": { + "actionRadii": { + "continental": "Continental", + "global": "Global or only virtual", + "interplanetary": "Interplanetary", + "national": "National", + "regional": "Regional" + }, + "actionRadius": "Action radius of the group", + "addMemberToGroup": "Add to group", + "addMemberToGroupSuccess": "“{name}” was added to the group with the role “{role}”!", + "addUser": "Add User", + "addUserNoOptions": "No users found!", + "addUserPlaceholder": "User name", + "allGroups": "All Groups", + "button": { + "tooltip": "Show groups" + }, + "categories": "Topic ::: Topics", + "categoriesTitle": "Topics of the group", + "changeMemberRole": "The role has been changed to “{role}”!", + "contentMenu": { + "visitGroupPage": "Show group" + }, + "createNewGroup": { + "title": "Create A New Group", + "tooltip": "Create a new group" + }, + "description": "Description", + "editGroupSettings": { + "groupName": "Settings Of “{name}”", + "title": "Edit My Group" + }, + "errors": { + "userAlreadyMember": "User “{name}” is already a member!" + }, + "follow": "Follow", + "foundation": "Foundation", + "general": "General", + "goal": "Goal of group", + "groupCreated": "The group was created!", + "in": "in", + "joinLeaveButton": { + "iAmMember": "I'm a member", + "join": "Join", + "leave": "Leave", + "pendingMember": "Pending member", + "tooltip": "The group owner has yet to confirm you." + }, + "labelSlug": "Unique group name", + "leaveModal": { + "confirmButton": "Leave", + "message": "Leaving a group may be irreversible!
                                  Leave group “{name}”!", + "title": "Do you really want to leave the group?" + }, + "memberRemoved": "User “{name}” was removed from group!", + "members": "Members", + "membersAdministrationList": { + "avatar": "Avatar", + "name": "Name", + "roleInGroup": "Role", + "slug": "Unique name" + }, + "membersCount": "Member ::: Members", + "membersListTitle": "Group Members", + "membersListTitleNotAllowedSeeingGroupMembers": "Group Members invisible", + "modal": { + "cancel": "Cancel", + "confirm": "Confirm", + "confirmAddGroupMemberText": "Add user “{name}” to group?", + "confirmAddGroupMemberTitle": "Confirm" + }, + "myGroups": "My Groups", + "name": "Group name", + "radius": "Radius", + "removeMember": "Remove member", + "removeMemberButton": "Remove", + "role": "Your role in the group", + "roles": { + "admin": "Administrator", + "owner": "Owner", + "pending": "Pending Member", + "usual": "Member" + }, + "save": "Create new group", + "type": "Visibility of the group", + "types": { + "closed": "Closed", + "hidden": "Secret", + "public": "Public" + }, + "typesOptions": { + "closed": "Closed — All posts only visible to the group's members", + "hidden": "Secret — Group (including the name) is completely invisible", + "public": "Public — Group and all posts are visible for all registered users" + }, + "update": "Save change", + "updatedGroup": "The group data has been changed." + }, + "hashtags-filter": { + "clearSearch": "Clear search", + "hashtag-search": "Searching for #{hashtag}", + "title": "Your filter bubble" + }, + "header": { + "avatarMenu": { + "button": { + "tooltip": "My profile" + }, + "groups": "Groups", + "myProfile": "My profile" + }, + "chat": { + "tooltip": "My chats" + } + }, + "index": { + "change-filter-settings": "Change your filter settings to get more results.", + "no-results": "No contributions found." + }, + "invite-codes": { + "button": { + "tooltip": "Invite friends" + }, + "copy-code": "Copy Invite Link", + "copy-success": "Invite code copied to clipboard", + "not-available": "You have no valid invite code available!", + "your-code": "Send this link per e-mail or in social media to invite your friends:" + }, + "localeSwitch": { + "tooltip": "Choose language" + }, + "login": { + "email": "Your E-mail", + "failure": "Incorrect email address or password.", + "forgotPassword": "Forgot Password?", + "hello": "Hello", + "login": "Login", + "logout": "Logout", + "moreInfo": "What is {APPLICATION_NAME}?", + "moreInfoHint": "to the presentation page", + "no-account": "Don't have an account?", + "no-cookie": "No cookie can be set. You must accept cookies.", + "password": "Your Password", + "register": "Sign up", + "success": "You are logged in!" + }, + "maintenance": { + "explanation": "At the moment we are doing some scheduled maintenance, please try again later.", + "questions": "Any Questions or concerns, send an e-mail to", + "title": "{APPLICATION_NAME} is under maintenance" + }, + "map": { + "alertMessage": "The map cannot be accessed: The Mapbox token is not set on the server!", + "button": { + "tooltip": "Show map" + }, + "legend": { + "event": "Event", + "group": "Group", + "theUser": "My position", + "user": "User" + }, + "markerTypes": { + "event": "event", + "group": "group", + "theUser": "my position", + "user": "user" + }, + "pageTitle": "Map", + "styles": { + "dark": "Dark", + "outdoors": "Outdoors", + "satellite": "Satellite", + "streets": "Streets" + } + }, + "modals": { + "deleteUser": { + "created": "Created" + } + }, + "moderation": { + "name": "Moderation", + "reports": { + "author": "Author", + "content": "Content", + "decideButton": "Confirm", + "decided": "Decided", + "decideModal": { + "cancel": "Cancel", + "Comment": { + "disable": { + "message": "Do you really want to let the comment \"{name}\" stay disabled?", + "title": "Finally Disable Comment" + }, + "enable": { + "message": "Do you really want to let the comment \"{name}\" stay enabled?", + "title": "Finally Enable Comment" + } + }, + "Post": { + "disable": { + "message": "Do you really want to let the post \"{name}\" stay disabled?", + "title": "Finally Disable Post" + }, + "enable": { + "message": "Do you really want to let the post \"{name}\" stay enabled?", + "title": "Finally Enable Post" + } + }, + "submit": "Confirm decision", + "User": { + "disable": { + "message": "Do you really want to let the user \"{name}\" stay disabled?", + "title": "Finally Disable User" + }, + "enable": { + "message": "Do you really want to let the user \"{name}\" stay enabled?", + "title": "Finally Enable User" + } + } + }, + "decision": "Decision", + "DecisionSuccess": "Decided successfully!", + "disabled": "Disabled", + "disabledAt": "Disabled at", + "disabledBy": "Disabled by", + "empty": "Congratulations, nothing to moderate.", + "enabled": "Enabled", + "enabledAt": "Enabled at", + "enabledBy": "Enabled by", + "filterLabel": { + "all": "All", + "closed": "Closed", + "reviewed": "Reviewed", + "unreviewed": "Unreviewed" + }, + "moreDetails": "View Details", + "name": "Reports", + "noDecision": "No decision!", + "numberOfUsers": "{count} users", + "previousDecision": "Previous decision:", + "reasonCategory": "Topic", + "reasonDescription": "Description", + "reportedOn": "Date", + "status": "Current status", + "submitter": "Reported by" + } + }, + "notifications": { + "comment": "Comment", + "content": "Content or Description", + "empty": "Sorry, you don't have any notifications at the moment.", + "filterLabel": { + "all": "All", + "read": "Read", + "unread": "Unread" + }, + "group": "Description", + "headerMenuButton": { + "tooltip": "My notifications" + }, + "markAllAsRead": "Mark all as read", + "pageLink": "All notifications", + "post": "Post or Group", + "reason": { + "changed_group_member_role": "Changed your role in group …", + "commented_on_post": "Commented on your post …", + "mentioned_in_comment": "Mentioned you in a comment …", + "mentioned_in_post": "Mentioned you in a post …", + "removed_user_from_group": "Removed you from group …", + "user_joined_group": "Joined your group …", + "user_left_group": "Left your group …" + }, + "title": "Notifications", + "user": "User" + }, + "post": { + "comment": { + "reply": "Reply", + "submit": "Comment", + "submitted": "Comment submitted!", + "updated": "Changes saved!" + }, + "createNewEvent": { + "forGroup": { + "title": "For The Group “{name}”" + }, + "title": "Create an Event" + }, + "createNewPost": { + "forGroup": { + "title": "For The Group “{name}”" + }, + "title": "Create an Article" + }, + "edited": "edited", + "editPost": { + "event": "Edit Your Event", + "forGroup": { + "title": "For The Group “{name}”" + }, + "title": "Edit Your Post" + }, + "event": "Event", + "menu": { + "delete": "Delete post", + "edit": "Edit post", + "pin": "Pin post", + "pinnedSuccessfully": "Post pinned successfully!", + "unpin": "Unpin post", + "unpinnedSuccessfully": "Post unpinned successfully!" + }, + "name": "Article", + "pinned": "Announcement", + "takeAction": { + "name": "Take action" + }, + "viewEvent": { + "eventEnd": "End", + "eventIsOnline": "Online", + "eventLocationName": "City — e.g. Example Street 1, 12345 City", + "eventStart": "Start", + "eventVenue": "Venue — e.g. Backyard, 1st Floor, …", + "title": "Event" + }, + "viewPost": { + "forGroup": { + "title": "In The Group “{name}”" + }, + "title": "Post" + } + }, + "profile": { + "avatar": { + "submitted": "Upload successful!" + }, + "commented": "Commented", + "follow": "Follow", + "followers": "Followers", + "following": "Following", + "invites": { + "description": "Enter their e-mail address for invitation.", + "emailPlaceholder": "E-mail to invite", + "title": "Invite somebody to {APPLICATION_NAME}!" + }, + "memberSince": "Member since", + "network": { + "andMore": "and {number} more …", + "followedBy": "is followed by:", + "followedByNobody": "is not followed by anyone.", + "following": "is following:", + "followingNobody": "follows nobody.", + "title": "Network" + }, + "shouted": "Shouted", + "socialMedia": "Where else can I find", + "userAnonym": "Anonymous" + }, + "quotes": { + "african": { + "author": "African proverb", + "quote": "Many small people in many small places do many small things, that can alter the face of the world." + } + }, + "release": { + "cancel": "Cancel", + "comment": { + "error": "You have already reported the comment!", + "message": "Do you really want to release the comment from \"{name}\"?", + "title": "Release Comment", + "type": "Comment" + }, + "contribution": { + "error": "You have already reported the contribution!!", + "message": "Do you really want to release the contribution \"{name}\"?", + "title": "Release Contribution", + "type": "Contribution" + }, + "submit": "Release", + "success": "Released successfully!", + "user": { + "error": "You already reported the user!", + "message": "Do you really want to release the user \"{name}\"?", + "title": "Release User", + "type": "User" + } + }, + "report": { + "cancel": "Cancel", + "comment": { + "error": "You have already reported the comment!", + "message": "Do you really want to report the comment from \"{name}\"?", + "title": "Report Comment", + "type": "Comment" + }, + "contribution": { + "error": "You have already reported the contribution!", + "message": "Do you really want to report the contribution \"{name}\"?", + "title": "Report Post", + "type": "Contribution" + }, + "reason": { + "category": { + "invalid": "Please select a valid topic", + "label": "Select a topic:", + "options": { + "advert_products_services_commercial": "Advertising products and services with commercial intent.", + "criminal_behavior_violation_german_law": "Criminal behavior or violation of German law.", + "discrimination_etc": "Discriminatory posts, comments, utterances or insults.", + "doxing": "The disclosure of others' personal information without their consent or threat there of (\"doxing\").", + "glorific_trivia_of_cruel_inhuman_acts": "Glorification or trivialization of cruel or inhuman acts of violence.", + "intentional_intimidation_stalking_persecution": "Intentional intimidation, stalking or persecution.", + "other": "Other …", + "pornographic_content_links": "Posting or linking of clearly pornographic material." + }, + "placeholder": "Topic …" + }, + "description": { + "label": "Please explain: Why you like to report this?", + "placeholder": "Additional information …" + } + }, + "submit": "Report", + "success": "Thanks for reporting!", + "user": { + "error": "You already reported the user!", + "message": "Do you really want to report the user \"{name}\"?", + "title": "Report User", + "type": "User" + } + }, + "search": { + "failed": "Nothing found", + "for": "Searching for ", + "heading": { + "Group": "Group ::: Groups", + "Post": "Post ::: Posts", + "Tag": "Hashtag ::: Hashtags", + "User": "User ::: Users" + }, + "hint": "!... searches posts, @... searches users, &... searches groups, #… searches hashtags", + "no-results": "No results found for \"{search}\". Try a different search term!", + "page": "Page", + "placeholder": "Search", + "results": "result found ::: results found", + "title": "Search Results" + }, + "settings": { + "blocked-users": { + "block": "Block user", + "columns": { + "name": "Name", + "slug": "Slug", + "unblock": "Unblock" + }, + "empty": "So far, you have not blocked anybody.", + "explanation": { + "closing": "This should be sufficient for now so that blocked users can no longer bother you.", + "commenting-disabled": "Commenting is not possible at this time on this post.", + "commenting-explanation": "This can happen for several reasons, please see our ", + "intro": "If another user has been blocked by you, this is what happens:", + "notifications": "Blocked users will no longer receive notifications if they mention each other.", + "their-perspective": "Vice versa: The blocked person will also no longer be able to interact with your contributions.", + "your-perspective": "You will no longer be able to interact with their contributions." + }, + "how-to": "You can block other users on their profile page via the content menu.", + "name": "Blocked users", + "unblock": "Unblock user", + "unblocked": "{name} is unblocked again" + }, + "data": { + "labelBio": "About You", + "labelCity": "Your City or Region", + "labelCityHint": "(shows approximate position on map)", + "labelName": "Your Name", + "labelSlug": "Your unique user name", + "name": "Your data", + "namePlaceholder": "Femanon Funny", + "success": "Your data was successfully updated!" + }, + "deleteUserAccount": { + "accountDescription": "Be aware that your Posts and Comments are important to our community. If you still choose to delete them, you have to mark them below.", + "accountWarning": "You CAN'T MANAGE and CAN'T RECOVER your Account, Posts, or Comments after deleting your account!", + "accountWarningAdmin": "The account, contributions or comments can NOT BE ADMINISTERED OR RESTORED after deletion!", + "accountWarningIsAdmin": "Attention! You are about to delete a user account!", + "commentedCount": "Delete my {count} comment ::: Delete my {count} comments", + "confirmDeleting": "Delete user account now", + "contributionsCount": "Delete my {count} post ::: Delete my {count} posts", + "infoAdmin": "All contributions and comments of the user will be deleted additionally!", + "name": "Delete user account", + "pleaseConfirm": "Destructive action! Type “{confirm}” to confirm.", + "success": "Account successfully deleted!" + }, + "download": { + "description": "Click on the button above to download the content of your posts and comments. To download the images of your posts, you have to click on the corresponding link below.", + "json": "as JSON", + "name": "Download Data" + }, + "email": { + "change-successful": "Your e-mail address has been changed successfully.", + "labelEmail": "Change your e-mail address", + "labelNewEmail": "New e-mail Address", + "labelNonce": "Enter your code", + "name": "Your e-mail", + "submitted": "An e-mail to verify your address has been sent to {email}.", + "success": "A new e-mail address has been registered.", + "validation": { + "same-email": "This is your current e-mail address" + }, + "verification-error": { + "explanation": "This can have different causes:", + "message": "Your e-mail could not be changed.", + "reason": { + "invalid-nonce": "Is the confirmation code invalid?", + "no-email-request": "Are you certain that you requested a change of your e-mail address?" + }, + "support": "If the problem persists, please contact us by e-mail at" + } + }, + "embeds": { + "info-description": "Here is the list of third-party providers whose content can be displayed as third-party code, e.g. in the form of embedded videos.", + "name": "Third party providers", + "status": { + "change": { + "allow": "Sure", + "deny": "No thanks", + "question": "Should embedded source code from third parties always be displayed to you?" + }, + "description": "As a default for you, embedded code of third-party providers is", + "disabled": { + "off": "initially not displayed", + "on": "displayed immediately" + } + } + }, + "invites": { + "name": "Invites" + }, + "languages": { + "name": "Languages" + }, + "muted-users": { + "columns": { + "name": "Name", + "slug": "Slug", + "unmute": "Unmute" + }, + "empty": "So far, you have not muted anybody.", + "explanation": { + "intro": "If another user has been muted by you, this is what happens:", + "search": "Posts of muted people disappear from your search results.", + "your-perspective": "The muted person's posts will no longer appear in your news feed." + }, + "how-to": "You can mute other users on their profile page via the content menu.", + "mute": "Mute user", + "name": "Muted users", + "unmute": "Unmute user", + "unmuted": "{name} is unmuted again" + }, + "name": "Settings", + "notifications": { + "name": "Notifications", + "send-email-notifications": "Send e-mail notifications", + "success-update": "Notifications settings saved!" + }, + "organizations": { + "name": "My Organizations" + }, + "privacy": { + "make-shouts-public": "Share articles I have shouted on my public profile", + "name": "Privacy", + "success-update": "Privacy settings saved!" + }, + "security": { + "change-password": { + "button": "Change password", + "label-new-password": "Your new password", + "label-new-password-confirm": "Confirm new password", + "label-old-password": "Your old password", + "message-new-password-confirm-required": "Confirm your new password", + "message-new-password-missmatch": "Type the same password again", + "message-new-password-required": "Enter a new password", + "message-old-password-required": "Enter your old password", + "passwordSecurity": "Password security", + "passwordStrength0": "Very insecure password", + "passwordStrength1": "Insecure password", + "passwordStrength2": "Mediocre password", + "passwordStrength3": "Strong password", + "passwordStrength4": "Very strong password", + "success": "Password successfully changed!" + }, + "name": "Security" + }, + "social-media": { + "add-new-link": "Add new link", + "delete-modal": { + "confirm-button": "Delete", + "message": "Delete “{name}”.", + "title": "Do you really want to delete your link?" + }, + "edit-link": "Edit link", + "name": "Social media", + "placeholder": "Your social media url", + "requireUnique": "You added this url already", + "submit": "Add link", + "successAdd": "Added social media. Updated user profile!", + "successDelete": "Deleted social media. Updated user profile!" + }, + "validation": { + "slug": { + "alreadyTaken": "This user name is already taken.", + "regex": "Allowed characters are only lowercase letters, numbers, underscores and hyphens." + } + } + }, + "shoutButton": { + "shouted": "shouted" + }, + "site": { + "back-to-login": "Back to login page", + "bank": "bank account", + "code-of-conduct": "Code of Conduct", + "contact": "Contact", + "data-privacy": "Data privacy", + "director": "Managing Director", + "donate": "Donate", + "error-occurred": "An error occurred.", + "faq": "FAQ", + "germany": "Germany", + "imprint": "Imprint", + "made": "Made with ❤️", + "register": "Registry number", + "responsible": "responsible for contents of this page (§ 55 Abs. 2 RStV)", + "support": "Support", + "taxident": "USt-ID. according to §27a of the German Sales Tax Law:", + "termsAndConditions": "Terms and conditions", + "thanks": "Thanks!", + "tribunal": "Registry court" + }, + "termsAndConditions": { + "newTermsAndConditions": "New Terms and Conditions", + "termsAndConditionsNewConfirm": "I have read and agree to the new terms of conditions.", + "termsAndConditionsNewConfirmText": "Please read the new terms of use now!" + } +} diff --git a/docs/webapp/locales/es.json b/docs/webapp/locales/es.json new file mode 100644 index 000000000..ae455e5eb --- /dev/null +++ b/docs/webapp/locales/es.json @@ -0,0 +1,737 @@ +{ + "actions": { + "cancel": "Cancelar", + "create": "Crear", + "delete": "Borrar", + "edit": "Edite", + "loading": "cargamento", + "loadMore": "cargar más", + "save": "Guardar" + }, + "admin": { + "categories": { + "categoryName": "Nombre", + "name": "Categorías", + "postCount": "Contribuciones" + }, + "dashboard": { + "comments": "Comentarios", + "follows": "Sigue", + "invites": "Invita", + "name": "Tablero", + "notifications": "Notificaciones", + "organizations": "Organizaciones", + "posts": "Contribuciones", + "projects": "Proyectos", + "shouts": "Recomendaciones", + "users": "Usuarios" + }, + "donations": { + "goal": "Donaciones mensuales necesarias", + "name": "Información de donaciones", + "progress": "Donaciones recogidas hasta ahora", + "successfulUpdate": "¡Información de donaciones actualizada con éxito!" + }, + "hashtags": { + "name": "Hashtags", + "nameOfHashtag": "Nombre", + "number": "No.", + "tagCount": "Contribuciones", + "tagCountUnique": "Usuarios" + }, + "invites": { + "description": "Las invitaciones son una manera maravillosa de tener a sus amigos en su red ...", + "name": "Invitar usuarios", + "title": "Invitar personas" + }, + "name": "Admin", + "notifications": { + "name": "Notificaciones" + }, + "organizations": { + "name": "Organizaciones" + }, + "pages": { + "name": "Páginas" + }, + "settings": { + "name": "Configuración" + }, + "users": { + "empty": "No se han encontrado usuarios", + "form": { + "placeholder": "correo electrónico, nombre o descripción" + }, + "name": "Usuarios", + "table": { + "columns": { + "createdAt": "Creado el", + "email": "Correo electrónico", + "name": "Nombre", + "number": "No.", + "role": "Rol", + "slug": "Alias" + } + } + } + }, + "chat": { + "search": "Filtrar salas de chat" + }, + "code-of-conduct": { + "subheader": "para la red social de {ORGANIZATION_NAME}" + }, + "comment": { + "content": { + "unavailable-placeholder": "... este comentario ya no está disponible" + }, + "edited": "editado", + "menu": { + "delete": "Borrar comentario", + "edit": "Editar comentario" + }, + "show": { + "less": "mostrar menos", + "more": "mostrar más" + } + }, + "common": { + "category": "Categoría ::: Categorías", + "comment": "Comentario ::: Comentarios", + "letsTalk": "Hablemos", + "loading": "cargando", + "loadMore": "cargar más", + "name": "Nombre", + "organization": "Organización ::: Organizaciones", + "post": "Mensaje ::: Mensajes", + "project": "Proyecto ::: Proyectos", + "reportContent": "Informe", + "shout": "Grito ::: Gritos", + "tag": "Etiqueta ::: Etiquetas", + "takeAction": "Tomar acción", + "user": "Usuario ::: Usuarios", + "validations": { + "categories": "deben seleccionarse al menos una y como máximo tres categorías", + "email": "debe ser una dirección de correo electrónico válida", + "url": "debe ser una URL válida" + }, + "versus": "Versus" + }, + "components": { + "password-reset": { + "change-password": { + "error": "Error al cambiar la contraseña. ¿Posiblemente un código de seguridad incorrecto?", + "help": "Si tiene algún problema, por favor envíenos un correo electrónico a:", + "success": "El cambio de contraseña ha sido un éxito!" + }, + "request": { + "form": { + "description": "Se enviará un correo electrónico de restablecimiento de contraseña a la dirección de correo electrónico especificada.", + "submit": "Solicitar correo electrónico", + "submitted": "Se ha enviado un correo electrónico con más instrucciones a {email}." + }, + "title": "Restablecer su contraseña" + } + }, + "registration": { + "create-user-account": { + "error": "¡No se ha podido crear una cuenta de usuario!", + "help": "¿Tal vez el código de verificación era incorrecto o expiró? Si el problema persiste, por favor envíenos un correo electrónico a:", + "success": "¡Su cuenta de usuario ha sido creada!", + "title": "Crear una cuenta de usuario" + }, + "email-nonce": { + "form": { + "description": "Abra su buzón de correo e introduzca el código que le enviamos.", + "next": "Continuar", + "nonce": "Introduzca el código", + "validations": { + "length": "debe tener exactamente {nonceLength} letras" + } + } + }, + "signup": { + "form": { + "data-privacy": "He leido y entendido la declaración de protección de datos.", + "description": "Para empezar, introduzca su dirección de correo electrónico:", + "errors": { + "email-exists": "¡Ya hay una cuenta de usuario con esta dirección de correo electrónico!" + }, + "submit": "Crear una cuenta", + "success": "Se ha enviado un correo electrónico con un enlace de confirmación para el registro a {email}.", + "terms-and-condition": "Estoy de acuerdo con los términos de uso." + }, + "title": "¡Únete a {APPLICATION_NAME}!", + "unavailable": "Desafortunadamente, el registro público de cuentas de usuario en este servidor actualmente no es posible." + } + } + }, + "contribution": { + "categories": { + "infoSelectedNoOfMaxCategories": "{chosen} de {max} categorías seleccionadas" + }, + "category": { + "name": { + "animal-protection": "Protección de animales", + "art-culture-sport": "Arte, Cultura y Deporte", + "consumption-sustainability": "Consumo y Sostenibilidad", + "cooperation-development": "Cooperación y Desarrollo", + "democracy-politics": "Democracia y Política", + "economy-finances": "Economía y Finanzas", + "education-sciences": "Educación y Ciencias", + "energy-technology": "Energía y Tecnología", + "environment-nature": "Medio ambiente y Naturaleza", + "freedom-of-speech": "Libertad de expresión", + "global-peace-nonviolence": "Paz Global y No-Violencia", + "happiness-values": "Felicidad y Valores", + "health-wellbeing": "Salud y Bienestar", + "human-rights-justice": "Derechos Humanos y Justicia", + "it-internet-data-privacy": "TI, Internet y privacidad de datos", + "just-for-fun": "Sólo por diversión" + } + }, + "emotions-label": { + "angry": "Enfadado", + "cry": "Llorar", + "funny": "Gracioso", + "happy": "Feliz", + "surprised": "Sorprendido" + }, + "filterALL": "Ver todas las contribuciones", + "filterFollow": "Filtrar las contribuciones de los usuarios que sigo", + "inappropriatePicture": "Esta imagen puede ser inapropiada para algunas personas.", + "languageSelectLabel": "Idioma", + "languageSelectText": "Seleccione el idioma", + "newPost": "Crear una nueva contribución", + "success": "¡Guardado!", + "teaserImage": { + "cropperConfirm": "Confirmar", + "supportedFormats": "Insertar una imagen de formato de archivo JPG, PNG o GIF!" + }, + "title": "Título" + }, + "delete": { + "cancel": "Cancelar", + "comment": { + "message": "¿Realmente quieres borrar el comentario de \"{name}\" ?", + "success": "¡Comentario eliminado con éxito!", + "title": "Eliminar comentario", + "type": "Comentario" + }, + "contribution": { + "message": "¿Realmente desea eliminar la Contribución \"{name}\" ?", + "success": "¡Publicación eliminado con éxito!", + "title": "Borrar contribución", + "type": "Contribución" + }, + "submit": "Borrar" + }, + "disable": { + "cancel": "Cancelar", + "comment": { + "message": "¿Realmente quieres deshabilitar el comentario de \"{name}\"?", + "title": "Desactivar comentario", + "type": "Comentario" + }, + "contribution": { + "message": "¿Realmente quieres deshabilitar la contribución \"{name}\"?", + "title": "Deshabilitar contribución", + "type": "Contribución" + }, + "submit": "Desactivar", + "success": "Discapacitado con éxito", + "user": { + "message": "¿Realmente quieres deshabilitar el usuario \"{name}\"?", + "title": "Desactivar usuario", + "type": "Usuario" + } + }, + "donations": { + "amount-of-total": "{amount} de {total} € recaudados", + "donate-now": "Donar ahora" + }, + "editor": { + "embed": { + "always_allow": "Permitir siempre contenido incrustado por proveedores externos (esta configuración se puede cambiar en cualquier momento)", + "data_privacy_info": "Sus datos aún no han sido compartidos con terceros proveedores. Si usted procede a ver este video, el siguiente proveedor probablemente recolectará datos del usuario:", + "data_privacy_warning": "¡Advertencia de privacidad de datos!", + "play_now": "Ver ahora" + }, + "hashtag": { + "addHashtag": "Nuevo hashtag", + "addLetter": "Escriba una letra", + "noHashtagsFound": "No se han encontrado hashtags" + }, + "mention": { + "noUsersFound": "No se han encontrado usuarios" + }, + "placeholder": "Deje sus pensamientos inspiradores...." + }, + "error-pages": { + "403-default": "No autorizado a esta página", + "404-default": "Esta página no se pudo encontrar", + "500-default": "Error interno del servidor", + "503-default": "Servicio no disponible", + "back-to-index": "Volver a la página de índice", + "cannot-edit-post": "Esta contribución no se puede editar.", + "default": "Se produjo un error", + "post-not-found": "Esta contribución no se pudo encontrar", + "profile-not-found": "Este perfil no se pudo encontrar" + }, + "filter-menu": { + "all": "Todas", + "categories": "Categorías de contenido", + "emotions": "Emociones", + "filter-by": "Filtrar por ...", + "following": "Usuarios que sigo", + "languages": "Idiomas", + "order": { + "newest": { + "hint": null, + "label": "Más reciente" + }, + "oldest": { + "hint": null, + "label": "Más antiguo" + } + } + }, + "followButton": { + "follow": "Seguir", + "following": "Siguiendo" + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "hashtags-filter": { + "clearSearch": "Borrar búsqueda", + "hashtag-search": "Buscando a #{hashtag}", + "title": "Su burbuja de filtro" + }, + "index": { + "change-filter-settings": "Cambie la configuración de sus filtros para obtener más resultados.", + "no-results": "No se han encontrado contribuciones." + }, + "login": { + "email": "Su correo electrónico", + "failure": "Dirección de correo electrónico o contraseña incorrecta.", + "forgotPassword": "¿Olvidó su contraseña?", + "hello": "Hola", + "login": "Iniciar sesión", + "logout": "Cierre de sesión", + "moreInfo": "¿Qué es {APPLICATION_NAME}?", + "moreInfoHint": "a la página de presentación", + "no-account": "¿No tiene una cuenta?", + "password": "Su contraseña", + "register": "Regístrese", + "success": "¡Usted ha iniciado sesión!" + }, + "maintenance": { + "explanation": "Actualmente estamos llevando a cabo algunos trabajos de mantenimiento planificados, por favor, inténtelo de nuevo más tarde.", + "questions": "Si tiene alguna pregunta o problema, por favor contáctenos por correo electrónico a", + "title": "{APPLICATION_NAME} está en mantenimiento" + }, + "moderation": { + "name": "Moderación", + "reports": { + "author": "Autor", + "content": "Contenido", + "decideButton": "Confirmar", + "decided": "Decidido", + "decideModal": { + "cancel": "Cancelar", + "Comment": { + "disable": { + "message": "¿Realmente quiere que el comentario \"{name}\" permanezca desactivado?", + "title": "Desactivar finalmente Comentario" + }, + "enable": { + "message": "¿Realmente quiere que el comentario \"{nombre}\" permanezca habilitado?", + "title": "Finalmente Habilitar Comentario" + } + }, + "Post": { + "disable": { + "message": "¿Realmente quiere que la entrada \"{name}\" permanezca desactivada?", + "title": "Finalmente Desactivar Contribución" + }, + "enable": { + "message": "¿Realmente quiere que la contribución \"{name}\" permanezca activada?", + "title": "Finalmente Habilitar Contribución" + } + }, + "submit": "Confirmar decisión", + "User": { + "disable": { + "message": "¿Realmente quiere que el usuario \"{name}\" permanezca desactivado?", + "title": "Finalmente Deshabilitar Usuario" + }, + "enable": { + "message": "¿Realmente quiere que el usuario \"{name}\" permanezca habilitado?", + "title": "Finalmente Habilitar Usuario" + } + } + }, + "decision": "Decisión", + "DecisionSuccess": "Decidido con éxito!", + "disabled": "Deshabilitado", + "disabledAt": "Deshabilitado el", + "disabledBy": "desactivado por", + "empty": "Felicitaciones, nada que moderar.", + "enabled": "Habilitado", + "enabledAt": "Habilitado el", + "enabledBy": "Habilitado por", + "filterLabel": { + "all": "Todos", + "closed": "Cerrado", + "reviewed": "Revisado", + "unreviewed": "Sin revisar" + }, + "moreDetails": "Ver Detalles", + "name": "Informes", + "noDecision": "¡No hay decisión!", + "numberOfUsers": "{count} usuarios", + "previousDecision": "Decisión previa:", + "reasonCategory": "Categoría", + "reasonDescription": "Descripción", + "reportedOn": "Fecha", + "status": "Estado actual", + "submitter": "comunicado por" + } + }, + "notifications": { + "comment": "Comentario", + "content": "Contenido", + "empty": "Lo sentimos, no tiene ninguna notificación en este momento.", + "filterLabel": { + "all": "Todas", + "read": "Leído", + "unread": "No leído" + }, + "markAllAsRead": "Marcar todas como leido", + "pageLink": "Todas las notificaciones", + "post": "Contribución", + "reason": { + "commented_on_post": "Comentó su contribución ...", + "mentioned_in_comment": "Le mencionó en un comentario …", + "mentioned_in_post": "Le mencionó en una contribución …" + }, + "title": "Notificaciones", + "user": "Usuario" + }, + "post": { + "comment": { + "reply": "Contestar", + "submit": "Comentario", + "submitted": "Comentario enviado", + "updated": "Cambios guardados" + }, + "edited": "editado", + "menu": { + "delete": "Borrar contribución", + "edit": "Editar contribución", + "pin": "Anclar contribución", + "pinnedSuccessfully": "¡Contribución anclado con éxito!", + "unpin": "Desanclar contribución", + "unpinnedSuccessfully": "¡Contribución desanclado con éxito!" + }, + "name": "Contribución", + "pinned": "Anuncio", + "takeAction": { + "name": "Tomar acción" + } + }, + "profile": { + "avatar": { + "submitted": "Carga con éxito" + }, + "commented": "Comentado", + "follow": "Seguir", + "followers": "Seguidores", + "following": "Siguiendo", + "invites": { + "description": "Introduzca la dirección de correo electrónico para la invitación.", + "emailPlaceholder": "Correo electrónico para invitar", + "title": "¡Invite a alguien a {APPLICATION_NAME}!" + }, + "memberSince": "Miembro desde", + "name": "Mi perfil", + "network": { + "andMore": "y {number} más ...", + "followedBy": "es seguido por:", + "followedByNobody": "no es seguido por nadie.", + "following": "está siguiendo:", + "followingNobody": "no sigue a nadie.", + "title": "Red" + }, + "shouted": "Recomendado", + "socialMedia": "¿Dónde más puedo encontrar?", + "userAnonym": "Anónimo" + }, + "quotes": { + "african": { + "author": "Proverbio africano", + "quote": "Muchas personas pequeñas en muchos lugares pequeños hacen muchas cosas pequeñas, que pueden alterar la faz del mundo." + } + }, + "release": { + "cancel": "Cancelar", + "comment": { + "error": "¡Ya ha reportado el comentario!", + "message": "¿Realmente quieres liberar el comentario de \"{name}\"?", + "title": "Comentario de la versión", + "type": "Comentario" + }, + "contribution": { + "error": "¡Ya ha reportado la contribución!", + "message": "¿Realmente quieres liberar la contribución \"{name}\"?", + "title": "Contribución de la versión ", + "type": "Contribución" + }, + "submit": "Liberar", + "success": "¡Liberado con éxito!", + "user": { + "error": "¡Ya ha reportado el usuario!", + "message": "¿Realmente quieres liberar al usuario \"{name}\"?", + "title": "Liberar usuario", + "type": "Usuario" + } + }, + "report": { + "cancel": "Cancelar", + "comment": { + "error": "¡Ya ha reportado al comentario!", + "message": "¿Realmente quieres reportar el comentario de \"{name}\"?", + "title": "Reportar comentario", + "type": "Comentario" + }, + "contribution": { + "error": "¡Ya ha reportado la contribución!", + "message": "¿Realmente quieres informar al usuario de la contribución \"{name}\"?", + "title": "Informe Contribución", + "type": "Contribución" + }, + "reason": { + "category": { + "invalid": "Por favor seleccione una categoría válida", + "label": "Seleccione una categoría:", + "options": { + "advert_products_services_commercial": "Publicidad de productos y servicios con fines comerciales.", + "criminal_behavior_violation_german_law": "Comportamiento criminal o violación de la ley alemana.", + "discrimination_etc": "Contribuciones discriminatorias, comentarios, expresiones o insultos.", + "doxing": "La divulgación de información personal de otros sin su consentimiento o amenaza de (\"doxing\").", + "glorific_trivia_of_cruel_inhuman_acts": "Glorificación o minimización de actos de violencia crueles o inhumanos.", + "intentional_intimidation_stalking_persecution": "Intimidación intencional, acoso o persecución.", + "other": "Otra ...", + "pornographic_content_links": "Publicación o enlace de material claramente pornográfico." + }, + "placeholder": "Categoría ..." + }, + "description": { + "label": "Por favor explique: ¿Por qué le gusta reportar esto?", + "placeholder": "Información adicional...." + } + }, + "submit": "Informe", + "success": "¡Gracias por informar!", + "user": { + "error": "¡Ya reportó al usuario!", + "message": "¿Realmente quieres reportar al usuario \"{name}\"?", + "title": "Reportar usuario", + "type": "Usuario" + } + }, + "search": { + "failed": "No se ha encontrado nada", + "heading": { + "Post": "Contribuciones", + "User": "Usuarios" + }, + "hint": "¿Qué estás buscando? Utiliza !… para contribuciones, @… para usuarios, #… para hashtags.", + "placeholder": "Buscar" + }, + "settings": { + "blocked-users": { + "block": "Bloquear usuario", + "columns": { + "name": "Nombre", + "slug": "Alias", + "unblock": "Desbloquear" + }, + "empty": "Hasta ahora, no ha bloqueado a nadie.", + "explanation": { + "closing": "Esto debería ser suficiente por ahora para que los usuarios bloqueados no puedan molestarle más.", + "commenting-disabled": "No es posible hacer comentarios en este momento en esta contribución", + "commenting-explanation": "Esto puede suceder por varias razones, por favor vea nuestra ", + "intro": "Si otro usuario ha sido bloqueado por usted, esto es lo que sucede:", + "notifications": "Los usuarios bloqueados no recibirán más notificaciones si se mencionan en sus contribuciones.", + "their-perspective": "Viceversa: la persona bloqueada tampoco verá más sus contribuciones en sus noticias.", + "your-perspective": "Las contribuciones de la persona bloqueada no aparecerán más en su canal de noticias." + }, + "how-to": "Puede bloquear a otros usuarios en la página de perfil de aquellos a través del menú de contenido.", + "name": "Usuarios bloqueados", + "unblock": "Desbloquear usuario", + "unblocked": "{name} está desbloqueado nuevamente" + }, + "data": { + "labelBio": "Acerca de usted", + "labelCity": "Su ciudad o región", + "labelName": "Su nombre", + "labelSlug": "Su nombre de usuario único", + "name": "Sus datos", + "namePlaceholder": "Femanon Funny", + "success": "¡Sus datos han sido actualizados con éxito!" + }, + "deleteUserAccount": { + "accountDescription": "Tenga en cuenta que su contribución y sus comentarios son importantes para nuestra comunidad. Si aún decide borrarlos, debe marcarlos a continuación.", + "accountWarning": "¡NO PUEDE GESTIONAR y NO PUEDE RECUPERAR su cuenta, contribuciones o comentarios después de eliminar su cuenta!", + "commentedCount": "Eliminar mis {count} comentarios", + "contributionsCount": "Eliminar mis {count} contribuciones", + "name": "Eliminar cuenta de usuario", + "pleaseConfirm": "¡Acción destructiva! Escriba “{confirm}” para confirmar.", + "success": "¡Cuenta eliminada con éxito!" + }, + "download": { + "name": "Descargar datos" + }, + "email": { + "change-successful": "Su dirección de correo electrónico ha sido cambiada con éxito.", + "labelEmail": "Cambiar su dirección de correo electrónico", + "labelNewEmail": "Nueva dirección de correo electrónico", + "labelNonce": "Introduzca su código", + "name": "Su correo electrónico", + "submitted": "Se ha enviado un correo electrónico a {email} para verificar su dirección.", + "success": "Se ha registrado una nueva dirección de correo electrónico.", + "validation": { + "same-email": "Esta es su dirección de correo electrónico actual" + }, + "verification-error": { + "explanation": "Esto puede tener diferentes causas:", + "message": "Su correo electrónico no se pudo cambiar.", + "reason": { + "invalid-nonce": "¿El código de confirmación no es válido?", + "no-email-request": "¿Está seguro de que ha solicitado un cambio de su dirección de correo electrónico?" + }, + "support": "Si el problema persiste, póngase en contacto con nosotros por correo electrónico a" + } + }, + "embeds": { + "info-description": "Aquí está la lista de proveedores de terceros cuyo contenido se puede mostrar como código de terceros, por ejemplo, en forma de vídeos incrustados.", + "name": "Proveedores externos", + "status": { + "change": { + "allow": "Seguro", + "deny": "No, gracias", + "question": "¿Debería mostrarse siempre el código fuente incrustado de terceros?" + }, + "description": "Por defecto, el código incrustado de proveedores externos está", + "disabled": { + "off": "inicialmente sin mostrar", + "on": "mostrado inmediatamente" + } + } + }, + "invites": { + "name": "Invita" + }, + "languages": { + "name": "Idiomas" + }, + "muted-users": { + "columns": { + "name": "Nombre", + "slug": "Alias", + "unmute": "Dejar de silenciar" + }, + "empty": "Hasta ahora, no ha silenciado a nadie.", + "explanation": { + "intro": "Si otro usuario ha sido silenciado por usted, esto es lo que sucede:", + "search": "Las contribuciones de personas silenciadas desaparecen de los resultados de búsqueda.", + "your-perspective": "Las contribuciones de la persona silenciada ya no aparecerán en tu canal de noticias." + }, + "how-to": "Puede silenciar a otros usuarios en su página de perfil a través del menú de contenido.", + "mute": "Silenciar usuario", + "name": "Usuarios silenciados", + "unmute": "Dejar de silenciar al usuario", + "unmuted": "{name} no está silenciado ahora" + }, + "name": "Configuración", + "organizations": { + "name": "Mis organizaciones" + }, + "privacy": { + "make-shouts-public": "Compartir artículos que he recomendado en mi perfil público", + "name": "Privacidad", + "success-update": "Configuración de privacidad guardada" + }, + "security": { + "change-password": { + "button": "Cambiar contraseña", + "label-new-password": "Su nueva contraseña", + "label-new-password-confirm": "Confirmar nueva contraseña", + "label-old-password": "Su contraseña antigua", + "message-new-password-confirm-required": "Confirme su nueva contraseña", + "message-new-password-missmatch": "Vuelva a escribir la misma contraseña", + "message-new-password-required": "Introduzca una nueva contraseña", + "message-old-password-required": "Ingrese su contraseña anterior", + "passwordSecurity": "Seguridad de la contraseña", + "passwordStrength0": "Contraseña muy insegura", + "passwordStrength1": "Contraseña insegura", + "passwordStrength2": "Contraseña mediocre", + "passwordStrength3": "Contraseña segura", + "passwordStrength4": "Contraseña muy sólida", + "success": "¡Contraseña cambiada con éxito!" + }, + "name": "Seguridad" + }, + "social-media": { + "name": "Medios de comunicación social", + "placeholder": "Agregar una URL de Social-Media", + "requireUnique": "Ya ha añadido esta url", + "submit": "Añadir enlace", + "successAdd": "Social-Media agregó. Perfil actualizado!", + "successDelete": "Social-Media borrado. Perfil actualizado!" + }, + "validation": { + "slug": { + "alreadyTaken": "Este nombre de usuario ya está en uso.", + "regex": "Los caracteres permitidos son solo letras minúsculas, números, guiones bajos y guiones." + } + } + }, + "shoutButton": { + "shouted": "recomendado" + }, + "site": { + "back-to-login": "Volver a la página de inicio de sesión", + "bank": "cuenta bancaria", + "code-of-conduct": "Código de conducta", + "contact": "Contacto", + "data-privacy": "Protección de datos", + "director": "Director General", + "error-occurred": "Se ha ocurrido un error.", + "faq": "Preguntas más frecuentes", + "germany": "Alemania", + "imprint": "Pie de imprenta", + "made": "Hecho con ❤️", + "register": "Número de registro", + "responsible": "Responsable según § 55 Abs. 2 RStV (Alemania)", + "taxident": "Número de identificación del impuesto sobre el valor añadido según el § 27 a de la Ley del Impuesto sobre el Valor Añadido (Alemania)", + "termsAndConditions": "Términos y condiciones", + "thanks": "¡Gracias!", + "tribunal": "Tribunal de registro" + }, + "termsAndConditions": { + "newTermsAndConditions": "Nuevos términos de uso", + "termsAndConditionsNewConfirm": "He leído y acepto los nuevos términos de uso.", + "termsAndConditionsNewConfirmText": "¡Por favor, lea los nuevos términos de uso ahora!" + } +} diff --git a/docs/webapp/locales/fr.json b/docs/webapp/locales/fr.json new file mode 100644 index 000000000..6f98be2e9 --- /dev/null +++ b/docs/webapp/locales/fr.json @@ -0,0 +1,709 @@ +{ + "actions": { + "cancel": "Annuler", + "create": "Créer", + "delete": "Supprimer", + "edit": "Modifier", + "loading": "chargement", + "loadMore": "charger plus", + "save": "Sauvegarder" + }, + "admin": { + "categories": { + "categoryName": "Nom", + "name": "Catégories", + "postCount": "Postes" + }, + "dashboard": { + "comments": "Commentaires", + "follows": "Suit", + "invites": "Invitations", + "name": "Tableau de bord", + "notifications": "Notifications", + "organizations": "Organisations", + "posts": "Postes", + "projects": "Projets", + "shouts": "Cris", + "users": "Utilisateurs" + }, + "donations": { + "goal": "Dons mensuels requis", + "name": "Informations sur les dons", + "progress": "Dons recueillis jusqu'à présent", + "successfulUpdate": "Les informations sur les dons ont été mises à jour avec succès !" + }, + "hashtags": { + "name": "Hashtags", + "nameOfHashtag": "Nom", + "number": "Num.", + "tagCount": "Postes", + "tagCountUnique": "Utilisateurs" + }, + "invites": { + "description": "Les invitations sont une merveilleuse façon d'avoir vos amis dans votre réseau...", + "name": "Inviter des utilisateurs", + "title": "Inviter des gens" + }, + "name": "Admin", + "notifications": { + "name": "Notifications" + }, + "organizations": { + "name": "Organisations" + }, + "pages": { + "name": "Pages" + }, + "settings": { + "name": "Paramètres" + }, + "users": { + "empty": "Aucun utilisateur trouvé", + "form": { + "placeholder": "mail, nom ou description" + }, + "name": "Utilisateurs", + "table": { + "columns": { + "createdAt": "Créé à", + "email": "Mail", + "name": "Nom", + "number": "Num.", + "role": "Rôle", + "slug": "Slug" + } + } + } + }, + "chat": { + "search": "Filtrer les salons de chat" + }, + "code-of-conduct": { + "subheader": "pour le réseau social de {ORGANIZATION_NAME}" + }, + "comment": { + "content": { + "unavailable-placeholder": "… ce commentaire n'est plus disponible" + }, + "edited": "édité", + "menu": { + "delete": "Supprimer le commentaire", + "edit": "Modifier le commentaire" + }, + "show": { + "less": "montrer moins", + "more": "montrer plus" + } + }, + "common": { + "category": "Catégorie ::: Catégories", + "comment": "Commentaire ::: Commentaires", + "letsTalk": "Parlons-en", + "loading": "chargement", + "loadMore": "charger plus", + "name": "Nom", + "organization": "Organisation ::: Organisations", + "post": "Message ::: Messages", + "project": "Projet ::: Projets", + "reportContent": "Signaler", + "shout": "Partage ::: Partages", + "tag": "Tag ::: Tags", + "takeAction": "Passer à l'action", + "user": "Utilisateur ::: Utilisateurs", + "validations": { + "categories": "au moins une et au maximum trois catégories doivent être sélectionnées", + "email": "Doit être une adresse mail valide", + "url": "doit être une URL valide" + }, + "versus": "Versus" + }, + "components": { + "password-reset": { + "change-password": { + "error": "La modification de votre mot de passe a échoué. Peut-être que le code de sécurité n'était pas correct ?", + "help": "En cas de problème, n'hésitez pas à nous demander de l'aide en nous envoyant un mail à :", + "success": "La modification de votre mot de passe a réussi !" + }, + "request": { + "form": { + "description": "Un mail de réinitialisation de mot de passe sera envoyé à l'adresse mail indiquée.", + "submit": "Demander mail", + "submitted": "Un mail avec des instructions supplémentaires a été envoyé à {email}." + }, + "title": "Réinitialiser votre mot de passe" + } + }, + "registration": { + "create-user-account": { + "error": "Compte d'utilisateur n'a pas pu être créé!", + "help": " Peut-être que la confirmation n'était pas valide? En cas de problème, n'hésitez pas à nous demander de l'aide en nous envoyant un mail à:", + "success": "Votre compte a été créé!", + "title": "Créer un compte utilisateur" + }, + "email-nonce": { + "form": { + "description": "Ouvrez votre boîte de réception et entrez le code que nous vous avons envoyé.", + "next": "Continuer", + "nonce": "Entrez votre code", + "validations": { + "length": "doit comporter {nonceLength} caractères" + } + } + }, + "signup": { + "form": { + "data-privacy": "J'ai lu et compris la Déclaration de confidentialité.", + "description": "Pour commencer, entrez votre adresse mail :", + "errors": { + "email-exists": "Il existe déjà un compte utilisateur avec cette adresse mail!" + }, + "submit": "Créer un compte", + "success": "Un mail avec un lien pour compléter votre inscription a été envoyé à {email}", + "terms-and-condition": "Je confirme les Conditions générales." + }, + "title": "Rejoignez {APPLICATION_NAME}!", + "unavailable": "Malheureusement, l'enregistrement public des comptes utilisateurs n'est pas encore disponible sur ce serveur." + } + } + }, + "contribution": { + "categories": { + "infoSelectedNoOfMaxCategories": "{chosen} de {max} catégories sélectionnées" + }, + "category": { + "name": { + "animal-protection": "Protection des animaux", + "art-culture-sport": "Art, Culture & Sport", + "consumption-sustainability": "Consommation & Durabilité", + "cooperation-development": "Coopération & Développement", + "democracy-politics": "Démocratie & Politique", + "economy-finances": "Économie & Finances", + "education-sciences": "Éducation & Sciences", + "energy-technology": "Énergie & Technologie", + "environment-nature": "Environnement & Nature", + "freedom-of-speech": "Liberté d'expression", + "global-peace-nonviolence": "Paix mondiale & Non-violence", + "happiness-values": "Bonheur & Valeurs", + "health-wellbeing": "Santé & Bien-être", + "human-rights-justice": "Droits de l'homme & Justice", + "it-internet-data-privacy": "Informatique, Internet & Confidentialité des données", + "just-for-fun": "Juste pour le Fun" + } + }, + "emotions-label": { + "angry": "En colère", + "cry": "Pleurer", + "funny": "Marrant", + "happy": "Heureux", + "surprised": "Surpris" + }, + "filterALL": "Voir toutes les contributions", + "filterFollow": "Filtrer les contributions des utilisateurs que je suis", + "inappropriatePicture": "Cette image peut être inappropriée pour certaines personnes.", + "languageSelectLabel": "Langue", + "languageSelectText": "Sélectionner une langue", + "newPost": "Créer un nouveau Post", + "success": "Enregistré!", + "teaserImage": { + "cropperConfirm": "Confirmer", + "supportedFormats": "Insérer une image au format de fichier JPG, PNG ou GIF!" + }, + "title": "Titre" + }, + "delete": { + "cancel": "Annuler", + "comment": { + "message": "Voulez-vous vraiment supprimer le commentaire de \"{name}\"?", + "success": "Commentaire supprimé avec succès !", + "title": "Supprimer un commentaire", + "type": "Commentaire" + }, + "contribution": { + "message": "Voulez-vous vraiment supprimer la contribution \"{name}\"?", + "success": "Contribution supprimée avec succès !", + "title": "Supprimer la contribution", + "type": "Contribution" + }, + "submit": "Supprimer" + }, + "disable": { + "cancel": "Annuler", + "comment": { + "message": "Souhaitez-vous vraiment désactiver le commentaire de « {name} » ?", + "title": "Désactiver le commentaire", + "type": "Commentaire" + }, + "contribution": { + "message": "Souhaitez-vous vraiment signaler l'entrée « {name} »?", + "title": "Désactiver l'apport", + "type": "Contribution" + }, + "submit": "Désactiver", + "success": "Désactivé avec succès", + "user": { + "message": "Souhaitez-vous vraiment désactiver l'utilisateur « {name} »?", + "title": "Désactiver l'utilisateur", + "type": "Utilisateur" + } + }, + "donations": { + "amount-of-total": "{amount} de {total} € collectés", + "donate-now": "Faites un don" + }, + "editor": { + "embed": { + "always_allow": "Autoriser toujours le contenu intégré par des fournisseurs tiers (ce paramètre peut être modifié à tout moment)", + "data_privacy_info": "Vos données n'ont pas encore été partagées avec des fournisseurs tiers. Si vous regardez cette vidéo, le fournisseur suivant recueillera probablement des données utilisateurs:", + "data_privacy_warning": "Attention à la confidentialité des données!", + "play_now": "Regarder maintenant" + }, + "hashtag": { + "addHashtag": "Nouveau hashtag", + "addLetter": "Tapez une lettre", + "noHashtagsFound": "Aucun hashtag trouvé" + }, + "mention": { + "noUsersFound": "Aucun utilisateur trouvé" + }, + "placeholder": "Écrivez quelque chose d'inspirant..." + }, + "filter-menu": { + "all": "Toutes", + "categories": "Catégories de contenu", + "emotions": "Émotions", + "filter-by": "Filtrer par ...", + "following": "Utilisateurs que je suis", + "languages": "Langues", + "order": { + "newest": { + "hint": null, + "label": "Plus récent" + }, + "oldest": { + "hint": null, + "label": "Le plus ancien" + } + } + }, + "followButton": { + "follow": "Suivre", + "following": "Je suis les" + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "hashtags-filter": { + "clearSearch": "Réinitialiser la recherche", + "hashtag-search": "Recherche de #{hashtag}", + "title": "Votre bulle de filtre" + }, + "index": { + "change-filter-settings": "Modifiez les paramètres de filtrage pour obtenir plus de résultats.", + "no-results": "Pas de contribution trouvée." + }, + "login": { + "email": "Votre mail", + "failure": "Adresse mail ou mot de passe incorrect.", + "forgotPassword": "Mot de passe oublié?", + "hello": "Bonjour", + "login": "Connexion", + "logout": "Déconnexion", + "moreInfo": "Qu'est-ce que {APPLICATION_NAME}?", + "moreInfoHint": "à la page de présentation", + "no-account": "Vous n'avez pas de compte?", + "password": "Votre mot de passe", + "register": "S'inscrire", + "success": "Vous êtes connecté!" + }, + "maintenance": { + "explanation": "Pour l'instant, nous faisons de la maintenance programmée, veuillez réessayer plus tard.", + "questions": "Des questions ou des préoccupations, envoyez un mail à", + "title": "{APPLICATION_NAME} est en maintenance" + }, + "moderation": { + "name": "Modération", + "reports": { + "author": "Auteur", + "content": "Contenu", + "decideButton": "Confirmer", + "decided": "Décidé", + "decideModal": { + "cancel": "Annuler", + "Comment": { + "disable": { + "message": "Voulez-vous vraiment que le commentaire \"{name}\" reste désactivé ?", + "title": "Finalement désactiver le commentaire" + }, + "enable": { + "message": "Voulez-vous vraiment que le commentaire \"{name}\" reste activé?", + "title": "Finalement activer le commentaire" + } + }, + "Post": { + "disable": { + "message": "Voulez-vous vraiment que la publication \"{name}\" reste désactivé?", + "title": "Finalement désactiver la publication" + }, + "enable": { + "message": "Voulez-vous vraiment que la publication \"{name}\" reste activé?", + "title": "Finalement activer le post" + } + }, + "submit": "Confirmer la décision", + "User": { + "disable": { + "message": "Voulez-vous vraiment laisser l'utilisateur \"{name}\" désactivé?", + "title": "Finalement désactiver l'utilisateur" + }, + "enable": { + "message": "Voulez-vous réellement laisser l'utilisateur \"{name}\" activé?", + "title": "Finalement activer utilisateur" + } + } + }, + "decision": "Décision", + "DecisionSuccess": "Décidé avec succès!", + "disabled": "Désactivé", + "disabledAt": "Désactivé le", + "disabledBy": "désactivé par", + "empty": "Félicitations, rien à modérer.", + "enabled": "Activé", + "enabledAt": "Activé le", + "enabledBy": "Activé par", + "filterLabel": { + "all": "Tous", + "closed": "Fermé", + "reviewed": "Revu", + "unreviewed": "Non révisé" + }, + "moreDetails": "Voir les détails", + "name": "Signalisations", + "noDecision": "Pas de décision!", + "numberOfUsers": "{count} utilisateurs", + "previousDecision": "Décision précédente:", + "reasonCategory": "Catégorie", + "reasonDescription": "Description", + "reportedOn": "Date", + "status": "Statut actuel", + "submitter": "signalé par" + } + }, + "notifications": { + "comment": "Commentaire", + "content": "Contenu", + "empty": "Désolé, vous n'avez pas de notifications pour le moment.", + "filterLabel": { + "all": "Tous", + "read": "Lire", + "unread": "Non lu" + }, + "group": "Description", + "headerMenuButton": { + "tooltip": "Mes notifications" + }, + "markAllAsRead": "Tout marquer comme lu", + "pageLink": "Toutes les notifications", + "post": "Post", + "reason": { + "commented_on_post": "Commenté sur votre post…", + "mentioned_in_comment": "Vous a mentionné dans un commentaire…", + "mentioned_in_post": "Vous a mentionné dans un post…" + }, + "title": "Notifications", + "user": "Utilisateur" + }, + "post": { + "comment": { + "submit": "Commenté", + "submitted": "Commentaire soumis", + "updated": "Changements sauvegardés" + }, + "edited": "édité", + "menu": { + "delete": "Supprimer le Post", + "edit": "Modifier le Post", + "pin": "Épingler le Post", + "pinnedSuccessfully": "Poste épinglé avec succès!", + "unpin": "Retirer l'épingle du poste", + "unpinnedSuccessfully": "Épingle retirer du Post avec succès!" + }, + "name": "Post", + "pinned": "Annonce", + "takeAction": { + "name": "Passez à l'action" + } + }, + "profile": { + "avatar": { + "submitted": "Téléchargement réussi" + }, + "commented": "Commentais", + "follow": "Suivre", + "followers": "Suiveurs", + "following": "Suivant", + "invites": { + "description": "Entrez leur adresse mail pour l'invitation.", + "emailPlaceholder": "Mail d'invitation", + "title": "Invitez quelqu'un à {APPLICATION_NAME}!" + }, + "memberSince": "Membre depuis", + "name": "Mon profil", + "network": { + "andMore": "et {number} plus…", + "followedBy": "est suivi par:", + "followedByNobody": "n'est suivi par personne.", + "following": "suit:", + "followingNobody": "ne suit personne.", + "title": "Réseau" + }, + "shouted": "Recommandé", + "socialMedia": "Où d'autre puis-je trouver", + "userAnonym": "Anonyme" + }, + "quotes": { + "african": { + "author": "Proverbe africain", + "quote": "Beaucoup de petites personnes dans beaucoup de petits endroits font beaucoup de petites choses, qui peuvent changer la face du monde." + } + }, + "release": { + "cancel": "Annuler", + "comment": { + "error": "Vous avez déjà signalé le commentaire!", + "message": "Voulez-vous vraiment publier le commentaire de \"{name}\"?", + "title": "Publication des commentaires", + "type": "Commentaire" + }, + "contribution": { + "error": "Vous avez déjà signalé la contribution !!", + "message": "Voulez-vous vraiment débloquer la contribution \"{name}\"?", + "title": "Versement de la contribution", + "type": "Contribution" + }, + "submit": "Relâchez", + "success": "Relâchez avec succès!", + "user": { + "error": "Vous avez déjà signalé l'utilisateur!", + "message": "Voulez-vous vraiment libérer l'utilisateur \"{name}\"?", + "title": "Validation par l'utilisateur", + "type": "Utilisateur" + } + }, + "report": { + "cancel": "Annuler", + "comment": { + "error": "Vous avez déjà rapporté le commentaire!", + "message": "Souhaitez-vous vraiment signaler l'utilisateur « {name} »?", + "title": "Signaler un commentaire", + "type": "Commentaire" + }, + "contribution": { + "error": "Vous avez déjà rapporté la contribution!", + "message": "Souhaitez-vous vraiment signaler l'entrée « {name} »?", + "title": "Signaler l'entrée", + "type": "Apport" + }, + "reason": { + "category": { + "invalid": "Veuillez sélectionner une catégorie valide", + "label": "Sélectionnez une catégorie:", + "options": { + "advert_products_services_commercial": "Publicité de produits et de services à des fins commerciaux.", + "criminal_behavior_violation_german_law": "Comportement criminel ou violation du droit allemand.", + "discrimination_etc": "Posts, commentaires, expressions ou insultes discriminatoires.", + "doxing": "La divulgation de renseignements personnels sans le consentement ou la menace de (\"doxing\").", + "glorific_trivia_of_cruel_inhuman_acts": "Glorification ou banalisation d'actes de violence cruels ou inhumains.", + "intentional_intimidation_stalking_persecution": "L'intimidation, le harcèlement ou la persécution intentionnelle.", + "other": "Autres...", + "pornographic_content_links": "Publication ou partage de matériel clairement pornographique." + }, + "placeholder": "Catégorie..." + }, + "description": { + "label": "S'il vous plaît expliquer: Pourquoi voulez-vous signaler cela?", + "placeholder": "Informations complémentaires..." + } + }, + "submit": "Envoyer le rapport", + "success": "Merci de nous avoir fait part de vos commentaires!", + "user": { + "error": "Vous avez déjà signalé l'utilisateur!", + "message": "Souhaitez-vous vraiment signaler l'utilisateur « {name} »?", + "title": "Signaler l'utilisateur", + "type": "Utilisateur" + } + }, + "search": { + "failed": "Rien trouvé", + "heading": { + "Post": "Posts", + "User": "Utilisateurs" + }, + "hint": "Qu'est-ce que vous cherchez? Utiliser !… pour des posts, @… pour des membres, #… pour des hashtag.", + "placeholder": "Rechercher" + }, + "settings": { + "blocked-users": { + "block": "Bloquer l'utilisateur", + "columns": { + "name": "Nom", + "slug": "Slug", + "unblock": "Débloquer" + }, + "empty": "Jusqu'à présent, vous n'avez bloqué personne.", + "explanation": { + "closing": "Ceci devrait être suffisant pour le moment afin que les utilisateurs bloqués ne puissent plus vous déranger.", + "intro": "Si vous avez bloqué un autre utilisateur, voici ce qui se passe:", + "notifications": "Les utilisateurs bloqués ne recevront plus de notifications s'ils sont mentionnés dans vos postes.", + "their-perspective": "Vice versa: la personne bloquée ne verra plus non plus vos postes dans son fil d'actualités.", + "your-perspective": "Les postes de la personne bloquée n'apparaîtront dans votre fil d'actualités." + }, + "how-to": "Vous pouvez bloquer d'autres utilisateurs sur leur page de profil via le menu de contenu.", + "name": "Utilisateurs bloqués", + "unblock": "Débloquer l'utilisateur", + "unblocked": "{name} est à nouveau débloqué" + }, + "data": { + "labelBio": "À propos de vous", + "labelCity": "Votre ville ou région", + "labelName": "Votre nom", + "labelSlug": "Votre nom d'utilisateur unique", + "name": "Vos données", + "namePlaceholder": "Fémanon Funny", + "success": "Vos données ont été mises à jour avec succès !" + }, + "deleteUserAccount": { + "accountDescription": "Sachez que vos postes et commentaires sont importants pour notre communauté. Si vous voulez quand même les supprimer, vous devez les marquer ci-dessous.", + "accountWarning": "Vous NE POUVEZ PAS GÉRER et NE POUVEZ PAS RECOUVRIR votre compte, vos messages ou vos commentaires après avoir supprimé votre compte!", + "commentedCount": "Supprimer mes {count} commentaires", + "contributionsCount": "Supprimer mes {count} postes", + "name": "Supprimer un compte utilisateur", + "pleaseConfirm": "Action destructive! Saisissez “{confirm}” pour confirmer.", + "success": "Compte supprimer avec succès!" + }, + "download": { + "name": "Télécharger les données" + }, + "email": { + "change-successful": "Votre adresse mail a été modifiée avec succès.", + "labelEmail": "Changer votre adresse mail", + "labelNewEmail": "Nouvelle adresse mail", + "labelNonce": "Entrez votre code", + "name": "Votre mail", + "submitted": "Un mail pour vérifier votre adresse a été envoyé à {email}.", + "success": "Une nouvelle adresse mail a été enregistrée.", + "validation": { + "same-email": "Voici votre adresse mail actuelle" + }, + "verification-error": { + "explanation": "Cela peut avoir différentes causes:", + "message": "Votre mail n'a pas pu être changé.", + "reason": { + "invalid-nonce": "Le code de confirmation est-il invalide?", + "no-email-request": "Êtes-vous certain d'avoir demandé un changement d'adresse mail?" + }, + "support": "Si le problème persiste, veuillez nous contacter par mail à l'adresse suivante" + } + }, + "embeds": { + "info-description": "Voici la liste des fournisseurs tiers dont le contenu peut être affiché sous forme de code tiers, par exemple sous la forme de vidéos intégrées.", + "name": "Fournisseurs tiers", + "status": { + "change": { + "allow": "Sûr", + "deny": "Non merci", + "question": "Est-ce que vous voulez que le code source intégrer vous soit toujours affiché?" + }, + "description": "Par défaut, le code incorporé des fournisseurs tiers est", + "disabled": { + "off": "initialement non affiché", + "on": "affiché immédiatement" + } + } + }, + "invites": { + "name": "Invite" + }, + "languages": { + "name": "Langues" + }, + "name": "Paramètres", + "organizations": { + "name": "Mes organisations" + }, + "privacy": { + "make-shouts-public": "Partager les articles que j'ai recommandés sur mon profil", + "name": "Confidentialité", + "success-update": "Paramètres de confidentialité enregistrés" + }, + "security": { + "change-password": { + "button": "Modifier le mot de passe", + "label-new-password": "Votre nouveau mot de passe", + "label-new-password-confirm": "Confirmez votre nouveau mot de passe", + "label-old-password": "Votre ancien mot de passe", + "message-new-password-confirm-required": "Confirmez votre nouveau mot de passe", + "message-new-password-missmatch": "Tapez à nouveau le même mot de passe", + "message-new-password-required": "Entrez un nouveau mot de passe", + "message-old-password-required": "Entrez votre ancien mot de passe", + "passwordSecurity": "Sécurité par mot de passe", + "passwordStrength0": "Mot de passe très peu sûr", + "passwordStrength1": "Mot de passe non sécurisé", + "passwordStrength2": "Mot de passe médiocre", + "passwordStrength3": "Mot de passe fort", + "passwordStrength4": "Mot de passe très fort", + "success": "Mot de passe modifié avec succès !" + }, + "name": "Sécurité" + }, + "social-media": { + "name": "Médias sociaux", + "placeholder": "Ajouter une URL pour les médias sociaux", + "requireUnique": "Vous avez déjà ajouté cette URL", + "submit": "Ajouter un lien", + "successAdd": "Les médias sociaux ont été ajoutés. Profil mis à jour !", + "successDelete": "Médias sociaux supprimé. Profil mis à jour !" + }, + "validation": { + "slug": { + "alreadyTaken": "Ce nom d'utilisateur est déjà pris.", + "regex": "Les caractères autorisés ne sont que les lettres minuscules, les chiffres, les traits de soulignement et les traits d'union." + } + } + }, + "shoutButton": { + "shouted": "recommandé" + }, + "site": { + "back-to-login": "Retour à la page de connexion", + "bank": "compte bancaire", + "code-of-conduct": "Code de conduite", + "contact": "Contacter", + "data-privacy": "Protection des données", + "director": "Directeur Général", + "error-occurred": "Une erreur s'est produite.", + "faq": "FAQ", + "germany": "Allemagne", + "imprint": "Mentions légales", + "made": "Fabriqué avec ❤️", + "register": "Numéro de registre", + "responsible": "Responsable selon § 55 Abs. 2 RStV (Allemagne)", + "taxident": "Numéro d'identification à la taxe sur la valeur ajoutée selon § 27 a de la loi sur la taxe sur la valeur ajoutée (Allemagne)", + "termsAndConditions": "Conditions générales", + "thanks": "Merci!", + "tribunal": "Tribunal de registre" + }, + "termsAndConditions": { + "newTermsAndConditions": "Nouvelles conditions générales", + "termsAndConditionsNewConfirm": "J'ai lu et accepté les nouvelles conditions générales.", + "termsAndConditionsNewConfirmText": "Veuillez lire les nouvelles conditions d'utilisation dès maintenant !" + } +} diff --git a/docs/webapp/locales/html/de/code-of-conduct.html b/docs/webapp/locales/html/de/code-of-conduct.html new file mode 100644 index 000000000..f40fd76f9 --- /dev/null +++ b/docs/webapp/locales/html/de/code-of-conduct.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Präambel +

                                  +

                                  + Ich bin der Inhalt vom Verhaltenskodex. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/data-privacy.html b/docs/webapp/locales/html/de/data-privacy.html new file mode 100644 index 000000000..5ffaf5bc2 --- /dev/null +++ b/docs/webapp/locales/html/de/data-privacy.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Information über die Erhebung personenbezogener Daten +

                                  +

                                  + Das hier wäre der Inhalt der Datenschutzbestimmungen. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/donate.html b/docs/webapp/locales/html/de/donate.html new file mode 100644 index 000000000..7ac723202 --- /dev/null +++ b/docs/webapp/locales/html/de/donate.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Wohin kann ich spenden? +

                                  +

                                  + Hier steht was zu den Spenden. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/faq.html b/docs/webapp/locales/html/de/faq.html new file mode 100644 index 000000000..aab0205a1 --- /dev/null +++ b/docs/webapp/locales/html/de/faq.html @@ -0,0 +1,67 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Wie bediene ich dieses Netzwerk? +

                                  +

                                  + Hier findest Du die + Bedienungsanleitung.
                                  +

                                  +

                                  + Betreiberspezifische FAQs +

                                  +

                                  + Hier steht was zu den betreiberspezifischen FAQs. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/imprint.html b/docs/webapp/locales/html/de/imprint.html new file mode 100644 index 000000000..818beaae9 --- /dev/null +++ b/docs/webapp/locales/html/de/imprint.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Betreiber +

                                  +

                                  + Ich bin das Impressum. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/index.js b/docs/webapp/locales/html/de/index.js new file mode 100644 index 000000000..341ab9bdd --- /dev/null +++ b/docs/webapp/locales/html/de/index.js @@ -0,0 +1,19 @@ +import organization from './organization.html' +import support from './support.html' +import termsAndConditions from './terms-and-conditions.html' +import codeOfConduct from './code-of-conduct.html' +import dataPrivacy from './data-privacy.html' +import faq from './faq.html' +import imprint from './imprint.html' +import donate from './donate.html' + +export default { + organization, + support, + termsAndConditions, + codeOfConduct, + dataPrivacy, + faq, + imprint, + donate, +} diff --git a/docs/webapp/locales/html/de/organization.html b/docs/webapp/locales/html/de/organization.html new file mode 100644 index 000000000..ad9c4ce49 --- /dev/null +++ b/docs/webapp/locales/html/de/organization.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Das Entwicklernetzwerk +

                                  +

                                  + Hier wird das Netzwerk beschrieben. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/support.html b/docs/webapp/locales/html/de/support.html new file mode 100644 index 000000000..50490111f --- /dev/null +++ b/docs/webapp/locales/html/de/support.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Ansprechpartner +

                                  +

                                  + Ich bin der Inhalt vom Support. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/de/terms-and-conditions.html b/docs/webapp/locales/html/de/terms-and-conditions.html new file mode 100644 index 000000000..c35fb92ac --- /dev/null +++ b/docs/webapp/locales/html/de/terms-and-conditions.html @@ -0,0 +1,61 @@ + + + + +
                                  +

                                  + Für das soziale Netzwerk Ocelot.Social für Entwickler +

                                  +

                                  + Nutzung und Lizenz +

                                  +

                                  + Ich bin der Inhalt der Seite "Nutzungsbedingungen". +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/code-of-conduct.html b/docs/webapp/locales/html/en/code-of-conduct.html new file mode 100644 index 000000000..a38d79365 --- /dev/null +++ b/docs/webapp/locales/html/en/code-of-conduct.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + Präambel +

                                  +

                                  + I am the content of the code of conduct. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/data-privacy.html b/docs/webapp/locales/html/en/data-privacy.html new file mode 100644 index 000000000..c21a83532 --- /dev/null +++ b/docs/webapp/locales/html/en/data-privacy.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + Information about the collection of personal data +

                                  +

                                  + This would be our data privacy section. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/donate.html b/docs/webapp/locales/html/en/donate.html new file mode 100644 index 000000000..e436c7900 --- /dev/null +++ b/docs/webapp/locales/html/en/donate.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + Where can I donate? +

                                  +

                                  + Here's what it says about donations. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/faq.html b/docs/webapp/locales/html/en/faq.html new file mode 100644 index 000000000..1356622aa --- /dev/null +++ b/docs/webapp/locales/html/en/faq.html @@ -0,0 +1,67 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + How do I operate this network? +

                                  +

                                  + Here you can find the + user manual.
                                  +

                                  +

                                  + Operator-Specific FAQs +

                                  +

                                  + Here are the operator-specific FAQs. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/imprint.html b/docs/webapp/locales/html/en/imprint.html new file mode 100644 index 000000000..2723cb3fa --- /dev/null +++ b/docs/webapp/locales/html/en/imprint.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + Operator +

                                  +

                                  + I am the imprint. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/index.js b/docs/webapp/locales/html/en/index.js new file mode 100644 index 000000000..341ab9bdd --- /dev/null +++ b/docs/webapp/locales/html/en/index.js @@ -0,0 +1,19 @@ +import organization from './organization.html' +import support from './support.html' +import termsAndConditions from './terms-and-conditions.html' +import codeOfConduct from './code-of-conduct.html' +import dataPrivacy from './data-privacy.html' +import faq from './faq.html' +import imprint from './imprint.html' +import donate from './donate.html' + +export default { + organization, + support, + termsAndConditions, + codeOfConduct, + dataPrivacy, + faq, + imprint, + donate, +} diff --git a/docs/webapp/locales/html/en/organization.html b/docs/webapp/locales/html/en/organization.html new file mode 100644 index 000000000..a1f7684d4 --- /dev/null +++ b/docs/webapp/locales/html/en/organization.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + The Developers Network +

                                  +

                                  + Here the network is described. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/support.html b/docs/webapp/locales/html/en/support.html new file mode 100644 index 000000000..7905714b5 --- /dev/null +++ b/docs/webapp/locales/html/en/support.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + Contact +

                                  +

                                  + I am the content of the support. +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/en/terms-and-conditions.html b/docs/webapp/locales/html/en/terms-and-conditions.html new file mode 100644 index 000000000..0df6d1e32 --- /dev/null +++ b/docs/webapp/locales/html/en/terms-and-conditions.html @@ -0,0 +1,60 @@ + + + +
                                  +

                                  + For the social network Ocelot.Social for Developers +

                                  +

                                  + Use and License +

                                  +

                                  + I am the content of the page "Terms And Conditions". +

                                  +
                                  + + diff --git a/docs/webapp/locales/html/index.js b/docs/webapp/locales/html/index.js new file mode 100644 index 000000000..c23aec819 --- /dev/null +++ b/docs/webapp/locales/html/index.js @@ -0,0 +1,7 @@ +import de from './de' +import en from './en' + +export default { + de, + en, +} diff --git a/docs/webapp/locales/index.js b/docs/webapp/locales/index.js new file mode 100644 index 000000000..28cbd27d0 --- /dev/null +++ b/docs/webapp/locales/index.js @@ -0,0 +1,74 @@ +import { enUS, de, nl, fr, es, it, pt, pl, ru } from 'date-fns/locale' +import find from 'lodash/find' + +const locales = [ + { + name: 'English', + code: 'en', + iso: 'en-US', + enabled: true, + dateFnsLocale: enUS, + }, + { + name: 'Deutsch', + code: 'de', + iso: 'de-DE', + enabled: true, + dateFnsLocale: de, + }, + { + name: 'Nederlands', + code: 'nl', + iso: 'nl-NL', + enabled: true, + dateFnsLocale: nl, + }, + { + name: 'Français', + code: 'fr', + iso: 'fr-FR', + enabled: true, + dateFnsLocale: fr, + }, + { + name: 'Italiano', + code: 'it', + iso: 'it-IT', + enabled: true, + dateFnsLocale: it, + }, + { + name: 'Español', + code: 'es', + iso: 'es-ES', + enabled: true, + dateFnsLocale: es, + }, + { + name: 'Português', + code: 'pt', + iso: 'pt-PT', + enabled: true, + dateFnsLocale: pt, + }, + { + name: 'Polski', + code: 'pl', + iso: 'pl-PL', + enabled: true, + dateFnsLocale: pl, + }, + { + name: 'Русский', + code: 'ru', + iso: 'ru-RU', + enabled: true, + dateFnsLocale: ru, + }, +] + +export default locales +export function getDateFnsLocale({ $i18n }) { + const { dateFnsLocale } = find(locales, { code: $i18n.locale() }) || {} + return dateFnsLocale || enUS +} diff --git a/docs/webapp/locales/it.json b/docs/webapp/locales/it.json new file mode 100644 index 000000000..548278fc9 --- /dev/null +++ b/docs/webapp/locales/it.json @@ -0,0 +1,652 @@ +{ + "actions": { + "cancel": null, + "create": "Crea", + "delete": "Cancella", + "edit": "Modifica", + "loading": "Caricamento in corso", + "loadMore": "Carica di più", + "save": "Salva" + }, + "admin": { + "categories": { + "categoryName": "Nome", + "name": "Categorie", + "postCount": "Messaggi" + }, + "dashboard": { + "comments": "Commenti", + "follows": "Segue", + "invites": "Inviti", + "name": "Cruscotto", + "notifications": "Notifiche", + "organizations": "Organizzazioni", + "posts": "Messaggi", + "projects": "Progetti", + "shouts": "Gridi", + "users": "Utenti" + }, + "donations": { + "goal": "Donazioni mensili necessarie", + "name": "Info donazioni", + "progress": "Donazioni raccolte finora", + "successfulUpdate": "Informazioni sulle donazioni aggiornate con successo!" + }, + "hashtags": { + "name": null, + "nameOfHashtag": null, + "number": null, + "tagCount": null, + "tagCountUnique": null + }, + "invites": { + "description": null, + "name": null, + "title": null + }, + "name": "Admin", + "notifications": { + "name": "Notifiche" + }, + "organizations": { + "name": "Organizzazioni" + }, + "pages": { + "name": "Pagine" + }, + "settings": { + "name": "Impostazioni" + }, + "tags": { + "name": "Tag", + "tagCount": "Messaggi", + "tagCountUnique": "Utenti" + }, + "users": { + "empty": null, + "form": { + "placeholder": null + }, + "name": "Utenti", + "table": { + "columns": { + "createdAt": null, + "email": null, + "name": null, + "number": null, + "role": null, + "slug": null + } + } + } + }, + "code-of-conduct": { + "subheader": null + }, + "comment": { + "content": { + "unavailable-placeholder": null + }, + "delete": null, + "edit": null, + "edited": null, + "menu": { + "delete": null, + "edit": null + }, + "show": { + "less": null, + "more": null + } + }, + "common": { + "category": "Categoria ::: Categorie", + "comment": "Commento ::: Commenti", + "letsTalk": "Discutiamo", + "loading": "Caricamento in corso", + "loadMore": "Caricare di più", + "name": "Nome", + "organization": "Organizzazione ::: Organizzazioni", + "post": "Messaggio ::: Messaggi", + "project": "Progetto ::: Progetti", + "reportContent": null, + "shout": "Grido ::: Gridi", + "tag": "Tag ::: Tag", + "takeAction": "Agire", + "user": "Utente ::: Utenti", + "validations": { + "categories": null, + "email": null, + "url": null + }, + "versus": "Verso" + }, + "components": { + "password-reset": { + "change-password": { + "error": "Modifica della password non riuscita. Forse il codice di sicurezza non era corretto?", + "help": null, + "success": null + }, + "request": { + "form": { + "description": null, + "submit": null, + "submitted": null + }, + "title": null + } + }, + "registration": { + "create-user-account": { + "error": null, + "help": null, + "success": null, + "title": null + }, + "email-nonce": { + "form": { + "description": null, + "next": null, + "nonce": null, + "validations": { + "length": null + } + } + }, + "signup": { + "form": { + "data-privacy": null, + "description": null, + "errors": { + "email-exists": null + }, + "submit": null, + "success": null, + "terms-and-condition": null + }, + "title": null, + "unavailable": null + } + } + }, + "contribution": { + "categories": { + "infoSelectedNoOfMaxCategories": null + }, + "category": { + "name": { + "animal-protection": null, + "art-culture-sport": null, + "consumption-sustainability": null, + "cooperation-development": null, + "democracy-politics": null, + "economy-finances": null, + "education-sciences": null, + "energy-technology": null, + "environment-nature": null, + "freedom-of-speech": null, + "global-peace-nonviolence": null, + "happiness-values": null, + "health-wellbeing": null, + "human-rights-justice": null, + "it-internet-data-privacy": null, + "just-for-fun": null + } + }, + "delete": null, + "edit": null, + "emotions-label": { + "angry": null, + "cry": null, + "funny": null, + "happy": null, + "surprised": null + }, + "filterALL": null, + "filterFollow": null, + "languageSelectLabel": null, + "languageSelectText": null, + "newPost": null, + "success": null, + "teaserImage": { + "cropperConfirm": "Confermare", + "supportedFormats": "Inserisci un'immagine in formato file JPG, PNG o GIF!" + }, + "title": null + }, + "delete": { + "cancel": null, + "comment": { + "message": null, + "success": null, + "title": null, + "type": null + }, + "contribution": { + "message": null, + "success": null, + "title": null, + "type": null + }, + "submit": null + }, + "disable": { + "cancel": null, + "comment": { + "message": null, + "title": null, + "type": null + }, + "contribution": { + "message": null, + "title": null, + "type": null + }, + "submit": null, + "success": null, + "user": { + "message": null, + "title": null, + "type": null + } + }, + "donations": { + "amount-of-total": "{amount} of {total} € collezionato", + "donate-now": "Dona ora" + }, + "editor": { + "embed": { + "always_allow": null, + "data_privacy_info": "I tuoi dati non sono ancora stati condivisi con fornitori terzi. Se continui a guardare questo video, il seguente fornitore probabilmente raccoglierà i dati dell'utente:", + "data_privacy_warning": null, + "play_now": null + }, + "hashtag": { + "addHashtag": null, + "addLetter": null, + "noHashtagsFound": null + }, + "mention": { + "noUsersFound": null + }, + "placeholder": null + }, + "filter-menu": { + "all": null, + "categories": null, + "emotions": null, + "filter-by": null, + "following": null, + "languages": null, + "order": { + "newest": { + "hint": null, + "label": null + }, + "oldest": { + "hint": null, + "label": null + } + } + }, + "followButton": { + "follow": null, + "following": null + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "hashtags-filter": { + "clearSearch": null, + "hashtag-search": null, + "title": null + }, + "index": { + "change-filter-settings": null, + "no-results": null + }, + "login": { + "email": "La tua email", + "failure": null, + "forgotPassword": null, + "hello": "Ciao", + "login": "Accesso", + "logout": "Logout", + "moreInfo": "Che cosa è {APPLICATION_NAME}?", + "moreInfoHint": null, + "no-account": null, + "password": "La tua password", + "register": null, + "success": null + }, + "maintenance": { + "explanation": null, + "questions": null, + "title": null + }, + "moderation": { + "name": null, + "reports": { + "createdAt": null, + "disabledBy": null, + "empty": null, + "name": null, + "reasonCategory": null, + "reasonDescription": null, + "reporter": null, + "submitter": null + } + }, + "notifications": { + "comment": null, + "content": null, + "empty": null, + "filterLabel": { + "all": null, + "read": null, + "unread": null + }, + "markAllAsRead": "Segna tutti come letti", + "pageLink": null, + "post": null, + "reason": { + "commented_on_post": null, + "mentioned_in_comment": null, + "mentioned_in_post": null + }, + "title": null, + "user": null + }, + "post": { + "comment": { + "submit": null, + "submitted": null, + "updated": null + }, + "edited": null, + "menu": { + "delete": null, + "edit": null, + "pin": null, + "pinnedSuccessfully": null, + "unpin": null, + "unpinnedSuccessfully": null + }, + "name": "Messaggio", + "pinned": null, + "takeAction": { + "name": "Agire" + } + }, + "profile": { + "avatar": { + "submitted": null + }, + "commented": "Commentato", + "follow": "Seguire", + "followers": "Seguenti", + "following": "Seguendo", + "invites": { + "description": null, + "emailPlaceholder": null, + "title": null + }, + "memberSince": "Membro dal", + "name": "Il mio profilo", + "network": { + "andMore": null, + "followedBy": null, + "followedByNobody": null, + "following": null, + "followingNobody": null, + "title": null + }, + "shouted": "Gridato", + "socialMedia": null, + "userAnonym": "Anonymous" + }, + "quotes": { + "african": { + "author": "Proverbio africano", + "quote": "Molte piccole persone in molti piccoli luoghi fanno molte piccole cose, che possono cambiare la faccia del mondo." + } + }, + "release": { + "cancel": null, + "comment": { + "error": null, + "message": null, + "title": null, + "type": null + }, + "contribution": { + "error": null, + "message": null, + "title": null, + "type": null + }, + "submit": null, + "success": null, + "user": { + "error": null, + "message": null, + "title": null, + "type": null + } + }, + "report": { + "cancel": null, + "comment": { + "error": null, + "message": null, + "title": null, + "type": null + }, + "contribution": { + "error": null, + "message": null, + "title": null, + "type": null + }, + "reason": { + "category": { + "invalid": null, + "label": null, + "options": { + "advert_products_services_commercial": null, + "criminal_behavior_violation_german_law": null, + "discrimination_etc": null, + "doxing": null, + "glorific_trivia_of_cruel_inhuman_acts": null, + "intentional_intimidation_stalking_persecution": null, + "other": null, + "pornographic_content_links": null + }, + "placeholder": null + }, + "description": { + "label": null, + "placeholder": null + } + }, + "submit": null, + "success": null, + "user": { + "error": null, + "message": null, + "title": null, + "type": null + } + }, + "search": { + "failed": "Non è stato trovato nulla", + "hint": "Cosa state cercando? Usate !... per i post, @... per gli utenti, #... per gli hashtag.", + "placeholder": "Ricerca" + }, + "settings": { + "data": { + "labelBio": "Su di te", + "labelCity": "La tua città o regione", + "labelName": "Nome", + "labelSlug": null, + "name": "I tuoi dati", + "namePlaceholder": "Anonymous", + "success": null + }, + "delete": { + "name": "Elimina Account" + }, + "deleteUserAccount": { + "accountDescription": "Essere consapevoli che i tuoi post e commenti sono importanti per la nostra comunità. Se cancelli il tuo account utente, tutto scomparirà per sempre - e sarebbe un vero peccato!", + "accountWarning": "Attenzione! Tu NON PUOI GESTIRE e NON PUOI RECUPERARE il tuo account, i tuoi messaggi o commenti dopo aver cancellato il tuo account!", + "commentedCount": "Cancella i miei {count} commenti", + "contributionsCount": "Cancellare i miei {count} messaggi", + "name": "Cancellare l'account utente", + "pleaseConfirm": "Azione distruttiva! Digita “{confirm}” per confermare.", + "success": "Account eliminato con successo!" + }, + "download": { + "name": "Scaricamento dati" + }, + "email": { + "change-successful": null, + "labelEmail": null, + "labelNewEmail": null, + "labelNonce": null, + "name": null, + "submitted": null, + "success": null, + "validation": { + "same-email": null + }, + "verification-error": { + "explanation": null, + "message": null, + "reason": { + "invalid-nonce": null, + "no-email-request": null + }, + "support": null + } + }, + "embeds": { + "info-description": "Ecco l'elenco dei fornitori di terze parti i cui contenuti possono essere visualizzati come codice di terze parti, ad esempio sotto forma di video incorporati.", + "name": null, + "status": { + "change": { + "allow": null, + "deny": null, + "question": null + }, + "description": null, + "disabled": { + "off": null, + "on": null + } + } + }, + "invites": { + "name": "Inviti" + }, + "languages": { + "name": "Lingue" + }, + "muted-users": { + "columns": { + "name": null, + "slug": null, + "unmute": null + }, + "empty": null, + "explanation": { + "intro": null, + "search": null, + "your-perspective": null + }, + "how-to": null, + "mute": null, + "name": null, + "unmute": null, + "unmuted": null + }, + "name": "Impostazioni", + "organizations": { + "name": "Mie organizzazioni" + }, + "privacy": { + "make-shouts-public": null, + "name": null, + "success-update": null + }, + "security": { + "change-password": { + "button": null, + "label-new-password": null, + "label-new-password-confirm": null, + "label-old-password": null, + "message-new-password-confirm-required": null, + "message-new-password-missmatch": null, + "message-new-password-required": null, + "message-old-password-required": null, + "passwordSecurity": null, + "passwordStrength0": null, + "passwordStrength1": null, + "passwordStrength2": null, + "passwordStrength3": null, + "passwordStrength4": null, + "success": null + }, + "name": "Sicurezza" + }, + "social-media": { + "name": null, + "placeholder": null, + "requireUnique": null, + "submit": null, + "successAdd": "Social media aggiunti. \nProfilo utente aggiornato ", + "successDelete": "Social media cancellati. Profilo utente aggiornato!" + }, + "validation": { + "slug": { + "alreadyTaken": null, + "regex": null + } + } + }, + "shoutButton": { + "shouted": null + }, + "site": { + "back-to-login": null, + "bank": "conto bancario", + "code-of-conduct": null, + "contact": "Contatto", + "data-privacy": "protezione dei dati", + "director": "Direttore Generale", + "error-occurred": null, + "faq": null, + "germany": "Germania", + "imprint": "Impressum", + "made": "Con ❤️ fatto", + "register": "numero di registro", + "responsible": "Responsabile ai sensi del § 55 Abs. 2 RStV (Germania)", + "taxident": "Numero di identificazione dell'imposta sul valore aggiunto ai sensi del § 27 a Legge sull'imposta sul valore aggiunto (Germania)", + "termsAndConditions": null, + "thanks": null, + "tribunal": "registro tribunale" + }, + "termsAndConditions": { + "newTermsAndConditions": "Nuovi Termini e Condizioni", + "termsAndConditionsNewConfirm": "Ho letto e accetto le nuove condizioni generali di contratto.", + "termsAndConditionsNewConfirmText": "Si prega di leggere le nuove condizioni d'uso ora!" + } +} diff --git a/docs/webapp/locales/nl.json b/docs/webapp/locales/nl.json new file mode 100644 index 000000000..27fbc8865 --- /dev/null +++ b/docs/webapp/locales/nl.json @@ -0,0 +1,214 @@ +{ + "actions": { + "cancel": "Annuleren" + }, + "admin": { + "categories": { + "categoryName": "Naam", + "name": "Categorieën", + "postCount": "Berichten" + }, + "dashboard": { + "comments": "Opmerkingen", + "follows": "Volgt", + "invites": "Uitnodigingen", + "name": "Dashboard", + "notifications": "Meldingen", + "organizations": "Organisaties", + "posts": "Berichten", + "projects": "Projecten", + "shouts": "Shouts", + "users": "Gebruikers" + }, + "name": "Admin", + "notifications": { + "name": "Meldingen" + }, + "organizations": { + "name": "Organisaties" + }, + "pages": { + "name": "Pages" + }, + "settings": { + "name": "Instellingen" + }, + "tags": { + "name": "Tags", + "tagCount": "Berichten", + "tagCountUnique": "Gebruikers" + }, + "users": { + "name": "Gebruikers" + } + }, + "comment": { + "delete": "Commentaar verwijderen", + "edit": "Commentaar bewerken" + }, + "common": { + "category": "Categorie ::: Categorieën", + "comment": "Opmerking ::: Opmerkingen", + "letsTalk": "Laten we praten", + "loading": "inlading", + "loadMore": "meer laden", + "name": "Naam", + "organization": "Organisatie ::: Organisaties", + "post": "Bericht ::: Berichten", + "project": "Project ::: Projecten", + "reportContent": "Melden", + "shout": "Shout ::: Shouts", + "tag": "Tag ::: Tags", + "takeAction": "Onderneem actie", + "user": "Gebruiker ::: Gebruikers", + "versus": "Versus" + }, + "contribution": { + "delete": "Bijdrage verwijderen", + "edit": "Bijdrage bewerken", + "teaserImage": { + "cropperConfirm": "Bevestigen", + "supportedFormats": "Voeg een afbeelding in met het bestandsformaat JPG, PNG of GIF!" + } + }, + "disable": { + "comment": { + "message": "Wilt u de reactie van \" {name} \" echt uitschakelen ?", + "title": "Commentaar uitschakelen", + "type": "Melding" + } + }, + "followButton": { + "follow": "Volgen", + "following": "Volgt" + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "login": { + "email": "Uw E-mail", + "hello": "Hallo", + "login": "Inloggen", + "logout": "Uitloggen", + "moreInfo": "Wat is {APPLICATION_NAME}?", + "password": "Uw Wachtwoord" + }, + "notifications": { + "comment": null, + "content": null, + "empty": null, + "filterLabel": { + "all": null, + "read": null, + "unread": null + }, + "markAllAsRead": "Markeer alles als gelezen", + "pageLink": null, + "post": null, + "reason": { + "commented_on_post": null, + "mentioned_in_comment": null, + "mentioned_in_post": null + }, + "title": null, + "user": null + }, + "post": { + "moreInfo": { + "name": "Meer info" + }, + "name": "Post", + "takeAction": { + "name": "Onderneem actie" + } + }, + "profile": { + "avatar": { + "submitted": null + }, + "follow": "Volgen", + "followers": "Volgelingen", + "following": "Volgt", + "memberSince": "Lid sinds", + "name": "Mijn profiel" + }, + "quotes": { + "african": { + "author": "Afrikaans spreekwoord", + "quote": "Veel kleine mensen op veel kleine plaatsen doen veel kleine dingen, die het gezicht van de wereld kunnen veranderen." + } + }, + "report": { + "cancel": "Annuleren", + "comment": { + "message": "Wilt u echt het commentaar van \"{name}\" melden?", + "title": "Reactie melden", + "type": "Melding" + }, + "contribution": { + "message": "Wilt u echt het commentaar van \"{name}\" melden?", + "title": "Bijdrage melden", + "type": "Bijdrage" + }, + "submit": "Verzenden", + "user": { + "message": "Wilt u echt het commentaar van \"{name}\" melden?", + "title": "Gebruiker melden", + "type": "Gebruiker" + } + }, + "search": { + "failed": "Niets gevonden", + "hint": "Waar zoekt u naar? Gebruik !... voor berichten, @... voor gebruikers, #... voor hashtags.", + "placeholder": "Zoeken" + }, + "settings": { + "data": { + "name": "Uw gegevens" + }, + "delete": { + "name": "Account verwijderen" + }, + "download": { + "name": "Gegevens downloaden" + }, + "invites": { + "name": "Uitnodigingen" + }, + "languages": { + "name": "Talen" + }, + "name": "Instellingen", + "organizations": { + "name": "Mijn Organisaties" + }, + "security": { + "name": "Veiligheid" + } + }, + "shoutButton": { + "shouted": "uitgeroepen" + }, + "site": { + "bank": "bankrekening", + "contact": "contact", + "data-privacy": "gegevensbescherming", + "director": "Directeur", + "germany": "Duitsland", + "imprint": "Afdruk", + "made": "Met ❤️ gemaakt", + "register": "inschrijfnummer", + "responsible": "Verantwoordelijk volgens § 55 Abs. 2 RStV (Duitsland).", + "taxident": "Identificatienummer voor de belasting over de toegevoegde waarde overeenkomstig § 27 a Wet op de belasting over de toegevoegde waarde (Duitsland).", + "termsAc": "Gebruiksvoorwaarden", + "tribunal": "registerrechtbank" + } +} diff --git a/docs/webapp/locales/pl.json b/docs/webapp/locales/pl.json new file mode 100644 index 000000000..3b7d1200a --- /dev/null +++ b/docs/webapp/locales/pl.json @@ -0,0 +1,375 @@ +{ + "actions": { + "cancel": "Odwołaj", + "create": "Tworzenie", + "delete": "Usuń", + "edit": "Edycja", + "loading": "załadunek", + "loadMore": "Obciążenie więcej", + "save": "Oszczędzaj" + }, + "admin": { + "categories": { + "categoryName": "Nazwa", + "name": "Kategorie", + "postCount": "Stanowiska" + }, + "dashboard": { + "comments": "Komentarze", + "follows": "Podąża za", + "invites": "Zaprasza", + "name": "Tablica rozdzielcza", + "notifications": "Powiadomienia", + "organizations": "Organizacje", + "posts": "Stanowiska", + "projects": "Projekty", + "shouts": "Zalecane", + "users": "Użytkownicy" + }, + "name": "Admin", + "notifications": { + "name": "Powiadomienia" + }, + "organizations": { + "name": "Organizacje" + }, + "pages": { + "name": "Strony" + }, + "settings": { + "name": "Ustawienia" + }, + "tags": { + "name": "Znaczniki", + "tagCount": "Stanowiska", + "tagCountUnique": "Użytkownicy" + }, + "users": { + "name": "Użytkownicy" + } + }, + "comment": { + "content": { + "unavailable-placeholder": " ...ten komentarz nie jest już dostępny." + }, + "menu": { + "delete": "Usuń komentarz", + "edit": "Edytuj komentarz" + }, + "show": { + "less": "Pokaż mniej", + "more": "Pokaż więcej" + } + }, + "common": { + "category": "Kategoria ::: Kategorie", + "comment": "Komentarz ::: Komentarze", + "letsTalk": "Porozmawiajmy", + "loading": "załadunek", + "loadMore": "Obciążenie więcej", + "name": "Nazwa", + "organization": "Organization ::: Organizations", + "post": "Poczta ::: Posty", + "project": "Projekt ::: Projekty", + "reportContent": "Sprawozdanie", + "shout": "przekazanie sprawy ::: Polecam tę stronę", + "tag": "Znacznik ::: Znaczniki", + "takeAction": "Podejmij działania", + "user": "Użytkownik ::: Użytkownicy", + "validations": { + "email": "musi być ważny adres e-mail." + }, + "versus": "werset" + }, + "components": { + "password-reset": { + "change-password": { + "error": "Zmiana hasła nie powiodła się. Może kod bezpieczeństwa nie był poprawny?", + "help": "W przypadku problemów, zachęcamy do zwrócenia się o pomoc, wysyłając do nas wiadomość e-mail:", + "success": "Zmiana hasła zakończyła się sukcesem!" + }, + "request": { + "form": { + "description": "Na podany adres e-mail zostanie wysłany email z resetem hasła.", + "submit": "Poproś o wiadomość e-mail", + "submitted": "Na adres {email} została wysłana wiadomość z dalszymi instrukcjami." + }, + "title": "Zresetuj hasło" + } + }, + "registration": { + "email-nonce": { + "form": { + "description": "Otwórz swoją skrzynkę odbiorczą i wpisz kod, który do Ciebie wysłaliśmy.", + "next": "Kontynuuj", + "nonce": "Wprowadź swój kod", + "validations": { + "length": "musi mieć długość {nonceLength} znaków." + } + } + } + } + }, + "contribution": { + "categories": { + "infoSelectedNoOfMaxCategories": "{chosen} z {max} wybrane kategorie" + }, + "filterALL": "Pokaż wszystkie wpisy", + "filterFollow": "Pokaż wpisy użytkowników, których śledzę", + "languageSelectLabel": "Język", + "newPost": "Utwórz nowy wpis", + "success": "Zapisano!", + "teaserImage": { + "cropperConfirm": "Potwierdzać", + "supportedFormats": "Wstaw zdjęcie w formacie pliku JPG, PNG lub GIF!" + } + }, + "delete": { + "cancel": "Odwołaj", + "comment": { + "message": "Czy na pewno chcesz ukryć komentarz użytkownika \" {name} \"?", + "title": "Usuń komentarz", + "type": "Komentarz" + }, + "contribution": { + "message": "Czy na pewno chcesz ukryć wpis \" {name} \"?", + "success": "Wyślij pomyślnie usunięty!", + "title": "Ukryj wpis", + "type": "Wpis / Post" + }, + "submit": "Usuń" + }, + "disable": { + "cancel": "Anuluj", + "comment": { + "message": "Naprawdę chcesz wyłączyć komentarz \"{name}\"?", + "title": "Wyłącz komentarz", + "type": "Komentarz" + }, + "contribution": { + "message": "Naprawdę chcesz unieszkodliwić ten wkład \"{name}\"?", + "title": "Wyłącz Wkład", + "type": "Wkład" + }, + "submit": "Deaktywuj", + "success": "Zdeaktywowano", + "user": { + "message": "Czy naprawdę chcesz wyłączyć użytkownika \"{name}\"?", + "title": "Wyłączenie użytkownika", + "type": "Użytkownik" + } + }, + "editor": { + "placeholder": "Napisz coś inspirującego..." + }, + "followButton": { + "follow": "naśladować", + "following": "w skutek" + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "hashtags-filter": { + "title": "Twoja bańka filtrująca" + }, + "login": { + "email": "Twój adres e-mail", + "forgotPassword": "Zapomniałeś hasła?", + "hello": "Cześć", + "login": "Logowanie", + "logout": "Wyloguj się", + "moreInfo": "Co to jest {APPLICATION_NAME}?", + "moreInfoHint": "idź po więcej szczegółów", + "password": "Twoje hasło" + }, + "moderation": { + "name": "Umiarkowanie", + "reports": { + "disabledBy": "deaktywowane przez", + "empty": "Gratulacje, moderacja nie jest potrzebna", + "name": "Raporty", + "submitter": "zgłoszone przez" + } + }, + "notifications": { + "markAllAsRead": "Oznacz wszystkie jako przeczytane", + "menu": { + "mentioned": "wspomiał o Tobie we wpisie" + } + }, + "post": { + "comment": { + "submit": "Komentarz", + "submitted": "Komentarz dodany" + }, + "menu": { + "delete": "Usuń wpis", + "edit": "Edytuj wpis" + }, + "name": "Poczta", + "takeAction": { + "name": "Podejmij działanie" + } + }, + "profile": { + "avatar": { + "submitted": "Przesłano pomyślnie" + }, + "commented": "Skomentuj", + "follow": "Obserwuj", + "followers": "Obserwujący", + "following": "Obserwowani", + "memberSince": "Członek od", + "name": "Mój profil", + "network": { + "and": "i", + "followedBy": "jest obserwowany:", + "followedByNobody": "nikt go nie obserwuje.", + "following": "obserwuje:", + "followingNobody": "nikogo nie obserwuje.", + "more": "więcej", + "title": "Sieć" + }, + "shouted": "Krzyknij", + "socialMedia": "Gdzie jeszcze mogę znaleźć", + "userAnonym": "Anonymous" + }, + "quotes": { + "african": { + "author": "Afrykańskie przysłowie", + "quote": "Wielu małych ludzi w wielu małych miejscowościach robi wiele małych rzeczy, które mogą zmienić oblicze świata." + } + }, + "release": { + "cancel": "Anuluj", + "comment": { + "message": "Czy na pewno chcesz zgłosić komentarz użytkownika \" {name} \"?", + "title": "Zgłoś komentarz", + "type": "Komentarz" + }, + "contribution": { + "message": "Czy na pewno chcesz zgłosić wpis użytkownika \" {name} \"?", + "title": "Zgłoś wpis", + "type": "Wpis" + }, + "submit": "Zgłoś", + "success": "Zgłoszono pomyślnie!", + "user": { + "message": "Czy na pewno chcesz zgłosić użytkownika \" {name} \"?", + "title": "Zgłoś użytkownika", + "type": "Użytkownik" + } + }, + "report": { + "cancel": "Anuluj", + "comment": { + "error": "Zgłosiłeś już komentarz!", + "message": "Czy na pewno chcesz zgłosić komentarz użytkownika\" {name} \"?", + "title": "Sprawozdanie Komentarz", + "type": "Komentarz" + }, + "contribution": { + "error": "Zgłosiłeś już ten wkład!", + "message": "Czy na pewno chcesz zgłosić ten wpis użytkownika \" {name} \"?", + "title": "Zgłoś wpis", + "type": "Wpis / Post" + }, + "submit": "Wyślij raport", + "success": "Dziękujemy za Twoje zgłoszenie!", + "user": { + "error": "Zgłosiłeś już użytkownika!", + "message": "Czy na pewno chcesz zgłosić użytkownika \" {name} \"?", + "title": "Raport Użytkownik", + "type": "Użytkownik" + } + }, + "search": { + "failed": "Niczego nie znaleziono", + "hint": "Czego szukasz? Użyj !... dla postów, @... dla użytkowników, #... dla hashtagów.", + "placeholder": "Szukaj" + }, + "settings": { + "data": { + "labelBio": "O Tobie", + "labelCity": "Twoje miasto lub region", + "labelName": "Twoje dane", + "name": "Twoje dane", + "namePlaceholder": "Anonymous", + "success": "Twoje dane zostały pomyślnie zaktualizowane!" + }, + "deleteUserAccount": { + "accountDescription": "Be aware that your Post and Comments are important to our community. If you still choose to delete them, you have to mark them below.", + "accountWarning": "Po usunięcie Twojego konta, nie możesz ZARZĄDZAĆ ani ODZYSKAĆ danych, wpisów oraz komentarzy!", + "commentedCount": "Usuń {count} moich komentarzy", + "contributionsCount": "Usuń {count} moich postów", + "name": "Usuń dane", + "pleaseConfirm": "Uwaga, niebezpieczeństwo! Wpisz „{confirm}”, aby potwierdzić.", + "success": "Konto zostało usunięte" + }, + "download": { + "name": "Pobierz dane" + }, + "invites": { + "name": "Zaproszenia" + }, + "languages": { + "name": "Języki" + }, + "name": "Ustawienia", + "organizations": { + "name": "My Organizations" + }, + "security": { + "change-password": { + "button": "Zmień hasło", + "label-new-password": "Nowe hasło", + "label-new-password-confirm": "Potwierdź nowe hasło", + "label-old-password": "Stare hasło", + "message-new-password-confirm-required": "Potwierdź nowe hasło", + "message-new-password-missmatch": "Wpisz to samo hasło ponownie", + "message-new-password-required": "Wprowadź nowe hasło", + "message-old-password-required": "Podaj stare hasło", + "passwordSecurity": "Siła hasła", + "passwordStrength0": "Hasło bardzo słabe", + "passwordStrength1": "Hasło słabe", + "passwordStrength2": "Hasło średnie", + "passwordStrength3": "Hasło silne", + "passwordStrength4": "Hasło bardzo silne", + "success": "Hasło zostało zmienione!" + }, + "name": "Bezpieczeństwo" + }, + "social-media": { + "name": "Media społecznościowe", + "placeholder": "Dodaj link do mediów społecznościowych", + "submit": "Dodaj link", + "successAdd": "Dodano społeczność. Profil zaktualizowany!", + "successDelete": "Usunięto społeczność. Profil zaktualizowany!" + } + }, + "shoutButton": { + "shouted": "krzyczeć" + }, + "site": { + "bank": "rachunek bankowy", + "contact": "Kontakt", + "data-privacy": "ochrona danych", + "director": "Dyrektor zarządzający", + "germany": "Niemcy", + "imprint": "Nadruk", + "made": "Z ❤️ zrobiony", + "register": "numer rejestracyjny", + "responsible": "Odpowiedzialny zgodnie z § 55 Abs. 2 RStV (Niemcy)", + "taxident": "Numer identyfikacyjny podatku od wartości dodanej zgodnie z § 27 a Ustawa o podatku od wartości dodanej (Niemcy)", + "termsAc": "Warunki użytkowania", + "tribunal": "sąd rejestrowy" + } +} diff --git a/docs/webapp/locales/pt.json b/docs/webapp/locales/pt.json new file mode 100644 index 000000000..121fc903d --- /dev/null +++ b/docs/webapp/locales/pt.json @@ -0,0 +1,687 @@ +{ + "actions": { + "cancel": "Cancelar", + "create": "Criar", + "delete": "Apagar", + "edit": "Editar", + "loading": "Carregando", + "loadMore": "Carregar mais", + "save": "Salvar" + }, + "admin": { + "categories": { + "categoryName": "Nome", + "name": "Categorias", + "postCount": "Postagens" + }, + "dashboard": { + "comments": "Comentários", + "follows": "Segue", + "invites": "Convites", + "name": "Painel de controle", + "notifications": "Notificações", + "organizations": "Organizações", + "posts": "Postagens", + "projects": "Projetos", + "shouts": "Aclamações", + "users": "Usuários" + }, + "donations": { + "goal": "Doações mensais necessárias", + "name": "Informações sobre Doações", + "progress": "Doações arrecadadas até o momento", + "successfulUpdate": "Informações sobre doações atualizadas com sucesso!" + }, + "hashtags": { + "name": "Hashtags", + "nameOfHashtag": "Nome", + "number": "Não.", + "tagCount": "Publicações", + "tagCountUnique": "Usuários" + }, + "invites": { + "description": "Convites são uma maneira maravilhosa de ter seus amigos em sua rede …", + "name": "Convidar usuários", + "title": "Convidar pessoas" + }, + "name": "Administração", + "notifications": { + "name": "Notificações" + }, + "organizations": { + "name": "Organizações" + }, + "pages": { + "name": "Páginas" + }, + "settings": { + "name": "Configurações" + }, + "users": { + "empty": "Nenhum usuário encontrado", + "form": { + "placeholder": "e-mail, nome ou descrição" + }, + "name": "Usuários", + "table": { + "columns": { + "createdAt": "Criado em", + "email": "E-mail", + "name": "Nome", + "number": "N.º", + "role": "Função", + "slug": "Slug" + } + } + } + }, + "code-of-conduct": { + "consequences": { + "description": "Se um membro da comunidade apresentar um comportamento inaceitável, os operadores, moderadores e administradores responsáveis da rede podem tomar medidas adequadas, incluindo, entre outras:", + "list": { + "0": "Pedido de suspensão imediata de uma conduta inaceitável", + "1": "Bloquear ou excluir comentários", + "2": "Exclusão temporária da respectiva publicação ou contribuição", + "3": "Bloquear ou eliminar conteúdo", + "4": "Retirada temporária de permissão de escrita", + "5": "Exclusão temporária da rede", + "6": "Exclusão definitiva da rede", + "7": "Violações da lei alemã podem ser denunciadas" + }, + "title": "Consequências de um comportamento inaceitável" + }, + "expected-behaviour": { + "description": "Os seguintes comportamentos são esperados e solicitados a todos os membros da comunidade:", + "list": { + "0": "Exercitar ponderação e respeito no seu discurso e ações.", + "1": "Tente a colaboração antes do conflito.", + "2": "Evite comportamentos e discursos humilhantes, discriminatórios ou assediadores.", + "3": "Esteja atento ao que o rodeia e aos outros participantes. Alerte os líderes comunitários se você perceber uma situação perigosa, alguém em perigo ou violações deste Código de Conduta, mesmo que pareçam inconsequentes." + }, + "title": "Comportamentos esperados" + }, + "get-help": "Se você for vítima ou testemunhar um comportamento inaceitável, ou tiver qualquer outra preocupação, por favor notifique um organizador da comunidade o mais rápido possível e inclua o link ou mencione o conteúdo correspondente:", + "preamble": { + "description": "A {APPLICATION_NAME} é uma rede de conhecimento e ação social sem fins lucrativos da próxima geração. Feito por pessoas - para pessoas. Open Source, justo e transparente. Para uma mudança local e global positiva em todas as áreas da vida. Redesenhamos completamente a troca pública de conhecimentos, idéias e projetos. As funções da {APPLICATION_NAME} reúnem as pessoas - offline e online - para que possamos fazer do mundo um lugar melhor.", + "title": "Introdução" + }, + "purpose": { + "description": "Com este código de conduta, regulamentamos os princípios essenciais para o comportamento em nossa rede social. A Carta dos Direitos Humanos das Nações Unidas é a nossa orientação e forma o coração da nossa compreensão dos valores. O código de conduta serve como princípios orientadores para a nossa aparência pessoal e interação uns com os outros. Qualquer pessoa ativa como usuário da {APPLICATION_NAME} Network, que escreve artigos, comentários ou se conecta com outros usuários, incluindo aqueles fora da rede, reconhece estas regras de conduta como obrigatórias.", + "title": "Propósito" + }, + "subheader": "para a rede social da {ORGANIZATION_NAME}", + "unacceptable-behaviour": { + "description": "Os seguintes comportamentos são inaceitáveis dentro da nossa comunidade:", + "list": { + "0": "Mensagens, comentários, afirmações ou insultos discriminatórios, particularmente aqueles relacionados a gênero, orientação sexual, raça, religião, orientação política ou filosófica ou deficiência.", + "1": "Publicar ou vincular material claramente pornográfico.", + "2": "Glorificação ou banalização de atos de violência cruel ou desumana.", + "3": "A divulgação de informações pessoais de terceiros sem o seu consentimento ou ameaça de (\"doxing\").", + "4": "Intimidação intencional, assédio ou perseguição.", + "5": "Publicidade de produtos e serviços com intenção comercial.", + "6": "Comportamento criminoso ou violação da lei alemã.", + "7": "Apoiar ou incentivar tal conduta." + }, + "title": "Comportamentos Inaceitáveis" + } + }, + "comment": { + "content": { + "unavailable-placeholder": "…esse comentário não está mais disponível" + }, + "edited": "editado", + "menu": { + "delete": "Apagar Comentário", + "edit": "Editar Comentário" + }, + "show": { + "less": "mostrar menos", + "more": "mostrar mais" + } + }, + "common": { + "category": "Categoria ::: Categorias", + "comment": "Comentário ::: Comentários", + "letsTalk": "Vamos Conversar", + "loading": "Carregando", + "loadMore": "Carregar mais", + "name": "Nome", + "organization": "Organização ::: Organizações", + "post": "Postagem ::: Postagens", + "project": "Projeto ::: Projetos", + "reportContent": "Denunciar", + "shout": "Aclamação ::: Aclamações", + "tag": "Etiqueta ::: Etiquetas", + "takeAction": "Tomar uma ação", + "user": "Usuário ::: Usuários", + "validations": { + "categories": "devem ser seleccionadas, no mínimo uma e, no máximo três categorias", + "email": "deve ser um endereço de e-mail válido", + "url": "deve ser uma URL válida" + }, + "versus": "Contra" + }, + "components": { + "password-reset": { + "change-password": { + "error": "A alteração da sua senha falhou. Talvez o código de segurança não estava correto?", + "help": "Em caso de problemas, sinta-se à vontade para pedir ajuda, enviando um e-mail para:", + "success": "A alteração da sua senha foi bem-sucedida!" + }, + "request": { + "form": { + "description": "Um e-mail de redefinição de senha será enviado ao endereço de e-mail fornecido.", + "submit": "Solicitar e-mail", + "submitted": "Um e-mail com mais instruções foi enviado para {email}" + }, + "title": "Redefinir sua senha" + } + }, + "registration": { + "create-user-account": { + "error": "Nenhuma conta de usuário pode ser criada!", + "help": " Talvez a confirmação tenha sido inválida? Em caso de problemas, sinta-se à vontade para pedir ajuda, enviando um e-mail para:", + "success": "A sua conta foi criada!", + "title": "Criar uma conta de usuário" + }, + "email-nonce": { + "form": { + "description": "Abra a sua caixa de entrada e digite o código que lhe enviamos.", + "next": "Continue", + "nonce": "Digite seu código", + "validations": { + "length": "deve ter {nonceLength} caracteres" + } + } + }, + "signup": { + "form": { + "data-privacy": "Eu li e entendi o Política de Privacidade.", + "description": "Para começar, digite seu endereço de e-mail:", + "errors": { + "email-exists": "Já existe uma conta de usuário com este endereço de e-mail!" + }, + "submit": "Criar uma conta", + "success": "Um e-mail com um link para completar o seu registo foi enviado para {email}", + "terms-and-condition": "Eu concordo com os Termos e condições." + }, + "title": "Junte-se à {APPLICATION_NAME}!", + "unavailable": "Infelizmente, o registo público para usuário não está disponível neste servidor." + } + } + }, + "contribution": { + "categories": { + "infoSelectedNoOfMaxCategories": "{chosen} of {max} categorias selecionadas" + }, + "category": { + "name": { + "animal-protection": "Proteção Animal", + "art-culture-sport": "Arte, Cultura e Esporte", + "consumption-sustainability": "Consumo e Sustentabilidade", + "cooperation-development": "Cooperação e Desenvolvimento", + "democracy-politics": "Democracia e Política", + "economy-finances": "Economia e Finanças", + "education-sciences": "Educação e Ciências", + "energy-technology": "Energia e tecnologia", + "environment-nature": "Meio Ambiente e Natureza", + "freedom-of-speech": "Liberdade de expressão", + "global-peace-nonviolence": "Paz Mundial e Não-Violência", + "happiness-values": "Felicidade e Valores", + "health-wellbeing": "Saúde e Bem-estar", + "human-rights-justice": "Direitos Humanos e Justiça", + "it-internet-data-privacy": "TI, Internet e Privacidade de Dados", + "just-for-fun": "Só por diversão" + } + }, + "emotions-label": { + "angry": "Irritado", + "cry": "Chorando", + "funny": "Engraçado", + "happy": "Feliz", + "surprised": "Surpreso" + }, + "filterALL": "Ver todas as contribuições", + "filterFollow": "Filtrar contribuições de usuários que eu sigo", + "languageSelectLabel": "Idioma", + "languageSelectText": "Selecionar Idioma", + "newPost": "Criar uma nova publicação", + "success": "Salvo!", + "teaserImage": { + "cropperConfirm": "Confirmar", + "supportedFormats": "Insira uma imagem do formato JPG, PNG ou GIF!" + }, + "title": "Título" + }, + "delete": { + "cancel": "Cancelar", + "comment": { + "message": "Você realmente deseja excluir o comentário \"{name}\"?", + "success": "Comentário excluído com sucesso!", + "title": "Excluir Comentário", + "type": "Comentário" + }, + "contribution": { + "message": "Você realmente deseja excluir a publicação \"{name}\"?", + "success": "Publicação excluída com êxito!", + "title": "Excluir publicação", + "type": "Contribuição" + }, + "submit": "Excluir" + }, + "disable": { + "cancel": "Cancelar", + "comment": { + "message": "Você realmente deseja desativar o comentário de \" {name} \"?", + "title": "Desativar comentário", + "type": "Comentário" + }, + "contribution": { + "message": "Você realmente deseja desativar a contribuição \" {name} \"?", + "title": "Desativar Contribuição", + "type": "Contribuição" + }, + "submit": "Desativar", + "success": "Desativado com sucesso!", + "user": { + "message": "Você realmente deseja desativar o usuário \" {name} \"?", + "title": "Desativar usuário", + "type": "Usuário" + } + }, + "donations": { + "amount-of-total": "{amount} dos {total} € foram coletados", + "donate-now": "Doe agora" + }, + "editor": { + "embed": { + "always_allow": "Sempre permita conteúdo incorporado por provedores de terceiros (esta configuração pode ser alterada a qualquer momento)", + "data_privacy_info": "Seus dados ainda não foram compartilhados com terceiros. Se continuar assistindo este vídeo, o seguinte fornecedor irá provavelmente recolher dados do utilizador:", + "data_privacy_warning": "Aviso de Privacidade de Dados!", + "play_now": "Assista agora" + }, + "hashtag": { + "addHashtag": "Nova hashtag", + "addLetter": "Digite uma letra", + "noHashtagsFound": "Nenhuma hashtag encontrada" + }, + "mention": { + "noUsersFound": "Nenhum usuário encontrado" + }, + "placeholder": " Escreva algo inspirador…" + }, + "filter-menu": { + "all": "Todos", + "categories": "Categorias de Conteúdo", + "emotions": "Emoções", + "filter-by": "Filtrar por ...", + "following": "Usuários que eu sigo", + "languages": "Idiomas", + "order": { + "newest": { + "hint": null, + "label": "Mais recentes" + }, + "oldest": { + "hint": null, + "label": "Mais antigos" + } + } + }, + "followButton": { + "follow": "Seguir", + "following": "Seguindo" + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "hashtags-filter": { + "clearSearch": "Limpar pesquisa", + "hashtag-search": "Procurando por #{hashtag}", + "title": "Sua bolha de filtro" + }, + "index": { + "change-filter-settings": "Altere suas configurações de filtro para obter mais resultados.", + "no-results": "Nenhuma contribuição encontrada." + }, + "login": { + "email": "Seu email", + "failure": "Endereço de e-mail ou senha incorretos.", + "forgotPassword": "Esqueceu a sua senha?", + "hello": "Olá", + "login": "Entrar", + "logout": "Sair", + "moreInfo": "O que é a {APPLICATION_NAME}?", + "moreInfoHint": "para a página de apresentação", + "no-account": "Ainda não tem uma conta?", + "password": "Sua senha", + "register": "Cadastrar-se", + "success": "Você está conectado!" + }, + "maintenance": { + "explanation": "No momento estamos em manutenção, por favor tente novamente mais tarde.", + "questions": "Qualquer dúvida, envie um e-mail para", + "title": "{APPLICATION_NAME} está em manutenção" + }, + "moderation": { + "name": "Moderação", + "reports": { + "disabledBy": "desativado por", + "empty": "Parabéns, nada a moderar.", + "name": "Denúncias", + "reasonCategory": "Categoria", + "reasonDescription": "Descrição", + "submitter": "denunciado por" + } + }, + "notifications": { + "comment": "Comentário", + "content": "Conteúdo", + "empty": "Desculpe, não tem nenhuma notificação neste momento.", + "filterLabel": { + "all": "Todos", + "read": "Lido", + "unread": "Não lido" + }, + "markAllAsRead": "Marcar todas como lidas", + "pageLink": "Todas as notificações", + "post": "Post", + "reason": { + "commented_on_post": "Comentou no seu post …", + "mentioned_in_comment": "Mentionou você em um comentário …", + "mentioned_in_post": "Mencinou você em um post …" + }, + "title": "Notificações", + "user": "Usuário" + }, + "post": { + "comment": { + "submit": "Commentar", + "submitted": "Comentário Enviado", + "updated": "Alterações salvas" + }, + "edited": "editado", + "menu": { + "delete": "Excluir publicação", + "edit": "Editar publicação", + "pin": "Fixar publicação", + "pinnedSuccessfully": "Publicação fixada com sucesso!", + "unpin": "Desafixar publicação", + "unpinnedSuccessfully": "Publicação desafixada com sucesso!" + }, + "name": "Postar", + "pinned": "Anúncio", + "takeAction": { + "name": "Tomar uma ação" + } + }, + "profile": { + "avatar": { + "submitted": "Carregado com sucesso!" + }, + "commented": "Comentou", + "follow": "Seguir", + "followers": "Seguidores", + "following": "Seguindo", + "invites": { + "description": "Digite o endereço de e-mail para o convite.", + "emailPlaceholder": "E-mail para convidar", + "title": "Convidar alguém para {APPLICATION_NAME}!" + }, + "memberSince": "Membro desde", + "name": "Meu perfil", + "network": { + "andMore": "e {number} mais …", + "followedBy": "é seguido por:", + "followedByNobody": "não é seguido por ninguém.", + "following": "está seguindo:", + "followingNobody": "não segue ninguém.", + "title": "Rede" + }, + "shouted": "Aclamou", + "socialMedia": "Onde mais posso encontrar", + "userAnonym": "Anonymous" + }, + "quotes": { + "african": { + "author": "Provérbio africano", + "quote": "Muitas pessoas pequenas, em muitos lugares pequenos, fazem muitas coisas pequenas, que podem mudar a face do mundo." + } + }, + "release": { + "cancel": "Cancelar", + "comment": { + "error": "Você já denunciou o comentário!", + "message": "Você realmente quer liberar o comentário de \"{name}\"?", + "title": "Liberar Comentário ", + "type": "Comentário" + }, + "contribution": { + "error": "Você já denunciou a contribuição!", + "message": "Você realmente quer liberar a contribuição \"{name}\"?", + "title": "Liberar contribuição ", + "type": "Contribuição" + }, + "submit": "Liberar", + "success": "Liberado com sucesso!", + "user": { + "error": "Você já denunciou o usuário!", + "message": "Você realmente quer liberar o usuário \"{name}\"?", + "title": "Liberar usuário", + "type": "Usuário" + } + }, + "report": { + "cancel": "Cancelar", + "comment": { + "error": "Você já denunciou o comentário!", + "message": "Você realmente deseja denunciar o comentário de \"{name}\"?", + "title": "Denunciar Comentário", + "type": "Comentário" + }, + "contribution": { + "error": "Você já denunciou a contribuição!", + "message": "Você realmente deseja denunciar a contribuição \" {name} \"?", + "title": "Denunciar Contribuição", + "type": "Contribuição" + }, + "reason": { + "category": { + "invalid": "Selecione uma categoria válida", + "label": "Selecione uma categoria:", + "options": { + "advert_products_services_commercial": "Publicidade de produtos e serviços com intenção comercial.", + "criminal_behavior_violation_german_law": "Comportamento criminoso ou violação da lei alemã.", + "discrimination_etc": "Mensagens, comentários, afirmações ou insultos discriminatórios.", + "doxing": "A divulgação de informações pessoais de terceiros sem o seu consentimento ou ameaça de (\"doxing\").", + "glorific_trivia_of_cruel_inhuman_acts": "Glorificação ou banalização de atos de violência cruel ou desumana.", + "intentional_intimidation_stalking_persecution": "Intimidação intencional, assédio ou perseguição.", + "other": "Outros …", + "pornographic_content_links": "Publicação ou vinculação de material claramente pornográfico." + }, + "placeholder": "Categoria …" + }, + "description": { + "label": "Por favor, explique: Por que você gostaria de denunciar isso?", + "placeholder": "Informações adicionais …" + } + }, + "submit": "Enviar denúncia", + "success": "Obrigado por denunciar!", + "user": { + "error": "Você já denunciou o usuário!", + "message": "Você realmente deseja denunciar o usuário \" {name} \"?", + "title": "Denunciar usuário", + "type": "Usuário" + } + }, + "search": { + "failed": "Nada encontrado", + "hint": "O que você está buscando? Use !... para postagens, @... para usuários, #... para hashtags.", + "placeholder": "Buscar" + }, + "settings": { + "blocked-users": { + "block": "Bloquear usuário", + "columns": { + "name": "Nome", + "slug": "Slug", + "unblock": "Desbloquear" + }, + "empty": "Até agora, você não bloqueou ninguém.", + "explanation": { + "closing": "Isso deve ser suficiente por enquanto para que os usuários bloqueados não possam mais incomodá-lo.", + "intro": "Se outro usuário foi bloqueado por você, isto é o que acontece:", + "notifications": "Usuários bloqueados não receberão mais notificações se forem mencionados em suas mensagens.", + "their-perspective": "Vice versa: A pessoa bloqueada também não verá mais suas mensagens em seu feed de notícias.", + "your-perspective": "As mensagens da pessoa bloqueada não aparecerão mais no seu feed de notícias." + }, + "how-to": "Você pode bloquear outros usuários em suas páginas de perfil através do menu de conteúdo.", + "name": "Usuários bloqueados", + "unblock": "Desbloquear usuário", + "unblocked": "{name} está desbloqueado novamente" + }, + "data": { + "labelBio": "Sobre você", + "labelCity": "Sua cidade ou estado", + "labelName": "Seu nome", + "labelSlug": "Seu nome de usuário exclusivo", + "name": "Seus dados", + "namePlaceholder": "Anonymous", + "success": "Seus dados foram atualizados com sucesso!" + }, + "deleteUserAccount": { + "accountDescription": "Esteja ciente de que o suas Publicações e Comentários são importantes para a nossa comunidade. Se você ainda optar por excluí-los, você tem que marcá-los abaixo.", + "accountWarning": "Você NÃO PODE GERENCIAR e NÃO PODE RECUPERAR sua conta, Publicações, ou Comentários após excluir sua conta!", + "commentedCount": "Deletar meus {count} comentários", + "contributionsCount": "Deletar minhas {count} publicações", + "name": "Deletar dados", + "pleaseConfirm": "Ação destrutiva! Digitar “{confirm}” para confirmar.", + "success": "Conta eliminada com sucesso!" + }, + "download": { + "name": "Baixar dados" + }, + "email": { + "change-successful": "O seu endereço de e-mail foi alterado com sucesso.", + "labelEmail": "Alterar o seu endereço de e-mail", + "labelNewEmail": "Novo endereço de e-mail", + "labelNonce": "Digite o seu código", + "name": "Seu email", + "submitted": "Um e-mail para verificar o seu endereço foi enviado para {email}.", + "success": "Um novo endereço de e-mail foi registrado.", + "validation": { + "same-email": "Este é o seu endereço de e-mail atual" + }, + "verification-error": { + "explanation": "Isto pode ter diferentes causas:", + "message": "O seu e-mail não pode ser alterado.", + "reason": { + "invalid-nonce": "O código de confirmação esta inválido?", + "no-email-request": "Você tem certeza de que solicitou uma alteração no seu endereço de e-mail?" + }, + "support": "Se o problema persistir, por favor contacte-nos por e-mail" + } + }, + "embeds": { + "info-description": "Se você concordar, as publicações da seguinte lista de provedores incluirão automaticamente código de terceiros de outros provedores (terceiros) na forma de vídeos, imagens ou texto incorporados.", + "name": "Fornecedores de terceiros", + "status": { + "change": { + "allow": "Certeza", + "deny": "Não, obrigado", + "question": "O código-fonte incorporado de terceiros deve sempre ser exibido para você?" + }, + "description": "Como padrão para você, o código incorporado de provedores de terceiros é", + "disabled": { + "off": "não exibido inicialmente", + "on": "exibido imediatamente" + } + } + }, + "invites": { + "name": "Convites" + }, + "languages": { + "name": "Idiomas" + }, + "name": "Configurações", + "organizations": { + "name": "Minhas Organizações" + }, + "privacy": { + "make-shouts-public": "Compartilhar postagens que eu recomendei no meu perfil público", + "name": "Privacidade", + "success-update": "Configurações de privacidade salvas" + }, + "security": { + "change-password": { + "button": "Modificar senha", + "label-new-password": "Sua nova senha", + "label-new-password-confirm": "Confirme sua nova senha", + "label-old-password": "Sua senha antiga", + "message-new-password-confirm-required": "Confirme sua nova senha", + "message-new-password-missmatch": "Digite a mesma senha novamente", + "message-new-password-required": "Digite uma nova senha", + "message-old-password-required": "Digite sua senha antiga", + "passwordSecurity": "Segurança da senha", + "passwordStrength0": "Senha muito insegura", + "passwordStrength1": "Senha insegura", + "passwordStrength2": "Senha medíocre", + "passwordStrength3": "Senha forte", + "passwordStrength4": "Senha muito forte", + "success": "Senha modificada com sucesso!" + }, + "name": "Segurança" + }, + "social-media": { + "name": "Mídias sociais", + "placeholder": "Sua url de mídia social", + "requireUnique": "Você já adicionou esta url", + "submit": "Adicionar link", + "successAdd": "Mídias sociais adicionadas. Perfil de usuário atualizado!", + "successDelete": "Mídias sociais removidas. Perfil de usuário atualizado!" + }, + "validation": { + "slug": { + "alreadyTaken": "Este nome de usuário já está registrado.", + "regex": "Os caracteres permitidos são apenas letras minúsculas, números, sublinhados e hífens." + } + } + }, + "shoutButton": { + "shouted": "aclamou" + }, + "site": { + "back-to-login": "Voltar para o Login", + "bank": "conta bancária", + "code-of-conduct": "Codigo de Conduto", + "contact": "Contato", + "data-privacy": "Proteção de Dados", + "director": "Diretor Administrativo", + "error-occurred": "Ocorreu um erro.", + "faq": "FAQ", + "germany": "Alemanha", + "imprint": "Impressão", + "made": "Feito com ❤️", + "register": "número de registo", + "responsible": "Responsável segundo § 55 Abs. 2 RStV (Alemanha) ", + "taxident": "Número de identificação do imposto sobre o valor acrescentado de acordo com o § 27 da Lei do Imposto sobre o Valor Acrescentado (Alemanha)", + "termsAndConditions": "Termos e Condições", + "thanks": "Obrigado(a)!", + "tribunal": "tribunal de registo" + }, + "termsAndConditions": { + "newTermsAndConditions": "Novos Termos e Condições", + "termsAndConditionsNewConfirm": "Eu li e concordo com os novos termos de condições.", + "termsAndConditionsNewConfirmText": "Por favor, leia os novos termos de uso agora!" + } +} diff --git a/docs/webapp/locales/ru.json b/docs/webapp/locales/ru.json new file mode 100644 index 000000000..4ae664cd8 --- /dev/null +++ b/docs/webapp/locales/ru.json @@ -0,0 +1,748 @@ +{ + "actions": { + "cancel": "Отменить", + "create": "Создать", + "delete": "Удалить", + "edit": "Редактировать", + "loading": "загрузка", + "loadMore": "Загрузить ещё", + "save": "Сохранить" + }, + "admin": { + "categories": { + "categoryName": "Имя", + "name": "Категории", + "postCount": "Посты" + }, + "dashboard": { + "comments": "Комментарии", + "follows": "Подписки", + "invites": "Приглашения", + "name": "Панель управления", + "notifications": "Уведомления", + "organizations": "Организации", + "posts": "Посты", + "projects": "Проекты", + "shouts": "Выкрики", + "users": "Пользователи" + }, + "donations": { + "goal": "Необходимы ежемесячные пожертвования", + "name": "Информация о пожертвованиях", + "progress": "Пожертвования собраны", + "successfulUpdate": "Информация о пожертвованиях успешно обновлена!" + }, + "hashtags": { + "name": "Хэштеги", + "nameOfHashtag": "Имя", + "number": "№", + "tagCount": "Посты", + "tagCountUnique": "Пользователи" + }, + "invites": { + "description": "Приглашения — это замечательный способ завести друзей в своей сети ...", + "name": "Пригласить пользователей", + "title": "Пригласить людей" + }, + "name": "Администрирование", + "notifications": { + "name": "Уведомления" + }, + "organizations": { + "name": "Организации" + }, + "pages": { + "name": "Страницы" + }, + "settings": { + "name": "Настройки" + }, + "users": { + "empty": "Пользователи не найдены", + "form": { + "placeholder": "Электронная почта, имя или описание" + }, + "name": "Пользователи", + "table": { + "columns": { + "createdAt": "Дата создания", + "email": "Эл. почта", + "name": "Имя", + "number": "№", + "role": "Роль", + "slug": "Алиас" + } + } + } + }, + "code-of-conduct": { + "subheader": "социальной сети {ORGANIZATION_NAME}" + }, + "comment": { + "content": { + "unavailable-placeholder": "...этот комментарий больше не доступен" + }, + "edited": "Изменен", + "menu": { + "delete": "Удалить комментарий", + "edit": "Редактировать комментарий" + }, + "show": { + "less": "показать меньше", + "more": "показать больше" + } + }, + "common": { + "category": "Категория ::: Категории ::: Категории", + "comment": "Комментарий::: Комментарии::: Комментарии", + "letsTalk": "Давай поговорим", + "loading": "загрузка", + "loadMore": "Загрузить ещё", + "name": "Имя", + "organization": "Организация ::: Организации ::: Организации", + "post": "Пост ::: Посты ::: Посты", + "project": "Проект ::: Проекты ::: Проекты", + "reportContent": "Отчет", + "shout": "Выкрик ::: Выкрики ::: Выкрики", + "tag": "Тег ::: Теги ::: Теги", + "takeAction": "Принять меры", + "user": "Пользователь ::: Пользователи ::: Пользователи", + "validations": { + "categories": "Выберите от одной то трех категорий", + "email": "должен быть корректный адрес электронной почты", + "url": "должен быть корректный URL" + }, + "versus": "Против" + }, + "components": { + "password-reset": { + "change-password": { + "error": "Смена пароля не удалась. Может быть, код безопасности был неправильным?", + "help": "В случае возникновения проблем, не стесняйся обращаться за помощью, отправив нам письмо по адресу:", + "success": "Смена пароля прошла успешно!" + }, + "request": { + "form": { + "description": "На указанный адрес электронной почты будет отправлено сообщение с инструкциями для сброса пароля.", + "submit": "Отправить запрос", + "submitted": "На адрес {email}было отправлено электронное письмо с дальнейшими инструкциями" + }, + "title": "Сбросить пароль" + } + }, + "registration": { + "create-user-account": { + "error": "Не удалось создать учетную запись!", + "help": "Может быть, подтверждение было недействительным? В случае возникновения проблем, не стесняйтесь обращаться за помощью, отправив нам письмо по электронной почте:", + "success": "Учетная запись успешно создана!", + "title": "Создать учетную запись" + }, + "email-nonce": { + "form": { + "description": "Откройте папку \\\"Входящие\\\" и введите код из сообщения.", + "next": "Продолжить", + "nonce": "Введите код", + "validations": { + "length": "длина должна быть {nonceLength} символов" + } + } + }, + "signup": { + "form": { + "data-privacy": "Я прочитал и понял Заявление о конфиденциальности", + "description": "Для начала работы введите свой адрес электронной почты:", + "errors": { + "email-exists": "Уже есть учетная запись пользователя с этим адресом электронной почты!" + }, + "submit": "Создать учетную запись", + "success": "Письмо со ссылкой для завершения регистрации было отправлено на {email} ", + "terms-and-condition": "Принимаю Условия и положения." + }, + "title": "Присоединяйся к {APPLICATION_NAME}!", + "unavailable": "К сожалению, публичная регистрация пользователей на этом сервере сейчас недоступна." + } + } + }, + "contribution": { + "categories": { + "infoSelectedNoOfMaxCategories": "Выбрано {chosen} из {max} категорий" + }, + "category": { + "name": { + "animal-protection": "Защита животных", + "art-culture-sport": "Искусство, культура и спорт", + "consumption-sustainability": "Потребление и стабильность", + "cooperation-development": "Сотрудничество и развитие", + "democracy-politics": "Демократия и политика", + "economy-finances": "Экономика и финансы", + "education-sciences": "Образование и наука", + "energy-technology": "Энергия и технологии", + "environment-nature": "Окружающая среда и природа", + "freedom-of-speech": "Свобода слова", + "global-peace-nonviolence": "Глобальный мир и борьба с насилием", + "happiness-values": "Счастье и ценности", + "health-wellbeing": "Здоровье и благополучие", + "human-rights-justice": "Права человека и справедливость", + "it-internet-data-privacy": "ИТ, интернет и конфиденциальность", + "just-for-fun": "Просто для удовольствия" + } + }, + "emotions-label": { + "angry": "Возмутительно", + "cry": "Плачу", + "funny": "Смешно", + "happy": "Счастлив", + "surprised": "Удивлен" + }, + "filterALL": "Просмотреть все посты", + "filterFollow": "Показать сообщения пользователей, на которых я подписан", + "inappropriatePicture": "Эта картинка может быть неуместным для некоторых людей.", + "languageSelectLabel": "Язык", + "languageSelectText": "Выберите язык", + "newPost": "Создать пост", + "success": "Сохранено!", + "teaserImage": { + "cropperConfirm": "Подтвердить", + "supportedFormats": "Вставьте изображение файла формата JPG, PNG или GIF!" + }, + "title": "Заголовок" + }, + "delete": { + "cancel": "Отменить", + "comment": { + "message": "Вы уверены, что хотите удалить комментарий \"{name}\"?", + "success": "Комментарий успешно удален!", + "title": "Удалить комментарий", + "type": "Комментарий" + }, + "contribution": { + "message": "Вы уверены, что хотите удалить пост \"{name}\"?", + "success": "Пост успешно удален!", + "title": "Удалить пост", + "type": "Пост" + }, + "submit": "Удалить" + }, + "disable": { + "cancel": "Отменить", + "comment": { + "message": "Вы действительно хотите отключить комментарий от «{name}»?", + "title": "Отключить комментарий", + "type": "Комментарий" + }, + "contribution": { + "message": "Вы действительно хотите отключить пост «{name}»?", + "title": "Отключить пост", + "type": "Пост" + }, + "submit": "Отключить", + "success": "Успешно отключен", + "user": { + "message": "Вы действительно хотите отключить пользователя «{name}»?", + "title": "Отключить пользователя", + "type": "Пользователь" + } + }, + "donations": { + "amount-of-total": "{amount} из {total} € собрано", + "donate-now": "Пожертвуйте сейчас" + }, + "editor": { + "embed": { + "always_allow": "Всегда отображать содержимое сторонних производителей (эту настройку можно изменить в любое время).", + "data_privacy_info": "Ваши данные еще не были переданы третьим лицам. Если вы воспроизведёте это видео, следующий провайдер, вероятно, зарегистрирует ваши данные пользователя:", + "data_privacy_warning": "Предупреждение о конфиденциальности данных!", + "play_now": "Смотреть сейчас" + }, + "hashtag": { + "addHashtag": "Новый хэштег", + "addLetter": "Введите букву", + "noHashtagsFound": "Хэштеги не найдены" + }, + "legend": { + "bold": "Полужирный", + "heading3": "Заголовок 3", + "heading4": "Заголовок 4", + "italic": "Курсив", + "legendTitle": "Клавиатурные сокращения и код разметки", + "link": "Ссылка", + "orderedList": "Нумерованный список", + "paragraph": "Параграф", + "quote": "Кавычки", + "ruler": "Горизонтальная линия", + "underline": "Подчеркнутый", + "unorderedList": "Маркированный список" + }, + "mention": { + "noUsersFound": "Пользователи не найдены" + }, + "placeholder": "Поделитесь своими вдохновляющими мыслями ..." + }, + "error-pages": { + "403-default": "Не авторизован на этой странице", + "404-default": "Эту страницу не удалось найти", + "500-default": "Внутренняя Ошибка Сервера", + "503-default": "Сервис недоступен", + "back-to-index": "Обратно в индекс страницы", + "cannot-edit-post": "Этот пост нельзя редактировать", + "default": "Произошла ошибка.", + "post-not-found": "Этот пост не удалось найти", + "profile-not-found": "Этот профиль не удалось найти" + }, + "filter-menu": { + "all": "Все", + "categories": "Категории", + "emotions": "", + "filter-by": "Другие фильтры ...", + "following": "Мои подписки", + "languages": "Языки", + "order": { + "newest": { + "hint": null, + "label": "Сначала новые" + }, + "oldest": { + "hint": null, + "label": "Сначала старые" + } + } + }, + "followButton": { + "follow": "Подписаться", + "following": "Вы подписаны" + }, + "group": { + "foundation": null, + "goal": null, + "joinLeaveButton": { + "iAmMember": null, + "join": null, + "pendingMember": null + }, + "membersCount": null, + "membersListTitle": null + }, + "hashtags-filter": { + "clearSearch": "Очистить поиск", + "hashtag-search": "Поиск по #{hashtag}", + "title": "Ваш фильтр пузыря" + }, + "index": { + "change-filter-settings": "Измените настройки фильтра, чтобы получить больше результатов.", + "no-results": "Посты не найдены." + }, + "login": { + "email": "Электронная почта", + "failure": "Неверный адрес электронной почты или пароль.", + "forgotPassword": "Забыли пароль?", + "hello": "Здравствуйте", + "login": "Вход", + "logout": "Выйти", + "moreInfo": "Что такое {APPLICATION_NAME}?", + "moreInfoHint": "на страницу проекта", + "no-account": "У вас нет аккаунта?", + "password": "Пароль", + "register": "Зарегистрируйтесь", + "success": "Вы вошли в систему!" + }, + "maintenance": { + "explanation": "В данный момент мы проводим плановое техническое обслуживание, пожалуйста, повторите попытку позже.", + "questions": "Любые вопросы или сообщения о проблемах отправляйте на электронную почту", + "title": "{APPLICATION_NAME} на техническом обслуживании" + }, + "moderation": { + "name": "Модерация", + "reports": { + "author": "Автор", + "content": "Содержа́ние", + "decideButton": "Подтвердить", + "decided": "Решил", + "decideModal": { + "cancel": "Отменить", + "Comment": { + "disable": { + "message": "Вы действительно хотите, оставить комментарий \"{name}\" отключеным?", + "title": "Окончательно отключить комментарий" + }, + "enable": { + "message": "Вы действительно хотите, чтобы комментарий \"{name}\" остановиться и включен?", + "title": "Окончательно включить комментарий" + } + }, + "Post": { + "disable": { + "message": "Вы действительно хотите, чтобы пост \"{name}\" остановиться и отключен?", + "title": "Окончательно отключить пост" + }, + "enable": { + "message": "Вы действительно хотите, чтобы пост \"{name}\" остановиться и включен?", + "title": "Окончательно включить пост" + } + }, + "submit": "Подтвердить решение", + "User": { + "disable": { + "message": "Вы действительно хотите, чтобы пользователь \"{name}\" остановиться и отключен?", + "title": "Окончательно отключить пользователя" + }, + "enable": { + "message": "Вы уверены, что хотите поделиться пользователем \"{name}\"?", + "title": "Окончательно включить пост" + } + } + }, + "decision": "Решение", + "DecisionSuccess": "Решил успешно!", + "disabled": "Отключен", + "disabledAt": "Отключено на", + "disabledBy": "Отключил(а)", + "empty": "Поздравляю, модерировать нечего.", + "enabled": "Включен", + "enabledAt": "Включено на", + "enabledBy": "Включено с", + "filterLabel": { + "all": "Все", + "closed": "Закрыто", + "reviewed": "Рассмотренный", + "unreviewed": "Нерассмотренный" + }, + "moreDetails": "Посмотреть подробности", + "name": "Отчеты", + "noDecision": "Нет решения!", + "numberOfUsers": "{count} пользователи", + "previousDecision": "Предыдущее решение:", + "reasonCategory": "Категория", + "reasonDescription": "Описание", + "reportedOn": "Дата", + "status": "Текущее состояние", + "submitter": "Сообщил(а)" + } + }, + "notifications": { + "comment": "Комментарий", + "content": "Контент", + "empty": "Извините, на данный момент у вас нет уведомлений.", + "filterLabel": { + "all": "Все", + "read": "Прочитанные", + "unread": "Непрочитанные" + }, + "markAllAsRead": "Отметить все как прочитанное", + "pageLink": "Все уведомления", + "post": "Пост", + "reason": { + "commented_on_post": "Комментарий к посту...", + "mentioned_in_comment": "Упоминание в комментарии....", + "mentioned_in_post": "Упоминание в посте...." + }, + "title": "Уведомления", + "user": "Пользователь" + }, + "post": { + "comment": { + "reply": "Ответ", + "submit": "Комментировать", + "submitted": "Комментарий отправлен", + "updated": "Изменения сохраненные" + }, + "edited": "Изменен", + "menu": { + "delete": "Удалить пост", + "edit": "Редактировать пост", + "pin": "Закрепить пост", + "pinnedSuccessfully": "Пост больше не закреплен!", + "unpin": "Открепить пост", + "unpinnedSuccessfully": "Пост успешно не закреплено!" + }, + "name": "Пост", + "pinned": "Объявление", + "takeAction": { + "name": "Действовать" + } + }, + "profile": { + "avatar": { + "submitted": "Успешная загрузка!" + }, + "commented": "Прокомментированные", + "follow": "Подписаться", + "followers": "Подписчики", + "following": "Подписки", + "invites": { + "description": "Введите адрес электронной почты для приглашения.", + "emailPlaceholder": "Электронная почта для приглашения", + "title": "Пригласите кого-нибудь в {APPLICATION_NAME}!" + }, + "memberSince": "Участник с", + "name": "Мой профиль", + "network": { + "andMore": "и ещё {number} человек... ::: и ещё {number} человека... ::: и ещё {number} человек...", + "followedBy": "ваши подписчики:", + "followedByNobody": "у вас нет подписчиков.", + "following": "подписан на:", + "followingNobody": "ни на кого не подписан.", + "title": "Сеть" + }, + "shouted": "С выкриками", + "socialMedia": "Где еще я могу найти", + "userAnonym": "Анонимный" + }, + "quotes": { + "african": { + "author": "Африканская пословица", + "quote": "Много маленьких людей делают много маленьких вещей во многих маленьких местах, что может изменить мир до неузнаваемости." + } + }, + "release": { + "cancel": "Отменить", + "comment": { + "error": "Вы уже сообщили о комментарии!", + "message": "Вы уверены, что хотите показать комментарий \"{name}\"?", + "title": "Показать комментарий", + "type": "Комментарий" + }, + "contribution": { + "error": "Вы уже сообщили о посте!", + "message": "Вы уверены, что хотите показать пост \"{name}\"?", + "title": "Показать пост", + "type": "Пост" + }, + "submit": "Показать", + "success": "Успешно показан!", + "user": { + "error": "Вы уже сообщили о пользователе!", + "message": "Вы уверены, что хотите показать пользователя \"{name}\"?", + "title": "Показать пользователя", + "type": "Пользователь" + } + }, + "report": { + "cancel": "Отменить", + "comment": { + "error": "Вы уже сообщили о посте!", + "message": "Вы действительно хотите сообщить о посте \" {name} \"?", + "title": "Пожаловаться на комментарий", + "type": "Комментарий" + }, + "contribution": { + "error": "Вы уже сообщили о посте!", + "message": "Вы действительно хотите сообщить о посте \"{name}\"?", + "title": "Пожаловаться на пост", + "type": "Пожаловаться на пост" + }, + "reason": { + "category": { + "invalid": "Пожалуйста, выберите подходящую категорию", + "label": "Выберите категорию:", + "options": { + "advert_products_services_commercial": "Реклама продуктов и услуг с коммерческим намерением.", + "criminal_behavior_violation_german_law": "Уголовное поведение или нарушении немецкого права.", + "discrimination_etc": "Дискриминационные посты, комментарии, заявления или оскорбления.", + "doxing": "Публикация персональных данных других лиц без их согласия или угроза публикации (\"Доксинг\").", + "glorific_trivia_of_cruel_inhuman_acts": "Прославление или умаление жестоких, или бесчеловечных актов насилия.", + "intentional_intimidation_stalking_persecution": "Преднамеренное запугивание или преследование.", + "other": "Другое ...", + "pornographic_content_links": "Публикация или ссылка на явно порнографический материал." + }, + "placeholder": "Категория ..." + }, + "description": { + "label": "Пожалуйста, объясните, почему хотите об этом сообщить?", + "placeholder": "Дополнительная информация ..." + } + }, + "submit": "Отправить", + "success": "Спасибо за сообщение!", + "user": { + "error": "Вы уже сообщили о пользователе!", + "message": "Вы действительно хотите сообщить о пользователе \"{name}\"?", + "title": "Пожаловаться на пользователя", + "type": "Пользователь" + } + }, + "search": { + "failed": "Ничего не найдено", + "heading": { + "Post": "Посты", + "User": "Пользователи" + }, + "hint": "Что вы хотите найти? Используйте !... для постов, @... для пользователей, #... для хэштегов.", + "placeholder": "Поиск" + }, + "settings": { + "blocked-users": { + "block": "Блокировать", + "columns": { + "name": "Имя", + "slug": "Алиас", + "unblock": "Разблокировать" + }, + "empty": "Вы пока никого не блокировали.", + "explanation": { + "closing": "На данный момент этого должно быть достаточно, чтобы заблокированные пользователи больше вас не беспокоили.", + "commenting-disabled": "Комментировать этот пост на данный момент невозможно.", + "commenting-explanation": "Это может произойти по нескольким причинам, пожалуйста, смотрите наш", + "intro": "Если блокируете другого пользователя, происходит следующее:", + "notifications": "Заблокированные пользователи больше не будут получать уведомления об упоминаниях в ваших постах.", + "their-perspective": "И наоборот — заблокированный пользователь больше не видит ваши посты в своей ленте.", + "your-perspective": "Посты заблокированного пользователя не отображаются в персональной ленте." + }, + "how-to": "Вы можете блокировать других пользователей на странице их профиля с помощью меню профиля.", + "name": "Заблокированные пользователи", + "unblock": "Разблокировать пользователей", + "unblocked": "{name} - снова разблокирован" + }, + "data": { + "labelBio": "О себе", + "labelCity": "Город или регион", + "labelName": "Имя", + "labelSlug": "Уникальное имя пользователя", + "name": "Персональные данные", + "namePlaceholder": "Маша Медведева", + "success": "Персональные данные были успешно обновлены!" + }, + "deleteUserAccount": { + "accountDescription": "Обратите внимание, что ваши посты и комментарии важны для сообщества. Если вы все равно хотите их удалить, то вы должны отметить соответствующие опции ниже.", + "accountWarning": "Вы НЕ СМОЖЕТЕ восстановить свой аккаунт, посты или комментарии после удаления.", + "commentedCount": "Удалить мои комментарии: {count}", + "contributionsCount": "Удалить мои посты: {count}", + "name": "Удалить данные", + "pleaseConfirm": "Разрушительное действие! Введите {confirm} для подтверждения.", + "success": "Аккаунт успешно удален!" + }, + "download": { + "name": "Скачать данные" + }, + "email": { + "change-successful": "Адрес электронной почты был успешно изменен.", + "labelEmail": "Адрес электронной почты", + "labelNewEmail": "Новый адрес электронной почты", + "labelNonce": "Введите свой код", + "name": "Электронная почта", + "submitted": "Электронное письмо с подтверждением отправлено на {email}.", + "success": "Новый адрес электронной почты был зарегистрирован.", + "validation": { + "same-email": "Это текущий адрес электронной почты." + }, + "verification-error": { + "explanation": "Причины могут быть разными:", + "message": "Адрес электронной почты не может быть изменен.", + "reason": { + "invalid-nonce": "Правильно ли указан код подтверждения?", + "no-email-request": "Вы уверены, что отправляли запрос на изменение своего адреса электронной почты?" + }, + "support": "Если проблема сохраняется, пожалуйста, свяжитесь с нами по электронной почте" + } + }, + "embeds": { + "info-description": "Вот список сторонних провайдеров, чей контент может отображаться в форме вставок кода, например, в виде встроенных видео:", + "name": "Сторонний контент", + "status": { + "change": { + "allow": "Конечно.", + "deny": "Нет, не надо", + "question": "Вы хотите, чтобы вставки кода сторонних провайдеров всегда отображались?" + }, + "description": "Значение по умолчанию -", + "disabled": { + "off": "сначала не отображать вставки кода сторонних провайдеров", + "on": "сразу отображать вставки кода сторонних провайдеров" + } + } + }, + "invites": { + "name": "Приглашения" + }, + "languages": { + "name": "Языки" + }, + "muted-users": { + "columns": { + "name": "Имя", + "slug": "Алиас", + "unmute": "Включить звук" + }, + "empty": "Вы пока никого не Выключили.", + "explanation": { + "intro": "Если другой пользователь был выключен вами, это то, что происходит:", + "search": "Посты Выключенных пользователей не отображаются в результатах поиска.", + "your-perspective": "Посты выключенного пользователя не отображаются в персональной ленте." + }, + "how-to": "Вы можете выключить звук других пользователей на их странице профиля с помощью меню содержимого.", + "mute": "Выключить звук", + "name": "Выключенные пользователь", + "unmute": "Включить звук пользователя", + "unmuted": "{name} будет снова включен" + }, + "name": "Настройки", + "organizations": { + "name": "Мои организации" + }, + "privacy": { + "make-shouts-public": "Публиковать в моем публичном профиле статьи в которых я участвовал", + "name": "Конфиденциальность", + "success-update": "Настройки приватности сохранены" + }, + "security": { + "change-password": { + "button": "Изменить пароль", + "label-new-password": "Новый пароль", + "label-new-password-confirm": "Подтверждение пароля", + "label-old-password": "Старый пароль", + "message-new-password-confirm-required": "Требуется подтверждение пароля", + "message-new-password-missmatch": "Пароли не совпадают", + "message-new-password-required": "Требуется новый пароль", + "message-old-password-required": "Требуется свой старый пароль", + "passwordSecurity": "Безопасность пароля", + "passwordStrength0": "Очень небезопасный", + "passwordStrength1": "Небезопасный", + "passwordStrength2": "Посредственный", + "passwordStrength3": "Надежный", + "passwordStrength4": "Очень надежный", + "success": "Пароль успешно изменен!" + }, + "name": "Безопасность" + }, + "social-media": { + "name": "Социальные Медиа", + "placeholder": "Ссылка на профиль социальной сети", + "requireUnique": "Ссылка уже существует", + "submit": "Добавить ссылку", + "successAdd": "Добавлены социальные меди. Профиль обновлен!", + "successDelete": "Социальные Меди удалены. Профиль обновлен!" + }, + "validation": { + "slug": { + "alreadyTaken": "Это имя пользователя уже занято.", + "regex": "Допускаются только строчные буквы, цифры, подчеркивания или дефисы." + } + } + }, + "shoutButton": { + "shouted": "выкрикнули" + }, + "site": { + "back-to-login": "Вернуться на страницу входа", + "bank": "банковский счет", + "code-of-conduct": "Кодекс поведения", + "contact": "Контакт", + "data-privacy": "Конфиденциальность", + "director": "Управляющий директор", + "error-occurred": "Произошла ошибка.", + "faq": "ЧаВо (FAQ)", + "germany": "Германия", + "imprint": "Импрессум", + "made": "Сделано с ❤️", + "register": "Регистрационный номер", + "responsible": "ответственный за содержание этой страницы (§ 55 Abs. 2 RStV)", + "taxident": "UST-ID. в соответствии с §27a Закона о налоге с продаж Германии:", + "termsAndConditions": "Условия и положения", + "thanks": "Спасибо!", + "tribunal": "Суд регистрации" + }, + "termsAndConditions": { + "newTermsAndConditions": "Новые условия и положения", + "termsAndConditionsNewConfirm": "Я прочитал(а) и согласен(на) с новыми условиями.", + "termsAndConditionsNewConfirmText": "Пожалуйста, ознакомьтесь с новыми условиями использования!" + } +} diff --git a/docs/webapp/maintenance/README.md b/docs/webapp/maintenance/README.md new file mode 100644 index 000000000..95c09bae8 --- /dev/null +++ b/docs/webapp/maintenance/README.md @@ -0,0 +1,39 @@ +# Maintenance Mode + +The maintenance mode shows a translatable page that tells the user that we are right back, because we are working on the server. + +![Maintenance Mode Screen Shot](../../.gitbook/assets/maintenance-page.png) + +## Running The Maintenance Page Or Service + +At the moment the maintenance mode can only be locally tested with Docker-Compose. + +{% tabs %} +{% tab title="Locally Without Docker" %} + +{% hint style="info" %} +TODO: Implement a locally running maintenance mode! Without Docker … +{% endhint %} + +The command … + +```bash +# running the maintenance mode in webapp/ folder +$ yarn generate:maintenance +``` + +… is unfortunatelly **not(!)** working at the moment. +This is because the code is rewritten to be easy usable for Docker-Compose. Therefore we lost this possibility. + +{% endtab %} +{% tab title="Locally With Docker" %} + +To get the maintenance mode running use the command: + +```bash +# start Docker in the main folder +$ docker-compose up +```` + +And the maintenance mode page or service will be started as well in an own container. +In the browser you can reach it under `http://localhost:3001/`. diff --git a/docs/webapp/maintenance/nginx/custom.conf b/docs/webapp/maintenance/nginx/custom.conf new file mode 100644 index 000000000..c27f272f9 --- /dev/null +++ b/docs/webapp/maintenance/nginx/custom.conf @@ -0,0 +1,19 @@ +server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location ~* \.(?:css|js|map|jpe?g|gif|png|svg|woff|ico)$ { } + + location / { + if (-f $document_root/index.html) { + return 503; + } + } + error_page 503 @maintenance; + location @maintenance { + rewrite ^(.*)$ /index.html break; + } +} diff --git a/docs/webapp/maintenance/source/nuxt.config.maintenance.js b/docs/webapp/maintenance/source/nuxt.config.maintenance.js new file mode 100644 index 000000000..4bbe72fdb --- /dev/null +++ b/docs/webapp/maintenance/source/nuxt.config.maintenance.js @@ -0,0 +1,62 @@ +import defaultConfig from './nuxt.config.js' + +const { css, styleResources, manifest } = defaultConfig + +export default { + css, + styleResources, + manifest, + + head: { + title: manifest.name, + meta: [ + { + charset: 'utf-8', + }, + { + name: 'viewport', + content: 'initial-scale=1', + }, + { + hid: 'description', + name: 'description', + content: `Maintenance page for ${manifest.name}`, + }, + ], + link: [ + { + rel: 'icon', + type: 'image/x-icon', + href: '/favicon.ico', + }, + ], + }, + + plugins: [ + { src: `~/plugins/styleguide.js`, ssr: true }, + { src: '~/plugins/i18n.js', ssr: true }, + { src: '~/plugins/v-tooltip.js', ssr: false }, + ], + + modules: ['cookie-universal-nuxt', '@nuxtjs/style-resources'], + + router: { + extendRoutes(routes, resolve) { + routes.push({ + name: 'maintenance', + path: '*', + component: resolve(__dirname, 'pages/index.vue'), + }) + }, + }, + build: { + extend(config, ctx) { + config.module.rules.push({ + enforce: 'pre', + test: /\.html$/, + loader: 'raw-loader', + exclude: /(node_modules)/, + }) + }, + }, +} diff --git a/docs/webapp/maintenance/source/package.json b/docs/webapp/maintenance/source/package.json new file mode 100644 index 000000000..039765a68 --- /dev/null +++ b/docs/webapp/maintenance/source/package.json @@ -0,0 +1,16 @@ +{ + "name": "@ocelot-social/maintenance", + "version": "3.0.1", + "description": "Maintenance page for ocelot.social", + "repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social", + "author": "ocelot.social Community", + "license": "MIT", + "private": false, + "main": "index.js", + "scripts": { + "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider yarn run nuxt -c nuxt.config.maintenance.js", + "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider yarn run nuxt build -c nuxt.config.maintenance.js", + "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider yarn run nuxt start -c nuxt.config.maintenance.js", + "generate": "cross-env NODE_OPTIONS=--openssl-legacy-provider yarn run nuxt generate -c nuxt.config.maintenance.js" + } +} diff --git a/docs/webapp/maintenance/source/pages/index.vue b/docs/webapp/maintenance/source/pages/index.vue new file mode 100644 index 000000000..c38041ca7 --- /dev/null +++ b/docs/webapp/maintenance/source/pages/index.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/docs/webapp/maintenance/source/store/index.js b/docs/webapp/maintenance/source/store/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/docs/webapp/middleware/authenticated.js b/docs/webapp/middleware/authenticated.js new file mode 100644 index 000000000..1df2d4b11 --- /dev/null +++ b/docs/webapp/middleware/authenticated.js @@ -0,0 +1,27 @@ +import isEmpty from 'lodash/isEmpty' +import links from '~/constants/links.js' + +export default async ({ store, env, route, redirect }) => { + const publicPages = env.publicPages + // only affect non public pages + if (publicPages.indexOf(route.name) >= 0) { + return true + } + + // await store.dispatch('auth/refreshJWT', 'authenticated middleware') + const isAuthenticated = await store.dispatch('auth/check') + if (isAuthenticated === true) { + return true + } + + // try to logout user + // await store.dispatch('auth/logout', null, { root: true }) + + // set the redirect path for after the login + const params = {} + if (!isEmpty(route.path) && route.path !== '/') { + params.path = route.path + } + + return redirect(links.LANDING_PAGE, params) +} diff --git a/docs/webapp/middleware/isAdmin.js b/docs/webapp/middleware/isAdmin.js new file mode 100644 index 000000000..12b6c5bac --- /dev/null +++ b/docs/webapp/middleware/isAdmin.js @@ -0,0 +1,5 @@ +export default ({ store, error }) => { + if (!store.getters['auth/isAdmin']) { + return error({ statusCode: 403, message: 'error-pages.not-authorized' }) + } +} diff --git a/docs/webapp/middleware/isModerator.js b/docs/webapp/middleware/isModerator.js new file mode 100644 index 000000000..9b17badea --- /dev/null +++ b/docs/webapp/middleware/isModerator.js @@ -0,0 +1,5 @@ +export default ({ store, error }) => { + if (!store.getters['auth/isModerator']) { + return error({ statusCode: 403, message: 'error-pages.not-authorized' }) + } +} diff --git a/docs/webapp/middleware/termsAndConditions.js b/docs/webapp/middleware/termsAndConditions.js new file mode 100644 index 000000000..e056bf40a --- /dev/null +++ b/docs/webapp/middleware/termsAndConditions.js @@ -0,0 +1,20 @@ +import isEmpty from 'lodash/isEmpty' + +export default async ({ store, env, route, redirect }) => { + const publicPages = env.publicPages + // only affect non public pages + if (publicPages.indexOf(route.name) >= 0) { + return true + } + + if (route.name === 'terms-and-conditions-confirm') return true // avoid endless loop + + if (store.getters['auth/termsAndConditionsAgreed']) return true + + const params = {} + if (!isEmpty(route.path) && route.path !== '/') { + params.path = route.path + } + + return redirect('/terms-and-conditions-confirm', params) +} diff --git a/docs/webapp/mixins/internalPageMixins.js b/docs/webapp/mixins/internalPageMixins.js new file mode 100644 index 000000000..922d64f95 --- /dev/null +++ b/docs/webapp/mixins/internalPageMixins.js @@ -0,0 +1,23 @@ +import InternalPage from '~/components/_new/features/InternalPage/InternalPage.vue' + +export function internalPageMixins(pageParams) { + return { + layout: 'basic', + components: { + InternalPage, + }, + data() { + return { pageParams } + }, + head() { + return { + title: this.$t(this.pageParams.internalPage.headTitleIdent), + } + }, + created() { + if (!this.pageParams.isInternalPage) { + this.pageParams.redirectToPage(this) + } + }, + } +} diff --git a/docs/webapp/mixins/mobile.js b/docs/webapp/mixins/mobile.js new file mode 100644 index 000000000..c91dadf9b --- /dev/null +++ b/docs/webapp/mixins/mobile.js @@ -0,0 +1,22 @@ +export default (mobileWidth = null) => { + return { + data() { + return { + windowWidth: null, + maxMobileWidth: mobileWidth || 810, // greater counts as desktop + } + }, + computed: { + isMobile() { + if (!this.windowWidth) return false + return this.windowWidth <= this.maxMobileWidth + }, + }, + mounted() { + this.windowWidth = window.innerWidth + window.addEventListener('resize', () => { + this.windowWidth = window.innerWidth + }) + }, + } +} diff --git a/docs/webapp/mixins/persistentLinks.js b/docs/webapp/mixins/persistentLinks.js new file mode 100644 index 000000000..164ccea41 --- /dev/null +++ b/docs/webapp/mixins/persistentLinks.js @@ -0,0 +1,34 @@ +export default function (options = {}) { + const { queryId, querySlug, path, message = 'Page not found.' } = options + return { + asyncData: async (context) => { + const { + params: { id, slug }, + redirect, + error, + app: { apolloProvider }, + } = context + const idOrSlug = id || slug + + if (idOrSlug) { + const variables = { idOrSlug } + const client = apolloProvider.defaultClient + + let response + let resource + response = await client.query({ query: queryId, variables }) + resource = response.data[Object.keys(response.data)[0]][0] + if (resource && resource.slug === slug) return // all good + if (resource && resource.slug !== slug) { + return redirect(`/${path}/${resource.id}/${resource.slug}`) + } + + response = await client.query({ query: querySlug, variables }) + resource = response.data[Object.keys(response.data)[0]][0] + if (resource) return redirect(`/${path}/${resource.id}/${resource.slug}`) + } + + return error({ statusCode: 404, key: message }) + }, + } +} diff --git a/docs/webapp/mixins/postListActions.js b/docs/webapp/mixins/postListActions.js new file mode 100644 index 000000000..57fd28bd1 --- /dev/null +++ b/docs/webapp/mixins/postListActions.js @@ -0,0 +1,39 @@ +import PostMutations from '~/graphql/PostMutations' + +export default { + methods: { + removePostFromList(deletedPost, posts) { + return posts.filter((post) => { + return post.id !== deletedPost.id + }) + }, + pinPost(post, refetchPostList = () => {}) { + this.$apollo + .mutate({ + mutation: PostMutations().pinPost, + variables: { + id: post.id, + }, + }) + .then(() => { + this.$toast.success(this.$t('post.menu.pinnedSuccessfully')) + refetchPostList() + }) + .catch((error) => this.$toast.error(error.message)) + }, + unpinPost(post, refetchPostList = () => {}) { + this.$apollo + .mutate({ + mutation: PostMutations().unpinPost, + variables: { + id: post.id, + }, + }) + .then(() => { + this.$toast.success(this.$t('post.menu.unpinnedSuccessfully')) + refetchPostList() + }) + .catch((error) => this.$toast.error(error.message)) + }, + }, +} diff --git a/docs/webapp/mixins/scrollToAnchor.js b/docs/webapp/mixins/scrollToAnchor.js new file mode 100644 index 000000000..2966c79ed --- /dev/null +++ b/docs/webapp/mixins/scrollToAnchor.js @@ -0,0 +1,23 @@ +function scrollToAnchor(anchor, { checkAnchor, $scrollTo }) { + if (typeof checkAnchor !== 'function') + throw new Error( + 'You must define `checkAnchor` on the component if you use scrollToAnchor mixin!', + ) + if (!checkAnchor(anchor)) return + setTimeout(() => { + $scrollTo(anchor) + }, 250) +} + +export default { + watch: { + $route(to, from) { + const anchor = to && to.hash + scrollToAnchor(anchor, this) + }, + }, + mounted() { + const anchor = this.$route && this.$route.hash + scrollToAnchor(anchor, this) + }, +} diff --git a/docs/webapp/mixins/seo.js b/docs/webapp/mixins/seo.js new file mode 100644 index 000000000..2dd0ecb20 --- /dev/null +++ b/docs/webapp/mixins/seo.js @@ -0,0 +1,12 @@ +export default { + head() { + return { + htmlAttrs: { + lang: this.$i18n.locale(), + }, + bodyAttrs: { + class: `page-name-${this.$route.name}`, + }, + } + }, +} diff --git a/docs/webapp/mixins/sortCategoriesMixin.js b/docs/webapp/mixins/sortCategoriesMixin.js new file mode 100644 index 000000000..2a22a8610 --- /dev/null +++ b/docs/webapp/mixins/sortCategoriesMixin.js @@ -0,0 +1,25 @@ +export default { + methods: { + sortCategories(categories) { + const miscSlug = 'miscellaneous' + const misc = categories.find((cat) => cat.slug === miscSlug) + const sortedCategories = categories + .filter((cat) => cat.slug !== miscSlug) + .sort((a, b) => { + if ( + this.$t(`contribution.category.name.${a.slug}`) < + this.$t(`contribution.category.name.${b.slug}`) + ) + return -1 + if ( + this.$t(`contribution.category.name.${a.slug}`) > + this.$t(`contribution.category.name.${b.slug}`) + ) + return 1 + return 0 + }) + if (misc) sortedCategories.push(misc) + return sortedCategories + }, + }, +} diff --git a/docs/webapp/nuxt.config.js b/docs/webapp/nuxt.config.js new file mode 100644 index 000000000..c9b4db317 --- /dev/null +++ b/docs/webapp/nuxt.config.js @@ -0,0 +1,321 @@ +import path from 'path' +import manifest from './constants/manifest.js' +import metadata from './constants/metadata.js' + +const CONFIG = require('./config').default // we need to use require since this is only evaluated at compile time. + +const styleguidePath = '../styleguide' +const styleguideStyles = CONFIG.STYLEGUIDE_DEV + ? [ + `${styleguidePath}/src/system/styles/main.scss`, + `${styleguidePath}/src/system/styles/shared.scss`, + ] + : '@human-connection/styleguide/dist/shared.scss' + +export default { + buildDir: CONFIG.NUXT_BUILD, + mode: 'universal', + + dev: CONFIG.DEBUG, + debug: CONFIG.DEBUG ? 'nuxt:*,app' : null, + + modern: CONFIG.PRODUCTION ? 'server' : false, + + pageTransition: { + name: 'slide-up', + mode: 'out-in', + }, + + env: { + ...CONFIG, + // pages which do NOT require a login + publicPages: [ + 'login', + 'logout', + 'password-reset-request', + 'password-reset-enter-nonce', + 'password-reset-change-password', + 'registration', + 'pages-slug', + 'organization', + 'support', + 'terms-and-conditions', + 'code-of-conduct', + 'changelog', + 'imprint', + 'data-privacy', + 'faq', + 'donate', + ], + // pages to keep alive + keepAlivePages: ['index'], + }, + /* + ** Headers of the page + */ + head: { + title: manifest.name, + titleTemplate: `%s - ${manifest.name}`, + meta: [ + { + charset: 'utf-8', + }, + { + name: 'viewport', + content: 'initial-scale=1', + }, + { + hid: 'description', + name: 'description', + content: CONFIG.DESCRIPTION, + }, + ], + link: [ + { + rel: 'icon', + type: 'image/x-icon', + href: '/favicon.ico', + }, + ], + }, + + /* + ** Customize the progress-bar color + */ + loading: { + color: '#86b31e', + height: '2px', + duration: 20000, + }, + + /* + ** Global CSS + */ + css: [ + '~assets/_new/styles/resets.scss', + '~assets/styles/main.scss', + '~assets/styles/imports/_branding.scss', + ], + + /* + ** Global processed styles + */ + styleResources: { + scss: [ + styleguideStyles, + '~assets/_new/styles/tokens.scss', + '~assets/styles/imports/_branding.scss', + '~assets/_new/styles/export.scss', + ], + }, + + /* + ** Plugins to load before mounting the App + */ + plugins: [ + { src: '~/plugins/base-components.js', ssr: true }, + { + src: `~/plugins/styleguide${CONFIG.STYLEGUIDE_DEV ? '-dev' : ''}.js`, + ssr: true, + }, + { src: '~/plugins/i18n.js', ssr: true }, + { src: '~/plugins/axios.js', ssr: false }, + { src: '~/plugins/keep-alive.js', ssr: false }, + { src: '~/plugins/vue-directives.js', ssr: false }, + { src: '~/plugins/v-tooltip.js', ssr: false }, + { src: '~/plugins/izi-toast.js', ssr: false }, + { src: '~/plugins/vue-filters.js' }, + { src: '~/plugins/vue-infinite-loading.js', ssr: false }, + { src: '~/plugins/vue-observe-visibility.js', ssr: false }, + { src: '~/plugins/v-mapbox.js', mode: 'client' }, + { src: '~/plugins/vue-advanced-chat.js', mode: 'client' }, + ], + + router: { + middleware: ['authenticated', 'termsAndConditions'], + linkActiveClass: 'router-link-active', + linkExactActiveClass: 'router-link-exact-active', + }, + + /* + ** Nuxt.js modules + */ + modules: [ + ['@nuxtjs/dotenv', { only: Object.keys(CONFIG) }], + ['nuxt-env', { keys: Object.keys(CONFIG) }], + [ + 'vue-scrollto/nuxt', + { + offset: -100, // to compensate fixed navbar height + duration: 1000, + }, + ], + 'cookie-universal-nuxt', + '@nuxtjs/apollo', + '@nuxtjs/axios', + '@nuxtjs/style-resources', + '@nuxtjs/sentry', + '@nuxtjs/pwa', + ], + + buildModules: [ + // https://composition-api.nuxtjs.org/getting-started/setup#quick-start + '@nuxtjs/composition-api/module', + ], + + /* + ** Axios module configuration + */ + axios: { + // See https://github.com/nuxt-community/axios-module#options + debug: CONFIG.DEBUG, + proxy: true, + }, + proxy: { + '/.well-known/webfinger': { + target: CONFIG.GRAPHQL_URI, + toProxy: true, // cloudflare needs that + headers: { + Accept: 'application/json', + 'X-UI-Request': true, + 'X-API-TOKEN': CONFIG.BACKEND_TOKEN, + }, + }, + '/activitypub': { + // make this configurable (nuxt-dotenv) + target: CONFIG.GRAPHQL_URI, + toProxy: true, // cloudflare needs that + headers: { + Accept: 'application/json', + 'X-UI-Request': true, + 'X-API-TOKEN': CONFIG.BACKEND_TOKEN, + }, + }, + '/api': { + // make this configurable (nuxt-dotenv) + target: CONFIG.GRAPHQL_URI, + pathRewrite: { + '^/api': '', + }, + toProxy: true, // cloudflare needs that + headers: { + Accept: 'application/json', + 'X-UI-Request': true, + 'X-API-TOKEN': CONFIG.BACKEND_TOKEN, + }, + }, + }, + + // Give apollo module options + apollo: { + tokenName: metadata.COOKIE_NAME, // optional, default: apollo-token + cookieAttributes: { + expires: CONFIG.COOKIE_EXPIRE_TIME, // optional, default: 7 (days) + /** * Define the path where the cookie is available. Defaults to '/' */ + // For some reason this can vary - lets see if setting this helps. + path: '/', // optional + /** * A Boolean indicating if the cookie transmission requires a + * secure protocol (https). Defaults to false. */ + secure: CONFIG.COOKIE_HTTPS_ONLY, + sameSite: 'lax', // for the meaning see https://www.thinktecture.com/de/identity/samesite/samesite-in-a-nutshell/ + }, + // includeNodeModules: true, // optional, default: false (this includes graphql-tag for node_modules folder) + + // Watch loading state for all queries + // See 'Smart Query > options > watchLoading' for detail + // TODO: find a way to get this working + // watchLoading(isLoading) { + // console.log('Global loading', countModifier) + // this.$nuxt.$loading.start() + // }, + // required + clientConfigs: { + default: '~/plugins/apollo-config.js', + }, + }, + + sentry: { + dsn: CONFIG.SENTRY_DSN_WEBAPP, + publishRelease: !!CONFIG.COMMIT, + config: CONFIG.COMMIT ? { release: CONFIG.COMMIT } : {}, + }, + + manifest, + + /* + ** Build configuration + */ + build: { + /* + ** You can extend webpack config here + */ + extend(config, ctx) { + // Add the compilerOptions + ctx.loaders.vue.compilerOptions = { + // Add your compilerOptions here + isCustomElement: (tagName) => { + return tagName === 'vue-advanced-chat' || tagName === 'emoji-picker' + }, + } + + if (CONFIG.STYLEGUIDE_DEV) { + config.resolve.alias['@@'] = path.resolve(__dirname, `${styleguidePath}/src/system`) + config.module.rules.push({ + resourceQuery: /blockType=docs/, + loader: require.resolve(`${styleguidePath}/src/loader/docs-trim-loader.js`), + }) + } + + const svgRule = config.module.rules.find((rule) => rule.test.test('.svg')) + svgRule.test = /\.(png|jpe?g|gif|webp)$/ + config.module.rules.push({ + test: /\.svg$/, + use: [ + 'babel-loader', + { + loader: 'vue-svg-loader', + options: { + svgo: { + plugins: [ + { + removeViewBox: false, + }, + { + removeDimensions: true, + }, + ], + }, + }, + }, + ], + }) + config.module.rules.push({ + enforce: 'pre', + test: /\.html$/, + loader: 'raw-loader', + exclude: /(node_modules)/, + }) + + const tagAttributesForTesting = ['data-test', ':data-test', 'v-bind:data-test'] + ctx.loaders.vue.compilerOptions = { + modules: [ + { + preTransformNode(abstractSyntaxTreeElement) { + if (!ctx.isDev) { + const { attrsMap, attrsList } = abstractSyntaxTreeElement + tagAttributesForTesting.forEach((attribute) => { + if (attrsMap[attribute]) { + delete attrsMap[attribute] + const index = attrsList.findIndex((attr) => attr.name === attribute) + attrsList.splice(index, 1) + } + }) + } + return abstractSyntaxTreeElement + }, + }, + ], + } + }, + }, +} diff --git a/docs/webapp/package.json b/docs/webapp/package.json new file mode 100644 index 000000000..14a962cde --- /dev/null +++ b/docs/webapp/package.json @@ -0,0 +1,121 @@ +{ + "name": "ocelot-social-webapp", + "version": "3.0.1", + "description": "ocelot.social Frontend", + "repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social", + "author": "ocelot.social Community", + "license": "MIT", + "private": false, + "scripts": { + "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt", + "dev:styleguide": "cross-env STYLEGUIDE_DEV=true yarn run dev", + "storybook": "cross-env NODE_OPTIONS=--openssl-legacy-provider start-storybook -p 3002 -s ./static -c storybook/", + "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt build", + "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt start", + "generate": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt generate", + "lint": "eslint --ext .js,.vue .", + "locales": "../scripts/translations/missing-keys.sh && ../scripts/translations/sort.sh", + "precommit": "yarn lint", + "test": "cross-env NODE_ENV=test jest --coverage --forceExit --detectOpenHandles", + "test:unit:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --no-cache --runInBand" + }, + "dependencies": { + "@human-connection/styleguide": "0.5.22", + "@mapbox/mapbox-gl-geocoder": "^5.0.1", + "@nuxtjs/apollo": "^4.0.0-rc19", + "@nuxtjs/axios": "~5.9.7", + "@nuxtjs/dotenv": "~1.4.1", + "@nuxtjs/pwa": "^3.0.0-beta.20", + "@nuxtjs/sentry": "^4.0.0", + "@nuxtjs/style-resources": "~1.0.0", + "accounting": "~0.4.1", + "apollo-cache-inmemory": "~1.6.6", + "apollo-client": "~2.6.8", + "cookie-universal-nuxt": "~2.2.2", + "cropperjs": "^1.5.5", + "cross-env": "~7.0.3", + "date-fns": "2.22.1", + "express": "~4.17.1", + "graphql": "~14.7.0", + "intersection-observer": "^0.12.0", + "jsonwebtoken": "~9.0.0", + "linkify-it": "~3.0.2", + "mapbox-gl": "1.13.2", + "node-fetch": "^2.6.1", + "nuxt": "~2.12.1", + "nuxt-dropzone": "^1.0.4", + "nuxt-env": "~0.1.0", + "sass": "^1.30.0", + "stack-utils": "^2.0.3", + "tippy.js": "^4.3.5", + "tiptap": "~1.26.6", + "tiptap-extensions": "~1.28.8", + "trunc-html": "^1.1.2", + "v-mapbox": "^1.11.2", + "v-tooltip": "~2.1.3", + "validator": "^13.0.0", + "vue-advanced-chat": "^2.0.7", + "vue-count-to": "~1.0.13", + "vue-infinite-loading": "^2.4.5", + "vue-izitoast": "^1.2.1", + "vue-observe-visibility": "^1.0.0", + "vue-scrollto": "^2.20.0", + "vue-sweetalert-icons": "~4.3.1", + "vue2-datepicker": "^3.11.1", + "vuex-i18n": "~1.13.1", + "xregexp": "^4.3.0", + "zxcvbn": "^4.4.2" + }, + "devDependencies": { + "@babel/core": "~7.22.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/preset-env": "^7.22.4", + "@faker-js/faker": "5.1.0", + "@nuxtjs/composition-api": "0.32.0", + "@storybook/addon-a11y": "^6.3.6", + "@storybook/addon-actions": "^5.3.21", + "@storybook/addon-notes": "^5.3.18", + "@storybook/vue": "~6.3.6", + "@vue/cli-shared-utils": "~4.3.1", + "@vue/eslint-config-prettier": "~6.0.0", + "@vue/server-test-utils": "~1.0.0-beta.31", + "@vue/test-utils": "1.3.4", + "@vue/vue2-jest": "29", + "async-validator": "^3.2.4", + "babel-core": "^7.0.0-bridge.0", + "babel-eslint": "~10.1.0", + "babel-jest": "29.5", + "babel-loader": "~8.1.0", + "babel-plugin-require-context-hook": "^1.0.0", + "babel-preset-vue": "~2.0.2", + "core-js": "~2.6.10", + "css-loader": "~3.5.2", + "eslint": "~6.8.0", + "eslint-config-prettier": "~6.15.0", + "eslint-config-standard": "~14.1.1", + "eslint-loader": "~4.0.0", + "eslint-plugin-import": "~2.20.2", + "eslint-plugin-jest": "~24.4.0", + "eslint-plugin-node": "~11.1.0", + "eslint-plugin-prettier": "~3.4.0", + "eslint-plugin-promise": "~4.3.1", + "eslint-plugin-standard": "~5.0.0", + "eslint-plugin-vue": "~6.2.2", + "flush-promises": "^1.0.2", + "identity-obj-proxy": "^3.0.0", + "jest": "29.5", + "jest-environment-jsdom": "^29.4.2", + "mutation-observer": "^1.0.3", + "prettier": "~2.7.1", + "sass-loader": "~10.1.1", + "storybook-design-token": "^0.8.1", + "storybook-vue-router": "^1.0.7", + "style-loader": "~0.23.1", + "style-resources-loader": "~1.3.3", + "vue-svg-loader": "~0.16.0", + "vue-template-compiler": "^2.6.11" + }, + "resolutions": { + "nan": "2.17.0" + } +} diff --git a/docs/webapp/pages/admin.spec.js b/docs/webapp/pages/admin.spec.js new file mode 100644 index 000000000..aa6eceab1 --- /dev/null +++ b/docs/webapp/pages/admin.spec.js @@ -0,0 +1,37 @@ +import { mount } from '@vue/test-utils' +import admin from './admin.vue' + +const stubs = { + 'nuxt-child': true, +} + +const localVue = global.localVue + +describe('admin.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(admin, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + }) +}) diff --git a/docs/webapp/pages/admin.vue b/docs/webapp/pages/admin.vue new file mode 100644 index 000000000..8f2b989d6 --- /dev/null +++ b/docs/webapp/pages/admin.vue @@ -0,0 +1,71 @@ + + + diff --git a/docs/webapp/pages/admin/categories.spec.js b/docs/webapp/pages/admin/categories.spec.js new file mode 100644 index 000000000..f293dacf2 --- /dev/null +++ b/docs/webapp/pages/admin/categories.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import Categories from './categories.vue' + +const localVue = global.localVue + +describe('categories.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Categories, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/categories.vue b/docs/webapp/pages/admin/categories.vue new file mode 100644 index 000000000..5e91a8687 --- /dev/null +++ b/docs/webapp/pages/admin/categories.vue @@ -0,0 +1,49 @@ + + + diff --git a/docs/webapp/pages/admin/donations.spec.js b/docs/webapp/pages/admin/donations.spec.js new file mode 100644 index 000000000..37a20393f --- /dev/null +++ b/docs/webapp/pages/admin/donations.spec.js @@ -0,0 +1,197 @@ +import { mount } from '@vue/test-utils' +import Vue from 'vue' +import Donations from './donations.vue' + +const localVue = global.localVue + +describe('donations.vue', () => { + let wrapper + let mocks + + const donationsQueryMock = jest.fn() + const donationsUpdateMock = jest.fn() + const donationsMutaionMock = jest.fn() + donationsMutaionMock.mockResolvedValue({ + then: jest.fn(), + catch: jest.fn(), + }) + + beforeEach(() => { + mocks = { + $t: jest.fn((string) => string), + $apollo: { + Donations: { + query: donationsQueryMock, + update: donationsUpdateMock, + }, + mutate: donationsMutaionMock, + queries: { + Donations: { + query: donationsQueryMock, + refetch: jest.fn(), + fetchMore: jest.fn().mockResolvedValue([ + { + id: 'p23', + name: 'It is a post', + author: { + id: 'u1', + }, + }, + ]), + }, + }, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Donations, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + + describe('displays', () => { + it('title', () => { + expect(wrapper.find('.title').text()).toBe('admin.donations.name') + }) + + it('showDonations label', () => { + expect(wrapper.find('.show-donations-checkbox').text()).toBe( + 'admin.donations.showDonationsCheckboxLabel', + ) + }) + + it('donations goal label', () => { + expect(wrapper.find('[data-test="donations-goal"]').text()).toBe('admin.donations.goal') + }) + + it('donations progress label', () => { + expect(wrapper.find('[data-test="donations-progress"]').text()).toBe( + 'admin.donations.progress', + ) + }) + + it('save button text', () => { + expect(wrapper.find('.donations-info-button').text()).toBe('actions.save') + }) + }) + + describe('form component click', () => { + it('on #showDonations checkbox changes "showDonations" to true', async () => { + await wrapper.find('#showDonations').setChecked(true) + expect(wrapper.vm.showDonations).toBe(true) + }) + + it('on #showDonations checkbox twice changes "showDonations" back to false', async () => { + await wrapper.find('#showDonations').setChecked(true) + await wrapper.find('#showDonations').setChecked(false) + expect(wrapper.vm.showDonations).toBe(false) + }) + + it.skip('on donations-goal and enter value XXX', async () => { + await wrapper.find('#donations-goal').setValue('20000') + expect(wrapper.vm.formData.goal).toBe('20000') + }) + }) + + describe('apollo', () => { + it.skip('query is called', () => { + expect(donationsQueryMock).toHaveBeenCalledTimes(1) + expect(mocks.$apollo.queries.Donations.refetch).toHaveBeenCalledTimes(1) + // expect(mocks.$apollo.Donations.query().exists()).toBeTruthy() + // console.log('mocks.$apollo: ', mocks.$apollo) + }) + + it.skip('query result is displayed', () => { + mocks.$apollo.queries = jest.fn().mockResolvedValue({ + data: { + PostsEmotionsCountByEmotion: 1, + }, + }) + }) + + describe('submit', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + it('calls mutation with default values once', () => { + wrapper.find('.donations-info-button').trigger('submit') + expect(donationsMutaionMock).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { showDonations: false, goal: 15000, progress: 0 }, + }), + ) + }) + + it('calls mutation with input values once', async () => { + wrapper.find('#showDonations').setChecked(true) + await wrapper.vm.$nextTick() + wrapper.find('#donations-goal').setValue('20000') + await wrapper.vm.$nextTick() + wrapper.find('#donations-progress').setValue('10000') + await wrapper.vm.$nextTick() + wrapper.find('.donations-info-button').trigger('submit') + await wrapper.vm.$nextTick() + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { showDonations: true, goal: 20000, progress: 10000 }, + }), + ) + }) + + it.skip('calls mutation with corrected values once', async () => { + wrapper.find('.show-donations-checkbox').trigger('click') + await Vue.nextTick() + expect(wrapper.vm.showDonations).toBe(false) + // wrapper.find('.donations-info-button').trigger('submit') + // await mocks.$apollo.mutate + // expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining({variables: { showDonations: false, goal: 15000, progress: 7000 }})) + // expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it.skip('default values are displayed', async () => { + mocks.$apollo.mutate = jest.fn().mockResolvedValue({ + data: { UpdateDonations: { showDonations: true, goal: 10, progress: 20 } }, + }) + wrapper.find('.donations-info-button').trigger('submit') + await mocks.$apollo.mutate + await Vue.nextTick() + expect(wrapper.vm.showDonations).toBe(false) + expect(wrapper.vm.formData.goal).toBe(1) + expect(wrapper.vm.formData.progress).toBe(1) + }) + + it.skip('entered values are send in the mutation', async () => { + // mocks.$apollo.mutate = jest.fn().mockResolvedValue({ data: { UpdateDonations: { showDonations: true, goal: 10, progress: 20 } } }) + + // expect(wrapper.vm.showDonations).toBe(null) + // expect(wrapper.vm.formData.goal).toBe(null) + // expect(wrapper.vm.formData.progress).toBe(null) + // wrapper.find('.base-button').trigger('click') + // await Vue.nextTick() + // expect(wrapper.vm.showDonations).toBe(true) + // expect(wrapper.vm.formData.goal).toBe(1) + // expect(wrapper.vm.formData.progress).toBe(1) + + // wrapper.find('.base-button').trigger('click') + // wrapper.find('.donations-info-button').trigger('click') + // await Vue.nextTick() + // wrapper.find('.donations-info-button').trigger('submit') + await mocks.$apollo.mutate + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/admin/donations.vue b/docs/webapp/pages/admin/donations.vue new file mode 100644 index 000000000..1caedb9e1 --- /dev/null +++ b/docs/webapp/pages/admin/donations.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/docs/webapp/pages/admin/hashtags.spec.js b/docs/webapp/pages/admin/hashtags.spec.js new file mode 100644 index 000000000..b1a44aebf --- /dev/null +++ b/docs/webapp/pages/admin/hashtags.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import Hashtags from './hashtags.vue' + +const localVue = global.localVue + +describe('hashtags.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Hashtags, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/hashtags.vue b/docs/webapp/pages/admin/hashtags.vue new file mode 100644 index 000000000..57335076e --- /dev/null +++ b/docs/webapp/pages/admin/hashtags.vue @@ -0,0 +1,54 @@ + + + diff --git a/docs/webapp/pages/admin/index.spec.js b/docs/webapp/pages/admin/index.spec.js new file mode 100644 index 000000000..35e8ba212 --- /dev/null +++ b/docs/webapp/pages/admin/index.spec.js @@ -0,0 +1,52 @@ +import { mount } from '@vue/test-utils' +import AdminIndexPage from './index.vue' + +import VueApollo from 'vue-apollo' + +const localVue = global.localVue + +localVue.use(VueApollo) + +describe('admin/index.vue', () => { + let Wrapper + let store + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + Wrapper = () => { + return mount(AdminIndexPage, { + store, + mocks, + localVue, + }) + } + + describe('in loading state', () => { + beforeEach(() => { + mocks = { ...mocks, $apolloData: { loading: true } } + }) + + it.skip('shows a loading spinner', () => { + // I don't know how to mock the data that gets passed to + // ApolloQuery component + // What I found: + // https://github.com/Akryum/vue-apollo/issues/656 + // https://github.com/Akryum/vue-apollo/issues/609 + Wrapper() + const calls = mocks.$t.mock.calls + const expected = [['site.error-occurred']] + expect(calls).toEqual(expected) + }) + }) + + describe('in error state', () => { + it.todo('displays an error message') + }) + }) +}) diff --git a/docs/webapp/pages/admin/index.vue b/docs/webapp/pages/admin/index.vue new file mode 100644 index 000000000..22f0bd678 --- /dev/null +++ b/docs/webapp/pages/admin/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/docs/webapp/pages/admin/invite.spec.js b/docs/webapp/pages/admin/invite.spec.js new file mode 100644 index 000000000..da0f743a2 --- /dev/null +++ b/docs/webapp/pages/admin/invite.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' +import Invite from './invite.vue' + +const localVue = global.localVue + +describe('invite.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + loading: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Invite, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('ds-section')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/invite.vue b/docs/webapp/pages/admin/invite.vue new file mode 100644 index 000000000..8f5c7b083 --- /dev/null +++ b/docs/webapp/pages/admin/invite.vue @@ -0,0 +1,21 @@ + + + diff --git a/docs/webapp/pages/admin/notifications.spec.js b/docs/webapp/pages/admin/notifications.spec.js new file mode 100644 index 000000000..34773058e --- /dev/null +++ b/docs/webapp/pages/admin/notifications.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' +import Notifications from './notifications.vue' + +const localVue = global.localVue + +describe('notifications.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + loading: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Notifications, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/notifications.vue b/docs/webapp/pages/admin/notifications.vue new file mode 100644 index 000000000..beb7f93c1 --- /dev/null +++ b/docs/webapp/pages/admin/notifications.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/admin/organizations.spec.js b/docs/webapp/pages/admin/organizations.spec.js new file mode 100644 index 000000000..2045a09b3 --- /dev/null +++ b/docs/webapp/pages/admin/organizations.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' +import Organizations from './organizations.vue' + +const localVue = global.localVue + +describe('organizations.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + loading: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Organizations, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/organizations.vue b/docs/webapp/pages/admin/organizations.vue new file mode 100644 index 000000000..adfc2b18b --- /dev/null +++ b/docs/webapp/pages/admin/organizations.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/admin/pages.spec.js b/docs/webapp/pages/admin/pages.spec.js new file mode 100644 index 000000000..91103b756 --- /dev/null +++ b/docs/webapp/pages/admin/pages.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' +import Pages from './pages.vue' + +const localVue = global.localVue + +describe('pages.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + loading: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Pages, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/pages.vue b/docs/webapp/pages/admin/pages.vue new file mode 100644 index 000000000..496e03cb2 --- /dev/null +++ b/docs/webapp/pages/admin/pages.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/admin/settings.spec.js b/docs/webapp/pages/admin/settings.spec.js new file mode 100644 index 000000000..0f83a37d5 --- /dev/null +++ b/docs/webapp/pages/admin/settings.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' +import Settings from './settings.vue' + +const localVue = global.localVue + +describe('settings.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + loading: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Settings, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/admin/settings.vue b/docs/webapp/pages/admin/settings.vue new file mode 100644 index 000000000..0b7b87b09 --- /dev/null +++ b/docs/webapp/pages/admin/settings.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/admin/users.spec.js b/docs/webapp/pages/admin/users.spec.js new file mode 100644 index 000000000..43c51fb52 --- /dev/null +++ b/docs/webapp/pages/admin/users.spec.js @@ -0,0 +1,153 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import Users from './users.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, +} + +describe('Users', () => { + let wrapper + let Wrapper + let getters + + const mocks = { + $t: jest.fn(), + $apollo: { + loading: false, + mutate: jest + .fn() + .mockRejectedValue({ message: 'Ouch!' }) + .mockResolvedValue({ + data: { + switchUserRole: { + id: 'user', + email: 'user@example.org', + name: 'User', + role: 'moderator', + slug: 'user', + }, + }, + }), + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + + describe('mount', () => { + getters = { + 'auth/isAdmin': () => true, + 'auth/user': () => { + return { id: 'admin' } + }, + } + + Wrapper = () => { + const store = new Vuex.Store({ getters }) + return mount(Users, { + mocks, + localVue, + store, + stubs, + }) + } + + it('renders', () => { + wrapper = Wrapper() + expect(wrapper.element.tagName).toBe('DIV') + }) + + describe('search', () => { + let searchAction + beforeEach(() => { + searchAction = (wrapper, { query }) => { + wrapper.find('input').setValue(query) + wrapper.find('form').trigger('submit') + return wrapper + } + }) + + describe('query looks like an email address', () => { + it('searches users for exact email address', async () => { + const wrapper = await searchAction(Wrapper(), { query: 'email@example.org' }) + expect(wrapper.vm.email).toEqual('email@example.org') + expect(wrapper.vm.filter).toBe(null) + }) + + it('email address is case-insensitive', async () => { + const wrapper = await searchAction(Wrapper(), { query: 'eMaiL@example.org' }) + expect(wrapper.vm.email).toEqual('email@example.org') + expect(wrapper.vm.filter).toBe(null) + }) + }) + + describe('query is just text', () => { + it('tries to find matching users by `name`, `slug` or `about`', async () => { + const wrapper = await searchAction(await Wrapper(), { query: 'Find me' }) + const expected = { + OR: [ + { name_contains: 'Find me' }, + { slug_contains: 'Find me' }, + { about_contains: 'Find me' }, + ], + } + expect(wrapper.vm.email).toBe(null) + expect(wrapper.vm.filter).toEqual(expected) + }) + }) + }) + + describe('change roles', () => { + beforeAll(() => { + wrapper = Wrapper() + wrapper.setData({ + User: [ + { + id: 'admin', + email: 'admin@example.org', + name: 'Admin', + role: 'admin', + slug: 'admin', + }, + { + id: 'user', + email: 'user@example.org', + name: 'User', + role: 'user', + slug: 'user', + }, + ], + userRoles: ['user', 'moderator', 'admin'], + }) + }) + + it('cannot change own role', () => { + const adminRow = wrapper.findAll('tr').at(1) + expect(adminRow.find('select').exists()).toBe(false) + }) + + it('changes the role of another user', () => { + const userRow = wrapper.findAll('tr').at(2) + userRow.findAll('option').at(1).setSelected() + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: { + id: 'user', + role: 'moderator', + }, + }), + ) + }) + + it('toasts a success message after role has changed', () => { + const userRow = wrapper.findAll('tr').at(2) + userRow.findAll('option').at(1).setSelected() + expect(mocks.$toast.success).toHaveBeenCalled() + }) + }) + }) +}) diff --git a/docs/webapp/pages/admin/users.vue b/docs/webapp/pages/admin/users.vue new file mode 100644 index 000000000..44f162c77 --- /dev/null +++ b/docs/webapp/pages/admin/users.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/docs/webapp/pages/chat.vue b/docs/webapp/pages/chat.vue new file mode 100644 index 000000000..9f93fabcb --- /dev/null +++ b/docs/webapp/pages/chat.vue @@ -0,0 +1,54 @@ + + + diff --git a/docs/webapp/pages/code-of-conduct.spec.js b/docs/webapp/pages/code-of-conduct.spec.js new file mode 100644 index 000000000..e914ceaee --- /dev/null +++ b/docs/webapp/pages/code-of-conduct.spec.js @@ -0,0 +1,43 @@ +import { mount } from '@vue/test-utils' +import CodeOfConduct from './code-of-conduct.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +describe('code-of-conduct.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(CodeOfConduct, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.code-of-conduct') + }) + }) +}) diff --git a/docs/webapp/pages/code-of-conduct.vue b/docs/webapp/pages/code-of-conduct.vue new file mode 100644 index 000000000..3a3275c39 --- /dev/null +++ b/docs/webapp/pages/code-of-conduct.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/data-privacy.spec.js b/docs/webapp/pages/data-privacy.spec.js new file mode 100644 index 000000000..a1fdf4afc --- /dev/null +++ b/docs/webapp/pages/data-privacy.spec.js @@ -0,0 +1,43 @@ +import { mount } from '@vue/test-utils' +import DataPrivacy from './data-privacy.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +describe('data-privacy.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(DataPrivacy, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.data-privacy') + }) + }) +}) diff --git a/docs/webapp/pages/data-privacy.vue b/docs/webapp/pages/data-privacy.vue new file mode 100644 index 000000000..31f86c9b8 --- /dev/null +++ b/docs/webapp/pages/data-privacy.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/donate.spec.js b/docs/webapp/pages/donate.spec.js new file mode 100644 index 000000000..2eff7d8d0 --- /dev/null +++ b/docs/webapp/pages/donate.spec.js @@ -0,0 +1,47 @@ +import { mount } from '@vue/test-utils' +import Donate from './donate.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +const openMock = jest.fn() +delete window.open +window.open = openMock + +describe('donate.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Donate, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.donate') + }) + }) +}) diff --git a/docs/webapp/pages/donate.vue b/docs/webapp/pages/donate.vue new file mode 100644 index 000000000..aac73695f --- /dev/null +++ b/docs/webapp/pages/donate.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/faq.spec.js b/docs/webapp/pages/faq.spec.js new file mode 100644 index 000000000..9d3c776cc --- /dev/null +++ b/docs/webapp/pages/faq.spec.js @@ -0,0 +1,43 @@ +import { mount } from '@vue/test-utils' +import Faq from './faq.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +describe('faq.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Faq, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.faq') + }) + }) +}) diff --git a/docs/webapp/pages/faq.vue b/docs/webapp/pages/faq.vue new file mode 100644 index 000000000..ec0ee8eda --- /dev/null +++ b/docs/webapp/pages/faq.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/groups/_id.spec.js b/docs/webapp/pages/groups/_id.spec.js new file mode 100644 index 000000000..1a9a7203a --- /dev/null +++ b/docs/webapp/pages/groups/_id.spec.js @@ -0,0 +1,36 @@ +import { mount } from '@vue/test-utils' +import _id from './_id.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-child': true, +} + +describe('Group profile _id.vue', () => { + let wrapper + let Wrapper + let mocks + + beforeEach(() => { + mocks = {} + }) + + describe('mount', () => { + Wrapper = () => { + return mount(_id, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findComponent({ name: 'nuxt-child' }).exists()).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/groups/_id.vue b/docs/webapp/pages/groups/_id.vue new file mode 100644 index 000000000..ab8f3c41e --- /dev/null +++ b/docs/webapp/pages/groups/_id.vue @@ -0,0 +1,34 @@ + + + diff --git a/docs/webapp/pages/groups/_id/_slug.spec.js b/docs/webapp/pages/groups/_id/_slug.spec.js new file mode 100644 index 000000000..bb9279bce --- /dev/null +++ b/docs/webapp/pages/groups/_id/_slug.spec.js @@ -0,0 +1,1639 @@ +import { mount } from '@vue/test-utils' +import GroupProfileSlug from './_slug.vue' + +const localVue = global.localVue + +localVue.filter('date', (d) => d) + +const stubs = { + 'client-only': true, + 'v-popover': true, + 'nuxt-link': true, + 'router-link': true, + 'infinite-loading': true, + 'follow-list': true, +} + +describe('GroupProfileSlug', () => { + let wrapper + let Wrapper + let mocks + let yogaPractice + let schoolForCitizens + let investigativeJournalism + let peterLustig + let jennyRostock + let bobDerBaumeister + let huey + + beforeEach(() => { + mocks = { + $env: { + CATEGORIES_ACTIVE: true, + }, + // post: { + // id: 'p23', + // name: 'It is a post', + // }, + $t: jest.fn((a) => a), + $filters: { + removeLinks: (c) => c, + truncate: (a) => a, + }, + // If you're mocking router, then don't use VueRouter with localVue: https://vue-test-utils.vuejs.org/guides/using-with-vue-router.html + $route: { + params: { + id: 'g1', + slug: 'school-for-citizens', + }, + }, + $router: { + history: { + push: jest.fn(), + }, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $apollo: { + loading: false, + mutate: jest.fn().mockResolvedValue(), + }, + } + yogaPractice = { + id: 'g2', + name: 'Yoga Practice', + slug: 'yoga-practice', + about: null, + description: `

                                  What Is yoga?

                                  Yoga is not just about practicing asanas. It's about how we do it.

                                  And practicing asanas doesn't have to be yoga, it can be more athletic than yogic.

                                  What makes practicing asanas yogic?

                                  The important thing is:

                                  • Use the exercises (consciously) for your personal development.

                                  `, + descriptionExcerpt: `

                                  What Is yoga?

                                  Yoga is not just about practicing asanas. It's about how we do it.

                                  And practicing asanas doesn't have to be yoga, it can be more athletic than yogic.

                                  What makes practicing asanas yogic?

                                  The important thing is:

                                  • Use the exercises …

                                  `, + groupType: 'public', + actionRadius: 'interplanetary', + categories: [ + { + id: 'cat4', + icon: 'psyche', + name: 'psyche', + slug: 'psyche', + description: 'Seele, Gefühle, Glück', + }, + { + id: 'cat5', + icon: 'movement', + name: 'body-and-excercise', + slug: 'body-and-excercise', + description: 'Sport, Yoga, Massage, Tanzen, Entspannung', + }, + { + id: 'cat17', + icon: 'spirituality', + name: 'spirituality', + slug: 'spirituality', + description: 'Religion, Werte, Ethik', + }, + ], + locationName: null, + location: null, + // myRole: 'usual', + } + schoolForCitizens = { + id: 'g1', + name: 'School For Citizens', + slug: 'school-for-citizens', + about: 'Our children shall receive education for life.', + description: `

                                  English

                                  Our goal

                                  Only those who enjoy learning and do not lose their curiosity can obtain a good education for life and continue to learn with joy throughout their lives.

                                  Curiosity

                                  For this we need a school that takes up the curiosity of the children, the people, and satisfies it through a lot of experience.


                                  Deutsch

                                  Unser Ziel

                                  Nur wer Spaß am Lernen hat und seine Neugier nicht verliert, kann gute Bildung für's Leben erlangen und sein ganzes Leben mit Freude weiter lernen.

                                  Neugier

                                  Dazu benötigen wir eine Schule, die die Neugier der Kinder, der Menschen, aufnimmt und durch viel Erfahrung befriedigt.

                                  `, + descriptionExcerpt: `

                                  English

                                  Our goal

                                  Only those who enjoy learning and do not lose their curiosity can obtain a good education for life and continue to learn with joy throughout their lives.

                                  Curiosity

                                  For this we need a school that takes up the curiosity of the children, …

                                  `, + groupType: 'closed', + actionRadius: 'national', + categories: [ + { + id: 'cat8', + icon: 'child', + name: 'children', + slug: 'children', + description: 'Familie, Pädagogik, Schule, Prägung', + }, + { + id: 'cat14', + icon: 'science', + name: 'science', + slug: 'science', + description: 'Bildung, Hochschule, Publikationen, ...', + }, + ], + locationName: 'France', + location: { + name: 'Paris', + nameDE: 'Paris', + nameEN: 'Paris', + }, + // myRole: 'usual', + } + investigativeJournalism = { + id: 'g0', + name: 'Investigative Journalism', + slug: 'investigative-journalism', + about: 'Investigative journalists share ideas and insights and can collaborate.', + description: `

                                  English:

                                  This group is hidden.

                                  What is our group for?

                                  This group was created to allow investigative journalists to share and collaborate.

                                  How does it work?

                                  Here you can internally share posts and comments about them.


                                  Deutsch:

                                  Diese Gruppe ist verborgen.

                                  Wofür ist unsere Gruppe?

                                  Diese Gruppe wurde geschaffen, um investigativen Journalisten den Austausch und die Zusammenarbeit zu ermöglichen.

                                  Wie funktioniert das?

                                  Hier könnt ihr euch intern über Beiträge und Kommentare zu ihnen austauschen.

                                  `, + descriptionExcerpt: + '

                                  English:

                                  This group is hidden.

                                  What is our group for?

                                  This group was created to allow investigative journalists to share and collaborate.

                                  How does it work?

                                  Here you can internally share posts and comments about them.


                                  Deutsch:

                                  Diese Gruppe ist verborgen.

                                  ', + groupType: 'hidden', + actionRadius: 'global', + categories: [ + { + id: 'cat6', + icon: 'balance-scale', + name: 'law', + slug: 'law', + description: 'Menschenrechte, Gesetze, Verordnungen', + }, + { + id: 'cat12', + icon: 'politics', + name: 'politics', + slug: 'politics', + description: 'Demokratie, Mitbestimmung, Wahlen, Korruption, Parteien', + }, + { + id: 'cat16', + icon: 'media', + name: 'it-and-media', + slug: 'it-and-media', + description: + 'Nachrichten, Manipulation, Datenschutz, Überwachung, Datenkraken, AI, Software, Apps', + }, + ], + locationName: 'Hamburg, Germany', + location: { + name: 'Hamburg', + nameDE: 'Hamburg', + nameEN: 'Hamburg', + }, + // myRole: 'usual', + } + peterLustig = { + id: 'u1', + name: 'Peter Lustig', + slug: 'peter-lustig', + role: 'user', + } + jennyRostock = { + id: 'u3', + name: 'Jenny Rostock', + slug: 'jenny-rostock', + role: 'user', + } + bobDerBaumeister = { + id: 'u2', + name: 'Bob der Baumeister', + slug: 'bob-der-baumeister', + role: 'user', + } + huey = { + id: 'u4', + name: 'Huey', + slug: 'huey', + role: 'user', + } + }) + + describe('mount', () => { + Wrapper = (data = () => {}) => { + return mount(GroupProfileSlug, { + mocks, + localVue, + data, + stubs, + }) + } + + describe('given a puplic group – "yoga-practice"', () => { + describe('given a current user', () => { + describe('as group owner – "peter-lustig"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': peterLustig, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...yogaPractice, + myRole: 'owner', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('Yoga Practice') + }) + + it('has AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(true) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(true) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&yoga-practice') + }) + + describe('displays no(!) group location – because is "null"', () => { + it('has no(!) group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(false) + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button disabled(!)', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBe('disabled') + }) + + it('has group role "owner"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.owner') + }) + + it('has group type "public"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.public') + }) + + it('has group action radius "interplanetary"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.interplanetary') + }) + + it('has group categories "psyche", "body-and-excercise", "spirituality"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.psyche') + expect(wrapper.text()).toContain('contribution.category.name.body-and-excercise') + expect(wrapper.text()).toContain('contribution.category.name.spirituality') + }) + + it('has no(!) group goal – because is "null"', () => { + expect(wrapper.text()).not.toContain('group.goal') + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + describe('displays description – here as well the functionallity', () => { + let groupDescriptionBaseCard + + beforeEach(async () => { + groupDescriptionBaseCard = wrapper.find('.group-description') + }) + + it('has description BaseCard', () => { + expect(groupDescriptionBaseCard.exists()).toBe(true) + }) + + describe('displays descriptionExcerpt first', () => { + it('has descriptionExcerpt', () => { + expect(groupDescriptionBaseCard.text()).toContain( + `What Is yoga?Yoga is not just about practicing asanas. It's about how we do it.And practicing asanas doesn't have to be yoga, it can be more athletic than yogic.What makes practicing asanas yogic?The important thing is:Use the exercises …`, + ) + }) + + it('has "show more" button', () => { + expect(wrapper.vm.isDescriptionCollapsed).toBe(true) + expect(groupDescriptionBaseCard.text()).toContain('comment.show.more') + }) + }) + + describe('after "show more" click displays full description', () => { + beforeEach(async () => { + await groupDescriptionBaseCard.find('.collaps-button').trigger('click') + await wrapper.vm.$nextTick() + }) + + it('has full description', () => { + // test if end of full description is visible + expect(groupDescriptionBaseCard.text()).toContain( + `Use the exercises (consciously) for your personal development.`, + ) + }) + + it('has "show less" button', () => { + expect(wrapper.vm.isDescriptionCollapsed).toBe(false) + expect(groupDescriptionBaseCard.text()).toContain('comment.show.less') + }) + }) + }) + + it('has profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(true) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as usual member – "jenny-rostock"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': jennyRostock, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...yogaPractice, + myRole: 'usual', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('Yoga Practice') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&yoga-practice') + }) + + describe('displays no(!) group location – because is "null"', () => { + it('has no(!) group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(false) + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has group role "usual"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.usual') + }) + + it('has group type "public"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.public') + }) + + it('has group action radius "interplanetary"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.interplanetary') + }) + + it('has group categories "psyche", "body-and-excercise", "spirituality"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.psyche') + expect(wrapper.text()).toContain('contribution.category.name.body-and-excercise') + expect(wrapper.text()).toContain('contribution.category.name.spirituality') + }) + + it('has no(!) group goal – because is "null"', () => { + expect(wrapper.text()).not.toContain('group.goal') + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(true) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as pending member – "bob-der-baumeister"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': bobDerBaumeister, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...yogaPractice, + myRole: 'pending', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('Yoga Practice') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&yoga-practice') + }) + + describe('displays no(!) group location – because is "null"', () => { + it('has no(!) group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(false) + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has group role "pending"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.pending') + }) + + it('has group type "public"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.public') + }) + + it('has group action radius "interplanetary"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.interplanetary') + }) + + it('has group categories "psyche", "body-and-excercise", "spirituality"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.psyche') + expect(wrapper.text()).toContain('contribution.category.name.body-and-excercise') + expect(wrapper.text()).toContain('contribution.category.name.spirituality') + }) + + it('has no(!) group goal – because is "null"', () => { + expect(wrapper.text()).not.toContain('group.goal') + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has no(!) profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(false) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as none(!) member – "huey"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': huey, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...yogaPractice, + myRole: null, + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('Yoga Practice') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&yoga-practice') + }) + + describe('displays no(!) group location – because is "null"', () => { + it('has no(!) group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(false) + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has no(!) group role', () => { + expect(wrapper.text()).not.toContain('group.role') + expect(wrapper.text()).not.toContain('group.roles') + }) + + it('has group type "public"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.public') + }) + + it('has group action radius "interplanetary"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.interplanetary') + }) + + it('has group categories "psyche", "body-and-excercise", "spirituality"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.psyche') + expect(wrapper.text()).toContain('contribution.category.name.body-and-excercise') + expect(wrapper.text()).toContain('contribution.category.name.spirituality') + }) + + it('has no(!) group goal – because is "null"', () => { + expect(wrapper.text()).not.toContain('group.goal') + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has no(!) profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(false) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + }) + }) + + describe('given a closed group – "school-for-citizens"', () => { + describe('given a current user', () => { + describe('as group owner – "peter-lustig"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': peterLustig, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...schoolForCitizens, + myRole: 'owner', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('School For Citizens') + }) + + it('has AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(true) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(true) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&school-for-citizens') + }) + + describe('displays group location', () => { + it('has group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(true) + }) + + it('has group location name "Paris"', () => { + expect(wrapper.text()).toContain('Paris') + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button disabled(!)', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBe('disabled') + }) + + it('has group role "owner"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.owner') + }) + + it('has group type "closed"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.closed') + }) + + it('has group action radius "national"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.national') + }) + + it('has group categories "children", "science"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.children') + expect(wrapper.text()).toContain('contribution.category.name.science') + }) + + it('has group goal', () => { + expect(wrapper.text()).toContain('group.goal') + expect(wrapper.text()).toContain('Our children shall receive education for life.') + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(true) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as usual member – "jenny-rostock"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': jennyRostock, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...schoolForCitizens, + myRole: 'usual', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('School For Citizens') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&school-for-citizens') + }) + + describe('displays group location', () => { + it('has group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(true) + }) + + it('has group location name "Paris"', () => { + expect(wrapper.text()).toContain('Paris') + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has group role "usual"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.usual') + }) + + it('has group type "closed"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.closed') + }) + + it('has group action radius "national"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.national') + }) + + it('has group categories "children", "science"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.children') + expect(wrapper.text()).toContain('contribution.category.name.science') + }) + + it('has group goal', () => { + expect(wrapper.text()).toContain('group.goal') + expect(wrapper.text()).toContain('Our children shall receive education for life.') + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(true) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as pending member – "bob-der-baumeister"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': bobDerBaumeister, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...schoolForCitizens, + myRole: 'pending', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('School For Citizens') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&school-for-citizens') + }) + + describe('displays group location', () => { + it('has group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(true) + }) + + it('has group location name "Paris"', () => { + expect(wrapper.text()).toContain('Paris') + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has no(!) members count', () => { + expect(wrapper.text()).not.toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has group role "pending"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.pending') + }) + + it('has group type "closed"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.closed') + }) + + it('has group action radius "national"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.national') + }) + + it('has group categories "children", "science"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.children') + expect(wrapper.text()).toContain('contribution.category.name.science') + }) + + it('has group goal', () => { + expect(wrapper.text()).toContain('group.goal') + expect(wrapper.text()).toContain('Our children shall receive education for life.') + }) + + it('has ProfileList without(!) members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + // expect(profileList.text()).not.toContain('group.membersListTitle') // does not work, because is part of 'group.membersListTitleNotAllowedSeeingGroupMembers' + expect(profileList.text()).toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).not.toContain('Peter Lustig') + expect(profileList.text()).not.toContain('Jenny Rostock') + expect(profileList.text()).not.toContain('Bob der Baumeister') + expect(profileList.text()).not.toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has no(!) profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(false) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as none(!) member – "huey"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': huey, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...schoolForCitizens, + myRole: null, + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('School For Citizens') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&school-for-citizens') + }) + + describe('displays group location', () => { + it('has group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(true) + }) + + it('has group location name "Paris"', () => { + expect(wrapper.text()).toContain('Paris') + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has no(!) members count', () => { + expect(wrapper.text()).not.toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has no(!) group role', () => { + expect(wrapper.text()).not.toContain('group.role') + expect(wrapper.text()).not.toContain('group.roles') + }) + + it('has group type "closed"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.closed') + }) + + it('has group action radius "national"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.national') + }) + + it('has group categories "children", "science"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.children') + expect(wrapper.text()).toContain('contribution.category.name.science') + }) + + it('has group goal', () => { + expect(wrapper.text()).toContain('group.goal') + expect(wrapper.text()).toContain('Our children shall receive education for life.') + }) + + it('has ProfileList without(!) members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + // expect(profileList.text()).not.toContain('group.membersListTitle') // does not work, because is part of 'group.membersListTitleNotAllowedSeeingGroupMembers' + expect(profileList.text()).toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).not.toContain('Peter Lustig') + expect(profileList.text()).not.toContain('Jenny Rostock') + expect(profileList.text()).not.toContain('Bob der Baumeister') + expect(profileList.text()).not.toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has no(!) profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(false) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + }) + }) + + describe('given a hidden group – "investigative-journalism"', () => { + describe('given a current user', () => { + describe('as group owner – "peter-lustig"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': peterLustig, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...investigativeJournalism, + myRole: 'owner', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('Investigative Journalism') + }) + + it('has AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(true) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(true) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&investigative-journalism') + }) + + describe('displays group location', () => { + it('has group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(true) + }) + + it('has group location name "Hamburg"', () => { + expect(wrapper.text()).toContain('Hamburg') + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button disabled(!)', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBe('disabled') + }) + + it('has group role "owner"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.owner') + }) + + it('has group type "hidden"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.hidden') + }) + + it('has group action radius "global"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.global') + }) + + it('has group categories "law", "politics", "it-and-media"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.law') + expect(wrapper.text()).toContain('contribution.category.name.politics') + expect(wrapper.text()).toContain('contribution.category.name.it-and-media') + }) + + it('has group goal', () => { + expect(wrapper.text()).toContain('group.goal') + expect(wrapper.text()).toContain( + 'Investigative journalists share ideas and insights and can collaborate.', + ) + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(true) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as usual member – "jenny-rostock"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': jennyRostock, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...investigativeJournalism, + myRole: 'usual', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has group name – to verificate the group', () => { + expect(wrapper.text()).toContain('Investigative Journalism') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(true) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(true) + expect(wrapper.text()).toContain('&investigative-journalism') + }) + + describe('displays group location', () => { + it('has group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(true) + }) + + it('has group location name "Hamburg"', () => { + expect(wrapper.text()).toContain('Hamburg') + }) + }) + + it('has group foundation', () => { + expect(wrapper.text()).toContain('group.foundation') + }) + + it('has members count', () => { + expect(wrapper.text()).toContain('group.membersCount') + }) + + it('has join/leave button enabled', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(true) + expect(wrapper.find('.join-leave-button').attributes('disabled')).toBeFalsy() + }) + + it('has group role "usual"', () => { + expect(wrapper.text()).toContain('group.role') + expect(wrapper.text()).toContain('group.roles.usual') + }) + + it('has group type "hidden"', () => { + expect(wrapper.text()).toContain('group.type') + expect(wrapper.text()).toContain('group.types.hidden') + }) + + it('has group action radius "global"', () => { + expect(wrapper.text()).toContain('group.actionRadius') + expect(wrapper.text()).toContain('group.actionRadii.global') + }) + + it('has group categories "law", "politics", "it-and-media"', () => { + expect(wrapper.text()).toContain('group.categories') + expect(wrapper.text()).toContain('contribution.category.name.law') + expect(wrapper.text()).toContain('contribution.category.name.politics') + expect(wrapper.text()).toContain('contribution.category.name.it-and-media') + }) + + it('has group goal', () => { + expect(wrapper.text()).toContain('group.goal') + expect(wrapper.text()).toContain( + 'Investigative journalists share ideas and insights and can collaborate.', + ) + }) + + it('has ProfileList with members', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(true) + expect(profileList.text()).toContain('group.membersListTitle') + expect(profileList.text()).not.toContain( + 'group.membersListTitleNotAllowedSeeingGroupMembers', + ) + expect(profileList.text()).toContain('Peter Lustig') + expect(profileList.text()).toContain('Jenny Rostock') + expect(profileList.text()).toContain('Bob der Baumeister') + expect(profileList.text()).toContain('Huey') + }) + + it('has description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(true) + }) + + it('has profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(true) + }) + + it('has empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(true) + }) + }) + + describe('as pending member – "bob-der-baumeister"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': bobDerBaumeister, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...investigativeJournalism, + myRole: 'pending', + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has no(!) group name – to verificate the group', () => { + expect(wrapper.text()).not.toContain('Investigative Journalism') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has not(!) ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(false) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has no(!) group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(false) + expect(wrapper.text()).not.toContain('&investigative-journalism') + }) + + describe('displays not(!) group location', () => { + it('has no(!) group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(false) + }) + + it('has no(!) group location name "Hamburg"', () => { + expect(wrapper.text()).not.toContain('Hamburg') + }) + }) + + it('has no(!) group foundation', () => { + expect(wrapper.text()).not.toContain('group.foundation') + }) + + it('has no(!) members count', () => { + expect(wrapper.text()).not.toContain('group.membersCount') + }) + + it('has no(!) join/leave button', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(false) + }) + + it('has no(!) group role', () => { + expect(wrapper.text()).not.toContain('group.role') + expect(wrapper.text()).not.toContain('group.roles') + }) + + it('has no(!) group type', () => { + expect(wrapper.text()).not.toContain('group.type') + expect(wrapper.text()).not.toContain('group.types') + }) + + it('has no(!) group action radius', () => { + expect(wrapper.text()).not.toContain('group.actionRadius') + expect(wrapper.text()).not.toContain('group.actionRadii') + }) + + it('has no(!) group categories "law", "politics", "it-and-media"', () => { + expect(wrapper.text()).not.toContain('group.categories') + expect(wrapper.text()).not.toContain('contribution.category.name.law') + expect(wrapper.text()).not.toContain('contribution.category.name.politics') + expect(wrapper.text()).not.toContain('contribution.category.name.it-and-media') + }) + + it('has no(!) group goal', () => { + expect(wrapper.text()).not.toContain('group.goal') + }) + + it('has not(!) ProfileList', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(false) + }) + + it('has not(!) description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(false) + }) + + it('has no(!) profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(false) + }) + + it('has no(!) empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(false) + }) + }) + + describe('as none(!) member – "huey"', () => { + beforeEach(() => { + mocks.$store = { + getters: { + 'auth/user': huey, + 'auth/isModerator': () => false, + }, + } + wrapper = Wrapper(() => { + return { + Group: [ + { + ...investigativeJournalism, + myRole: null, + }, + ], + GroupMembers: [peterLustig, jennyRostock, bobDerBaumeister, huey], + } + }) + }) + + it('has no(!) group name – to verificate the group', () => { + expect(wrapper.text()).not.toContain('Investigative Journalism') + }) + + it('has not(!) AvatarUploader', () => { + expect(wrapper.find('.avatar-uploader').exists()).toBe(false) + }) + + it('has not(!) ProfileAvatar', () => { + expect(wrapper.find('.profile-avatar').exists()).toBe(false) + }) + + it('has not(!) GroupContentMenu', () => { + expect(wrapper.find('.group-content-menu').exists()).toBe(false) + }) + + it('has no(!) group slug', () => { + // expect(wrapper.find('[data-test="ampersand"]').exists()).toBe(false) + expect(wrapper.text()).not.toContain('&investigative-journalism') + }) + + describe('displays not(!) group location', () => { + it('has no(!) group location icon "map-marker"', () => { + expect(wrapper.find('[data-test="map-marker"]').exists()).toBe(false) + }) + + it('has no(!) group location name "Hamburg"', () => { + expect(wrapper.text()).not.toContain('Hamburg') + }) + }) + + it('has no(!) group foundation', () => { + expect(wrapper.text()).not.toContain('group.foundation') + }) + + it('has no(!) members count', () => { + expect(wrapper.text()).not.toContain('group.membersCount') + }) + + it('has no(!) join/leave button', () => { + expect(wrapper.find('.join-leave-button').exists()).toBe(false) + }) + + it('has no(!) group role', () => { + expect(wrapper.text()).not.toContain('group.role') + expect(wrapper.text()).not.toContain('group.roles') + }) + + it('has no(!) group type', () => { + expect(wrapper.text()).not.toContain('group.type') + expect(wrapper.text()).not.toContain('group.types') + }) + + it('has no(!) group action radius', () => { + expect(wrapper.text()).not.toContain('group.actionRadius') + expect(wrapper.text()).not.toContain('group.actionRadii') + }) + + it('has no(!) group categories "law", "politics", "it-and-media"', () => { + expect(wrapper.text()).not.toContain('group.categories') + expect(wrapper.text()).not.toContain('contribution.category.name.law') + expect(wrapper.text()).not.toContain('contribution.category.name.politics') + expect(wrapper.text()).not.toContain('contribution.category.name.it-and-media') + }) + + it('has no(!) group goal', () => { + expect(wrapper.text()).not.toContain('group.goal') + }) + + it('has not(!) ProfileList', () => { + const profileList = wrapper.find('.profile-list') + expect(profileList.exists()).toBe(false) + }) + + it('has not(!) description BaseCard', () => { + expect(wrapper.find('.group-description').exists()).toBe(false) + }) + + it('has no(!) profile post add button', () => { + expect(wrapper.find('.profile-post-add-button').exists()).toBe(false) + }) + + it('has no(!) empty post list', () => { + expect(wrapper.find('[data-test="icon-empty"]').exists()).toBe(false) + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/groups/_id/_slug.vue b/docs/webapp/pages/groups/_id/_slug.vue new file mode 100644 index 000000000..27b6a3cbc --- /dev/null +++ b/docs/webapp/pages/groups/_id/_slug.vue @@ -0,0 +1,681 @@ + + + + + diff --git a/docs/webapp/pages/groups/create.vue b/docs/webapp/pages/groups/create.vue new file mode 100644 index 000000000..8dd661d8d --- /dev/null +++ b/docs/webapp/pages/groups/create.vue @@ -0,0 +1,71 @@ + + + diff --git a/docs/webapp/pages/groups/edit/_id.vue b/docs/webapp/pages/groups/edit/_id.vue new file mode 100644 index 000000000..57c7d9f6a --- /dev/null +++ b/docs/webapp/pages/groups/edit/_id.vue @@ -0,0 +1,66 @@ + + + diff --git a/docs/webapp/pages/groups/edit/_id/index.vue b/docs/webapp/pages/groups/edit/_id/index.vue new file mode 100644 index 000000000..70807b338 --- /dev/null +++ b/docs/webapp/pages/groups/edit/_id/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/docs/webapp/pages/groups/edit/_id/members.vue b/docs/webapp/pages/groups/edit/_id/members.vue new file mode 100644 index 000000000..9b811d41c --- /dev/null +++ b/docs/webapp/pages/groups/edit/_id/members.vue @@ -0,0 +1,63 @@ + + + diff --git a/docs/webapp/pages/groups/index.spec.js b/docs/webapp/pages/groups/index.spec.js new file mode 100644 index 000000000..ecb28c2c9 --- /dev/null +++ b/docs/webapp/pages/groups/index.spec.js @@ -0,0 +1,38 @@ +import { mount } from '@vue/test-utils' +import groups from './index.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, + 'client-only': true, +} + +describe('groups', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(groups, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + }) +}) diff --git a/docs/webapp/pages/groups/index.vue b/docs/webapp/pages/groups/index.vue new file mode 100644 index 000000000..13002859b --- /dev/null +++ b/docs/webapp/pages/groups/index.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/docs/webapp/pages/imprint.spec.js b/docs/webapp/pages/imprint.spec.js new file mode 100644 index 000000000..5e8b57064 --- /dev/null +++ b/docs/webapp/pages/imprint.spec.js @@ -0,0 +1,47 @@ +import { mount } from '@vue/test-utils' +import Imprint from './imprint.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +const openMock = jest.fn() +delete window.open +window.open = openMock + +describe('imprint.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Imprint, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.imprint') + }) + }) +}) diff --git a/docs/webapp/pages/imprint.vue b/docs/webapp/pages/imprint.vue new file mode 100644 index 000000000..3c5fea10e --- /dev/null +++ b/docs/webapp/pages/imprint.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/index.spec.js b/docs/webapp/pages/index.spec.js new file mode 100644 index 000000000..c16560a84 --- /dev/null +++ b/docs/webapp/pages/index.spec.js @@ -0,0 +1,153 @@ +import { shallowMount, mount } from '@vue/test-utils' +import PostIndex from './index.vue' +import Vuex from 'vuex' +import HashtagsFilter from '~/components/HashtagsFilter/HashtagsFilter' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'router-link': true, + 'nuxt-link': true, + 'infinite-loading': true, +} + +describe('PostIndex', () => { + let wrapper + let Wrapper + let store + let mocks + let mutations + + beforeEach(() => { + mutations = { + 'posts/TOGGLE_ORDER': jest.fn(), + 'posts/RESET_CATEGORIES': jest.fn(), + 'posts/TOGGLE_CATEGORY': jest.fn(), + } + store = new Vuex.Store({ + getters: { + 'posts/filter': () => ({}), + 'posts/filteredPostTypes': () => [], + 'posts/articleSetInPostTypeFilter': () => false, + 'posts/eventSetInPostTypeFilter': () => false, + 'posts/eventsEnded': () => '', + 'posts/orderBy': () => 'createdAt_desc', + 'auth/user': () => { + return { id: 'u23' } + }, + }, + mutations, + }) + mocks = { + $t: (key) => key, + $filters: { + truncate: (a) => a, + removeLinks: jest.fn(), + }, + $i18n: { + locale: () => 'de', + }, + // If you are mocking router, than don't use VueRouter with localVue: https://vue-test-utils.vuejs.org/guides/using-with-vue-router.html + $router: { + history: { + push: jest.fn(), + }, + push: jest.fn(), + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $apollo: { + mutate: jest.fn().mockResolvedValue(), + queries: { + Post: { + refetch: jest.fn(), + fetchMore: jest.fn().mockResolvedValue([ + { + id: 'p23', + name: 'It is a post', + author: { + id: 'u1', + }, + }, + ]), + }, + }, + }, + $route: { + query: {}, + }, + $env: { + CATEGORIES_ACTIVE: true, + }, + } + }) + + describe('shallowMount', () => { + Wrapper = () => { + return shallowMount(PostIndex, { + store, + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('clears the search when the filter menu emits clearSearch', () => { + mocks.$route.query.hashtag = '#samplehashtag' + wrapper = Wrapper() + wrapper.findComponent(HashtagsFilter).vm.$emit('clearSearch') + expect(wrapper.vm.hashtag).toBeNull() + }) + + describe('category filter', () => { + beforeEach(() => { + mocks.$route.query = { + categoryId: 'cat3', + } + wrapper = Wrapper() + }) + + it('resets the category filter', () => { + expect(mutations['posts/RESET_CATEGORIES']).toBeCalled() + }) + + it('sets the category', () => { + expect(mutations['posts/TOGGLE_CATEGORY']).toBeCalledWith({}, 'cat3') + }) + }) + }) + + describe('mount', () => { + Wrapper = () => { + return mount(PostIndex, { + store, + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('donation-info', () => { + it('hides donation-info on default', () => { + wrapper = Wrapper() + expect(wrapper.find('.top-info-bar').exists()).toBe(false) + }) + + it('shows donation-info if "showDonations"', async () => { + wrapper = Wrapper() + await wrapper.setData({ showDonations: true }) + expect(wrapper.find('.top-info-bar').exists()).toBe(true) + }) + }) + }) +}) diff --git a/docs/webapp/pages/index.vue b/docs/webapp/pages/index.vue new file mode 100644 index 000000000..7b5c4a903 --- /dev/null +++ b/docs/webapp/pages/index.vue @@ -0,0 +1,467 @@ + + + + + diff --git a/docs/webapp/pages/login.spec.js b/docs/webapp/pages/login.spec.js new file mode 100644 index 000000000..a65fc79a0 --- /dev/null +++ b/docs/webapp/pages/login.spec.js @@ -0,0 +1,77 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import login from './login.vue' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} + +describe('Login.vue', () => { + let store + let mocks + let wrapper + let asyncData + let tosVersion + let redirect + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $i18n: { + locale: () => 'en', + }, + } + asyncData = false + tosVersion = '0.0.0' + redirect = jest.fn() + }) + + describe('mount', () => { + const Wrapper = async () => { + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { termsAndConditionsAgreedVersion: tosVersion } + }, + }, + }) + if (asyncData) { + const data = login.data ? login.data() : {} + const aData = await login.asyncData({ + store, + redirect, + }) + login.data = function () { + return { ...data, ...aData } + } + } + return mount(login, { + store, + mocks, + localVue, + stubs, + }) + } + + it('renders', async () => { + wrapper = await Wrapper() + expect(wrapper.findAll('.login-form')).toHaveLength(1) + }) + + it('renders with asyncData and wrong TOS Version', async () => { + asyncData = true + wrapper = await Wrapper() + expect(redirect).not.toHaveBeenCalled() + }) + + it('renders with asyncData and correct TOS Version', async () => { + asyncData = true + tosVersion = '0.0.4' + wrapper = await Wrapper() + expect(redirect).toBeCalledWith('/') + }) + }) +}) diff --git a/docs/webapp/pages/login.vue b/docs/webapp/pages/login.vue new file mode 100644 index 000000000..c90b29146 --- /dev/null +++ b/docs/webapp/pages/login.vue @@ -0,0 +1,40 @@ + + + diff --git a/docs/webapp/pages/logout.spec.js b/docs/webapp/pages/logout.spec.js new file mode 100644 index 000000000..460d321aa --- /dev/null +++ b/docs/webapp/pages/logout.spec.js @@ -0,0 +1,43 @@ +import { mount } from '@vue/test-utils' +import Logout from './logout.vue' + +const localVue = global.localVue + +describe('logout.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $store: { + dispatch: jest.fn(), + }, + $router: { + replace: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Logout, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('logs out and redirects to login', () => { + expect(mocks.$store.dispatch).toBeCalledWith('auth/logout') + expect(mocks.$router.replace).toBeCalledWith('/login') + }) + }) +}) diff --git a/docs/webapp/pages/logout.vue b/docs/webapp/pages/logout.vue new file mode 100644 index 000000000..c0fe2e81f --- /dev/null +++ b/docs/webapp/pages/logout.vue @@ -0,0 +1,29 @@ + + + diff --git a/docs/webapp/pages/map.spec.js b/docs/webapp/pages/map.spec.js new file mode 100644 index 000000000..a9e21c876 --- /dev/null +++ b/docs/webapp/pages/map.spec.js @@ -0,0 +1,170 @@ +// eslint-disable-next-line no-unused-vars +import mapboxgl from 'mapbox-gl' +import { mount } from '@vue/test-utils' +import VueMeta from 'vue-meta' +import Vuex from 'vuex' +import Map from './map' +import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder' + +jest.mock('@mapbox/mapbox-gl-geocoder', () => { + return jest.fn().mockImplementation(jest.fn()) +}) + +jest.mock('mapbox-gl', () => { + return { + GeolocateControl: jest.fn(), + Map: jest.fn(() => ({ + addControl: jest.fn(), + on: jest.fn(), + remove: jest.fn(), + })), + NavigationControl: jest.fn(), + Popup: jest.fn(() => { + return { + isOpen: jest.fn(), + setLngLat: jest.fn(() => { + return { + setHTML: jest.fn(() => { + return { + addTo: jest.fn(), + } + }), + } + }), + } + }), + } +}) + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +const onEventMocks = {} + +const mapOnMock = jest.fn((key, ...args) => { + onEventMocks[key] = args[args.length - 1] +}) +const mapAddControlMock = jest.fn() + +const mapMock = { + on: mapOnMock, + addControl: mapAddControlMock, + loadImage: jest.fn(), + getCanvas: jest.fn(() => { + return { + style: { + cursor: 'pointer', + }, + } + }), +} + +const stubs = { + 'client-only': true, + 'mgl-map': true, + MglFullscreenControl: true, + MglNavigationControl: true, + MglGeolocateControl: true, + MglScaleControl: true, +} + +describe('map', () => { + let wrapper + let mocks + + beforeEach(() => { + MapboxGeocoder.mockClear() + mocks = { + $t: (t) => t, + $env: { + MAPBOX_TOKEN: 'MY_MAPBOX_TOKEN', + }, + $toast: { + error: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ getters: { 'auth/user': () => false } }) + return mount(Map, { + mocks, + localVue, + stubs, + store, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('map.pageTitle') + }) + + describe('trigger map load', () => { + beforeEach(async () => { + await wrapper.find('mgl-map-stub').vm.$emit('load', { map: mapMock }) + }) + + it('initializes on style load', () => { + expect(mapOnMock).toBeCalledWith('style.load', expect.any(Function)) + }) + + it('initializes on mouseenter', () => { + expect(mapOnMock).toBeCalledWith('mouseenter', 'markers', expect.any(Function)) + }) + + it('initializes on mouseleave', () => { + expect(mapOnMock).toBeCalledWith('mouseleave', 'markers', expect.any(Function)) + }) + + it('calls add map control', () => { + expect(mapAddControlMock).toBeCalled() + }) + + describe('trigger style load event', () => { + let spy + beforeEach(() => { + spy = jest.spyOn(wrapper.vm, 'loadMarkersIconsAndAddMarkers') + onEventMocks['style.load']() + }) + + it('calls loadMarkersIconsAndAddMarkers', () => { + expect(spy).toBeCalled() + }) + }) + + describe('trigger mouse enter event', () => { + beforeEach(() => { + onEventMocks.mouseenter({ + features: [ + { + geometry: { + coordinates: [100, 200], + }, + properties: { + type: 'user', + }, + }, + ], + lngLat: { + lng: 100, + lat: 200, + }, + }) + }) + + it('works without errors and warnings', () => { + expect(true).toBe(true) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/map.vue b/docs/webapp/pages/map.vue new file mode 100644 index 000000000..2bf1817f7 --- /dev/null +++ b/docs/webapp/pages/map.vue @@ -0,0 +1,573 @@ + + + + + + diff --git a/docs/webapp/pages/moderation.spec.js b/docs/webapp/pages/moderation.spec.js new file mode 100644 index 000000000..8cdf755e9 --- /dev/null +++ b/docs/webapp/pages/moderation.spec.js @@ -0,0 +1,37 @@ +import { mount } from '@vue/test-utils' +import moderation from './moderation.vue' + +const stubs = { + 'nuxt-child': true, +} + +const localVue = global.localVue + +describe('moderation.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(moderation, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + }) +}) diff --git a/docs/webapp/pages/moderation.vue b/docs/webapp/pages/moderation.vue new file mode 100644 index 000000000..34199a144 --- /dev/null +++ b/docs/webapp/pages/moderation.vue @@ -0,0 +1,33 @@ + + + diff --git a/docs/webapp/pages/moderation/index.spec.js b/docs/webapp/pages/moderation/index.spec.js new file mode 100644 index 000000000..d5329e3b5 --- /dev/null +++ b/docs/webapp/pages/moderation/index.spec.js @@ -0,0 +1,33 @@ +import { mount } from '@vue/test-utils' +import Moderation from './index.vue' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, +} + +describe('moderation/index.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Moderation, { mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/moderation/index.vue b/docs/webapp/pages/moderation/index.vue new file mode 100644 index 000000000..abf957cac --- /dev/null +++ b/docs/webapp/pages/moderation/index.vue @@ -0,0 +1,13 @@ + + + diff --git a/docs/webapp/pages/notifications/index.spec.js b/docs/webapp/pages/notifications/index.spec.js new file mode 100644 index 000000000..d933da2c2 --- /dev/null +++ b/docs/webapp/pages/notifications/index.spec.js @@ -0,0 +1,181 @@ +import { mount } from '@vue/test-utils' +import NotificationsPage from './index.vue' + +import DropdownFilter from '~/components/DropdownFilter/DropdownFilter' +import NotificationsTable from '~/components/NotificationsTable/NotificationsTable' +import PaginationButtons from '~/components/_new/generic/PaginationButtons/PaginationButtons' + +import { markAsReadMutation, markAllAsReadMutation } from '~/graphql/User' +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'notifications-table': true, +} + +describe('PostIndex', () => { + let wrapper, Wrapper, mocks + + beforeEach(() => { + mocks = { + $t: (string) => string, + $toast: { + error: jest.fn((string) => string), + }, + $i18n: { + locale: () => 'en', + }, + $apollo: { + mutate: jest.fn().mockResolvedValueOnce({ + data: { markAsRead: { id: 'notificationSourceId', read: true } }, + }), + queries: { + notifications: { + refresh: jest.fn().mockResolvedValueOnce(), + }, + }, + }, + } + }) + + describe('mount', () => { + jest.clearAllMocks() + beforeEach(() => { + Wrapper = () => { + return mount(NotificationsPage, { + mocks, + localVue, + stubs, + }) + } + wrapper = Wrapper() + wrapper.setData({ + notifications: [ + { + id: 'mentioned_in_comment/c4-1/u1', + read: false, + reason: 'mentioned_in_comment', + createdAt: '2023-03-06T14:32:47.924Z', + updatedAt: '2023-03-06T14:32:47.924Z', + }, + { + id: 'mentioned_in_post/p8/u1', + read: false, + reason: 'mentioned_in_post', + createdAt: '2023-03-06T14:32:47.667Z', + updatedAt: '2023-03-06T14:32:47.667Z', + }, + ], + }) + }) + + it('renders a Notications header', () => { + expect(wrapper.find('.ds-heading').exists()).toBe(true) + }) + + it('renders a `dropdown-filter` component', () => { + expect(wrapper.find('.dropdown-filter').exists()).toBe(true) + }) + + it('renders a `notifications-table` component', () => { + expect(wrapper.findComponent(NotificationsTable).exists()).toBe(true) + }) + + it('renders a `mark-all-as-read` button', () => { + expect(wrapper.find('[data-test="markAllAsRead-button"]').exists()).toBe(true) + }) + + describe('filter', () => { + it('has "All" as default', () => { + expect(wrapper.find('a.dropdown-filter').text()).toBe('notifications.filterLabel.all') + }) + + describe('select Read', () => { + beforeEach(() => { + wrapper.findComponent(DropdownFilter).vm.$emit('filter', wrapper.vm.filterOptions[1]) + }) + + it('sets `notificationRead` to value of received option', () => { + expect(wrapper.vm.notificationRead).toEqual(wrapper.vm.filterOptions[1].value) + }) + + it('sets label to the label of the received option', () => { + expect(wrapper.vm.selected).toEqual(wrapper.vm.filterOptions[1].label) + }) + + it('refreshes the notifications', () => { + expect(mocks.$apollo.queries.notifications.refresh).toHaveBeenCalledTimes(1) + }) + }) + }) + + describe('markNotificationAsRead', () => { + beforeEach(() => { + wrapper + .findComponent(NotificationsTable) + .vm.$emit('markNotificationAsRead', 'notificationSourceId') + }) + + it('calls markAllAsRead mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ + mutation: markAsReadMutation(), + variables: { id: 'notificationSourceId' }, + }) + }) + + describe('error handling', () => { + beforeEach(() => { + mocks.$apollo.mutate = jest.fn().mockRejectedValueOnce({ message: 'Some error message' }) + wrapper + .findComponent(NotificationsTable) + .vm.$emit('markNotificationAsRead', 'notificationSourceId') + }) + + it('shows an error message if there is an error', () => { + expect(mocks.$toast.error).toHaveBeenCalledWith('Some error message') + }) + }) + }) + + describe('markAllNotificationAsRead', () => { + it('calls markAllNotificationAsRead mutation and refreshes notification', async () => { + wrapper.find('button[data-test="markAllAsRead-button"]').trigger('click') + await expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ + mutation: markAllAsReadMutation(), + }) + expect(mocks.$apollo.queries.notifications.refresh).toHaveBeenCalledTimes(1) + }) + + describe('error handling', () => { + it('shows an error message if there is an error', async () => { + mocks.$apollo.mutate = jest + .fn() + .mockRejectedValueOnce({ message: 'Another error message' }) + await wrapper.find('button[data-test="markAllAsRead-button"]').trigger('click') + expect(mocks.$toast.error).toHaveBeenCalledWith('Another error message') + }) + }) + }) + + describe('PaginationButtons', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('next: given a user is on the first page', () => { + it('adds offset to pageSize to skip first x notifications and display next page', () => { + wrapper.findComponent(PaginationButtons).vm.$emit('next') + expect(wrapper.vm.offset).toEqual(12) + }) + }) + + describe('back: given a user is on the third page', () => { + it('sets offset when back is emitted', () => { + wrapper.setData({ offset: 24 }) + wrapper.findComponent(PaginationButtons).vm.$emit('back') + expect(wrapper.vm.offset).toEqual(12) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/notifications/index.vue b/docs/webapp/pages/notifications/index.vue new file mode 100644 index 000000000..b3a63281a --- /dev/null +++ b/docs/webapp/pages/notifications/index.vue @@ -0,0 +1,162 @@ + + + + diff --git a/docs/webapp/pages/organization.spec.js b/docs/webapp/pages/organization.spec.js new file mode 100644 index 000000000..1829ac065 --- /dev/null +++ b/docs/webapp/pages/organization.spec.js @@ -0,0 +1,47 @@ +import { mount } from '@vue/test-utils' +import Organization from './organization.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +const openMock = jest.fn() +delete window.open +window.open = openMock + +describe('organization.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Organization, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.made') + }) + }) +}) diff --git a/docs/webapp/pages/organization.vue b/docs/webapp/pages/organization.vue new file mode 100644 index 000000000..7f6f3abd6 --- /dev/null +++ b/docs/webapp/pages/organization.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/password-reset.spec.js b/docs/webapp/pages/password-reset.spec.js new file mode 100644 index 000000000..9337d1d59 --- /dev/null +++ b/docs/webapp/pages/password-reset.spec.js @@ -0,0 +1,74 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import PasswordReset from './password-reset.vue' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'nuxt-child': true, +} + +describe('password-reset.vue', () => { + let wrapper + let mocks + let asyncData + let store + let redirect + let isLoggedIn + + beforeEach(() => { + mocks = { + $t: (t) => t, + $i18n: { + locale: () => 'en', + }, + } + asyncData = false + isLoggedIn = false + redirect = jest.fn() + }) + + describe('mount', () => { + const Wrapper = async () => { + store = new Vuex.Store({ + getters: { + 'auth/isLoggedIn': () => isLoggedIn, + }, + }) + if (asyncData) { + const data = PasswordReset.data ? PasswordReset.data() : {} + const aData = await PasswordReset.asyncData({ + store, + redirect, + }) + PasswordReset.data = function () { + return { ...data, ...aData } + } + } + return mount(PasswordReset, { + mocks, + localVue, + stubs, + }) + } + + it('renders', async () => { + wrapper = await Wrapper() + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('renders with asyncData and not loggedIn', async () => { + asyncData = true + wrapper = await Wrapper() + expect(redirect).not.toHaveBeenCalled() + }) + + it('renders with asyncData and loggedIn', async () => { + asyncData = true + isLoggedIn = true + wrapper = await Wrapper() + expect(redirect).toBeCalledWith('/') + }) + }) +}) diff --git a/docs/webapp/pages/password-reset.vue b/docs/webapp/pages/password-reset.vue new file mode 100644 index 000000000..6d67c4cae --- /dev/null +++ b/docs/webapp/pages/password-reset.vue @@ -0,0 +1,43 @@ + + + diff --git a/docs/webapp/pages/password-reset/change-password.spec.js b/docs/webapp/pages/password-reset/change-password.spec.js new file mode 100644 index 000000000..103004d67 --- /dev/null +++ b/docs/webapp/pages/password-reset/change-password.spec.js @@ -0,0 +1,35 @@ +import { mount } from '@vue/test-utils' +import changePassword from './change-password' + +const localVue = global.localVue + +describe('change-password', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $route: { + query: jest.fn().mockResolvedValue({ email: 'peter@lustig.de', nonce: '12345' }), + }, + $apollo: { + loading: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(changePassword, { mocks, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.ds-form')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/pages/password-reset/change-password.vue b/docs/webapp/pages/password-reset/change-password.vue new file mode 100644 index 000000000..3efdd001b --- /dev/null +++ b/docs/webapp/pages/password-reset/change-password.vue @@ -0,0 +1,32 @@ + + + diff --git a/docs/webapp/pages/password-reset/enter-nonce.spec.js b/docs/webapp/pages/password-reset/enter-nonce.spec.js new file mode 100644 index 000000000..2835fac4c --- /dev/null +++ b/docs/webapp/pages/password-reset/enter-nonce.spec.js @@ -0,0 +1,36 @@ +import { mount } from '@vue/test-utils' +import enterNonce from './enter-nonce.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, +} + +describe('enter-nonce.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $route: { + query: jest.fn().mockResolvedValue({ email: 'peter@lustig.de' }), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(enterNonce, { mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.ds-form')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/pages/password-reset/enter-nonce.vue b/docs/webapp/pages/password-reset/enter-nonce.vue new file mode 100644 index 000000000..ac7ef442a --- /dev/null +++ b/docs/webapp/pages/password-reset/enter-nonce.vue @@ -0,0 +1,26 @@ + + + diff --git a/docs/webapp/pages/password-reset/request.spec.js b/docs/webapp/pages/password-reset/request.spec.js new file mode 100644 index 000000000..622f377ee --- /dev/null +++ b/docs/webapp/pages/password-reset/request.spec.js @@ -0,0 +1,56 @@ +import { mount } from '@vue/test-utils' +import request from './request.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-link': true, +} + +describe('request.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + /* $toast: { + success: jest.fn(), + error: jest.fn(), + }, */ + $t: jest.fn(), + $apollo: { + loading: false, + // mutate: jest.fn().mockResolvedValue({ data: { reqestPasswordReset: true } }), + }, + /* $router: { + push: jest.fn() + } */ + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(request, { mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.ds-form')).toHaveLength(1) + }) + + it.skip('calls "handlePasswordResetRequested" on submit', async () => { + await jest.useFakeTimers() + await wrapper.find('input#email').setValue('mail@example.org') + await wrapper.findAll('.ds-form').trigger('submit') + await jest.runAllTimers() + expect(wrapper.emitted('handleSubmitted')).toEqual([[{ email: 'mail@example.org' }]]) + expect(mocks.$router.push).toHaveBeenCalledWith({ + path: 'enter-nonce', + query: { email: 'mail@example.org' }, + }) + }) + }) +}) diff --git a/docs/webapp/pages/password-reset/request.vue b/docs/webapp/pages/password-reset/request.vue new file mode 100644 index 000000000..29f8fde9d --- /dev/null +++ b/docs/webapp/pages/password-reset/request.vue @@ -0,0 +1,22 @@ + + + diff --git a/docs/webapp/pages/post/_id.spec.js.old b/docs/webapp/pages/post/_id.spec.js.old new file mode 100644 index 000000000..cb97a1776 --- /dev/null +++ b/docs/webapp/pages/post/_id.spec.js.old @@ -0,0 +1,40 @@ +import { config, mount } from '@vue/test-utils' +import _id from './_id.vue' + +const localVue = global.localVue + +config.stubs['nuxt-child'] = '' + +describe('post/_id.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $route: { + params: { + id: '1234', + slug: 'my-post', + }, + }, + $env: { + CATEGORIES_ACTIVE: false, + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(_id, { mocks, localVue }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findAll('.post-side-navigation')).toHaveLength(1) + }) + }) +}) diff --git a/docs/webapp/pages/post/_id.vue b/docs/webapp/pages/post/_id.vue new file mode 100644 index 000000000..c50ccc303 --- /dev/null +++ b/docs/webapp/pages/post/_id.vue @@ -0,0 +1,36 @@ + + + diff --git a/docs/webapp/pages/post/_id/_slug/index.spec.js b/docs/webapp/pages/post/_id/_slug/index.spec.js new file mode 100644 index 000000000..5340770ab --- /dev/null +++ b/docs/webapp/pages/post/_id/_slug/index.spec.js @@ -0,0 +1,206 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import Vue from 'vue' +import PostSlug from './index.vue' +import CommentList from '~/components/CommentList/CommentList' +import HcHashtag from '~/components/Hashtag/Hashtag' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.directive('scrollTo', jest.fn()) +localVue.use(VueMeta, { keyName: 'head' }) + +describe('PostSlug', () => { + let wrapper, Wrapper, backendData, mocks, stubs + + beforeEach(() => { + const author = { id: '1stUser', slug: '1st-user' } + backendData = { + post: { + id: '1', + author, + postType: ['Article'], + comments: [ + { + id: 'comment134', + contentExcerpt: 'this is a comment', + content: 'this is a comment', + author, + }, + ], + }, + ready: true, + } + }) + + describe('mount', () => { + Wrapper = async (opts = {}) => { + jest.useFakeTimers() + const store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { id: '1stUser' } + }, + 'auth/isModerator': () => false, + }, + }) + const propsData = {} + mocks = { + $t: jest.fn(), + $filters: { + truncate: (a) => a, + removeHtml: (a) => a, + }, + $route: { + hash: '', + params: { + slug: 'slug', + id: 'id', + }, + }, + // If you are mocking the router, then don't use VueRouter with localVue: https://vue-test-utils.vuejs.org/guides/using-with-vue-router.html + $router: { + history: { + push: jest.fn(), + }, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $apollo: { + mutate: jest.fn().mockResolvedValue(), + query: jest.fn().mockResolvedValue({ data: { PostEmotionsCountByEmotion: {} } }), + }, + $scrollTo: jest.fn(), + $env: { + CATEGORIES_ACTIVE: false, + }, + } + stubs = { + 'client-only': true, + 'nuxt-link': true, + 'router-link': true, + HcEditor: { render: () => {}, methods: { insertReply: jest.fn(() => null) } }, + ContentViewer: true, + } + const defaults = { + store, + mocks, + localVue, + propsData, + stubs, + } + const wrapper = mount(PostSlug, { + ...defaults, + ...opts, + }) + wrapper.setData(backendData) + await Vue.nextTick() + return wrapper + } + + it('has correct content', async () => { + wrapper = await Wrapper() + expect(wrapper.vm.$metaInfo.title).toBe('loading') + }) + + describe('given author is `null`', () => { + it('does not crash', async () => { + backendData = { + post: { + id: '1', + author: null, + comments: [], + postType: ['Article'], + }, + ready: true, + } + wrapper = await Wrapper() + expect(wrapper.find('.info.anonymous').exists()).toBe(true) + }) + }) + + describe('test Post callbacks', () => { + describe('deletion of Post from Page by invoking "deletePostCallback()"', () => { + beforeEach(async () => { + wrapper = await Wrapper() + await wrapper.vm.deletePostCallback() + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('does call mutation', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + }) + + it('mutation is successful', () => { + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + + it('does go to index (main) page', () => { + expect(mocks.$router.history.push).toHaveBeenCalledTimes(1) + }) + }) + }) + }) + + describe('reply method called when emitted reply received', () => { + it('CommentList', async () => { + wrapper = await Wrapper() + wrapper.findComponent(CommentList).vm.$emit('reply', { + id: 'commentAuthorId', + slug: 'ogerly', + }) + expect(stubs.HcEditor.methods.insertReply).toHaveBeenCalledWith({ + id: 'commentAuthorId', + slug: 'ogerly', + }) + }) + }) + + describe('tags shown in tag cloud', () => { + beforeEach(async () => { + // Create backendData with tags, not alphabetically sorted. + backendData.post.tags = [ + { id: 'c' }, + { id: 'qw' }, + { id: 'BQ' }, + { id: '42' }, + { id: 'Bw' }, + { id: 'a' }, + ] + + wrapper = await Wrapper() + }) + + it('are present', async () => { + // Get length from backendData and compare against number of tags present in component. + expect(wrapper.findAllComponents(HcHashtag).length).toBe(backendData.post.tags.length) + }) + + it('are alphabetically ordered', async () => { + // Get all HcHastag components + const wrappers = wrapper.findAllComponents(HcHashtag).wrappers + // Exctract ID properties (tag names) from component. + const ids = [] + wrappers.forEach((x) => { + ids.push({ + id: x.props().id, + }) + }) + // Compare extracted IDs with solution. + const idsAlphabetically = [ + { id: '42' }, + { id: 'a' }, + { id: 'BQ' }, + { id: 'Bw' }, + { id: 'c' }, + { id: 'qw' }, + ] + expect(ids).toStrictEqual(idsAlphabetically) + }) + }) + }) +}) diff --git a/docs/webapp/pages/post/_id/_slug/index.vue b/docs/webapp/pages/post/_id/_slug/index.vue new file mode 100644 index 000000000..884ddb6c2 --- /dev/null +++ b/docs/webapp/pages/post/_id/_slug/index.vue @@ -0,0 +1,445 @@ + + + + + diff --git a/docs/webapp/pages/post/create.spec.js b/docs/webapp/pages/post/create.spec.js new file mode 100644 index 000000000..45ac5f3f3 --- /dev/null +++ b/docs/webapp/pages/post/create.spec.js @@ -0,0 +1,38 @@ +import { mount } from '@vue/test-utils' +import create from './create.vue' + +const localVue = global.localVue + +describe('create.vue', () => { + let wrapper + + const mocks = { + $t: jest.fn(), + $env: { + CATEGORIES_ACTIVE: false, + }, + $route: { + query: { + groupId: null, + }, + }, + } + + const stubs = { + ContributionForm: true, + } + + describe('mount', () => { + const Wrapper = () => { + return mount(create, { mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findComponent({ name: 'ContributionForm' }).exists()).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/post/create.vue b/docs/webapp/pages/post/create.vue new file mode 100644 index 000000000..25b4ed44e --- /dev/null +++ b/docs/webapp/pages/post/create.vue @@ -0,0 +1,137 @@ + + + + diff --git a/docs/webapp/pages/post/edit/_id.spec.js b/docs/webapp/pages/post/edit/_id.spec.js new file mode 100644 index 000000000..2773483a4 --- /dev/null +++ b/docs/webapp/pages/post/edit/_id.spec.js @@ -0,0 +1,90 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import _id from './_id.vue' + +const localVue = global.localVue + +describe('post/_id.vue', () => { + let wrapper + let mocks + let store + let asyncData + let error + let userId + let authorId + + beforeEach(() => { + asyncData = false + error = jest.fn() + }) + + describe('mount', () => { + const Wrapper = async () => { + mocks = { + $t: jest.fn(), + $i18n: { + locale: () => 'en', + }, + apolloProvider: { + defaultClient: { + query: jest.fn().mockResolvedValue({ + data: { + Post: [ + { + author: { id: authorId }, + postType: ['Article'], + }, + ], + }, + }), + }, + }, + $env: { + CATEGORIES_ACTIVE: false, + }, + } + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { id: userId } + }, + }, + }) + if (asyncData) { + const data = _id.data ? _id.data() : {} + const aData = await _id.asyncData({ + app: mocks, + store, + error, + params: { id: '123' }, + }) + _id.data = function () { + return { ...data, ...aData } + } + } + return mount(_id, { store, mocks, localVue }) + } + + it('renders', async () => { + asyncData = false + wrapper = await Wrapper() + expect(wrapper.findAll('.contribution-form')).toHaveLength(1) + }) + + it('renders with asyncData of different users', async () => { + asyncData = true + authorId = 'some-author' + userId = 'some-user' + wrapper = await Wrapper() + expect(error).toBeCalledWith({ message: 'error-pages.cannot-edit-post', statusCode: 403 }) + }) + + it('renders with asyncData of same user', async () => { + asyncData = true + authorId = 'some-author' + userId = 'some-author' + wrapper = await Wrapper() + expect(error).not.toHaveBeenCalled() + }) + }) +}) diff --git a/docs/webapp/pages/post/edit/_id.vue b/docs/webapp/pages/post/edit/_id.vue new file mode 100644 index 000000000..04d120c50 --- /dev/null +++ b/docs/webapp/pages/post/edit/_id.vue @@ -0,0 +1,72 @@ + + + diff --git a/docs/webapp/pages/profile/_id.spec.js b/docs/webapp/pages/profile/_id.spec.js new file mode 100644 index 000000000..db65f403e --- /dev/null +++ b/docs/webapp/pages/profile/_id.spec.js @@ -0,0 +1,36 @@ +import { mount } from '@vue/test-utils' +import _id from './_id.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-child': true, +} + +describe('Profile _id.vue', () => { + let wrapper + let Wrapper + let mocks + + beforeEach(() => { + mocks = {} + }) + + describe('mount', () => { + Wrapper = () => { + return mount(_id, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.findComponent({ name: 'nuxt-child' }).exists()).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/profile/_id.vue b/docs/webapp/pages/profile/_id.vue new file mode 100644 index 000000000..7a771425d --- /dev/null +++ b/docs/webapp/pages/profile/_id.vue @@ -0,0 +1,34 @@ + + + diff --git a/docs/webapp/pages/profile/_id/_slug.spec.js b/docs/webapp/pages/profile/_id/_slug.spec.js new file mode 100644 index 000000000..5ab87ad3a --- /dev/null +++ b/docs/webapp/pages/profile/_id/_slug.spec.js @@ -0,0 +1,99 @@ +import { mount } from '@vue/test-utils' +import ProfileSlug from './_slug.vue' + +const localVue = global.localVue + +localVue.filter('date', (d) => d) + +const stubs = { + 'client-only': true, + 'v-popover': true, + 'nuxt-link': true, + 'infinite-loading': true, + 'follow-list': true, + 'router-link': true, +} + +describe('ProfileSlug', () => { + let wrapper + let Wrapper + let mocks + + beforeEach(() => { + mocks = { + post: { + id: 'p23', + name: 'It is a post', + }, + $t: jest.fn(), + // If you're mocking router, then don't use VueRouter with localVue: https://vue-test-utils.vuejs.org/guides/using-with-vue-router.html + $route: { + params: { + id: '4711', + slug: 'john-doe', + }, + }, + $router: { + history: { + push: jest.fn(), + }, + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $apollo: { + loading: false, + mutate: jest.fn().mockResolvedValue(), + }, + } + }) + + describe('mount', () => { + Wrapper = () => { + return mount(ProfileSlug, { + mocks, + localVue, + stubs, + }) + } + + describe('given an authenticated user', () => { + beforeEach(() => { + mocks.$filters = { + removeLinks: (c) => c, + truncate: (a) => a, + } + mocks.$store = { + getters: { + 'auth/isModerator': () => false, + 'auth/user': { + id: 'u23', + }, + }, + } + }) + + describe('given a user for the profile', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.setData({ + User: [ + { + id: 'u3', + name: 'Bob the builder', + contributionsCount: 6, + shoutedCount: 7, + commentedCount: 8, + }, + ], + }) + }) + + it('displays name of the user', () => { + expect(wrapper.text()).toContain('Bob the builder') + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/profile/_id/_slug.vue b/docs/webapp/pages/profile/_id/_slug.vue new file mode 100644 index 000000000..cef3a5d45 --- /dev/null +++ b/docs/webapp/pages/profile/_id/_slug.vue @@ -0,0 +1,475 @@ + + + + + diff --git a/docs/webapp/pages/registration.spec.js b/docs/webapp/pages/registration.spec.js new file mode 100644 index 000000000..a276c2b8b --- /dev/null +++ b/docs/webapp/pages/registration.spec.js @@ -0,0 +1,530 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import Registration from './registration.vue' +import Vue from 'vue' + +const localVue = global.localVue + +const stubs = { + 'client-only': true, + 'router-link': true, + 'nuxt-link': true, + 'infinite-loading': true, +} + +describe('Registration', () => { + let wrapper + let Wrapper + let mocks + let asyncData + let store + let redirect + let isLoggedIn + + beforeEach(() => { + mocks = { + $t: (key) => key, + $i18n: { + locale: () => 'de', + }, + $route: { + query: {}, + }, + $env: {}, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + asyncData = false + isLoggedIn = false + redirect = jest.fn() + }) + + describe('mount', () => { + Wrapper = async () => { + if (asyncData) { + store = new Vuex.Store({ + getters: { + 'auth/isLoggedIn': () => isLoggedIn, + }, + }) + const data = { + method: mocks, + overwriteSliderData: { + collectedInputData: { + inviteCode: null, + email: null, + emailSend: !!null, + nonce: null, + }, + }, + publicRegistration: false, + inviteRegistration: false, + } + const aData = await Registration.asyncData({ + store, + redirect, + }) + Registration.data = function () { + return { ...data, ...aData } + } + } else { + Registration.data = Registration.backupData ? Registration.backupData : Registration.data + } + return mount(Registration, { + mocks, + localVue, + stubs, + }) + } + + describe('no "PUBLIC_REGISTRATION" and no "INVITE_REGISTRATION"', () => { + beforeEach(() => { + mocks.$env = { + PUBLIC_REGISTRATION: false, + INVITE_REGISTRATION: false, + } + }) + + it('no "method" query in URI show "RegistrationSlideNoPublic"', async () => { + mocks.$route.query = {} + wrapper = await Wrapper() + expect(wrapper.find('.hc-empty').exists()).toBe(true) + expect(wrapper.find('.enter-invite').exists()).toBe(false) + expect(wrapper.find('.enter-email').exists()).toBe(false) + }) + + describe('"method=invite-mail" in URI show "RegistrationSlideNonce"', () => { + it('no "email" query in URI', async () => { + mocks.$route.query = { method: 'invite-mail' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').exists()).toBe(true) + }) + + describe('"email=user%40example.org" query in URI', () => { + it('have email displayed', async () => { + mocks.$route.query = { method: 'invite-mail', email: 'user@example.org' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').text()).toContain('user@example.org') + }) + + it('"nonce=64835" query in URI have nonce in input', async () => { + mocks.$route.query = { + method: 'invite-mail', + email: 'user@example.org', + nonce: '64835', + } + wrapper = await Wrapper() + await Vue.nextTick() + const form = wrapper.find('.enter-nonce') + expect(form.vm.formData.nonce).toEqual('64835') + }) + }) + }) + + describe('"method=invite-code" in URI show "RegistrationSlideNoPublic"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-code' } + wrapper = await Wrapper() + expect(wrapper.find('.hc-empty').exists()).toBe(true) + }) + + it('"inviteCode=ABCDEF" query in URI', async () => { + mocks.$route.query = { method: 'invite-code', inviteCode: 'ABCDEF' } + wrapper = await Wrapper() + expect(wrapper.find('.hc-empty').exists()).toBe(true) + }) + }) + }) + + describe('no "PUBLIC_REGISTRATION" but "INVITE_REGISTRATION"', () => { + beforeEach(() => { + mocks.$env = { + PUBLIC_REGISTRATION: false, + INVITE_REGISTRATION: true, + } + }) + + it('no "method" query in URI show "RegistrationSlideInvite"', async () => { + mocks.$route.query = {} + wrapper = await Wrapper() + expect(wrapper.find('.enter-invite').exists()).toBe(true) + expect(wrapper.find('.enter-email').exists()).toBe(false) + }) + + describe('"method=invite-mail" in URI show "RegistrationSlideNonce"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-mail' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').exists()).toBe(true) + }) + + describe('"email=user%40example.org" query in URI', () => { + it('have email displayed', async () => { + mocks.$route.query = { method: 'invite-mail', email: 'user@example.org' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').text()).toContain('user@example.org') + }) + + it('"nonce=64835" query in URI have nonce in input', async () => { + mocks.$route.query = { + method: 'invite-mail', + email: 'user@example.org', + nonce: '64835', + } + wrapper = await Wrapper() + await Vue.nextTick() + const form = wrapper.find('.enter-nonce') + expect(form.vm.formData.nonce).toEqual('64835') + }) + }) + }) + + describe('"method=invite-code" in URI show "RegistrationSlideInvite"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-code' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-invite').exists()).toBe(true) + }) + + it('"inviteCode=ABCDEF" query in URI have invite code in input', async () => { + mocks.$route.query = { method: 'invite-code', inviteCode: 'ABCDEF' } + wrapper = await Wrapper() + await Vue.nextTick() + const form = wrapper.find('.enter-invite') + expect(form.vm.formData.inviteCode).toEqual('ABCDEF') + }) + }) + }) + + describe('"PUBLIC_REGISTRATION" but no "INVITE_REGISTRATION"', () => { + beforeEach(() => { + mocks.$env = { + PUBLIC_REGISTRATION: true, + INVITE_REGISTRATION: false, + } + }) + + it('no "method" query in URI show "RegistrationSlideEmail"', async () => { + mocks.$route.query = {} + wrapper = await Wrapper() + expect(wrapper.find('.enter-email').exists()).toBe(true) + expect(wrapper.find('.enter-invite').exists()).toBe(false) + }) + + describe('"method=invite-mail" in URI show "RegistrationSlideNonce"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-mail' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').exists()).toBe(true) + }) + + describe('"email=user%40example.org" query in URI', () => { + it('have email displayed', async () => { + mocks.$route.query = { method: 'invite-mail', email: 'user@example.org' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').text()).toContain('user@example.org') + }) + + it('"nonce=64835" query in URI have nonce in input', async () => { + mocks.$route.query = { + method: 'invite-mail', + email: 'user@example.org', + nonce: '64835', + } + wrapper = await Wrapper() + await Vue.nextTick() + const form = wrapper.find('.enter-nonce') + expect(form.vm.formData.nonce).toEqual('64835') + }) + }) + }) + + describe('"method=invite-code" in URI show "RegistrationSlideEmail"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-code' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-email').exists()).toBe(true) + expect(wrapper.find('.enter-invite').exists()).toBe(false) + }) + }) + }) + + describe('"PUBLIC_REGISTRATION" and "INVITE_REGISTRATION"', () => { + beforeEach(() => { + mocks.$env = { + PUBLIC_REGISTRATION: true, + INVITE_REGISTRATION: true, + } + }) + + it('no "method" query in URI show "RegistrationSlideEmail"', async () => { + mocks.$route.query = {} + wrapper = await Wrapper() + expect(wrapper.find('.enter-email').exists()).toBe(true) + expect(wrapper.find('.enter-invite').exists()).toBe(false) + }) + + describe('"method=invite-mail" in URI show "RegistrationSlideNonce"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-mail' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').exists()).toBe(true) + }) + + describe('"email=user%40example.org" query in URI', () => { + it('have email displayed', async () => { + mocks.$route.query = { method: 'invite-mail', email: 'user@example.org' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-nonce').text()).toContain('user@example.org') + }) + + it('"nonce=64835" query in URI have nonce in input', async () => { + mocks.$route.query = { + method: 'invite-mail', + email: 'user@example.org', + nonce: '64835', + } + wrapper = await Wrapper() + await Vue.nextTick() + const form = wrapper.find('.enter-nonce') + expect(form.vm.formData.nonce).toEqual('64835') + }) + }) + }) + + describe('"method=invite-code" in URI show "RegistrationSlideInvite"', () => { + it('no "inviteCode" query in URI', async () => { + mocks.$route.query = { method: 'invite-code' } + wrapper = await Wrapper() + expect(wrapper.find('.enter-invite').exists()).toBe(true) + }) + + it('"inviteCode=ABCDEF" query in URI have invite code in input', async () => { + mocks.$route.query = { method: 'invite-code', inviteCode: 'ABCDEF' } + wrapper = await Wrapper() + await Vue.nextTick() + const form = wrapper.find('.enter-invite') + expect(form.vm.formData.inviteCode).toEqual('ABCDEF') + }) + }) + }) + + it('renders', async () => { + wrapper = await Wrapper() + expect(wrapper.classes('registration-slider')).toBe(true) + }) + + // The asyncTests must go last + it('renders with asyncData and not loggedIn', async () => { + asyncData = true + wrapper = await Wrapper() + expect(redirect).not.toHaveBeenCalled() + }) + + it('renders with asyncData and loggedIn', async () => { + asyncData = true + isLoggedIn = true + wrapper = await Wrapper() + expect(redirect).toBeCalledWith('/') + }) + + // copied from webapp/components/Registration/Signup.spec.js as testing template + // describe('with invitation code', () => { + // let action + // beforeEach(() => { + // propsData.token = '12345' + // action = async () => { + // wrapper = Wrapper() + // wrapper.find('input#email').setValue('mail@example.org') + // await wrapper.find('form').trigger('submit') + // await wrapper.html() + // } + // }) + + // describe('submit', () => { + // it('delivers invitation code to backend', async () => { + // await action() + // const expected = expect.objectContaining({ + // mutation: SignupMutation, + // variables: { email: 'mail@example.org', inviteCode: '12345' }, + // }) + // expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + // }) + + // describe('in case a user account with the email already exists', () => { + // beforeEach(() => { + // mocks.$apollo.mutate = jest + // .fn() + // .mockRejectedValue( + // new Error('UserInputError: A user account with this email already exists.'), + // ) + // }) + + // it('explains the error', async () => { + // await action() + // expect(mocks.$t).toHaveBeenCalledWith( + // 'components.registration.signup.form.errors.email-exists', + // ) + // }) + // }) + // }) + // }) + }) +}) + +// template from deleted webapp/components/Registration/CreateUserAccount.spec.js +// import { config, mount } from '@vue/test-utils' +// import Vue from 'vue' +// import { VERSION } from '~/constants/terms-and-conditions-version.js' +// import CreateUserAccount from './CreateUserAccount' +// import { SignupVerificationMutation } from '~/graphql/Registration.js' +// const localVue = global.localVue + +// config.stubs['sweetalert-icon'] = '' +// config.stubs['client-only'] = '' +// config.stubs['nuxt-link'] = '' + +// describe('CreateUserAccount', () => { +// let wrapper, Wrapper, mocks, propsData, stubs + +// beforeEach(() => { +// mocks = { +// $toast: { +// success: jest.fn(), +// error: jest.fn(), +// }, +// $t: jest.fn(), +// $apollo: { +// loading: false, +// mutate: jest.fn(), +// }, +// $i18n: { +// locale: () => 'en', +// }, +// } +// propsData = {} +// stubs = { +// LocaleSwitch: "
                                  ", +// } +// }) + +// describe('mount', () => { +// Wrapper = () => { +// return mount(CreateUserAccount, { +// mocks, +// propsData, +// localVue, +// stubs, +// }) +// } + +// describe('given email and nonce', () => { +// beforeEach(() => { +// propsData.nonce = '666777' +// propsData.email = 'sixseven@example.org' +// }) + +// it('renders a form to create a new user', () => { +// wrapper = Wrapper() +// expect(wrapper.find('.create-user-account').exists()).toBe(true) +// }) + +// describe('submit', () => { +// let action +// beforeEach(() => { +// action = async () => { +// wrapper = Wrapper() +// wrapper.find('input#name').setValue('John Doe') +// wrapper.find('input#password').setValue('hellopassword') +// wrapper.find('textarea#about').setValue('Hello I am the `about` attribute') +// wrapper.find('input#passwordConfirmation').setValue('hellopassword') +// wrapper.find('input#checkbox0').setChecked() +// wrapper.find('input#checkbox1').setChecked() +// wrapper.find('input#checkbox2').setChecked() +// wrapper.find('input#checkbox3').setChecked() +// wrapper.find('input#checkbox4').setChecked() +// await wrapper.find('form').trigger('submit') +// await wrapper.html() +// } +// }) + +// it('delivers data to backend', async () => { +// await action() +// const expected = expect.objectContaining({ +// variables: { +// about: 'Hello I am the `about` attribute', +// name: 'John Doe', +// email: 'sixseven@example.org', +// nonce: '666777', +// password: 'hellopassword', +// termsAndConditionsAgreedVersion: VERSION, +// locale: 'en', +// }, +// }) +// expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) +// }) + +// it('calls CreateUserAccount graphql mutation', async () => { +// await action() +// const expected = expect.objectContaining({ mutation: SignupVerificationMutation }) +// expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) +// }) + +// describe('in case mutation resolves', () => { +// beforeEach(() => { +// mocks.$apollo.mutate = jest.fn().mockResolvedValue({ +// data: { +// SignupVerification: { +// id: 'u1', +// name: 'John Doe', +// slug: 'john-doe', +// }, +// }, +// }) +// }) + +// it('displays success', async () => { +// await action() +// await Vue.nextTick() +// expect(mocks.$t).toHaveBeenCalledWith( +// 'components.registration.create-user-account.success', +// ) +// }) + +// describe('after timeout', () => { +// beforeEach(jest.useFakeTimers) + +// it('emits `userCreated` with { password, email }', async () => { +// await action() +// jest.runAllTimers() +// expect(wrapper.emitted('userCreated')).toEqual([ +// [ +// { +// email: 'sixseven@example.org', +// password: 'hellopassword', +// }, +// ], +// ]) +// }) +// }) +// }) + +// describe('in case mutation rejects', () => { +// beforeEach(() => { +// mocks.$apollo.mutate = jest.fn().mockRejectedValue(new Error('Invalid nonce')) +// }) + +// it('displays form errors', async () => { +// await action() +// await Vue.nextTick() +// expect(mocks.$t).toHaveBeenCalledWith( +// 'components.registration.create-user-account.error', +// ) +// }) +// }) +// }) +// }) +// }) +// }) diff --git a/docs/webapp/pages/registration.vue b/docs/webapp/pages/registration.vue new file mode 100644 index 000000000..a43810dc4 --- /dev/null +++ b/docs/webapp/pages/registration.vue @@ -0,0 +1,72 @@ + + + diff --git a/docs/webapp/pages/search/search-results.spec.js b/docs/webapp/pages/search/search-results.spec.js new file mode 100644 index 000000000..083e8a9e9 --- /dev/null +++ b/docs/webapp/pages/search/search-results.spec.js @@ -0,0 +1,63 @@ +import { mount } from '@vue/test-utils' +import searchResults from './search-results.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +const stubs = { + 'client-only': true, +} + +describe('search-results.vue', () => { + let wrapper + let mocks + let asyncData + let query + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + asyncData = false + query = {} + }) + + describe('mount', () => { + const Wrapper = async () => { + if (asyncData) { + const data = searchResults.data ? searchResults.data() : {} + const aData = await searchResults.asyncData({ + query, + }) + searchResults.data = function () { + return { ...data, ...aData } + } + } + return mount(searchResults, { mocks, localVue, stubs }) + } + + it('renders', async () => { + wrapper = await Wrapper() + expect(wrapper.findAll('.search-results')).toHaveLength(1) + }) + + it('has correct content', async () => { + wrapper = await Wrapper() + expect(wrapper.vm.$metaInfo.title).toBe('search.title') + }) + + it('renders with asyncData and no query', async () => { + asyncData = true + wrapper = await Wrapper() + expect(wrapper.vm.search).toBe(null) + }) + + it('renders with asyncData and query', async () => { + asyncData = true + query = { search: 'hello' } + wrapper = await Wrapper() + expect(wrapper.vm.search).toBe('hello') + }) + }) +}) diff --git a/docs/webapp/pages/search/search-results.vue b/docs/webapp/pages/search/search-results.vue new file mode 100644 index 000000000..fa870febb --- /dev/null +++ b/docs/webapp/pages/search/search-results.vue @@ -0,0 +1,27 @@ + + + diff --git a/docs/webapp/pages/settings.spec.js b/docs/webapp/pages/settings.spec.js new file mode 100644 index 000000000..0f3c6e22c --- /dev/null +++ b/docs/webapp/pages/settings.spec.js @@ -0,0 +1,37 @@ +import { mount } from '@vue/test-utils' +import settings from './settings.vue' + +const localVue = global.localVue + +const stubs = { + 'nuxt-child': true, +} + +describe('settings.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(settings, { + mocks, + localVue, + stubs, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + }) +}) diff --git a/docs/webapp/pages/settings.vue b/docs/webapp/pages/settings.vue new file mode 100644 index 000000000..1fce64d8f --- /dev/null +++ b/docs/webapp/pages/settings.vue @@ -0,0 +1,89 @@ + + + diff --git a/docs/webapp/pages/settings/blocked-users.spec.js b/docs/webapp/pages/settings/blocked-users.spec.js new file mode 100644 index 000000000..ee4348d0e --- /dev/null +++ b/docs/webapp/pages/settings/blocked-users.spec.js @@ -0,0 +1,71 @@ +import { mount, createLocalVue } from '@vue/test-utils' +import BlockedUsers from './blocked-users.vue' +import Styleguide from '@human-connection/styleguide' +import Filters from '~/plugins/vue-filters' +import { unblockUser } from '~/graphql/settings/BlockedUsers' + +const localVue = createLocalVue() + +localVue.use(Styleguide) +localVue.use(Filters) + +const stubs = { + 'nuxt-link': true, +} + +describe('blocked-users.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + queries: { + blockedUsers: { + refetch: jest.fn(), + }, + }, + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(BlockedUsers, { mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + describe('given a list of blocked users', () => { + beforeEach(() => { + const blockedUsers = [{ id: 'u1', name: 'John Doe', slug: 'john-doe' }] + wrapper.setData({ blockedUsers }) + }) + + describe('click unblock', () => { + beforeEach(() => { + wrapper.find('.base-button').trigger('click') + }) + + it('calls unblock mutation with given user', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ + mutation: unblockUser(), + variables: { id: 'u1' }, + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/blocked-users.vue b/docs/webapp/pages/settings/blocked-users.vue new file mode 100644 index 000000000..90519452f --- /dev/null +++ b/docs/webapp/pages/settings/blocked-users.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/docs/webapp/pages/settings/data-download.spec.js b/docs/webapp/pages/settings/data-download.spec.js new file mode 100644 index 000000000..7a71ef3f1 --- /dev/null +++ b/docs/webapp/pages/settings/data-download.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import DataDownload from './data-download.vue' + +const localVue = global.localVue + +describe('data-download.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(DataDownload, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/data-download.vue b/docs/webapp/pages/settings/data-download.vue new file mode 100644 index 000000000..ca6755bd5 --- /dev/null +++ b/docs/webapp/pages/settings/data-download.vue @@ -0,0 +1,87 @@ + + + diff --git a/docs/webapp/pages/settings/delete-account.spec.js b/docs/webapp/pages/settings/delete-account.spec.js new file mode 100644 index 000000000..c55e6bf83 --- /dev/null +++ b/docs/webapp/pages/settings/delete-account.spec.js @@ -0,0 +1,42 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import DeleteAccount from './delete-account.vue' + +const localVue = global.localVue + +describe('delete-account.vue', () => { + let wrapper + let mocks + let store + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { id: 'u343', name: 'Delete MyAccount' } + }, + }, + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(DeleteAccount, { + store, + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/delete-account.vue b/docs/webapp/pages/settings/delete-account.vue new file mode 100644 index 000000000..e1872bf4c --- /dev/null +++ b/docs/webapp/pages/settings/delete-account.vue @@ -0,0 +1,13 @@ + + + diff --git a/docs/webapp/pages/settings/embeds.spec.js b/docs/webapp/pages/settings/embeds.spec.js new file mode 100644 index 000000000..aa79d1787 --- /dev/null +++ b/docs/webapp/pages/settings/embeds.spec.js @@ -0,0 +1,42 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import Embeds from './embeds.vue' + +const localVue = global.localVue + +describe('embeds.vue', () => { + let wrapper + let mocks + let store + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { id: 'u343', name: 'Delete MyAccount', allowEmbedIframes: true } + }, + }, + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Embeds, { + store, + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/embeds.vue b/docs/webapp/pages/settings/embeds.vue new file mode 100644 index 000000000..4b0ef95d7 --- /dev/null +++ b/docs/webapp/pages/settings/embeds.vue @@ -0,0 +1,93 @@ + + + diff --git a/docs/webapp/pages/settings/index.spec.js b/docs/webapp/pages/settings/index.spec.js new file mode 100644 index 000000000..0de675840 --- /dev/null +++ b/docs/webapp/pages/settings/index.spec.js @@ -0,0 +1,309 @@ +import { mount } from '@vue/test-utils' +import index from './index.vue' +import Vuex from 'vuex' + +const localVue = global.localVue + +describe('index.vue', () => { + let store + let mocks + let getters + + beforeEach(() => { + mocks = { + $i18n: { locale: () => 'en' }, + $t: jest.fn(), + $apollo: { + mutate: jest + .fn() + .mockRejectedValue({ message: 'Ouch!' }) + .mockResolvedValueOnce({ + data: { + UpdateUser: { + id: 'u1', + slug: 'peter', + name: 'Peter', + locationName: 'Berlin', + about: 'Smth', + }, + }, + }), + query: jest + .fn() + .mockRejectedValue({ message: 'Ouch!' }) + .mockResolvedValueOnce({ + data: { + queryLocations: [ + { + place_name: 'Brazil', + id: 'country.9531777110682710', + __typename: 'LocationMapBox', + }, + { + place_name: 'United Kingdom', + id: 'country.12405201072814600', + __typename: 'LocationMapBox', + }, + { + place_name: 'Buenos Aires, Argentina', + id: 'place.7159025980072860', + __typename: 'LocationMapBox', + }, + { + place_name: 'Bandung, West Java, Indonesia', + id: 'place.8224726664248590', + __typename: 'LocationMapBox', + }, + { + place_name: 'Banten, Indonesia', + id: 'region.11849645724544000', + __typename: 'LocaLocationMapBoxtion2', + }, + ], + }, + }), + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + getters = { + 'auth/user': () => ({}), + } + }) + + describe('mount', () => { + let options + const Wrapper = () => { + store = new Vuex.Store({ + getters, + }) + return mount(index, { store, mocks, localVue, ...options }) + } + + beforeEach(() => { + options = {} + }) + + it('renders', () => { + expect(Wrapper().element.tagName).toBe('FORM') + }) + + describe('given form validation errors', () => { + beforeEach(() => { + options = { + ...options, + computed: { + formSchema: () => ({ + slug: [ + (_rule, _value, callback) => { + callback(new Error('Ouch!')) + }, + ], + }), + }, + } + }) + + it('cannot call updateUser mutation', () => { + const wrapper = Wrapper() + + wrapper.find('#name').setValue('Peter') + wrapper.find('.ds-form').trigger('submit') + + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + }) + + describe('no form validation errors', () => { + beforeEach(() => { + options = { ...options, computed: { formSchema: () => ({}) } } + }) + + describe('given a new username and hitting submit', () => { + it('calls updateUser mutation', () => { + const wrapper = Wrapper() + + wrapper.find('#name').setValue('Peter') + wrapper.find('.ds-form').trigger('submit') + + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: expect.objectContaining({ + name: 'Peter', + }), + }), + ) + }) + }) + + describe('given a new slug and hitting submit', () => { + it('calls updateUser mutation', () => { + const wrapper = Wrapper() + + wrapper.find('#slug').setValue('peter-der-lustige') + wrapper.find('.ds-form').trigger('submit') + + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: expect.objectContaining({ + slug: 'peter-der-lustige', + }), + }), + ) + }) + }) + + describe('given a new location and hitting submit', () => { + it('calls updateUser mutation', async () => { + const wrapper = Wrapper() + wrapper.setData({ + cities: [ + { + label: 'Berlin, Germany', + value: 'Berlin, Germany', + id: '1', + }, + ], + }) + await wrapper.vm.$nextTick() + wrapper.find('.ds-select-option').trigger('click') + wrapper.find('.ds-form').trigger('submit') + + await expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: expect.objectContaining({ + locationName: 'Berlin, Germany', + }), + }), + ) + }) + }) + + describe('given a new about and hitting submit', () => { + it('calls updateUser mutation', () => { + const wrapper = Wrapper() + + wrapper.find('#about').setValue('I am Peter!111elf') + wrapper.find('.ds-form').trigger('submit') + + expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: expect.objectContaining({ + about: 'I am Peter!111elf', + }), + }), + ) + }) + }) + + describe('given new username, slug, location and about then hitting submit', () => { + it('calls updateUser mutation', async () => { + const wrapper = Wrapper() + + wrapper.setData({ + cities: [ + { + label: 'Berlin, Germany', + value: 'Berlin, Germany', + id: '1', + }, + { + label: 'Hamburg, Germany', + value: 'Hamburg, Germany', + id: '2', + }, + ], + }) + await wrapper.vm.$nextTick() + wrapper.find('#name').setValue('Peter') + wrapper.find('#slug').setValue('peter-der-lustige') + wrapper.findAll('.ds-select-option').at(1).trigger('click') + wrapper.find('#about').setValue('I am Peter!111elf') + wrapper.find('.ds-form').trigger('submit') + + await expect(mocks.$apollo.mutate).toHaveBeenCalledWith( + expect.objectContaining({ + variables: expect.objectContaining({ + name: 'Peter', + slug: 'peter-der-lustige', + locationName: 'Hamburg, Germany', + about: 'I am Peter!111elf', + }), + }), + ) + }) + }) + }) + + describe('given user input on location field', () => { + it('calls queryLocations query', async () => { + const wrapper = Wrapper() + + jest.useFakeTimers() + + wrapper.find('#city').trigger('input') + wrapper.find('#city').setValue('B') + + jest.runAllTimers() + + expect(mocks.$apollo.query).toHaveBeenCalledWith( + expect.objectContaining({ + variables: expect.objectContaining({ + place: 'B', + }), + }), + ) + }) + + it('opens the dropdown', () => { + const wrapper = Wrapper() + + wrapper.find('#city').trigger('input') + wrapper.find('#city').setValue('B') + + expect(wrapper.find('.ds-select-dropdown').isVisible()).toBe(true) + }) + }) + + describe('given no user input on location field', () => { + it('cannot call queryLocations query', async () => { + const wrapper = Wrapper() + + jest.useFakeTimers() + + wrapper.find('#city').setValue('') + wrapper.find('#city').trigger('input') + + jest.runAllTimers() + + expect(mocks.$apollo.query).not.toHaveBeenCalled() + }) + + it('does not show the dropdown', () => { + const wrapper = Wrapper() + + wrapper.find('#city').setValue('') + wrapper.find('#city').trigger('input') + + expect(wrapper.find('.ds-select-is-open').exists()).toBe(false) + }) + }) + + describe('given user presses escape on location field', () => { + it('closes the dropdown', () => { + const wrapper = Wrapper() + + wrapper.find('#city').setValue('B') + wrapper.find('#city').trigger('input') + + expect(wrapper.find('.ds-select-dropdown').isVisible()).toBe(true) + + wrapper.find('#city').trigger('keyup.esc') + + expect(wrapper.find('.ds-select-is-open').exists()).toBe(false) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/index.vue b/docs/webapp/pages/settings/index.vue new file mode 100644 index 000000000..6cae7e44c --- /dev/null +++ b/docs/webapp/pages/settings/index.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/docs/webapp/pages/settings/invites.spec.js b/docs/webapp/pages/settings/invites.spec.js new file mode 100644 index 000000000..6db61d853 --- /dev/null +++ b/docs/webapp/pages/settings/invites.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import Invites from './invites.vue' + +const localVue = global.localVue + +describe('invites.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Invites, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/invites.vue b/docs/webapp/pages/settings/invites.vue new file mode 100644 index 000000000..0871084e3 --- /dev/null +++ b/docs/webapp/pages/settings/invites.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/settings/languages.spec.js b/docs/webapp/pages/settings/languages.spec.js new file mode 100644 index 000000000..5f582e4e2 --- /dev/null +++ b/docs/webapp/pages/settings/languages.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import Languages from './languages.vue' + +const localVue = global.localVue + +describe('languages.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Languages, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/languages.vue b/docs/webapp/pages/settings/languages.vue new file mode 100644 index 000000000..e60cc456a --- /dev/null +++ b/docs/webapp/pages/settings/languages.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/settings/muted-users.spec.js b/docs/webapp/pages/settings/muted-users.spec.js new file mode 100644 index 000000000..74caa8163 --- /dev/null +++ b/docs/webapp/pages/settings/muted-users.spec.js @@ -0,0 +1,71 @@ +import { mount, createLocalVue } from '@vue/test-utils' +import MutedUsers from './muted-users.vue' +import Styleguide from '@human-connection/styleguide' +import Filters from '~/plugins/vue-filters' +import { unmuteUser } from '~/graphql/settings/MutedUsers' + +const localVue = createLocalVue() + +localVue.use(Styleguide) +localVue.use(Filters) + +const stubs = { + 'nuxt-link': true, +} + +describe('muted-users.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + queries: { + mutedUsers: { + refetch: jest.fn(), + }, + }, + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(MutedUsers, { mocks, localVue, stubs }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + describe('given a list of muted users', () => { + beforeEach(() => { + const mutedUsers = [{ id: 'u1', name: 'John Doe', slug: 'john-doe' }] + wrapper.setData({ mutedUsers }) + }) + + describe('click unmute', () => { + beforeEach(() => { + wrapper.find('.base-button').trigger('click') + }) + + it('calls unmute mutation with given user', () => { + expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ + mutation: unmuteUser(), + variables: { id: 'u1' }, + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/muted-users.vue b/docs/webapp/pages/settings/muted-users.vue new file mode 100644 index 000000000..d314d31d4 --- /dev/null +++ b/docs/webapp/pages/settings/muted-users.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/docs/webapp/pages/settings/my-email-address/enter-nonce.spec.js b/docs/webapp/pages/settings/my-email-address/enter-nonce.spec.js new file mode 100644 index 000000000..3e3f032f6 --- /dev/null +++ b/docs/webapp/pages/settings/my-email-address/enter-nonce.spec.js @@ -0,0 +1,50 @@ +import { mount } from '@vue/test-utils' +import EnterNoncePage from './enter-nonce.vue' + +const localVue = global.localVue + +describe('EnterNoncePage', () => { + let mocks + let wrapper + + beforeEach(() => { + wrapper = null + mocks = { + $t: jest.fn((t) => t), + $route: { + query: {}, + }, + $router: { + replace: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(EnterNoncePage, { + mocks, + localVue, + }) + } + + describe('form', () => { + describe('submit', () => { + it('renders form errors', () => { + wrapper = Wrapper() + wrapper.find('form').trigger('submit') + expect(mocks.$router.replace).not.toHaveBeenCalled() + }) + + describe('entering a nonce', () => { + it('redirects to my-email-address/verify', () => { + wrapper = Wrapper() + wrapper.find('#nonce').setValue('foobar') + wrapper.find('form').trigger('submit') + expect(mocks.$router.replace).toHaveBeenCalled() + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/my-email-address/enter-nonce.vue b/docs/webapp/pages/settings/my-email-address/enter-nonce.vue new file mode 100644 index 000000000..8ee9d8ee7 --- /dev/null +++ b/docs/webapp/pages/settings/my-email-address/enter-nonce.vue @@ -0,0 +1,57 @@ + + + diff --git a/docs/webapp/pages/settings/my-email-address/index.spec.js b/docs/webapp/pages/settings/my-email-address/index.spec.js new file mode 100644 index 000000000..87b85a59d --- /dev/null +++ b/docs/webapp/pages/settings/my-email-address/index.spec.js @@ -0,0 +1,137 @@ +import { mount } from '@vue/test-utils' +import EmailSettingsIndexPage from './index.vue' +import Vuex from 'vuex' + +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, +} + +describe('EmailSettingsIndexPage', () => { + let store + let mocks + let wrapper + + beforeEach(() => { + wrapper = null + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { id: 'u23', email: 'some-mail@example.org' } + }, + }, + }) + mocks = { + $t: jest.fn((t) => t), + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $apollo: { + mutate: jest.fn().mockResolvedValue({ + data: { AddEmailAddress: { email: 'yet-another-email@example.org' } }, + }), + }, + $router: { + push: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(EmailSettingsIndexPage, { + store, + mocks, + localVue, + stubs, + }) + } + + describe('form', () => { + describe('submit', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + describe('email unchanged', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('form').trigger('submit') + }) + + it('displays form errors', () => { + expect(wrapper.text()).not.toContain('settings.email.submitted') + expect(wrapper.text()).toContain('settings.email.validation.same-email') + }) + + it('does not call $apollo.mutate', () => { + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + }) + + describe('enter another email', () => { + beforeEach(() => { + wrapper = Wrapper() + wrapper.find('#email').setValue('yet-ANOTHER-email@example.org') + wrapper.find('form').trigger('submit') + }) + + it('delivers email to backend', () => { + const expected = expect.objectContaining({ + variables: { email: 'yet-ANOTHER-email@example.org' }, + }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + it('no form errors', () => { + expect(wrapper.text()).not.toContain('settings.email.validation.same-email') + expect(wrapper.text()).toContain('settings.email.submitted') + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('redirects with response from backend', () => { + expect(mocks.$router.push).toHaveBeenCalledWith({ + path: 'my-email-address/enter-nonce', + query: { email: 'yet-another-email@example.org' }, + }) + }) + }) + }) + + describe('if backend responds with unique constraint violation', () => { + beforeEach(() => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ + message: 'User account already exists', + }) + wrapper = Wrapper() + wrapper.find('#email').setValue('already-taken@example.org') + wrapper.find('form').trigger('submit') + }) + + it('translates error message', () => { + expect(wrapper.text()).toContain('registration.signup.form.errors.email-exists') + }) + }) + + describe('if backend sends any other error', () => { + beforeEach(() => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ + message: 'Ouch!', + }) + wrapper = Wrapper() + wrapper.find('#email').setValue('already-taken@example.org') + wrapper.find('form').trigger('submit') + }) + + it('display a toast error', () => { + expect(mocks.$toast.error).toHaveBeenCalled() + }) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/my-email-address/index.vue b/docs/webapp/pages/settings/my-email-address/index.vue new file mode 100644 index 000000000..2d2cc406f --- /dev/null +++ b/docs/webapp/pages/settings/my-email-address/index.vue @@ -0,0 +1,114 @@ + + + diff --git a/docs/webapp/pages/settings/my-email-address/verify.spec.js b/docs/webapp/pages/settings/my-email-address/verify.spec.js new file mode 100644 index 000000000..4edbb26bd --- /dev/null +++ b/docs/webapp/pages/settings/my-email-address/verify.spec.js @@ -0,0 +1,165 @@ +import { mount } from '@vue/test-utils' +import EmailVerifyPage from './verify.vue' +import Vuex from 'vuex' + +const localVue = global.localVue + +const stubs = { + 'sweetalert-icon': true, + 'client-only': true, +} + +describe('EmailVerifyPage', () => { + let store + let mocks + let wrapper + let setUser + + beforeEach(() => { + setUser = jest.fn() + wrapper = null + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { id: 'u23', email: 'some-mail@example.org' } + }, + }, + mutations: { + 'auth/SET_USER': setUser, + }, + }) + mocks = { + $t: jest.fn((t) => t), + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + $router: { + replace: jest.fn(), + }, + store, + } + }) + + describe('asyncData', () => { + const asyncDataAction = () => { + const context = { + store: mocks.store, + query: {}, + app: { + apolloProvider: { + defaultClient: mocks.$apollo, + }, + }, + } + return EmailVerifyPage.asyncData(context) + } + + describe('backend sends successful response', () => { + beforeEach(() => { + mocks = { + ...mocks, + $apollo: { + mutate: jest.fn().mockResolvedValue({ + data: { + VerifyEmailAddress: { + email: 'verified-email@example.org', + }, + }, + }), + }, + } + }) + + it('sets `success` to true', async () => { + await expect(asyncDataAction()).resolves.toEqual({ + success: true, + }) + }) + + it("updates current user's email", async () => { + await asyncDataAction() + expect(setUser).toHaveBeenCalledWith({}, { id: 'u23', email: 'verified-email@example.org' }) + }) + }) + + describe('backend sends unsuccessful response', () => { + beforeEach(() => { + mocks = { + ...mocks, + $apollo: { + mutate: jest.fn().mockRejectedValue({ + data: { VerifyEmailAddress: null }, + errors: [{ message: 'User account already exists with that email' }], + }), + }, + } + }) + + it('sets `success` to false', async () => { + await expect(asyncDataAction()).resolves.toEqual({ + success: false, + }) + }) + + it('does not updates current user', async () => { + await asyncDataAction() + expect(setUser).not.toHaveBeenCalled() + }) + }) + }) + + describe('mount', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + const Wrapper = () => { + return mount(EmailVerifyPage, { + store, + mocks, + localVue, + stubs, + }) + } + + describe('given successful verification', () => { + beforeEach(() => { + mocks = { ...mocks, success: true } + wrapper = Wrapper() + }) + + it('shows success message', () => { + expect(wrapper.text()).toContain('settings.email.change-successful') + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('redirects to email settings page', () => { + expect(mocks.$router.replace).toHaveBeenCalledWith({ + name: 'settings-my-email-address', + }) + }) + }) + }) + + describe('given unsuccessful verification', () => { + beforeEach(() => { + mocks = { ...mocks, success: false } + wrapper = Wrapper() + }) + + it('shows success message', () => { + expect(wrapper.text()).toContain('settings.email.verification-error') + }) + + describe('after timeout', () => { + beforeEach(jest.runAllTimers) + + it('does not redirect', () => { + expect(mocks.$router.replace).not.toHaveBeenCalledWith() + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/my-email-address/verify.vue b/docs/webapp/pages/settings/my-email-address/verify.vue new file mode 100644 index 000000000..cfab25f0a --- /dev/null +++ b/docs/webapp/pages/settings/my-email-address/verify.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/docs/webapp/pages/settings/my-organizations.spec.js b/docs/webapp/pages/settings/my-organizations.spec.js new file mode 100644 index 000000000..b6d81bc3d --- /dev/null +++ b/docs/webapp/pages/settings/my-organizations.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import MyOrganizations from './my-organizations.vue' + +const localVue = global.localVue + +describe('my-organizations.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(MyOrganizations, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('ARTICLE') + }) + }) +}) diff --git a/docs/webapp/pages/settings/my-organizations.vue b/docs/webapp/pages/settings/my-organizations.vue new file mode 100644 index 000000000..194fa3f7e --- /dev/null +++ b/docs/webapp/pages/settings/my-organizations.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/settings/my-social-media.spec.js b/docs/webapp/pages/settings/my-social-media.spec.js new file mode 100644 index 000000000..5d2b06700 --- /dev/null +++ b/docs/webapp/pages/settings/my-social-media.spec.js @@ -0,0 +1,178 @@ +import { mount } from '@vue/test-utils' +import flushPromises from 'flush-promises' +import MySocialMedia from './my-social-media.vue' +import Vuex from 'vuex' +import Vue from 'vue' + +const localVue = global.localVue + +describe('my-social-media.vue', () => { + let wrapper + let mocks + let getters + let mutations + const socialMediaUrl = 'https://freeradical.zone/@mattwr18' + const newSocialMediaUrl = 'https://twitter.com/mattwr18' + const faviconUrl = 'https://freeradical.zone/favicon.ico' + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + $toast: { + error: jest.fn(), + success: jest.fn(), + }, + } + getters = { + 'auth/user': () => { + return {} + }, + } + mutations = { + 'modal/SET_OPEN': jest.fn().mockResolvedValueOnce(), + } + }) + + describe('mount', () => { + let form, input + const Wrapper = () => { + const store = new Vuex.Store({ + getters, + mutations, + }) + return mount(MySocialMedia, { store, mocks, localVue }) + } + + describe('adding social media link', () => { + beforeEach(async () => { + wrapper = Wrapper() + form = wrapper.find('form') + form.trigger('submit') + await Vue.nextTick() + input = wrapper.find('input#editSocialMedia') + }) + + it('requires the link to be a valid url', async () => { + input.setValue('some value') + form.trigger('submit') + await Vue.nextTick() + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('displays an error message when not saved successfully', async () => { + mocks.$apollo.mutate.mockRejectedValue({ message: 'Ouch!' }) + input.setValue(newSocialMediaUrl) + form.trigger('submit') + await Vue.nextTick() + await flushPromises() + expect(mocks.$toast.error).toHaveBeenCalledTimes(1) + }) + + describe('success', () => { + beforeEach(async () => { + mocks.$apollo.mutate.mockResolvedValue({ + data: { CreateSocialMedia: { id: 's2', url: newSocialMediaUrl } }, + }) + input.setValue(newSocialMediaUrl) + form.trigger('submit') + await Vue.nextTick() + }) + + it('sends the new url to the backend', () => { + const expected = expect.objectContaining({ + variables: { url: newSocialMediaUrl }, + }) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + it('displays a success message', async () => { + await flushPromises() + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + + it('switches back to list', async () => { + await flushPromises() + const submitButton = wrapper.find('.base-button[data-test="add-save-button"]') + expect(submitButton.text()).not.toContain('settings.social-media.submit') + }) + }) + }) + + describe('given existing social media links', () => { + beforeEach(() => { + getters = { + 'auth/user': () => ({ + socialMedia: [{ id: 's1', url: socialMediaUrl, favicon: faviconUrl }], + }), + } + wrapper = Wrapper() + form = wrapper.find('form') + }) + + describe('for each link it', () => { + it('displays the favicon', () => { + expect(wrapper.find(`img[src="${faviconUrl}"]`).exists()).toBe(true) + }) + + it('displays the url', () => { + expect(wrapper.find(`a[href="${socialMediaUrl}"]`).exists()).toBe(true) + }) + }) + + it('does not accept a duplicate url', async () => { + form.trigger('submit') + await Vue.nextTick() + wrapper.find('input#editSocialMedia').setValue(socialMediaUrl) + form.trigger('submit') + await Vue.nextTick() + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + describe('editing social media link', () => { + beforeEach(async () => { + const editButton = wrapper.find('.base-button[data-test="edit-button"]') + editButton.trigger('click') + await Vue.nextTick() + input = wrapper.find('input#editSocialMedia') + }) + + it('sends the new url to the backend', async () => { + const expected = expect.objectContaining({ + variables: { id: 's1', url: newSocialMediaUrl }, + }) + input.setValue(newSocialMediaUrl) + form.trigger('submit') + await Vue.nextTick() + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + }) + + // TODO: confirm deletion modal is not present + describe.skip('deleting social media link', () => { + beforeEach(async () => { + const deleteButton = wrapper.find('.base-button[data-test="delete-button"]') + deleteButton.trigger('click') + await Vue.nextTick() + // wrapper.find('button.cancel').trigger('click') + // await Vue.nextTick() + }) + + it('sends the link id to the backend', () => { + const expected = expect.objectContaining({ + variables: { id: 's1' }, + }) + expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1) + expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected) + }) + + it('displays a success message', async () => { + await flushPromises() + expect(mocks.$toast.success).toHaveBeenCalledTimes(1) + }) + }) + }) + }) +}) diff --git a/docs/webapp/pages/settings/my-social-media.vue b/docs/webapp/pages/settings/my-social-media.vue new file mode 100644 index 000000000..aa303e74c --- /dev/null +++ b/docs/webapp/pages/settings/my-social-media.vue @@ -0,0 +1,193 @@ + + + diff --git a/docs/webapp/pages/settings/notifications.spec.js b/docs/webapp/pages/settings/notifications.spec.js new file mode 100644 index 000000000..855505fe2 --- /dev/null +++ b/docs/webapp/pages/settings/notifications.spec.js @@ -0,0 +1,67 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import Notifications from './notifications.vue' + +const localVue = global.localVue + +describe('notifications.vue', () => { + let wrapper + let mocks + let store + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + } + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { + id: 'u343', + name: 'MyAccount', + sendNotificationEmails: true, + } + }, + }, + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Notifications, { + store, + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + + it('clicking on submit changes notifyByEmail to false', async () => { + await wrapper.find('#send-email').setChecked(false) + await wrapper.find('.base-button').trigger('click') + expect(wrapper.vm.notifyByEmail).toBe(false) + }) + + it('clicking on submit with a server error shows a toast and notifyByEmail is still true', async () => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ message: 'Ouch!' }) + await wrapper.find('#send-email').setChecked(false) + await wrapper.find('.base-button').trigger('click') + expect(mocks.$toast.error).toHaveBeenCalledWith('Ouch!') + expect(wrapper.vm.notifyByEmail).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/notifications.vue b/docs/webapp/pages/settings/notifications.vue new file mode 100644 index 000000000..a2828a1a9 --- /dev/null +++ b/docs/webapp/pages/settings/notifications.vue @@ -0,0 +1,63 @@ + + + diff --git a/docs/webapp/pages/settings/privacy.spec.js b/docs/webapp/pages/settings/privacy.spec.js new file mode 100644 index 000000000..4cabf5e50 --- /dev/null +++ b/docs/webapp/pages/settings/privacy.spec.js @@ -0,0 +1,67 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import Privacy from './privacy.vue' + +const localVue = global.localVue + +describe('privacy.vue', () => { + let wrapper + let mocks + let store + + beforeEach(() => { + mocks = { + $t: jest.fn(), + $apollo: { + mutate: jest.fn(), + }, + $toast: { + success: jest.fn(), + error: jest.fn(), + }, + } + store = new Vuex.Store({ + getters: { + 'auth/user': () => { + return { + id: 'u343', + name: 'MyAccount', + showShoutsPublicly: true, + } + }, + }, + }) + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Privacy, { + store, + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + + it('clicking on submit changes shoutsAllowed to false', async () => { + await wrapper.find('#allow-shouts').setChecked(false) + await wrapper.find('.base-button').trigger('click') + expect(wrapper.vm.shoutsAllowed).toBe(false) + }) + + it('clicking on submit with a server error shows a toast and shoutsAllowed is still true', async () => { + mocks.$apollo.mutate = jest.fn().mockRejectedValue({ message: 'Ouch!' }) + await wrapper.find('#allow-shouts').setChecked(false) + await wrapper.find('.base-button').trigger('click') + expect(mocks.$toast.error).toHaveBeenCalledWith('Ouch!') + expect(wrapper.vm.shoutsAllowed).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/privacy.vue b/docs/webapp/pages/settings/privacy.vue new file mode 100644 index 000000000..71fd31946 --- /dev/null +++ b/docs/webapp/pages/settings/privacy.vue @@ -0,0 +1,61 @@ + + + diff --git a/docs/webapp/pages/settings/security.spec.js b/docs/webapp/pages/settings/security.spec.js new file mode 100644 index 000000000..92ef93a0e --- /dev/null +++ b/docs/webapp/pages/settings/security.spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils' +import Security from './security.vue' + +const localVue = global.localVue + +describe('security.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Security, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.classes('base-card')).toBe(true) + }) + }) +}) diff --git a/docs/webapp/pages/settings/security.vue b/docs/webapp/pages/settings/security.vue new file mode 100644 index 000000000..e8754ada9 --- /dev/null +++ b/docs/webapp/pages/settings/security.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/pages/support.spec.js b/docs/webapp/pages/support.spec.js new file mode 100644 index 000000000..57e729796 --- /dev/null +++ b/docs/webapp/pages/support.spec.js @@ -0,0 +1,47 @@ +import { mount } from '@vue/test-utils' +import Support from './support.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +const openMock = jest.fn() +delete window.open +window.open = openMock + +describe('support.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(Support, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.support') + }) + }) +}) diff --git a/docs/webapp/pages/support.vue b/docs/webapp/pages/support.vue new file mode 100644 index 000000000..e157693c7 --- /dev/null +++ b/docs/webapp/pages/support.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/pages/terms-and-conditions-confirm.spec.js b/docs/webapp/pages/terms-and-conditions-confirm.spec.js new file mode 100644 index 000000000..c8faeb6f1 --- /dev/null +++ b/docs/webapp/pages/terms-and-conditions-confirm.spec.js @@ -0,0 +1,77 @@ +import Vuex from 'vuex' +import { mount } from '@vue/test-utils' +import TermsAndConditionsConfirm from './terms-and-conditions-confirm.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +const stubs = { + 'nuxt-link': true, +} + +describe('terms-and-conditions-confirm.vue', () => { + let wrapper + let mocks + let store + let asyncData + let tosAgree + let redirect + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + asyncData = false + tosAgree = false + redirect = jest.fn() + }) + + describe('mount', () => { + const Wrapper = async () => { + store = new Vuex.Store({ + getters: { + 'auth/termsAndConditionsAgreed': () => tosAgree, + }, + }) + if (asyncData) { + const data = TermsAndConditionsConfirm.data ? TermsAndConditionsConfirm.data() : {} + const aData = await TermsAndConditionsConfirm.asyncData({ + store, + redirect, + }) + TermsAndConditionsConfirm.data = function () { + return { ...data, ...aData } + } + } + return mount(TermsAndConditionsConfirm, { + mocks, + localVue, + stubs, + }) + } + + it('renders', async () => { + wrapper = await Wrapper() + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', async () => { + wrapper = await Wrapper() + expect(wrapper.vm.$metaInfo.title).toBe('termsAndConditions.newTermsAndConditions') + }) + + it('renders with asyncData and did not agree to TOS', async () => { + asyncData = true + wrapper = await Wrapper() + expect(redirect).not.toHaveBeenCalled() + }) + + it('renders with asyncData and did agree to TOS', async () => { + asyncData = true + tosAgree = true + wrapper = await Wrapper() + expect(redirect).toBeCalledWith('/') + }) + }) +}) diff --git a/docs/webapp/pages/terms-and-conditions-confirm.vue b/docs/webapp/pages/terms-and-conditions-confirm.vue new file mode 100644 index 000000000..5eef8ce66 --- /dev/null +++ b/docs/webapp/pages/terms-and-conditions-confirm.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/docs/webapp/pages/terms-and-conditions.spec.js b/docs/webapp/pages/terms-and-conditions.spec.js new file mode 100644 index 000000000..cc3b5b435 --- /dev/null +++ b/docs/webapp/pages/terms-and-conditions.spec.js @@ -0,0 +1,43 @@ +import { mount } from '@vue/test-utils' +import TermsAndConditions from './terms-and-conditions.vue' +import VueMeta from 'vue-meta' + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +// avoid: 'Error: Not implemented: navigation (except hash changes)', see https://stackoverflow.com/questions/54090231/how-to-fix-error-not-implemented-navigation-except-hash-changes +const assignMock = jest.fn() +delete window.location +window.location = { assign: assignMock } + +describe('terms-and-conditions.vue', () => { + let wrapper + let mocks + + beforeEach(() => { + mocks = { + $t: (t) => t, + } + }) + + describe('mount', () => { + const Wrapper = () => { + return mount(TermsAndConditions, { + mocks, + localVue, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('site.termsAndConditions') + }) + }) +}) diff --git a/docs/webapp/pages/terms-and-conditions.vue b/docs/webapp/pages/terms-and-conditions.vue new file mode 100644 index 000000000..341de62db --- /dev/null +++ b/docs/webapp/pages/terms-and-conditions.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/webapp/plugins/apollo-config.js b/docs/webapp/plugins/apollo-config.js new file mode 100644 index 000000000..51dac51c5 --- /dev/null +++ b/docs/webapp/plugins/apollo-config.js @@ -0,0 +1,25 @@ +import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory' +import introspectionQueryResultData from './apollo-config/fragmentTypes.json' +import metadata from '~/constants/metadata' + +const fragmentMatcher = new IntrospectionFragmentMatcher({ + introspectionQueryResultData, +}) + +export default ({ req, nuxtState }) => { + const { env } = req || nuxtState + const backendUrl = env.GRAPHQL_URI || 'http://localhost:4000' + + return { + wsEndpoint: env.WEBSOCKETS_URI, + httpEndpoint: process.server ? backendUrl : '/api', + httpLinkOptions: { + credentials: 'same-origin', + }, + credentials: true, + tokenName: metadata.COOKIE_NAME, + persisting: false, + websocketsOnly: false, + cache: new InMemoryCache({ fragmentMatcher }), + } +} diff --git a/docs/webapp/plugins/apollo-config/fragmentTypes.json b/docs/webapp/plugins/apollo-config/fragmentTypes.json new file mode 100644 index 000000000..777189693 --- /dev/null +++ b/docs/webapp/plugins/apollo-config/fragmentTypes.json @@ -0,0 +1,18 @@ +{ + "__schema": { + "types": [ + { + "kind": "UNION", + "name": "NotificationSource", + "possibleTypes": [ + { + "name": "Post" + }, + { + "name": "Comment" + } + ] + } + ] + } +} diff --git a/docs/webapp/plugins/axios.js b/docs/webapp/plugins/axios.js new file mode 100644 index 000000000..04dd68a2e --- /dev/null +++ b/docs/webapp/plugins/axios.js @@ -0,0 +1,8 @@ +export default ({ $axios, app }) => { + $axios.onRequest((config) => { + /* eslint-disable-next-line no-console */ + console.log(Object.keys(app)) + // add current ui language + config.headers['Accept-Language'] = app.$i18n.locale() + }) +} diff --git a/docs/webapp/plugins/base-components.js b/docs/webapp/plugins/base-components.js new file mode 100644 index 000000000..90cb301bc --- /dev/null +++ b/docs/webapp/plugins/base-components.js @@ -0,0 +1,11 @@ +import Vue from 'vue' + +const componentFiles = require.context('../components/_new/generic', true, /Base[a-zA-Z]+\.vue/) + +componentFiles.keys().forEach((fileName) => { + const component = componentFiles(fileName) + const componentConfig = component.default || component + const componentName = component.name || fileName.replace(/^.+\//, '').replace('.vue', '') + + Vue.component(componentName, componentConfig) +}) diff --git a/docs/webapp/plugins/i18n.js b/docs/webapp/plugins/i18n.js new file mode 100644 index 000000000..1382c2728 --- /dev/null +++ b/docs/webapp/plugins/i18n.js @@ -0,0 +1,120 @@ +import Vue from 'vue' +import vuexI18n from 'vuex-i18n/dist/vuex-i18n.umd.js' +import { isEmpty, find } from 'lodash' +import locales from '~/locales' +import htmlTranslations from '~/locales/html/' + +const registerTranslation = ({ Vue, locale }) => { + const translation = require(`~/locales/${locale}.json`) + translation.html = htmlTranslations[locale] + Vue.i18n.add(locale, translation) +} + +/** + * TODO: Refactor and simplify browser detection + * and implement the user preference logic + */ +export default ({ app, req, cookie, store }) => { + const debug = app.$env && app.$env.NODE_ENV !== 'production' + const key = 'locale' + + const changeHandler = async (mutation) => { + if (process.server) return + + const localeInStore = mutation.payload.locale + let cookieExists = true + let localeInCookies = await app.$cookies.get(key) + if (!localeInCookies) { + cookieExists = false + localeInCookies = navigator.language.split('-')[0] // get browser language + } + const isLocaleStoreSameAsCookies = localeInStore === localeInCookies + + // cookie has to be set, otherwise Cypress test does not work + if (cookieExists && isLocaleStoreSameAsCookies) { + return + } + + const expires = new Date() + expires.setDate(expires.getDate() + app.$env && app.$env.COOKIE_EXPIRE_TIME) + app.$cookies.set(key, localeInStore, { + expires, + // maxAge: app.$env.COOKIE_EXPIRE_TIME * 60 * 60 * 24, // days to seconds + sameSite: 'lax', // for the meaning see https://www.thinktecture.com/de/identity/samesite/samesite-in-a-nutshell/ + }) + if (!app.$i18n.localeExists(localeInStore)) { + import(`~/locales/${localeInStore}.json`).then((res) => { + app.$i18n.add(localeInStore, res.default) + }) + } + + const user = store.getters['auth/user'] + const token = store.getters['auth/token'] + // persist language if it differs from last value + if (user && user._id && token) { + // TODO: SAVE LOCALE + // store.dispatch('usersettings/patch', { + // uiLanguage: localeInStore + // }, { root: true }) + } + } + + // const i18nStore = new Vuex.Store({ + // strict: debug + // }) + + Vue.use(vuexI18n.plugin, store, { + onTranslationNotFound: function (locale, key) { + if (debug) { + /* eslint-disable-next-line no-console */ + console.warn(`vuex-i18n :: Key '${key}' not found for locale '${locale}'`) + } + }, + }) + + let userLocale = 'en' + const localeCookie = app.$cookies.get(key) + /* const userSettings = store.getters['auth/userSettings'] + if (userSettings && userSettings.uiLanguage) { + // try to get saved user preference + userLocale = userSettings.uiLanguage + } else */ + if (!isEmpty(localeCookie)) { + userLocale = localeCookie + } else { + try { + userLocale = process.browser + ? navigator.language || navigator.userLanguage + : req.headers['accept-language'].split(',')[0] + } catch (err) {} + + if (userLocale && !isEmpty(userLocale.language)) { + userLocale = userLocale.language.substr(0, 2) + } + } + + const availableLocales = locales.filter((lang) => !!lang.enabled) + const locale = find(availableLocales, ['code', userLocale]) ? userLocale : 'en' + + // register the fallback locales + registerTranslation({ Vue, locale: 'en' }) + if (locale !== 'en') { + registerTranslation({ Vue, locale }) + } + + // Set the start locale to use + Vue.i18n.set(locale) + Vue.i18n.fallback('en') + + if (process.browser) { + store.subscribe((mutation) => { + if (mutation.type === 'i18n/SET_LOCALE') { + changeHandler(mutation) + } + }) + } + + app.$i18n = Vue.i18n + + return store +} diff --git a/docs/webapp/plugins/izi-toast.js b/docs/webapp/plugins/izi-toast.js new file mode 100644 index 000000000..8bb41c961 --- /dev/null +++ b/docs/webapp/plugins/izi-toast.js @@ -0,0 +1,13 @@ +import Vue from 'vue' +import VueIziToast from 'vue-izitoast' + +import 'izitoast/dist/css/iziToast.css' + +export default ({ app }) => { + Vue.use(VueIziToast, { + position: 'bottomRight', + transitionIn: 'bounceInLeft', + layout: 2, + theme: 'dark', + }) +} diff --git a/docs/webapp/plugins/keep-alive.js b/docs/webapp/plugins/keep-alive.js new file mode 100644 index 000000000..ad5e5b27c --- /dev/null +++ b/docs/webapp/plugins/keep-alive.js @@ -0,0 +1,31 @@ +import Vue from 'vue' + +let lastRoute +const keepAliveHook = {} + +if (!process.server) { + keepAliveHook.install = (Vue) => { + const keepAlivePages = process.env.keepAlivePages || [] + + Vue.mixin({ + // Save route if this instance is a page (has metaInfo) + mounted() { + if (this.$metaInfo) { + lastRoute = this.$route.name + } + }, + activated() { + if (this.$metaInfo) { + lastRoute = this.$route.name + } + }, + deactivated() { + // If this is a page and we don't want it to be kept alive + if (this.$metaInfo && !keepAlivePages.includes(lastRoute)) { + this.$destroy() + } + }, + }) + } + Vue.use(keepAliveHook) +} diff --git a/docs/webapp/plugins/styleguide-dev.js b/docs/webapp/plugins/styleguide-dev.js new file mode 100644 index 000000000..4cffe028f --- /dev/null +++ b/docs/webapp/plugins/styleguide-dev.js @@ -0,0 +1,4 @@ +import Vue from 'vue' +import Styleguide from '@@' + +Vue.use(Styleguide) diff --git a/docs/webapp/plugins/styleguide.js b/docs/webapp/plugins/styleguide.js new file mode 100644 index 000000000..b04724c37 --- /dev/null +++ b/docs/webapp/plugins/styleguide.js @@ -0,0 +1,5 @@ +import Vue from 'vue' +import Styleguide from '@human-connection/styleguide' +import '@human-connection/styleguide/dist/system.css' + +Vue.use(Styleguide) diff --git a/docs/webapp/plugins/v-mapbox.js b/docs/webapp/plugins/v-mapbox.js new file mode 100644 index 000000000..3d45f16ca --- /dev/null +++ b/docs/webapp/plugins/v-mapbox.js @@ -0,0 +1,35 @@ +// Vue2 + Mapbox Reference: https://github.com/geospoc/v-mapbox/issues/702 +import Vue from 'vue' +import { + MglGeojsonLayer, + MglVectorLayer, + MglMap, + MglMarker, + MglPopup, + MglAttributionControl, + MglScaleControl, + MglNavigationControl, + MglGeolocateControl, + MglFullscreenControl, +} from 'v-mapbox' + +// Map +Vue.component('MglMap', MglMap) + +// overview of all: https://github.com/geospoc/v-mapbox/tree/v1.11.2/src/components +// mapbox: https://docs.mapbox.com/mapbox-gl-js/api/markers/ + +// Controls +Vue.component('MglAttributionControl', MglAttributionControl) +Vue.component('MglScaleControl', MglScaleControl) +Vue.component('MglNavigationControl', MglNavigationControl) +Vue.component('MglGeolocateControl', MglGeolocateControl) +Vue.component('MglFullscreenControl', MglFullscreenControl) + +// Layers +Vue.component('MglGeojsonLayer', MglGeojsonLayer) +Vue.component('MglVectorLayer', MglVectorLayer) + +// Marker & Popup +Vue.component('MglMarker', MglMarker) +Vue.component('MglPopup', MglPopup) diff --git a/docs/webapp/plugins/v-tooltip.js b/docs/webapp/plugins/v-tooltip.js new file mode 100644 index 000000000..0c0cbc8d6 --- /dev/null +++ b/docs/webapp/plugins/v-tooltip.js @@ -0,0 +1,16 @@ +import Vue from 'vue' +import VTooltip from 'v-tooltip' + +Vue.use(VTooltip, { + defaultDelay: { + show: 750, + hide: 50, + }, + defaultOffset: 2, + defaultPopperOptions: { + removeOnDestroy: true, + }, + popover: { + // defaultArrowClass: 'm-dropdown__arrow' + }, +}) diff --git a/docs/webapp/plugins/vue-advanced-chat.js b/docs/webapp/plugins/vue-advanced-chat.js new file mode 100644 index 000000000..487f1d213 --- /dev/null +++ b/docs/webapp/plugins/vue-advanced-chat.js @@ -0,0 +1,6 @@ +import { register } from 'vue-advanced-chat' +export default ({ app }) => { + if (process.client) { + register() + } +} diff --git a/docs/webapp/plugins/vue-directives.js b/docs/webapp/plugins/vue-directives.js new file mode 100644 index 000000000..d41f35a0e --- /dev/null +++ b/docs/webapp/plugins/vue-directives.js @@ -0,0 +1,36 @@ +import Vue from 'vue' + +export default ({ app }) => { + Vue.directive('focus', { + // When the bound element is inserted into the DOM... + inserted: (el, binding) => { + // Focus the element + Vue.nextTick(() => { + if (binding.value !== false) { + const target = el instanceof HTMLInputElement ? el : el.querySelector('input') + if (target) { + target.focus() + } + } + }) + }, + }) + + Vue.directive('router-link', { + bind: (el, binding) => { + binding.clickEventListener = (e) => { + if (!e.metaKey && !e.ctrlKey) { + e.preventDefault() + app.router.push(el.getAttribute('href')) + } + } + el.addEventListener('click', binding.clickEventListener) + }, + unbind: (el, binding) => { + // cleanup + if (binding.clickEventListener) { + el.removeEventListener('click', binding.clickEventListener) + } + }, + }) +} diff --git a/docs/webapp/plugins/vue-filters.js b/docs/webapp/plugins/vue-filters.js new file mode 100644 index 000000000..5368385b7 --- /dev/null +++ b/docs/webapp/plugins/vue-filters.js @@ -0,0 +1,113 @@ +import Vue from 'vue' +import format from 'date-fns/format' +import accounting from 'accounting' +import trunc from 'trunc-html' +import { getDateFnsLocale } from '~/locales' + +export default ({ app = {} }) => { + app.$filters = Object.assign(app.$filters || {}, { + date: (value, fmt = 'dd. MMM yyyy') => { + if (!value) return '' + return format(new Date(value), fmt, { + locale: getDateFnsLocale(app), + }) + }, + dateTime: (value, fmt = 'dd. MMM yyyy HH:mm') => { + if (!value) return '' + return format(new Date(value), fmt, { + locale: getDateFnsLocale(app), + }) + }, + number: (value, precision = 2, thousands = '.', decimals = ',', fallback = null) => { + if (isNaN(value) && fallback) { + return fallback + } + return accounting.formatNumber(value || 0, precision, thousands, decimals) + }, + // doesn't truncate in the middle of words + truncate: (value = '', length = -1) => { + if (!value || typeof value !== 'string' || value.length <= 0) { + return '' + } + if (length <= 0) { + return value + } + return trunc(value, length).html + }, + // truncates in the middle of words + truncateStr: (value = '', length = -1) => { + if (!value || typeof value !== 'string' || value.length <= 0) { + return '' + } + if (length <= 0) { + return value + } + if (length < value.length) { + return value.substring(0, length) + '…' + } + return value + }, + list: (value, glue = ', ', truncate = 0) => { + if (!Array.isArray(value) || !value.length) { + return '' + } + if (truncate > 0) { + value = value.map((item) => { + return app.$filters.truncate(item, truncate) + }) + } + return value.join(glue) + }, + listByKey: (values, key, glue, truncate) => { + return app.$filters.list( + values.map((item) => item[key]), + glue, + truncate, + ) + }, + camelCase: (value = '') => { + return value + .replace(/(?:^\w|[A-Za-z]|\b\w)/g, (letter, index) => { + return index === 0 ? letter.toUpperCase() : letter.toLowerCase() + }) + .replace(/\s+/g, '') + }, + removeLinks: (content) => { + if (!content) return '' + // remove all links from excerpt to prevent issues with the surrounding link + let excerpt = content.replace(/(.+)<\/a>/gim, '$1') + // do not display content that is only linebreaks + if (excerpt.replace(/
                                  /gim, '').trim() === '') { + excerpt = '' + } + + return excerpt + }, + removeHtml: (content, replaceLinebreaks = true) => { + if (!content) return '' + let contentExcerpt = content + if (replaceLinebreaks) { + // replace linebreaks with spaces first + contentExcerpt = contentExcerpt.replace(/
                                  /gim, ' ').trim() + } + // remove the rest of the HTML + contentExcerpt = contentExcerpt.replace(/<(?:.|\n)*?>/gm, '').trim() + + return contentExcerpt + }, + proxyApiUrl: (input) => { + const url = input && (input.url || input) + if (!url) return url + return url.startsWith('/') ? url.replace('/', '/api/') : url + }, + }) + + // add all methods as filters on each vue component + Object.keys(app.$filters).forEach((key) => { + Vue.filter(key, app.$filters[key]) + }) + + Vue.prototype.$filters = app.$filters + + return app +} diff --git a/docs/webapp/plugins/vue-infinite-loading.js b/docs/webapp/plugins/vue-infinite-loading.js new file mode 100644 index 000000000..e3e447a21 --- /dev/null +++ b/docs/webapp/plugins/vue-infinite-loading.js @@ -0,0 +1,4 @@ +import Vue from 'vue' +import InfiniteLoading from 'vue-infinite-loading' + +Vue.use(InfiniteLoading, { props: { distance: 10 }, system: { throttleLimit: 800 } }) diff --git a/docs/webapp/plugins/vue-observe-visibility.js b/docs/webapp/plugins/vue-observe-visibility.js new file mode 100644 index 000000000..af8143d7b --- /dev/null +++ b/docs/webapp/plugins/vue-observe-visibility.js @@ -0,0 +1,4 @@ +import Vue from 'vue' +import VueObserveVisibility from 'vue-observe-visibility' + +Vue.use(VueObserveVisibility) diff --git a/docs/webapp/scss.html b/docs/webapp/scss.html new file mode 100644 index 000000000..d8f024aaf --- /dev/null +++ b/docs/webapp/scss.html @@ -0,0 +1,589 @@ + + + + + + + SCSS · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  +
                                  + + + + + + + + +
                                  + +
                                  + +
                                  + + + + + + + + +
                                  +
                                  + +
                                  +
                                  + +
                                  + +

                                  SCSS - Code Guidelines

                                  +

                                  We use classes over tags and ids

                                  +

                                  Never apply styles to tags or ids – use classes instead!

                                  +

                                  Why?

                                  +
                                    +
                                  • HTML tags are responsible for the document structure, not the looks
                                  • +
                                  • targeting HTML tags comes with performance issues
                                  • +
                                  • ids are responsible for identifying a unique element, not for styling it
                                  • +
                                  • ids have higher specificity than classes and therefore don't play well together
                                  • +
                                  • classes can be combined and reused while ids are unique
                                  • +
                                  +

                                  For more background see the following articles on why not to style tags and why not to style ids.

                                  +

                                  We use design tokens instead of magic numbers

                                  +

                                  In order to achieve a consistent look and feel we use a set of pre-defined design tokens to style our components, for example colors, sizes and box-shadows. These tokens are stored as SCSS variables and reused throughout the app.

                                  +

                                  So, instead of typing pixel values or hex codes make sure you use design tokens such as height-header or color-input-border.

                                  +

                                  We name our classes after components

                                  +

                                  Our SCSS styles live within the corresponding component (see the Vue.js docs for single-file components for reference) and should therefore carry the same unique name.

                                  +

                                  Why?

                                  +
                                    +
                                  • it clearly ties the styles to the one component
                                  • +
                                  • having unique class names means styles will not be accidentally overwritten in other files
                                  • +
                                  • we can avoid using scoped CSS which comes with performance caveats
                                  • +
                                  +

                                  We use variants instead of overriding styles

                                  +

                                  Components will sometimes need to look different depending on the context in which they are used – a button might for example be green when it represents a call to action and red when it triggers a destructive action. Rather than making the rounded-button component green by default and then overriding the color for, say, the delete-account action – use variants! Pass the rounded-button a prop, such as color: danger, and then apply the respective variant class.

                                  +

                                  Name variant classes with a dash prefix, such as -danger, then target them like this:

                                  +
                                  .rounded-button {
                                  +  /* other css styles */
                                  +
                                  +  &.-danger {
                                  +    color: $color-danger;
                                  +  }
                                  +}
                                  +
                                  +

                                  We style within the component, we position when we use it

                                  +

                                  In order to make components truly reusable it is important to limit their styles to, well, their actual styling. What color are they, how big is the text, what happens on hover, do they have a rounded border – all that is part of it.

                                  +

                                  Margins, alignment and positioning on the other hand need to be defined in the parent because the same component might sometimes be aligned to the left, sometimes to the right and sometimes float above other content. For more details see the rscss guidelines.

                                  +

                                  To do that, use the child selector, like this:

                                  +
                                  .login-form {
                                  +  /* other css styles */
                                  +
                                  +  > .rounded-button {
                                  +    margin: $margin-small;
                                  +    justify-self: flex-end;
                                  +  }
                                  +}
                                  +
                                  +

                                  A special case are dimensions like width and height. If it is important that a component always has the same dimensions (the height of a button should be consistent, for example) define it within the component itself, if a component should have flexible dimensions (a card, for example, could stretch over the whole screen in one place and be limited to a certain width in another) define the dimensions in the parent.

                                  + +

                                  For a deeper dive into the WHY and HOW have a look at the following resources which the above guidelines are based on:

                                  + + + +
                                  + +
                                  +
                                  +
                                  + +

                                  results matching ""

                                  +
                                    + +
                                    +
                                    + +

                                    No results matching ""

                                    + +
                                    +
                                    +
                                    + +
                                    +
                                    + +
                                    + + + + + + + + + + + + + + +
                                    + + +
                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/favicon.ico b/docs/webapp/static/favicon.ico new file mode 100644 index 000000000..b535a3db8 Binary files /dev/null and b/docs/webapp/static/favicon.ico differ diff --git a/docs/webapp/static/icon.png b/docs/webapp/static/icon.png new file mode 100644 index 000000000..eca541332 Binary files /dev/null and b/docs/webapp/static/icon.png differ diff --git a/docs/webapp/static/img/custom/logo-horizontal.svg b/docs/webapp/static/img/custom/logo-horizontal.svg new file mode 100644 index 000000000..4121fa08e --- /dev/null +++ b/docs/webapp/static/img/custom/logo-horizontal.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/custom/logo-squared.svg b/docs/webapp/static/img/custom/logo-squared.svg new file mode 100644 index 000000000..2a926f0a9 --- /dev/null +++ b/docs/webapp/static/img/custom/logo-squared.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/empty-state.svg b/docs/webapp/static/img/empty-state.svg new file mode 100644 index 000000000..e7b1cb669 --- /dev/null +++ b/docs/webapp/static/img/empty-state.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/empty/alert.svg b/docs/webapp/static/img/empty/alert.svg new file mode 100644 index 000000000..5bff0a3da --- /dev/null +++ b/docs/webapp/static/img/empty/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/empty/docs.svg b/docs/webapp/static/img/empty/docs.svg new file mode 100644 index 000000000..eb97ac269 --- /dev/null +++ b/docs/webapp/static/img/empty/docs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/empty/events.svg b/docs/webapp/static/img/empty/events.svg new file mode 100644 index 000000000..2ac3ba12a --- /dev/null +++ b/docs/webapp/static/img/empty/events.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/empty/file.svg b/docs/webapp/static/img/empty/file.svg new file mode 100644 index 000000000..62efbf260 --- /dev/null +++ b/docs/webapp/static/img/empty/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/empty/messages.svg b/docs/webapp/static/img/empty/messages.svg new file mode 100644 index 000000000..6b7893918 --- /dev/null +++ b/docs/webapp/static/img/empty/messages.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/empty/tasks.svg b/docs/webapp/static/img/empty/tasks.svg new file mode 100644 index 000000000..260b906e5 --- /dev/null +++ b/docs/webapp/static/img/empty/tasks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/de.svg b/docs/webapp/static/img/locale-flags/de.svg new file mode 100644 index 000000000..9aae4206e --- /dev/null +++ b/docs/webapp/static/img/locale-flags/de.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/en.svg b/docs/webapp/static/img/locale-flags/en.svg new file mode 100644 index 000000000..ab5990fd0 --- /dev/null +++ b/docs/webapp/static/img/locale-flags/en.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/es.svg b/docs/webapp/static/img/locale-flags/es.svg new file mode 100644 index 000000000..880f7c988 --- /dev/null +++ b/docs/webapp/static/img/locale-flags/es.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/fr.svg b/docs/webapp/static/img/locale-flags/fr.svg new file mode 100644 index 000000000..7ecef705a --- /dev/null +++ b/docs/webapp/static/img/locale-flags/fr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/it.svg b/docs/webapp/static/img/locale-flags/it.svg new file mode 100644 index 000000000..b2749a0fc --- /dev/null +++ b/docs/webapp/static/img/locale-flags/it.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/nl.svg b/docs/webapp/static/img/locale-flags/nl.svg new file mode 100644 index 000000000..3c8752b5c --- /dev/null +++ b/docs/webapp/static/img/locale-flags/nl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/pl.svg b/docs/webapp/static/img/locale-flags/pl.svg new file mode 100644 index 000000000..c2695329d --- /dev/null +++ b/docs/webapp/static/img/locale-flags/pl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/locale-flags/pt.svg b/docs/webapp/static/img/locale-flags/pt.svg new file mode 100644 index 000000000..f64186f57 --- /dev/null +++ b/docs/webapp/static/img/locale-flags/pt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/mapbox/marker-icons/README.md b/docs/webapp/static/img/mapbox/marker-icons/README.md new file mode 100644 index 000000000..1dd83f969 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/README.md @@ -0,0 +1,12 @@ +# Mabbox markers + +I found the Mapbox markers to be downloaded at the bottom of the page: + + +At URL: + + +## Folder For Images Reachable By URL + +It looks like that not all folders, as example the `assets/*` folder, is reachable by URL. +Our images have to be in the `static/img/*` folder. diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-blue.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-blue.png new file mode 100644 index 000000000..8b686e2aa Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-blue.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-gray.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-gray.png new file mode 100644 index 000000000..231d02f19 Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-gray.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-green.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-green.png new file mode 100644 index 000000000..0e557e689 Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-green.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-orange.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-orange.png new file mode 100644 index 000000000..b9ec8995d Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-orange.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-pink.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-pink.png new file mode 100644 index 000000000..0d7a6279b Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-pink.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-purple.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-purple.png new file mode 100644 index 000000000..db4358f97 Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-purple.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-red.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-red.png new file mode 100644 index 000000000..c22f07abf Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-red.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-yellow.png b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-yellow.png new file mode 100644 index 000000000..98955c55a Binary files /dev/null and b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-20px-yellow.png differ diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-blue.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-blue.svg new file mode 100644 index 000000000..c289be238 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-blue.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-gray.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-gray.svg new file mode 100644 index 000000000..47ab09703 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-gray.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-green.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-green.svg new file mode 100644 index 000000000..0e77bed20 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-green.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-orange.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-orange.svg new file mode 100644 index 000000000..2ad365f3d --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-orange.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-pink.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-pink.svg new file mode 100644 index 000000000..cbf19c556 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-pink.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-purple.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-purple.svg new file mode 100644 index 000000000..2090c3f71 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-purple.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-red.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-red.svg new file mode 100644 index 000000000..b1ffa63a4 --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-red.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-yellow.svg b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-yellow.svg new file mode 100644 index 000000000..19918f2fa --- /dev/null +++ b/docs/webapp/static/img/mapbox/marker-icons/mapbox-marker-icon-yellow.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/webapp/static/img/svg/emoji/angry.svg b/docs/webapp/static/img/svg/emoji/angry.svg new file mode 100644 index 000000000..74abe161f --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/angry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/angry_color.svg b/docs/webapp/static/img/svg/emoji/angry_color.svg new file mode 100644 index 000000000..f6b4bd9a8 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/angry_color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/cry.svg b/docs/webapp/static/img/svg/emoji/cry.svg new file mode 100644 index 000000000..d375fd2fd --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/cry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/cry_color.svg b/docs/webapp/static/img/svg/emoji/cry_color.svg new file mode 100644 index 000000000..6a32bc2c5 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/cry_color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/funny.svg b/docs/webapp/static/img/svg/emoji/funny.svg new file mode 100644 index 000000000..d23792d8c --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/funny.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/funny_color.svg b/docs/webapp/static/img/svg/emoji/funny_color.svg new file mode 100644 index 000000000..3ac2087e8 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/funny_color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/happy.svg b/docs/webapp/static/img/svg/emoji/happy.svg new file mode 100644 index 000000000..d0d8a4e80 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/happy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/happy_color.svg b/docs/webapp/static/img/svg/emoji/happy_color.svg new file mode 100644 index 000000000..d541639e3 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/happy_color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/surprised.svg b/docs/webapp/static/img/svg/emoji/surprised.svg new file mode 100644 index 000000000..8a02a5a50 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/surprised.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/emoji/surprised_color.svg b/docs/webapp/static/img/svg/emoji/surprised_color.svg new file mode 100644 index 000000000..398c34f35 --- /dev/null +++ b/docs/webapp/static/img/svg/emoji/surprised_color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/webapp/static/img/svg/errors/error403.svg b/docs/webapp/static/img/svg/errors/error403.svg new file mode 100644 index 000000000..e52d00a7a --- /dev/null +++ b/docs/webapp/static/img/svg/errors/error403.svg @@ -0,0 +1 @@ + diff --git a/docs/webapp/static/img/svg/errors/error404.svg b/docs/webapp/static/img/svg/errors/error404.svg new file mode 100644 index 000000000..78f019410 --- /dev/null +++ b/docs/webapp/static/img/svg/errors/error404.svg @@ -0,0 +1 @@ + diff --git a/docs/webapp/static/img/svg/errors/error500.svg b/docs/webapp/static/img/svg/errors/error500.svg new file mode 100644 index 000000000..5a95d7bf6 --- /dev/null +++ b/docs/webapp/static/img/svg/errors/error500.svg @@ -0,0 +1 @@ + diff --git a/docs/webapp/static/img/svg/errors/error503.svg b/docs/webapp/static/img/svg/errors/error503.svg new file mode 100644 index 000000000..45b7b0cf7 --- /dev/null +++ b/docs/webapp/static/img/svg/errors/error503.svg @@ -0,0 +1,15 @@ + + + + error503 + Created with Sketch. + + + + + + + + + + diff --git a/docs/webapp/store/auth.js b/docs/webapp/store/auth.js new file mode 100644 index 000000000..4ef63e3ea --- /dev/null +++ b/docs/webapp/store/auth.js @@ -0,0 +1,121 @@ +import gql from 'graphql-tag' +import { VERSION } from '~/constants/terms-and-conditions-version.js' +import { currentUserQuery } from '~/graphql/User' +import Cookie from 'universal-cookie' +import metadata from '~/constants/metadata' + +const cookies = new Cookie() + +export const state = () => { + return { + user: null, + token: null, + pending: false, + } +} + +export const mutations = { + SET_USER(state, user) { + state.user = user || null + }, + SET_TOKEN(state, token) { + state.token = token || null + }, + SET_PENDING(state, pending) { + state.pending = pending + }, +} + +export const getters = { + isAuthenticated(state) { + return !!state.token + }, + isLoggedIn(state) { + return !!(state.user && state.token) + }, + pending(state) { + return !!state.pending + }, + isAdmin(state) { + return !!state.user && state.user.role === 'admin' + }, + isModerator(state) { + return !!state.user && (state.user.role === 'admin' || state.user.role === 'moderator') + }, + user(state) { + return state.user || {} + }, + token(state) { + return state.token + }, + termsAndConditionsAgreed(state) { + return state.user && state.user.termsAndConditionsAgreedVersion === VERSION + }, +} + +export const actions = { + async init({ commit, dispatch }) { + if (!process.server) { + return + } + const token = this.app.$apolloHelpers.getToken() + if (!token) { + return + } + commit('SET_TOKEN', token) + await dispatch('fetchCurrentUser') + }, + + async check({ commit, dispatch, getters }) { + if (!this.app.$apolloHelpers.getToken()) { + await dispatch('logout') + } + return getters.isLoggedIn + }, + + async fetchCurrentUser({ commit, dispatch }) { + const client = this.app.apolloProvider.defaultClient + const { + data: { currentUser }, + } = await client.query({ query: currentUserQuery }) + if (!currentUser) return dispatch('logout') + commit('SET_USER', currentUser) + return currentUser + }, + + async login({ commit, dispatch }, { email, password }) { + commit('SET_PENDING', true) + try { + const client = this.app.apolloProvider.defaultClient + const { + data: { login }, + } = await client.mutate({ + mutation: gql(` + mutation($email: String!, $password: String!) { + login(email: $email, password: $password) + } + `), + variables: { + email, + password, + }, + }) + await this.app.$apolloHelpers.onLogin(login) + commit('SET_TOKEN', login) + await dispatch('fetchCurrentUser') + if (cookies.get(metadata.COOKIE_NAME) === undefined) { + throw new Error('no-cookie') + } + } catch (err) { + throw new Error(err) + } finally { + commit('SET_PENDING', false) + } + }, + + async logout({ commit }) { + commit('SET_USER', null) + commit('SET_TOKEN', null) + return this.app.$apolloHelpers.onLogout() + }, +} diff --git a/docs/webapp/store/auth.test.js b/docs/webapp/store/auth.test.js new file mode 100644 index 000000000..0da91b461 --- /dev/null +++ b/docs/webapp/store/auth.test.js @@ -0,0 +1,233 @@ +import { getters, actions } from './auth.js' + +jest.mock('universal-cookie', () => { + return jest.fn().mockImplementation(() => { + return { + get: (arg) => 'my-cookie-name', + } + }) +}) + +let state +let commit +let dispatch + +const token = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwic2x1ZyI6Implbm55LXJvc3RvY2siLCJuYW1lIjoiSmVubnkgUm9zdG9jayIsImF2YXRhciI6Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS91aWZhY2VzL2ZhY2VzL3R3aXR0ZXIvbXV0dV9rcmlzaC8xMjguanBnIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUub3JnIiwicm9sZSI6InVzZXIiLCJpYXQiOjE1NDUxNDQ2ODgsImV4cCI6MTYzMTU0NDY4OCwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo0MDAwIiwic3ViIjoidTMifQ.s5_JeQN9TaUPfymAXPOpbMAwhmTIg9cnOvNEcj4z75k' +const currentUser = { + id: 'u3', + name: 'Jenny Rostock', + slug: 'jenny-rostock', + email: 'user@example.org', + avatar: { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/mutu_krish/128.jpg', + }, + role: 'user', + locale: 'de', +} +const successfulLoginResponse = { data: { login: token } } +const successfulCurrentUserResponse = { data: { currentUser } } + +/* +const incorrectPasswordResponse = { + data: { + login: null, + }, + errors: [ + { + message: 'Incorrect password.', + locations: [ + { + line: 2, + column: 3, + }, + ], + path: ['login'], + }, + ], +} +*/ + +beforeEach(() => { + commit = jest.fn() + dispatch = jest.fn(() => Promise.resolve()) +}) + +describe('getters', () => { + describe('isAuthenticated', () => { + describe('given JWT Bearer token', () => { + test('true', () => { + state = { token } + expect(getters.isAuthenticated(state)).toBe(true) + }) + }) + }) +}) + +describe('actions', () => { + let action + + describe('init', () => { + const theAction = () => { + const module = { + app: { + $apolloHelpers: { + getToken: () => token, + }, + }, + } + action = actions.init.bind(module) + return action({ commit, dispatch }) + } + + describe('client-side', () => { + beforeEach(() => { + process.server = false + }) + + it('returns', async () => { + await theAction() + expect(dispatch.mock.calls).toEqual([]) + expect(commit.mock.calls).toEqual([]) + }) + }) + + describe('server-side', () => { + beforeEach(() => { + process.server = true + }) + + it('fetches the current user', async () => { + await theAction() + expect(dispatch.mock.calls).toEqual([['fetchCurrentUser']]) + }) + + it('saves the JWT Bearer token', async () => { + await theAction() + expect(commit.mock.calls).toEqual(expect.arrayContaining([['SET_TOKEN', token]])) + }) + }) + }) + + describe('fetchCurrentUser', () => { + describe('given a successful response', () => { + beforeEach(async () => { + const module = { + app: { + apolloProvider: { + defaultClient: { + query: jest.fn(() => Promise.resolve(successfulCurrentUserResponse)), + }, + }, + }, + } + action = actions.fetchCurrentUser.bind(module) + await action({ commit }) + }) + + it('saves user data without token', () => { + expect(commit.mock.calls).toEqual( + expect.arrayContaining([ + [ + 'SET_USER', + { + id: 'u3', + name: 'Jenny Rostock', + slug: 'jenny-rostock', + email: 'user@example.org', + avatar: { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/mutu_krish/128.jpg', + }, + role: 'user', + locale: 'de', + }, + ], + ]), + ) + }) + }) + }) + + describe('login', () => { + describe('given valid credentials and a successful response', () => { + beforeEach(async () => { + const module = { + app: { + apolloProvider: { + defaultClient: { + mutate: jest.fn(() => Promise.resolve(successfulLoginResponse)), + }, + }, + $apolloHelpers: { + onLogin: jest.fn(() => Promise.resolve()), + }, + }, + } + action = actions.login.bind(module) + await action({ commit, dispatch }, { email: 'user@example.org', password: '1234' }) + }) + + afterEach(() => { + action = null + }) + + it('saves the JWT Bearer token', () => { + expect(commit.mock.calls).toEqual(expect.arrayContaining([['SET_TOKEN', token]])) + }) + + it('fetches the user', () => { + expect(dispatch.mock.calls).toEqual([['fetchCurrentUser']]) + }) + + it('saves pending flags in order', () => { + expect(commit.mock.calls).toEqual( + expect.arrayContaining([ + ['SET_PENDING', true], + ['SET_PENDING', false], + ]), + ) + }) + }) + + describe('given invalid credentials and incorrect password response', () => { + let onLogin + let mutate + + beforeEach(() => { + mutate = jest.fn(() => Promise.reject('This error is expected.')) // eslint-disable-line prefer-promise-reject-errors + onLogin = jest.fn(() => Promise.resolve()) + const module = { + app: { + apolloProvider: { defaultClient: { mutate } }, + $apolloHelpers: { onLogin }, + }, + } + action = actions.login.bind(module) + }) + + afterEach(() => { + action = null + }) + + it('populates error messages', async () => { + expect( + action({ commit }, { email: 'user@example.org', password: 'wrong' }), + ).rejects.toThrowError('This error is expected.') + expect(mutate).toHaveBeenCalled() + expect(onLogin).not.toHaveBeenCalled() + }) + + it('saves pending flags in order', async () => { + try { + await action({ commit }, { email: 'user@example.org', password: 'wrong' }) + } catch (err) {} // ignore + expect(commit.mock.calls).toEqual( + expect.arrayContaining([ + ['SET_PENDING', true], + ['SET_PENDING', false], + ]), + ) + }) + }) + }) +}) diff --git a/docs/webapp/store/chat.js b/docs/webapp/store/chat.js new file mode 100644 index 000000000..1e0b496ac --- /dev/null +++ b/docs/webapp/store/chat.js @@ -0,0 +1,32 @@ +export const state = () => { + return { + showChat: false, + roomID: null, + unreadRoomCount: 0, + } +} + +export const mutations = { + SET_OPEN_CHAT(state, ctx) { + state.showChat = ctx.showChat || false + state.roomID = ctx.roomID || null + }, + UPDATE_ROOM_COUNT(state, count) { + state.unreadRoomCount = count + }, + UPDATE_ROOM_ID(state, roomid) { + state.roomId = roomid || null + }, +} + +export const getters = { + showChat(state) { + return state + }, + roomID(state) { + return state + }, + unreadRoomCount(state) { + return state.unreadRoomCount + }, +} diff --git a/docs/webapp/store/index.js b/docs/webapp/store/index.js new file mode 100644 index 000000000..8bc4ed563 --- /dev/null +++ b/docs/webapp/store/index.js @@ -0,0 +1,9 @@ +export const state = () => ({}) + +export const mutations = {} + +export const actions = { + async nuxtServerInit({ dispatch }) { + await dispatch('auth/init') + }, +} diff --git a/docs/webapp/store/modal.js b/docs/webapp/store/modal.js new file mode 100644 index 000000000..72617f592 --- /dev/null +++ b/docs/webapp/store/modal.js @@ -0,0 +1,22 @@ +export const state = () => { + return { + open: null, + data: {}, + } +} + +export const mutations = { + SET_OPEN(state, ctx) { + state.open = ctx.name || null + state.data = ctx.data || {} + }, +} + +export const getters = { + open(state) { + return state.open + }, + data(state) { + return state.data + }, +} diff --git a/docs/webapp/store/posts.js b/docs/webapp/store/posts.js new file mode 100644 index 000000000..51e34f6c5 --- /dev/null +++ b/docs/webapp/store/posts.js @@ -0,0 +1,157 @@ +import get from 'lodash/get' +import update from 'lodash/update' +import xor from 'lodash/xor' +import isEmpty from 'lodash/isEmpty' +import isEqual from 'lodash/isEqual' +import clone from 'lodash/clone' + +const defaultFilter = {} + +export const state = () => { + return { + filter: { + ...defaultFilter, + }, + order: 'createdAt_desc', + } +} + +export const mutations = { + TOGGLE_FILTER_BY_FOLLOWED(state, currentUserId) { + const filter = clone(state.filter) + const id = get(filter, 'author.followedBy_some.id') + if (id) { + delete filter.author + state.filter = filter + } else { + state.filter = { + ...filter, + author: { followedBy_some: { id: currentUserId } }, + } + } + }, + TOGGLE_FILTER_BY_MY_GROUPS(state) { + const filter = clone(state.filter) + if (get(filter, 'postsInMyGroups')) { + delete filter.postsInMyGroups + state.filter = filter + } else { + state.filter = { + ...filter, + postsInMyGroups: true, + } + } + }, + RESET_CATEGORIES(state) { + const filter = clone(state.filter) + delete filter.categories_some + state.filter = filter + }, + RESET_FOLLOWERS_FILTER(state) { + const filter = clone(state.filter) + if (get(filter, 'postsInMyGroups')) { + delete filter.postsInMyGroups + } + if (get(filter, 'author.followedBy_some.id')) { + delete filter.author + } + state.filter = filter + }, + RESET_EMOTIONS(state) { + const filter = clone(state.filter) + delete filter.emotions_some + state.filter = filter + }, + RESET_LANGUAGES(state) { + const filter = clone(state.filter) + delete filter.language_in + state.filter = filter + }, + TOGGLE_CATEGORY(state, categoryId) { + const filter = clone(state.filter) + update(filter, 'categories_some.id_in', (categoryIds) => xor(categoryIds, [categoryId])) + if (isEmpty(get(filter, 'categories_some.id_in'))) delete filter.categories_some + state.filter = filter + }, + TOGGLE_LANGUAGE(state, languageCode) { + const filter = clone(state.filter) + update(filter, 'language_in', (languageCodes) => xor(languageCodes, [languageCode])) + if (isEmpty(get(filter, 'language_in'))) delete filter.language_in + state.filter = filter + }, + TOGGLE_EMOTION(state, emotion) { + const filter = clone(state.filter) + update(filter, 'emotions_some.emotion_in', (emotions) => xor(emotions, [emotion])) + if (isEmpty(get(filter, 'emotions_some.emotion_in'))) delete filter.emotions_some + state.filter = filter + }, + RESET_POST_TYPE(state) { + const filter = clone(state.filter) + delete filter.eventStart_gte + delete filter.postType_in + state.order = 'createdAt_desc' + state.filter = filter + }, + TOGGLE_POST_TYPE(state, postType) { + const filter = clone(state.filter) + if (postType && !(filter.postType_in && filter.postType_in.includes(postType))) { + filter.postType_in = [postType] + if (postType === 'Event') { + filter.eventStart_gte = new Date() + state.order = 'eventStart_asc' + } else { + delete filter.eventStart_gte + state.order = 'createdAt_desc' + } + } else { + delete filter.eventStart_gte + delete filter.postType_in + state.order = 'createdAt_desc' + } + state.filter = filter + }, + TOGGLE_EVENTS_ENDED(state) { + const filter = clone(state.filter) + if (filter.eventStart_gte) { + delete filter.eventStart_gte + } else { + if (filter.postType_in && filter.postType_in.includes('Event')) { + filter.eventStart_gte = new Date() + } + } + state.filter = filter + }, + TOGGLE_ORDER(state, value) { + state.order = value + }, +} + +export const getters = { + isActive(state) { + return !isEqual(state.filter, defaultFilter) + }, + filter(state) { + return state.filter + }, + filteredCategoryIds(state) { + return get(state.filter, 'categories_some.id_in') || [] + }, + filteredPostTypes(state) { + return get(state.filter, 'postType_in') || [] + }, + filteredLanguageCodes(state) { + return get(state.filter, 'language_in') || [] + }, + filteredByUsersFollowed(state) { + return !!get(state.filter, 'author.followedBy_some.id') + }, + filteredByPostsInMyGroups(state) { + return !!get(state.filter, 'postsInMyGroups') + }, + filteredByEmotions(state) { + return get(state.filter, 'emotions_some.emotion_in') || [] + }, + orderBy(state) { + return state.order + }, +} diff --git a/docs/webapp/store/posts.spec.js b/docs/webapp/store/posts.spec.js new file mode 100644 index 000000000..b3c73e124 --- /dev/null +++ b/docs/webapp/store/posts.spec.js @@ -0,0 +1,445 @@ +import { getters, mutations } from './posts.js' + +let state +let testMutation + +describe('getters', () => { + describe('isActive', () => { + it('returns true if filter differs from default setting', () => { + state = { filter: {} } + expect(getters.isActive(state)).toEqual(false) + state = { filter: { categories_some: { id_in: [24] } } } + expect(getters.isActive(state)).toEqual(true) + }) + }) + + describe('filteredCategoryIds', () => { + it('returns category ids if filter is set', () => { + state = { filter: { categories_some: { id_in: [24] } } } + expect(getters.filteredCategoryIds(state)).toEqual([24]) + }) + + it('returns empty array if category filter is not set', () => { + state = { filter: { author: { followedBy_some: { id: 7 } } } } + expect(getters.filteredCategoryIds(state)).toEqual([]) + }) + }) + + describe('filteredPostTypes', () => { + it('returns post types if filter is set', () => { + state = { filter: { postType_in: ['Article', 'Event'] } } + expect(getters.filteredPostTypes(state)).toEqual(['Article', 'Event']) + }) + + it('returns empty array if post type filter is not set', () => { + state = { filter: { author: { followedBy_some: { id: 7 } } } } + expect(getters.filteredPostTypes(state)).toEqual([]) + }) + }) + + describe('filteredLanguageCodes', () => { + it('returns category ids if filter is set', () => { + state = { filter: { language_in: ['en', 'de', 'pt'] } } + expect(getters.filteredLanguageCodes(state)).toEqual(['en', 'de', 'pt']) + }) + + it('returns empty array if language filter is not set', () => { + state = { filter: { author: { followedBy_some: { id: 7 } } } } + expect(getters.filteredLanguageCodes(state)).toEqual([]) + }) + }) + + describe('filter', () => { + it('returns filter', () => { + state = { filter: { author: { followedBy_some: { id: 7 } } } } + expect(getters.filter(state)).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + + describe('filteredByUsersFollowed', () => { + it('returns true if filter is set', () => { + state = { filter: { author: { followedBy_some: { id: 7 } } } } + expect(getters.filteredByUsersFollowed(state)).toBe(true) + }) + + it('returns false if filter is not set', () => { + state = { filter: { categories_some: { id_in: [23] } } } + expect(getters.filteredByUsersFollowed(state)).toBe(false) + }) + }) + + describe('filteredByPostsInMyGroups', () => { + it('returns true if filter is set', () => { + state = { filter: { postsInMyGroups: true } } + expect(getters.filteredByPostsInMyGroups(state)).toBe(true) + }) + + it('returns false if filter is not set', () => { + state = { filter: { categories_some: { id_in: [23] } } } + expect(getters.filteredByUsersFollowed(state)).toBe(false) + }) + }) + + describe('filteredByEmotions', () => { + it('returns an emotions array if filter is set', () => { + state = { filter: { emotions_some: { emotion_in: ['sad'] } } } + expect(getters.filteredByEmotions(state)).toEqual(['sad']) + }) + + it('returns an emotions array even when other filters are set', () => { + state = { + filter: { emotions_some: { emotion_in: ['sad'] }, categories_some: { id_in: [23] } }, + } + expect(getters.filteredByEmotions(state)).toEqual(['sad']) + }) + + it('returns empty array if filter is not set', () => { + state = { filter: {} } + expect(getters.filteredByEmotions(state)).toEqual([]) + }) + + it('returns empty array if another filter is set, but not emotions', () => { + state = { filter: { categories_some: { id_in: [23] } } } + expect(getters.filteredByEmotions(state)).toEqual([]) + }) + }) + + describe('orderBy', () => { + it('returns value for graphql query', () => { + state = { + order: 'createdAt_desc', + } + expect(getters.orderBy(state)).toEqual('createdAt_desc') + }) + }) +}) + +describe('mutations', () => { + describe('RESET_LANGUAGES', () => { + it('resets the languages filter', () => { + state = { + filter: { + author: { followedBy_some: { id: 7 } }, + language_in: ['nl'], + }, + } + mutations.RESET_LANGUAGES(state) + expect(getters.filter(state)).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + + describe('RESET_CATEGORIES', () => { + beforeEach(() => { + testMutation = (categoryId) => { + mutations.RESET_CATEGORIES(state, categoryId) + return getters.filter(state) + } + }) + it('resets the categories filter', () => { + state = { + filter: { + author: { followedBy_some: { id: 7 } }, + categories_some: { id_in: [23] }, + }, + } + expect(testMutation(23)).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + + describe('RESET_FOLLOWERS_FILTER', () => { + beforeEach(() => { + testMutation = () => { + mutations.RESET_FOLLOWERS_FILTER(state) + return getters.filter(state) + } + }) + + it('resets the categories filter', () => { + state = { + filter: { + author: { followedBy_some: { id: 4711 } }, + postsInMyGroups: true, + }, + } + expect(testMutation()).toEqual({}) + }) + }) + + describe('TOGGLE_LANGUAGE', () => { + beforeEach(() => { + testMutation = (languageCode) => { + mutations.TOGGLE_LANGUAGE(state, languageCode) + return getters.filter(state) + } + }) + + it('creates category filter if empty', () => { + state = { filter: {} } + expect(testMutation('de')).toEqual({ language_in: ['de'] }) + }) + + it('adds language code to existing filter', () => { + state = { filter: { language_in: ['de'] } } + expect(testMutation('en')).toEqual({ language_in: ['de', 'en'] }) + }) + + it('removes category id if present', () => { + state = { filter: { language_in: ['de', 'en'] } } + expect(testMutation('de')).toEqual({ language_in: ['en'] }) + }) + + it('removes language filter if empty', () => { + state = { filter: { language_in: ['de'] } } + expect(testMutation('de')).toEqual({}) + }) + + it('does not get in the way of other filters', () => { + state = { + filter: { + author: { followedBy_some: { id: 7 } }, + language_in: ['de'], + }, + } + expect(testMutation('de')).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + + describe('TOGGLE_CATEGORY', () => { + beforeEach(() => { + testMutation = (categoryId) => { + mutations.TOGGLE_CATEGORY(state, categoryId) + return getters.filter(state) + } + }) + + it('creates category filter if empty', () => { + state = { filter: {} } + expect(testMutation(23)).toEqual({ categories_some: { id_in: [23] } }) + }) + + it('adds category id not present', () => { + state = { filter: { categories_some: { id_in: [24] } } } + expect(testMutation(23)).toEqual({ categories_some: { id_in: [24, 23] } }) + }) + + it('removes category id if present', () => { + state = { filter: { categories_some: { id_in: [23, 24] } } } + const result = testMutation(23) + expect(result).toEqual({ categories_some: { id_in: [24] } }) + }) + + it('removes category filter if empty', () => { + state = { filter: { categories_some: { id_in: [23] } } } + expect(testMutation(23)).toEqual({}) + }) + + it('does not get in the way of other filters', () => { + state = { + filter: { + author: { followedBy_some: { id: 7 } }, + categories_some: { id_in: [23] }, + }, + } + expect(testMutation(23)).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + + describe('TOGGLE_POST_TYPE', () => { + beforeEach(() => { + testMutation = (postType) => { + mutations.TOGGLE_POST_TYPE(state, postType) + return getters.filter(state) + } + }) + + it('creates post type filter if empty, sets event start filter and event start order', () => { + state = { filter: {} } + expect(testMutation('Event')).toEqual({ + postType_in: ['Event'], + eventStart_gte: expect.any(Date), + }) + expect(getters.orderBy(state)).toEqual('eventStart_asc') + }) + + it('changes post type if present, resets filter event start and order', () => { + state = { + filter: { + postType_in: ['Event'], + eventStart_gte: new Date(), + }, + order: 'eventStart_asc', + } + expect(testMutation('Article')).toEqual({ postType_in: ['Article'] }) + expect(getters.orderBy(state)).toEqual('createdAt_desc') + }) + + it('removes post type filter if same post type is present and sets order', () => { + state = { + filter: { + postType_in: ['Event'], + eventStart_gte: new Date(), + }, + order: 'eventStart_asc', + } + expect(testMutation('Event')).toEqual({}) + expect(getters.orderBy(state)).toEqual('createdAt_desc') + }) + + it('removes post type filter if called with null', () => { + state = { + filter: { + postType_in: ['Event'], + eventStart_gte: new Date(), + }, + order: 'eventStart_asc', + } + expect(testMutation(null)).toEqual({}) + expect(getters.orderBy(state)).toEqual('createdAt_desc') + }) + + it('does not get in the way of other filters', () => { + state = { + filter: { + author: { followedBy_some: { id: 7 } }, + postType_in: ['Event'], + }, + } + expect(testMutation('Event')).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + + describe('RESET_POST_TYPE', () => { + beforeEach(() => { + testMutation = () => { + mutations.RESET_POST_TYPE(state) + return getters.filter(state) + } + }) + + it('resets the post type filter, event start and order', () => { + state = { + filter: { + postType_in: ['Event'], + eventStart_gte: new Date(), + }, + order: 'eventStart_asc', + } + expect(testMutation()).toEqual({}) + expect(getters.orderBy(state)).toEqual('createdAt_desc') + }) + }) + + describe('TOGGLE_EVENTS_ENDED', () => { + beforeEach(() => { + testMutation = (postType) => { + mutations.TOGGLE_EVENTS_ENDED(state, postType) + return getters.filter(state) + } + }) + + it('does not set events ended when post type is not Event', () => { + state = { + filter: {}, + } + expect(testMutation()).toEqual({}) + }) + + it('sets events ended when post type is Event', () => { + state = { + filter: { + postType_in: ['Event'], + }, + } + expect(testMutation()).toEqual({ + postType_in: ['Event'], + eventStart_gte: expect.any(Date), + }) + }) + + it('unsets events ended when set', () => { + state = { + filter: { + postType_in: ['Event'], + eventStart_gte: new Date(), + }, + } + expect(testMutation()).toEqual({ + postType_in: ['Event'], + }) + }) + }) + + describe('TOGGLE_FILTER_BY_FOLLOWED', () => { + beforeEach(() => { + testMutation = (userId) => { + mutations.TOGGLE_FILTER_BY_FOLLOWED(state, userId) + return getters.filter(state) + } + }) + + describe('given empty filter', () => { + beforeEach(() => { + state = { filter: {} } + }) + + it('attaches the id of the current user to the filter object', () => { + expect(testMutation(4711)).toEqual({ author: { followedBy_some: { id: 4711 } } }) + }) + }) + + describe('already filtered', () => { + beforeEach(() => { + state = { filter: { author: { followedBy_some: { id: 4711 } } } } + }) + + it('remove the id of the current user from the filter object', () => { + expect(testMutation(4711)).toEqual({}) + }) + }) + }) + + describe('TOGGLE_FILTER_BY_MY_GROUPS', () => { + beforeEach(() => { + testMutation = () => { + mutations.TOGGLE_FILTER_BY_MY_GROUPS(state) + return getters.filter(state) + } + }) + + describe('given empty filter', () => { + beforeEach(() => { + state = { filter: {} } + }) + + it('sets postsInMyGroups filter to true', () => { + expect(testMutation()).toEqual({ postsInMyGroups: true }) + }) + }) + + describe('already filtered', () => { + beforeEach(() => { + state = { filter: { postsInMyGroups: true } } + }) + + it('removes postsInMyGroups filter', () => { + expect(testMutation()).toEqual({}) + }) + }) + }) + + describe('TOGGLE_ORDER', () => { + beforeEach(() => { + testMutation = (key) => { + mutations.TOGGLE_ORDER(state, key) + return getters.orderBy(state) + } + }) + + it('switches the currently selected order', () => { + state = { + // does not matter + } + expect(testMutation('createdAt_asc')).toEqual('createdAt_asc') + }) + }) +}) diff --git a/docs/webapp/store/search.js b/docs/webapp/store/search.js new file mode 100644 index 000000000..a10649de1 --- /dev/null +++ b/docs/webapp/store/search.js @@ -0,0 +1,17 @@ +export const state = () => { + return { + searchValue: '', + } +} + +export const mutations = { + SET_VALUE(state, ctx) { + state.searchValue = ctx.searchValue || '' + }, +} + +export const getters = { + searchValue(state) { + return state.searchValue + }, +} diff --git a/docs/webapp/storybook/addons.js b/docs/webapp/storybook/addons.js new file mode 100644 index 000000000..47c4cbd22 --- /dev/null +++ b/docs/webapp/storybook/addons.js @@ -0,0 +1,5 @@ +import '@storybook/addon-actions/register' +import '@storybook/addon-a11y/register' +import 'storybook-design-token/register' +import '@storybook/addon-notes/register-panel' +// import '@storybook/addon-links/register' diff --git a/docs/webapp/storybook/config.js b/docs/webapp/storybook/config.js new file mode 100644 index 000000000..037c8fd1e --- /dev/null +++ b/docs/webapp/storybook/config.js @@ -0,0 +1,67 @@ +import { addParameters, configure } from '@storybook/vue' +import Vue from 'vue' +import Vuex from 'vuex' +import { action } from '@storybook/addon-actions' +// eslint-disable-next-line import/no-webpack-loader-syntax +import '!style-loader!css-loader!sass-loader!../assets/_new/styles/resets.scss' + +Vue.use(Vuex) +Vue.component('nuxt-link', { + props: ['to'], + methods: { + log() { + action('link clicked')(this.to) + }, + }, + template: 'NuxtLink', +}) +Vue.component('client-only', { + render() { + return this.$slots.default + }, +}) +Vue.component('v-popover', { + template: '
                                    Popover Content
                                    ', +}) + +// Globally register base components +const componentFiles = require.context('../components/_new/generic', true, /Base[a-zA-Z]+\.vue/) + +componentFiles.keys().forEach((fileName) => { + const component = componentFiles(fileName) + const componentConfig = component.default || component + const componentName = component.name || fileName.replace(/^.+\//, '').replace('.vue', '') + + Vue.component(componentName, componentConfig) +}) + +// Setup design token addon +const scssReq = require.context('!!raw-loader!~/assets/_new/styles', true, /.\.scss$/) +const scssTokenFiles = scssReq + .keys() + .map((filename) => ({ filename, content: scssReq(filename).default })) + +addParameters({ + designToken: { + files: { + scss: scssTokenFiles, + }, + }, +}) + +// Automatically import all files ending in *.stories.js +const req = require.context('../components', true, /.story.js$/) + +function loadStories() { + req.keys().forEach(req) +} + +// sort stories alphabetically +addParameters({ + options: { + storySort: (a, b) => + a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, { numeric: true }), + }, +}) + +configure(loadStories, module) diff --git a/docs/webapp/storybook/helpers.js b/docs/webapp/storybook/helpers.js new file mode 100644 index 000000000..bc42d5ac7 --- /dev/null +++ b/docs/webapp/storybook/helpers.js @@ -0,0 +1,91 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import vuexI18n from 'vuex-i18n/dist/vuex-i18n.umd.js' +import Styleguide from '@human-connection/styleguide' +import faker from '@faker-js/faker' +import Filters from '~/plugins/vue-filters' +import Directives from '~/plugins/vue-directives' +import IziToast from '~/plugins/izi-toast' +import layout from './layout.vue' +import locales from '~/locales/index.js' +import '~/plugins/v-tooltip' + +const helpers = { + init(options = {}) { + Vue.use(Vuex) + Vue.use(Styleguide) + Vue.use(Filters) + Vue.use(IziToast) + Vue.use(Directives) + + Vue.use(vuexI18n.plugin, helpers.store) + locales.forEach(({ code }) => { + Vue.i18n.add(code, require(`~/locales/${code}.json`)) + }) + + Vue.i18n.set('en') + Vue.i18n.fallback('en') + + const { plugins = [] } = options + plugins.forEach((plugin) => Vue.use(plugin)) + }, + store: new Vuex.Store({ + modules: { + auth: { + namespaced: true, + getters: { + isModerator() { + return true + }, + isAdmin() { + return true + }, + user() { + return { id: '1', name: 'admin', slug: 'admin' } + }, + }, + }, + }, + }), + layout(storyFn) { + const ctx = storyFn() + return { + components: { ctx, layout }, + template: ` + + + + + `, + } + }, + fakeUser(n) { + return new Array(n || 1).fill(0).map(() => { + const name = faker.name.findName() + return { + id: faker.random.uuid(), + name, + slug: faker.helpers.slugify(name), + } + }) + }, + fakePost(n) { + return new Array(n || 1).fill(0).map(() => { + const title = faker.lorem.words() + const content = faker.lorem.paragraph() + return { + id: faker.random.uuid(), + title, + content, + slug: faker.lorem.slug(title), + shoutedCount: faker.random.number(), + commentsCount: faker.random.number(), + clickedCount: faker.random.number(), + viewedTeaserCount: faker.random.number(), + postType: ['Article'], + } + }) + }, +} + +export default helpers diff --git a/docs/webapp/storybook/layout.vue b/docs/webapp/storybook/layout.vue new file mode 100644 index 000000000..b885d7f73 --- /dev/null +++ b/docs/webapp/storybook/layout.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/webapp/storybook/webpack.config.js b/docs/webapp/storybook/webpack.config.js new file mode 100644 index 000000000..6e1f857b8 --- /dev/null +++ b/docs/webapp/storybook/webpack.config.js @@ -0,0 +1,72 @@ +const path = require('path') +const srcDir = '..' +const rootDir = '..' + +// Export a function. Accept the base config as the only param. +module.exports = async ({ config, mode }) => { + // `mode` has a value of 'DEVELOPMENT' or 'PRODUCTION' + // You can change the configuration based on that. + // 'PRODUCTION' is used when building the static version of storybook. + + // Make whatever fine-grained changes you need + config.module.rules.push({ + test: /\.scss$/, + use: [ + { loader: 'style-loader' }, + { loader: 'css-loader', options: { sourceMap: true } }, + { loader: 'sass-loader', options: { sourceMap: true } }, + { + loader: 'style-resources-loader', + options: { + patterns: [ + path.resolve( + __dirname, + '../node_modules/@human-connection/styleguide/dist/shared.scss', + ), + path.resolve(__dirname, '../assets/_new/styles/tokens.scss'), + ], + injector: 'prepend', + }, + }, + ], + include: path.resolve(__dirname, '../'), + }) + + // load svgs with vue-svg-loader instead of file-loader + const rule = config.module.rules.find( + (r) => + r.test && r.test.toString().includes('svg') && r.loader && r.loader.includes('file-loader'), + ) + rule.test = /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani)(\?.*)?$/ + + config.module.rules.push({ + test: /\.svg$/, + use: [ + 'babel-loader', + { + loader: 'vue-svg-loader', + options: { + svgo: { + plugins: [ + { + removeViewBox: false, + }, + { + removeDimensions: true, + }, + ], + }, + }, + }, + ], + }) + + config.resolve.alias = { + ...config.resolve.alias, + '~~': path.resolve(__dirname, rootDir), + '~': path.resolve(__dirname, srcDir), + } + + // Return the altered config + return config +} diff --git a/docs/webapp/test/fileMock.js b/docs/webapp/test/fileMock.js new file mode 100644 index 000000000..c77f5e0de --- /dev/null +++ b/docs/webapp/test/fileMock.js @@ -0,0 +1,3 @@ +module.exports = { + render: () => 'test-file-stub', +} diff --git a/docs/webapp/test/registerContext.js b/docs/webapp/test/registerContext.js new file mode 100644 index 000000000..a27ca2f7a --- /dev/null +++ b/docs/webapp/test/registerContext.js @@ -0,0 +1,2 @@ +import registerRequireContextHook from 'babel-plugin-require-context-hook/register' +registerRequireContextHook() diff --git a/docs/webapp/test/testSetup.js b/docs/webapp/test/testSetup.js new file mode 100644 index 000000000..741e5f0ce --- /dev/null +++ b/docs/webapp/test/testSetup.js @@ -0,0 +1,22 @@ +import { createLocalVue } from '@vue/test-utils' +import Vuex from 'vuex' +import VTooltip from 'v-tooltip' +import Styleguide from '@human-connection/styleguide' +import BaseComponents from '~/plugins/base-components' +import Filters from '~/plugins/vue-filters' +import InfiniteLoading from '~/plugins/vue-infinite-loading' +import Directives from '~/plugins/vue-directives' +import VueObserveVisibility from '~/plugins/vue-observe-visibility' + +require('intersection-observer') + +global.localVue = createLocalVue() + +global.localVue.use(Vuex) +global.localVue.use(VTooltip) +global.localVue.use(Styleguide) +global.localVue.use(BaseComponents) +global.localVue.use(Filters) +global.localVue.use(Directives) +global.localVue.use(InfiniteLoading) +global.localVue.use(VueObserveVisibility) diff --git a/docs/webapp/testing.html b/docs/webapp/testing.html new file mode 100644 index 000000000..15c7978a6 --- /dev/null +++ b/docs/webapp/testing.html @@ -0,0 +1,558 @@ + + + + + + + Frontend tests · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    +
                                    + + + + + + + + +
                                    + +
                                    + +
                                    + + + + + + + + +
                                    +
                                    + +
                                    +
                                    + +
                                    + +

                                    Component Testing

                                    +

                                    Linting

                                    +

                                    We use ESLint to make sure all developers follow certain code guidelines when writing JavaScript.

                                    +

                                    Most code editors offer an ESLint plugin which helps detect mistakes already while you are writing code. To run the linter manually before pushing up new code type yarn lint into your terminal. Most minor issues can be fixed automatically with the command yarn lint --fix.

                                    +

                                    Unit tests

                                    +

                                    We write unit tests with the help of Jest and Vue Test Utils to make sure our components work in the way they should. In these tests we usually check that a certain input leads to the expected output. They are used to test functionality.

                                    +

                                    To run all tests use the command yarn test in the /webapp directory. Other useful commands are:

                                    +
                                      +
                                    • yarn test -t test-name to run tests including test-name in their file or test names
                                    • +
                                    • yarn test -o to run tests related to files that have been changed since the latest commit
                                    • +
                                    • yarn test path/to/component.spec.js to run a single test file
                                    • +
                                    +

                                    Documentation and manual testing

                                    +

                                    Storybook is a great tool that performs two important functions in our project:

                                    +

                                    Component documentation

                                    +

                                    With Storybook our components can be documented in detail and offer a visual reference to other developers. When all components are properly documented, Storybook can be used as a big component library – where developers can browse through design tokens and components and immediately verify that the component offers the desired functionality.

                                    +

                                    Manual testing in an isolated environment

                                    +

                                    When adding new components or changing existing ones, Storybook can be helpful not only to document the feature for future use, but also to test different use cases (e.g. by passing different types of props) in an isolated playground.

                                    +

                                    With the right addons, Storybook also gives immediate feedback on how well the component complies with accessibility guidelines.

                                    +
                                    +

                                    To run Storybook, first start the app, then enter the following command in a new terminal window: yarn storybook. The output should look similar to this:

                                    +

                                    Storybook output

                                    +

                                    The ocelot.social Storybook will then be available on http://localhost:3002.

                                    + + +
                                    + +
                                    +
                                    +
                                    + +

                                    results matching ""

                                    +
                                      + +
                                      +
                                      + +

                                      No results matching ""

                                      + +
                                      +
                                      +
                                      + +
                                      +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + +
                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/vue.html b/docs/webapp/vue.html new file mode 100644 index 000000000..9e6b18067 --- /dev/null +++ b/docs/webapp/vue.html @@ -0,0 +1,580 @@ + + + + + + + Vue · Ocelot.Social – Developer Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      +
                                      + + + + + + + + +
                                      + +
                                      + +
                                      + + + + + + + + +
                                      +
                                      + +
                                      +
                                      + +
                                      + +

                                      Vue – Code Guidelines

                                      +

                                      We use single-file components

                                      +

                                      Each component lives in a single file, containing:

                                      +
                                        +
                                      • its template (the DOM structure)
                                      • +
                                      • its script (including props, data and methods among other things)
                                      • +
                                      • its style (defining the look of the component)
                                      • +
                                      +

                                      See the Vue.js docs for more details.

                                      +

                                      Placed in the same folder are also:

                                      +
                                        +
                                      • the test file (e.g. MyComponent.spec.js)
                                      • +
                                      • the storybook file (e.g. MyComponent.story.js)
                                      • +
                                      +

                                      We use typed props

                                      +

                                      Vue.js allows us to define component props either as strings or as objects (with type and default or required values). Always go for the second option!

                                      +

                                      Also: only (and always!) define a default for props that are not required.

                                      +

                                      Why?

                                      +
                                        +
                                      • it makes our code more robust – a warning will be shown when passing a wrong prop type
                                      • +
                                      • it clearly defines the component API and tells other developers how to use it
                                      • +
                                      +

                                      It is as easy as writing:

                                      +
                                      props: {
                                      +  title: {
                                      +    type: String,
                                      +    required: true,
                                      +  },
                                      +  image: {
                                      +    type: String,
                                      +    default: 'human-connection-logo.png',
                                      +  },
                                      +}
                                      +

                                      For more complex use cases see the official Vue.js documentation.

                                      +

                                      We use shorthands

                                      +

                                      For better readability we prefer

                                      +
                                        +
                                      • :something over v-bind:something
                                      • +
                                      • @click over v-on:click
                                      • +
                                      • #slotSame over v-slot:slotName
                                      • +
                                      • #default over v-slot
                                      • +
                                      +

                                      Read more in the official Vue.js docs (for slots)

                                      + +

                                      The Vue.js component style guide offers a whole list of best-practices for writing Vue components.

                                      + + +
                                      + +
                                      +
                                      +
                                      + +

                                      results matching ""

                                      +
                                        + +
                                        +
                                        + +

                                        No results matching ""

                                        + +
                                        +
                                        +
                                        + +
                                        +
                                        + +
                                        + + + + + + + + + + + + + + +
                                        + + +
                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/webapp/yarn.lock b/docs/webapp/yarn.lock new file mode 100644 index 000000000..6b95b979b --- /dev/null +++ b/docs/webapp/yarn.lock @@ -0,0 +1,22910 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@antfu/utils@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.4.0.tgz#df100ed9922d7359bf6c99083765b5207086b9a7" + integrity sha512-gqkpvjkgFUu+s3kP+Ly33OKpo5zvVY3FDFhv5BIb98SncS3KD6DNxPfNDjwHIoyXbz1leWo1j8DtRLZ1D2Jv+Q== + dependencies: + "@types/throttle-debounce" "^2.1.0" + +"@apollo/federation@0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@apollo/federation/-/federation-0.10.2.tgz#6ead14e9d25b7a87d85fc0188fd5ec7fd63592fe" + integrity sha512-N+JoD7YraGAgDJq1GTkAzRRPUA+FgclFgAUcUDng9ICA4N147nuGUrbrpQdgLnE59nCLJAhcFvOgQRs177XMWw== + dependencies: + apollo-env "^0.5.1" + apollo-graphql "^0.3.4" + apollo-server-env "^2.4.3" + lodash.xorby "^4.7.0" + +"@apollo/protobufjs@^1.0.3": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.5.tgz#a78b726147efc0795e74c8cb8a11aafc6e02f773" + integrity sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollographql/apollo-tools@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.0.tgz#8a1a0ab7a0bb12ccc03b72e4a104cfa5d969fd5f" + integrity sha512-7wEO+S+zgz/wVe3ilFQqICufRBYYDSNUkd1V03JWvXuSydbYq2SM5EgvWmFF+04iadt+aQ0XCCsRzCzRPQODfQ== + dependencies: + apollo-env "0.5.1" + +"@apollographql/apollo-tools@^0.4.3": + version "0.4.8" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz#d81da89ee880c2345eb86bddb92b35291f6135ed" + integrity sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA== + dependencies: + apollo-env "^0.6.5" + +"@apollographql/graphql-language-service-interface@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-language-service-interface/-/graphql-language-service-interface-2.0.2.tgz#0e793636eca3d2ee0f818602d52fb5dab9edc0e3" + integrity sha512-28wePK0hlIVjgmvMXMAUq8qRSjz9O+6lqFp4PzOTHtfJfSsjVe9EfjF98zTpHsTgT3HcOxmbqDZZy8jlXtOqEA== + dependencies: + "@apollographql/graphql-language-service-parser" "^2.0.0" + "@apollographql/graphql-language-service-types" "^2.0.0" + "@apollographql/graphql-language-service-utils" "^2.0.2" + +"@apollographql/graphql-language-service-parser@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-language-service-parser/-/graphql-language-service-parser-2.0.2.tgz#50cb7a6c3e331eae09f6de13101da688dab261f1" + integrity sha512-rpTPrEJu1PMaRQxz5P8BZWsixNNhYloS0H0dwTxNBuE3qctbARvR7o8UCKLsmKgTbo+cz3T3a6IAsWlkHgMWGg== + dependencies: + "@apollographql/graphql-language-service-types" "^2.0.0" + +"@apollographql/graphql-language-service-types@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-language-service-types/-/graphql-language-service-types-2.0.2.tgz#1034e47eb7479129959c1bed2ee12d874aab5cab" + integrity sha512-vE+Dz8pG+Xa1Z2nMl82LoO66lQ6JqBUjaXqLDvS3eMjvA3N4hf+YUDOWfPdNZ0zjhHhHXzUIIZCkax6bXfFbzQ== + +"@apollographql/graphql-language-service-utils@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-language-service-utils/-/graphql-language-service-utils-2.0.2.tgz#aa552c31de16172433bbdbc03914585caaca1d03" + integrity sha512-fDj5rWlTi/czvUS5t7V7I45Ai6bOO3Z7JARYj21Y2xxfbRGtJi6h8FvLX0N/EbzQgo/fiZc/HAhtfwn+OCjD7A== + dependencies: + "@apollographql/graphql-language-service-types" "^2.0.0" + +"@apollographql/graphql-playground-html@1.6.26": + version "1.6.26" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz#2f7b610392e2a872722912fc342b43cf8d641cb3" + integrity sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ== + dependencies: + xss "^1.0.6" + +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + +"@babel/compat-data@^7.17.7": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== + +"@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== + +"@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.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.1.6", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.16.7", "@babel/core@^7.9.0": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" + integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.4" + "@babel/types" "^7.21.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/core@~7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" + integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== + dependencies: + "@babel/types" "^7.6.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.16.8", "@babel/generator@^7.21.4", "@babel/generator@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== + dependencies: + "@babel/types" "^7.21.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== + dependencies: + "@babel/types" "^7.22.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" + integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@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.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4", "@babel/helper-compilation-targets@^7.8.7": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== + dependencies: + "@babel/compat-data" "^7.22.0" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz#a6f8c3de208b1e5629424a9a63567f56501955fc" + integrity sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.14.7" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + +"@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" + integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.22.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.22.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" + integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + +"@babel/helper-create-regexp-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" + integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.3.1" + semver "^6.3.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" + integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== + dependencies: + "@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" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== + +"@babel/helper-explode-assignable-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" + integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.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" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.14.5", "@babel/helper-member-expression-to-functions@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + +"@babel/helper-member-expression-to-functions@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" + integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== + dependencies: + "@babel/types" "^7.22.3" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2", "@babel/helper-module-transforms@^7.9.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@7.10.4", "@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-plugin-utils@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" + integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-wrap-function" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-replace-supers@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" + integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-member-expression-to-functions" "^7.22.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@babel/helper-replace-supers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" + integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.14.5": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" + integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== + dependencies: + "@babel/types" "^7.14.8" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== + dependencies: + "@babel/types" "^7.21.5" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" + integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== + +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" + integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helper-wrap-function@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" + integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@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" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== + dependencies: + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.1.3", "@babel/parser@^7.1.6", "@babel/parser@^7.12.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.13.12", "@babel/parser@^7.13.9", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.9.6": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== + +"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" + integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" + integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + +"@babel/plugin-proposal-async-generator-functions@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" + integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-proposal-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" + integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.12.12": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz#59bc4dfc1d665b5a6749cf798ff42297ed1b2c1d" + integrity sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" + +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-default-from@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.14.5.tgz#8931a6560632c650f92a8e5948f6e73019d6d321" + integrity sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-default-from" "^7.14.5" + +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + 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.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.14.5" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@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" + +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" + integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@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.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz#e6c3dba5a61ecf72ba00a3f3f5f1234989a58e6a" + integrity sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.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.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.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" + integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.14.5.tgz#cdfa9d43d2b2c89b6f1af3e83518e8c8b9ed0dbc" + integrity sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" + integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-import-attributes@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" + integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz#7f798eb7e8cfd3821388120679d23d530bae6e53" + integrity sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA== + 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-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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" + integrity sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA== + 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.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-numeric-separator@^7.8.0": + 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.8.3", "@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-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" + integrity sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA== + 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" + integrity sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg== + 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" + integrity sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg== + 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-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-generator-functions@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" + integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" + integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-class-properties@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" + integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-class-static-block@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" + integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" + integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + globals "^11.1.0" + +"@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-classes@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" + integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== + 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-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dynamic-import@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" + integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-export-namespace-from@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" + integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz#0dc9c1d11dcdc873417903d6df4bed019ef0f85e" + integrity sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-flow" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" + integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@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" + +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-json-strings@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" + integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" + integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@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.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" + integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== + dependencies: + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" + +"@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.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.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" + integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== + dependencies: + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" + integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + +"@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.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" + integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" + integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-new-target@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" + integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" + integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" + integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" + integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.3" + +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-optional-catch-binding@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" + integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" + integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" + integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-parameters@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" + integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@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== + dependencies: + "@babel/helper-call-delegate" "^7.8.7" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-private-methods@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" + integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" + integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-display-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz#baa92d15c4570411301a85a74c13534873885b65" + integrity sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.14.5" + +"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz#39749f0ee1efd8a1bd729152cf5f78f1d247a44a" + integrity sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-runtime@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + +"@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typescript@^7.14.5": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" + integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.6" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" + integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" + integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.12.11": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.8.tgz#254942f5ca80ccabcfbb2a9f524c74bca574005b" + integrity sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.7" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@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/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.5" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.14.5" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.14.5" + "@babel/plugin-transform-modules-systemjs" "^7.14.5" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.14.8" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.15.0" + semver "^6.3.0" + +"@babel/preset-env@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" + integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@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/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.3" + "@babel/plugin-transform-async-to-generator" "^7.20.7" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-class-properties" "^7.22.3" + "@babel/plugin-transform-class-static-block" "^7.22.3" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-dynamic-import" "^7.22.1" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-export-namespace-from" "^7.22.3" + "@babel/plugin-transform-for-of" "^7.21.5" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-json-strings" "^7.22.3" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.3" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" + "@babel/plugin-transform-new-target" "^7.22.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" + "@babel/plugin-transform-numeric-separator" "^7.22.3" + "@babel/plugin-transform-object-rest-spread" "^7.22.3" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-optional-catch-binding" "^7.22.3" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-private-methods" "^7.22.3" + "@babel/plugin-transform-private-property-in-object" "^7.22.3" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.20.7" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.3" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.4" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" + semver "^6.3.0" + +"@babel/preset-env@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== + dependencies: + "@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" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@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-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-optional-catch-binding" "^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" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@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.9.0" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@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.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.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-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@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/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-flow@^7.0.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.14.5.tgz#a1810b0780c8b48ab0bece8e7ab8d0d37712751c" + integrity sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-flow-strip-types" "^7.14.5" + +"@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/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + 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/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + 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/preset-react@^7.12.10": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + +"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.12.7": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" + integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.14.5" + +"@babel/register@^7.0.0", "@babel/register@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.14.5.tgz#d0eac615065d9c2f1995842f85d6e56c345f3233" + integrity sha512-TjJpGz/aDjFGWsItRBQMOFTrmTI9tr79CHOK+KIvLeCkbxuOAk2M5QHjvruIMGoo9OuccMh5euplPzc5FjAKGg== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime-corejs3@^7.8.3": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.8.4.tgz#ccc4e042e2fae419c67fa709567e5d2179ed3940" + integrity sha512-+wpLqy5+fbQhvbllvlJEVRIpYj+COUWnnsm+I4jZlA8Lo7/MJmBhGTCHyk1/RWfOqBRJ2MbadddG6QltTKTlrg== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.2" + +"@babel/runtime@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.13.10", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" + integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" + integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.7", "@babel/template@^7.14.5", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3", "@babel/template@^7.8.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/template@^7.21.9": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" + +"@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.16.8", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.4" + "@babel/types" "^7.21.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.22.1": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" + integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.6.1", "@babel/types@^7.6.3", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0", "@babel/types@^7.9.6": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== + dependencies: + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@chromaui/localtunnel@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@chromaui/localtunnel/-/localtunnel-1.10.1.tgz#34da7dab7055a16b1b9034a9eb7e3054ebec4b98" + integrity sha512-LXhAogVc9SOQ45+mtk2mhcQxW4bE8aadfx9WbDzuDlBXcDgDMFBaxOmd5VYsPxQYA+cLFkKeuKOpROzsZSEySA== + dependencies: + axios "0.19.0" + debug "^3.0.1" + openurl "1.1.1" + yargs "6.6.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@emotion/cache@^10.0.17": + version "10.0.17" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.17.tgz#3491a035f62f276620d586677bfc3d4fad0b8472" + integrity sha512-442/miwbuwIDfSzfMqZNxuzxSEbskcz/bZ86QBYzEjFrr/oq9w+y5kJY1BHbGhDtr91GO232PZ5NN9XYMwr/Qg== + dependencies: + "@emotion/sheet" "0.9.3" + "@emotion/stylis" "0.8.4" + "@emotion/utils" "0.11.2" + "@emotion/weak-memoize" "0.2.3" + +"@emotion/cache@^10.0.27": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.27.tgz#7895db204e2c1a991ae33d51262a3a44f6737303" + integrity sha512-Zp8BEpbMunFsTcqAK4D7YTm3MvCp1SekflSLJH8lze2fCcSZ/yMkXHo8kb3t1/1Tdd3hAqf3Fb7z9VZ+FMiC9w== + dependencies: + "@emotion/sheet" "0.9.4" + "@emotion/stylis" "0.8.5" + "@emotion/utils" "0.11.3" + "@emotion/weak-memoize" "0.2.5" + +"@emotion/core@^10.0.14": + version "10.0.17" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.17.tgz#3367376709721f4ee2068cff54ba581d362789d8" + integrity sha512-gykyjjr0sxzVuZBVTVK4dUmYsorc2qLhdYgSiOVK+m7WXgcYTKZevGWZ7TLAgTZvMelCTvhNq8xnf8FR1IdTbg== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/cache" "^10.0.17" + "@emotion/css" "^10.0.14" + "@emotion/serialize" "^0.11.10" + "@emotion/sheet" "0.9.3" + "@emotion/utils" "0.11.2" + +"@emotion/core@^10.0.20": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.27.tgz#7c3f78be681ab2273f3bf11ca3e2edc4a9dd1fdc" + integrity sha512-XbD5R36pVbohQMnKfajHv43g8EbN4NHdF6Zh9zg/C0nr0jqwOw3gYnC07Xj3yG43OYSRyrGsoQ5qPwc8ycvLZw== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/cache" "^10.0.27" + "@emotion/css" "^10.0.27" + "@emotion/serialize" "^0.11.15" + "@emotion/sheet" "0.9.4" + "@emotion/utils" "0.11.3" + +"@emotion/core@^10.1.1": + version "10.1.1" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.1.1.tgz#c956c1365f2f2481960064bcb8c4732e5fb612c3" + integrity sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/cache" "^10.0.27" + "@emotion/css" "^10.0.27" + "@emotion/serialize" "^0.11.15" + "@emotion/sheet" "0.9.4" + "@emotion/utils" "0.11.3" + +"@emotion/css@^10.0.14": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.14.tgz#95dacabdd0e22845d1a1b0b5968d9afa34011139" + integrity sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg== + dependencies: + "@emotion/serialize" "^0.11.8" + "@emotion/utils" "0.11.2" + babel-plugin-emotion "^10.0.14" + +"@emotion/css@^10.0.27": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" + integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== + dependencies: + "@emotion/serialize" "^0.11.15" + "@emotion/utils" "0.11.3" + babel-plugin-emotion "^10.0.27" + +"@emotion/hash@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.2.tgz#53211e564604beb9befa7a4400ebf8147473eeef" + integrity sha512-RMtr1i6E8MXaBWwhXL3yeOU8JXRnz8GNxHvaUfVvwxokvayUY0zoBeWbKw1S9XkufmGEEdQd228pSZXFkAln8Q== + +"@emotion/hash@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831" + integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A== + +"@emotion/is-prop-valid@0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.2.tgz#b9692080da79041683021fcc32f96b40c54c59dc" + integrity sha512-ZQIMAA2kLUWiUeMZNJDTeCwYRx1l8SQL0kHktze4COT22occKpDML1GDUXP5/sxhOMrZO8vZw773ni4H5Snrsg== + dependencies: + "@emotion/memoize" "0.7.2" + +"@emotion/is-prop-valid@0.8.6": + version "0.8.6" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.6.tgz#4757646f0a58e9dec614c47c838e7147d88c263c" + integrity sha512-mnZMho3Sq8BfzkYYRVc8ilQTnc8U02Ytp6J1AwM6taQStZ3AhsEJBX2LzhA/LJirNCwM2VtHL3VFIZ+sNJUgUQ== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^0.8.6": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.2.tgz#7f4c71b7654068dfcccad29553520f984cc66b30" + integrity sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w== + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/serialize@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.10.tgz#53207dba7e28bd96928fc2a37e20b31b712bf9a2" + integrity sha512-04AB+wU00vv9jLgkWn13c/GJg2yXp3w7ZR3Q1O6mBSE6mbUmYeNX3OpBhfp//6r47lFyY0hBJJue+bA30iokHQ== + dependencies: + "@emotion/hash" "0.7.2" + "@emotion/memoize" "0.7.2" + "@emotion/unitless" "0.7.4" + "@emotion/utils" "0.11.2" + csstype "^2.5.7" + +"@emotion/serialize@^0.11.15": + version "0.11.15" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.15.tgz#9a0f5873fb458d87d4f23e034413c12ed60a705a" + integrity sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg== + dependencies: + "@emotion/hash" "0.7.4" + "@emotion/memoize" "0.7.4" + "@emotion/unitless" "0.7.5" + "@emotion/utils" "0.11.3" + csstype "^2.5.7" + +"@emotion/serialize@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.8.tgz#e41dcf7029e45286a3e0cf922933e670fe05402c" + integrity sha512-Qb6Us2Yk1ZW8SOYH6s5z7qzXXb2iHwVeqc6FjXtac0vvxC416ki0eTtHNw4Q5smoyxdyZh3519NKGrQvvvrZ/Q== + dependencies: + "@emotion/hash" "0.7.2" + "@emotion/memoize" "0.7.2" + "@emotion/unitless" "0.7.4" + "@emotion/utils" "0.11.2" + csstype "^2.5.7" + +"@emotion/sheet@0.9.3": + version "0.9.3" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a" + integrity sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A== + +"@emotion/sheet@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" + integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== + +"@emotion/styled-base@^10.0.17": + version "10.0.17" + resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.17.tgz#701af0cd256be2977db8d67c33630f542e460b85" + integrity sha512-vqQvxluZZKPByAB4zYZys0Qo/kVDP/03hAeg1K+TYpnZRwTi7WteOodc+/5669RPVNcfb93fphQpM5BYJnI1/g== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/is-prop-valid" "0.8.2" + "@emotion/serialize" "^0.11.10" + "@emotion/utils" "0.11.2" + +"@emotion/styled-base@^10.0.27": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.27.tgz#d9efa307ae4e938fcc4d0596b40b7e8bc10f7c7c" + integrity sha512-ufHM/HhE3nr309hJG9jxuFt71r6aHn7p+bwXduFxcwPFEfBIqvmZUMtZ9YxIsY61PVwK3bp4G1XhaCzy9smVvw== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/is-prop-valid" "0.8.6" + "@emotion/serialize" "^0.11.15" + "@emotion/utils" "0.11.3" + +"@emotion/styled@^10.0.14": + version "10.0.17" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.17.tgz#0cd38b8b36259541f2c6717fc22607a120623654" + integrity sha512-zHMgWjHDMNjD+ux64POtDnjLAObniu3znxFBLSdV/RiEhSLjHIowfvSbbd/C33/3uwtI6Uzs2KXnRZtka/PpAQ== + dependencies: + "@emotion/styled-base" "^10.0.17" + babel-plugin-emotion "^10.0.17" + +"@emotion/styled@^10.0.17", "@emotion/styled@^10.0.27": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf" + integrity sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q== + dependencies: + "@emotion/styled-base" "^10.0.27" + babel-plugin-emotion "^10.0.27" + +"@emotion/stylis@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.4.tgz#6c51afdf1dd0d73666ba09d2eb6c25c220d6fe4c" + integrity sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ== + +"@emotion/stylis@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.4.tgz#a87b4b04e5ae14a88d48ebef15015f6b7d1f5677" + integrity sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ== + +"@emotion/unitless@0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@emotion/utils@0.11.2": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.2.tgz#713056bfdffb396b0a14f1c8f18e7b4d0d200183" + integrity sha512-UHX2XklLl3sIaP6oiMmlVzT0J+2ATTVpf0dHQVyPJHTkOITvXfaSqnRk6mdDhV9pR8T/tHc3cex78IKXssmzrA== + +"@emotion/utils@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" + integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== + +"@emotion/weak-memoize@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.3.tgz#dfa0c92efe44a1d1a7974fb49ffeb40ef2da5a27" + integrity sha512-zVgvPwGK7c1aVdUVc9Qv7SqepOGRDrqCw7KZPSZziWGxSlbII3gmvGLPzLX4d0n0BMbamBacUrN22zOMyFFEkQ== + +"@emotion/weak-memoize@0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + +"@endemolshinegroup/cosmiconfig-typescript-loader@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.1.tgz#484ee6f4e9209ffde5d3edbdacf03e0bc5ee0c67" + integrity sha512-bhUR9035PbgL6A/nfLayjoqKo4W7hCtzxqVxq2cgDB+Ndpsa3dGIr71/ymgY3vCTCQaufkFxAcEeoECyJ498CA== + dependencies: + lodash.get "^4" + make-error "^1" + ts-node "^8" + tslib "^1" + +"@faker-js/faker@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-5.1.0.tgz#cee1d77ada0d0dbbe77201d18b1ebabf432d9c0f" + integrity sha512-0VonSKh7fBCqvY+V2FLN2ZW4pR4ZtWJalWmwSaiaB7yK7y4qp8vDfuaq9QdLjf/cdZGx3M7Wc4Q+x4fZHxI21Q== + +"@hapi/address@2.x.x": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a" + integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw== + +"@hapi/hoek@6.x.x": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.4.tgz#4b95fbaccbfba90185690890bdf1a2fbbda10595" + integrity sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A== + +"@hapi/joi@^15.0.1": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.0.3.tgz#e94568fd859e5e945126d5675e7dd218484638a7" + integrity sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/hoek" "6.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.0.tgz#5c47cd9637c2953db185aa957a27bcb2a8b7a6f8" + integrity sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww== + dependencies: + "@hapi/hoek" "6.x.x" + +"@human-connection/styleguide@0.5.22": + version "0.5.22" + resolved "https://registry.yarnpkg.com/@human-connection/styleguide/-/styleguide-0.5.22.tgz#444ec98b8f8d1c438e2e99736dcffe432b302755" + integrity sha512-zYDhWWoDIEcUhAJPSrb2azBPxBfcr6igVtTx1Bz/FNMW2bIWfZIRv9U4LaJ9RG/GgjKNcVE+OPdB8zCcwqyQyA== + dependencies: + vue "^2.6.10" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.2.tgz#ee92c316ee2fbdf0bcd9d2db0ef42d64fea26b56" + integrity sha512-JKs3VUtse0vQfCaFGJRX1bir9yBdtasxziSyu+pIiEllAQOe4oQhdCYIf3+Lx+nGglFktSKToBnRJfD5QKp+NQ== + dependencies: + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-mock "^29.4.2" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@jest/fake-timers@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.2.tgz#af43ee1a5720b987d0348f80df98f2cb17d45cd0" + integrity sha512-Ny1u0Wg6kCsHFWq7A/rW/tMhIedq2siiyHyLpHCmIhP7WmcAmd2cx95P+0xtTZlj5ZbJxIRQi4OPydZZUoiSQQ== + dependencies: + "@jest/types" "^29.4.2" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.4.2" + jest-mock "^29.4.2" + jest-util "^29.4.2" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.2.tgz#cf7cfe97c5649f518452b176c47ed07486270fc1" + integrity sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.4.2", "@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@mapbox/fusspot@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@mapbox/fusspot/-/fusspot-0.4.0.tgz#5ac625b5ed31695fda465fb0413ee0379bdf553c" + integrity sha512-6sys1vUlhNCqMvJOqPEPSi0jc9tg7aJ//oG1A16H3PXoIt9whtNngD7UzBHUVTH15zunR/vRvMtGNVsogm1KzA== + dependencies: + is-plain-obj "^1.1.0" + xtend "^4.0.1" + +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz#591a5d71a9cd1da1a0bf3420b3bea31b0fc7946a" + integrity sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.6" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== + +"@mapbox/mapbox-gl-geocoder@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-geocoder/-/mapbox-gl-geocoder-5.0.1.tgz#3db39280175872bfd94884275c5ee528bdff35e0" + integrity sha512-/OUL42eh4OBaIerhcwCpa27oD+u4a2xN8V7vEdsglwd8lCplFAxJCdwT9Kprli1TH5mTYsXyONmh03FwoWBWfA== + dependencies: + "@mapbox/mapbox-sdk" "^0.13.3" + events "^3.3.0" + lodash.debounce "^4.0.6" + nanoid "^3.1.31" + subtag "^0.5.0" + suggestions "^1.6.0" + xtend "^4.0.1" + +"@mapbox/mapbox-gl-supported@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/mapbox-sdk@^0.13.3": + version "0.13.7" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-sdk/-/mapbox-sdk-0.13.7.tgz#05e1bf287d86868623d748c19865b1fee7222642" + integrity sha512-JZjBsAVSBv7lX7gQPOQwftBGHIUcvL/tPKFxAL+SCT7u1n+eRH052XebOTkl28pNm7Du6DpKAs1GvgUnDcFFDQ== + dependencies: + "@mapbox/fusspot" "^0.4.0" + "@mapbox/parse-mapbox-token" "^0.2.0" + "@mapbox/polyline" "^1.0.0" + eventemitter3 "^3.1.0" + form-data "^3.0.0" + got "^11.8.5" + is-plain-obj "^1.1.0" + xtend "^4.0.1" + +"@mapbox/parse-mapbox-token@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/parse-mapbox-token/-/parse-mapbox-token-0.2.0.tgz#34049d948868376f689189a5ea0e3cd2d9284b91" + integrity sha512-BjeuG4sodYaoTygwXIuAWlZV6zUv4ZriYAQhXikzx+7DChycMUQ9g85E79Htat+AsBg+nStFALehlOhClYm5cQ== + dependencies: + base-64 "^0.1.0" + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ== + +"@mapbox/polyline@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mapbox/polyline/-/polyline-1.1.1.tgz#ab96e5e6936f4847a4894e14558daf43e40e3bd2" + integrity sha512-z9Sl7NYzsEIrAza658H92mc0OvpBjQwjp7Snv4xREKhsCMat7m1IKdWJMjQ5opiPYa0veMf7kCaSd1yx55AhmQ== + dependencies: + meow "^6.1.1" + +"@mapbox/tiny-sdf@^1.1.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" + integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA== + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@nuxt/babel-preset-app@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/babel-preset-app/-/babel-preset-app-2.12.1.tgz#54fe024800ebe4b373e94ed341b67ab41b2dcc12" + integrity sha512-CO8u9Lv67lHsZn310I9kRkvnk52tNPNVW1H8aItZKm1U5LIrhi9ezsVAFTRxGLEyyIHY71zHLE3nTqyP8OWFQA== + dependencies: + "@babel/core" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.9.0" + "@babel/preset-env" "^7.9.0" + "@babel/runtime" "^7.9.2" + "@vue/babel-preset-jsx" "^1.1.2" + core-js "^2.6.5" + +"@nuxt/builder@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/builder/-/builder-2.12.1.tgz#d4ff9eb3b83b845dc7cd2fab6860013accbd4601" + integrity sha512-gGRPkWUbEta7IrCRw2/FF2GzCU6320M/3WJj/CiG2t4aIyX+w4c4hmh2aVb4oNv7aMSLqqha9bySXJnIUJeIEA== + dependencies: + "@nuxt/devalue" "^1.2.4" + "@nuxt/utils" "2.12.1" + "@nuxt/vue-app" "2.12.1" + "@nuxt/webpack" "2.12.1" + chalk "^3.0.0" + chokidar "^3.3.1" + consola "^2.11.3" + fs-extra "^8.1.0" + glob "^7.1.6" + hash-sum "^2.0.0" + ignore "^5.1.4" + lodash "^4.17.15" + pify "^4.0.1" + semver "^7.1.3" + serialize-javascript "^3.0.0" + upath "^1.2.0" + +"@nuxt/cli@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/cli/-/cli-2.12.1.tgz#5aa4e6b48a9dd9ffac7077a1eb2dca457c22dcd1" + integrity sha512-7M6KcCjmzp3gOmIXnFrCypvUsZd8hmvu6GetfM1UwqrbL6gAN1yKrGv2gZa6rowcDqnVeXIbUHjzrkKD9lIFjg== + dependencies: + "@nuxt/config" "2.12.1" + "@nuxt/utils" "2.12.1" + boxen "^4.2.0" + chalk "^3.0.0" + consola "^2.11.3" + esm "^3.2.25" + execa "^3.4.0" + exit "^0.1.2" + fs-extra "^8.1.0" + hable "^3.0.0" + minimist "^1.2.5" + opener "1.5.1" + pretty-bytes "^5.3.0" + std-env "^2.2.1" + wrap-ansi "^6.2.0" + +"@nuxt/config@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/config/-/config-2.12.1.tgz#5fe02a1af14ec7e099a7deb95d1dd38ab0747627" + integrity sha512-pfAVRwQdp9yyepQx4vuA2mWLDWSHePH9PtuKB2pFUPNg77P2pOff2cWmeYyvCvBvcccnnAYGJoi8wFSUWFs35Q== + dependencies: + "@nuxt/utils" "2.12.1" + consola "^2.11.3" + esm "^3.2.25" + std-env "^2.2.1" + +"@nuxt/core@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/core/-/core-2.12.1.tgz#ce075632a8855f3a726d0c93fb3fad9d21ebc59b" + integrity sha512-UOOXb5Dg494FmEH3caW9/yD8VdZqzBb/qU3IANqDtB3xpC3eJ19VWrM2/MIHIeiy9zMgzTSsDkpurR7f2mNVZA== + dependencies: + "@nuxt/config" "2.12.1" + "@nuxt/devalue" "^1.2.4" + "@nuxt/server" "2.12.1" + "@nuxt/utils" "2.12.1" + "@nuxt/vue-renderer" "2.12.1" + consola "^2.11.3" + debug "^4.1.1" + esm "^3.2.25" + fs-extra "^8.1.0" + hable "^3.0.0" + hash-sum "^2.0.0" + std-env "^2.2.1" + +"@nuxt/devalue@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nuxt/devalue/-/devalue-1.2.4.tgz#69eca032b7481fd3c019a78ade65d642da3f2f35" + integrity sha512-hS87c2HdSfTk1d+2KQx7mQpebyd2HjguvZu/UBy9LB+kUgT1qz2+Sj38FH32yJALK6Fv49ZfOZEwgcZ4rcNLjg== + dependencies: + consola "^2.9.0" + +"@nuxt/friendly-errors-webpack-plugin@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.5.0.tgz#5374665bc72d34b7dbadcc361a4777e3f0f5d46b" + integrity sha512-pUgPFmRL56/xuTCGN5rqgTfxvs1N/AYJw7q7tUHiZaBm3UyPgbIVPkadS9njwbFbPD2XcebVy7npQMMVwQJWfA== + dependencies: + chalk "^2.3.2" + consola "^2.6.0" + error-stack-parser "^2.0.0" + string-width "^2.0.0" + +"@nuxt/generator@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/generator/-/generator-2.12.1.tgz#57f4e7125feedfa507fbb6c3dcc11a0b3ecc35de" + integrity sha512-7PENrp0aVdqmUWM+/n+frbj4yaKiV7u3NF1l/SKrwotmX6QYHn7sdfsvL/gAQxyO9Pcb9ahHrpR7q2GA0CHXPg== + dependencies: + "@nuxt/utils" "2.12.1" + chalk "^3.0.0" + consola "^2.11.3" + fs-extra "^8.1.0" + html-minifier "^4.0.0" + +"@nuxt/loading-screen@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@nuxt/loading-screen/-/loading-screen-1.2.0.tgz#9cfab1e5e421bbaedadb26f7f27a68bcde313c24" + integrity sha512-l7nXgwkuX2/lDxEDAyIe3013MS8Jhja29uDVka21gyEbRnL68XOkoV3ws4dkk6QfhT2bcPwtu2C8tYvAhhhUzA== + dependencies: + connect "^3.7.0" + fs-extra "^8.1.0" + node-res "^5.0.1" + serve-static "^1.14.1" + +"@nuxt/opencollective@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@nuxt/opencollective/-/opencollective-0.3.0.tgz#11d8944dcf2d526e31660bb69570be03f8fb72b7" + integrity sha512-Vf09BxCdj1iT2IRqVwX5snaY2WCTkvM0O4cWWSO1ThCFuc4if0Q/nNwAgCxRU0FeYHJ7DdyMUNSdswCLKlVqeg== + dependencies: + chalk "^2.4.2" + consola "^2.10.1" + node-fetch "^2.6.0" + +"@nuxt/server@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/server/-/server-2.12.1.tgz#9480eef16d2ffb84595375a4df8e045fa6e5503f" + integrity sha512-nz+zRFkMVASsysAVLLJGxMOjgYl/GzDzsoYJz40dS1hUnAE5sg9iLINDPNn/rWDjuo2yTOZ8oAjlds2+RcxrRA== + dependencies: + "@nuxt/config" "2.12.1" + "@nuxt/utils" "2.12.1" + "@nuxt/vue-renderer" "2.12.1" + "@nuxtjs/youch" "^4.2.3" + chalk "^3.0.0" + compression "^1.7.4" + connect "^3.7.0" + consola "^2.11.3" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "^8.1.0" + ip "^1.1.5" + launch-editor-middleware "^2.2.1" + on-headers "^1.0.2" + pify "^4.0.1" + serve-placeholder "^1.2.2" + serve-static "^1.14.1" + server-destroy "^1.0.1" + +"@nuxt/utils@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/utils/-/utils-2.12.1.tgz#6e8ecaf38c55efcef16608e2a5b61c8950d45a5c" + integrity sha512-KlI2H2MlPqnhRONJv9ERwHBLIoQQIWB6wM5zJqXMTLdgNTLJDRk8GrTngiAgFn8fe31jaZ7lENLeCqE55u1RwA== + dependencies: + consola "^2.11.3" + fs-extra "^8.1.0" + hash-sum "^2.0.0" + proper-lockfile "^4.1.1" + semver "^7.1.3" + serialize-javascript "^3.0.0" + signal-exit "^3.0.2" + ua-parser-js "^0.7.21" + +"@nuxt/vue-app@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/vue-app/-/vue-app-2.12.1.tgz#cfbe78c0646538e0f25c2fadd6623889aa754203" + integrity sha512-PrEyNvgpv0KD7YFsDBGBcLjOuJrKHTeLnzXoNM4lo7PB9x6qvy0xTGSEEvZ3zyYj74gOZ6BE/5oY0ioieLPZ8w== + dependencies: + node-fetch "^2.6.0" + unfetch "^4.1.0" + vue "^2.6.11" + vue-client-only "^2.0.0" + vue-meta "^2.3.3" + vue-no-ssr "^1.1.1" + vue-router "^3.1.6" + vue-template-compiler "^2.6.11" + vuex "^3.1.3" + +"@nuxt/vue-renderer@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/vue-renderer/-/vue-renderer-2.12.1.tgz#ac01b9e784b6af61399c59763ae12cf45a5136f9" + integrity sha512-WRK/8HID/OxEywNNyaFwjqpCuV1W0g79fMAtKXiZZg2fDPo2Np8/YpPmP1XxxWnadZhO+C/CeLTr2tLwoe9gTw== + dependencies: + "@nuxt/devalue" "^1.2.4" + "@nuxt/utils" "2.12.1" + consola "^2.11.3" + fs-extra "^8.1.0" + lru-cache "^5.1.1" + vue "^2.6.11" + vue-meta "^2.3.3" + vue-server-renderer "^2.6.11" + +"@nuxt/webpack@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@nuxt/webpack/-/webpack-2.12.1.tgz#12c0b55df29ebfa45749aa34b9817d2879795718" + integrity sha512-LvpUH5V8+NMrJG6xY1mwqwd2eVfZr7xnKIDyfDLNw/8SulMT9IUz5j9xaP8i/bSvkcWNLMKlQXRPwa3QjT/yIw== + dependencies: + "@babel/core" "^7.9.0" + "@nuxt/babel-preset-app" "2.12.1" + "@nuxt/friendly-errors-webpack-plugin" "^2.5.0" + "@nuxt/utils" "2.12.1" + babel-loader "^8.1.0" + cache-loader "^4.1.0" + caniuse-lite "^1.0.30001036" + chalk "^3.0.0" + consola "^2.11.3" + css-loader "^3.4.2" + cssnano "^4.1.10" + eventsource-polyfill "^0.9.6" + extract-css-chunks-webpack-plugin "^4.7.4" + file-loader "^4.3.0" + glob "^7.1.6" + hard-source-webpack-plugin "^0.13.1" + hash-sum "^2.0.0" + html-webpack-plugin "^3.2.0" + memory-fs "^0.4.1" + optimize-css-assets-webpack-plugin "^5.0.3" + pify "^4.0.1" + postcss "^7.0.27" + postcss-import "^12.0.1" + postcss-import-resolver "^2.0.0" + postcss-loader "^3.0.0" + postcss-preset-env "^6.7.0" + postcss-url "^8.0.0" + semver "^7.1.3" + std-env "^2.2.1" + style-resources-loader "^1.3.3" + terser-webpack-plugin "^2.3.5" + thread-loader "^2.1.3" + time-fix-plugin "^2.0.6" + url-loader "^2.3.0" + vue-loader "^15.9.1" + webpack "^4.42.1" + webpack-bundle-analyzer "^3.6.1" + webpack-dev-middleware "^3.7.2" + webpack-hot-middleware "^2.25.0" + webpack-node-externals "^1.7.2" + webpackbar "^4.0.0" + +"@nuxtjs/apollo@^4.0.0-rc19": + version "4.0.0-rc19" + resolved "https://registry.yarnpkg.com/@nuxtjs/apollo/-/apollo-4.0.0-rc19.tgz#145b50c8e0185dac83c37f48ab685861f9005850" + integrity sha512-OCUxdhz09vTA7jq4KrhdYw23PRXS4yHWST99Ohc1oSUiZUyNrmQc+VUNAz9bhSVjfHABrP1NP2FzKnBE1iEZhA== + dependencies: + cross-fetch "^3.0.4" + universal-cookie "^4.0.2" + vue-apollo "^3.0.2" + vue-cli-plugin-apollo "^0.21.3" + webpack-node-externals "^1.7.2" + +"@nuxtjs/axios@~5.9.7": + version "5.9.7" + resolved "https://registry.yarnpkg.com/@nuxtjs/axios/-/axios-5.9.7.tgz#ec78b72dbcb70fceee7724b7f24e0cb4d924440c" + integrity sha512-GLL0/0HbRCbvyXtw6WjXxCzQjXrQwlip4N3ATesyytcfzYcQUAfxdKCaKBK7IRiW+V1mH1vrzbEK/iDlfxA/TQ== + dependencies: + "@nuxtjs/proxy" "^1.3.3" + axios "^0.19.2" + axios-retry "^3.1.2" + consola "^2.11.3" + defu "^1.0.0" + +"@nuxtjs/composition-api@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/composition-api/-/composition-api-0.32.0.tgz#90a89f90899dc78d641a9d7da85b5d238eeb0cc7" + integrity sha512-/LYf0N5x5j8i2/Uldfw+n4o3SVXyCIYQyOwSL+2JTllyyEkO3zHJc8YAbJhp22kHh6gPEhmgBA/whDUbERY7mg== + dependencies: + "@vue/composition-api" "^1.4.6" + defu "^5.0.1" + estree-walker "^2.0.2" + fs-extra "^9.1.0" + magic-string "^0.25.7" + ufo "^0.7.9" + unplugin-vue2-script-setup "^0.9.3" + upath "^2.0.1" + +"@nuxtjs/dotenv@~1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@nuxtjs/dotenv/-/dotenv-1.4.1.tgz#dd5abb98e22cc7ae27139d3aa606151034293128" + integrity sha512-DpdObsvRwC8d89I9mzz6pBg6e/PEXHazDM57DOI1mmML2ZjHfQ/DvkjlSzUL7T+TnW3b/a4Ks5wQx08DqFBmeQ== + dependencies: + consola "^2.10.1" + dotenv "^8.1.0" + +"@nuxtjs/proxy@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@nuxtjs/proxy/-/proxy-1.3.3.tgz#3de3d9f073e8e57167168100940be2a824a220e0" + integrity sha512-ykpCUdOqPOH79mQG30QfWZmbRD8yjTD+TTSBbwow5GkROUQEtXw+HE+q6i+YFpuChvgJNbwVrXdZ3YmfXbZtTw== + dependencies: + consola "^2.5.6" + http-proxy-middleware "^0.19.1" + +"@nuxtjs/pwa@^3.0.0-beta.20": + version "3.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@nuxtjs/pwa/-/pwa-3.0.0-beta.20.tgz#56766da5485c09cb73307285292203f4a4417d5d" + integrity sha512-pZhGBqRvTCItvAdZ6PSZtqJUKT6ybphXCykfHh95KzW0cGf10QH/ETPci2AMDEzfx4jW2hImGSmLBToVWOV7Uw== + dependencies: + defu "^1.0.0" + execa "^1.0.0" + fs-extra "^8.1.0" + hasha "^5.0.0" + jimp-compact "^0.8.0" + workbox-cdn "^4.3.1" + +"@nuxtjs/sentry@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/sentry/-/sentry-4.0.0.tgz#a69915fe27f49444d51d9cb1947cd6e463db81a9" + integrity sha512-T2Vxzl1Ghu1W+TKSiJUICT/GU8y/rdyPJ7rzDyet98hLETEelciPJbhsztcut754nStZ+OWUpKrta47o5PbLZg== + dependencies: + "@sentry/browser" "^5.15.0" + "@sentry/integrations" "^5.15.0" + "@sentry/node" "^5.15.0" + "@sentry/webpack-plugin" "^1.10.0" + consola "^2.11.3" + deepmerge "^4.2.2" + +"@nuxtjs/style-resources@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/style-resources/-/style-resources-1.0.0.tgz#7c4d6be19d7f7cc5d687d689f2ab16c0b94773a1" + integrity sha512-tDRcC/pm8B0Kpxtzb/1/HOBkv3/kPD+2FiCiUBGMB7YriRud9OUPw1pnYCsAH9ftwpMJS4k4XOyUY8FCTk6OxA== + dependencies: + consola "^2.4.0" + glob-all "^3.1.0" + sass-resources-loader "^2.0.0" + +"@nuxtjs/youch@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@nuxtjs/youch/-/youch-4.2.3.tgz#36f8b22df5a0efaa81373109851e1d857aca6bed" + integrity sha512-XiTWdadTwtmL/IGkNqbVe+dOlT+IMvcBu7TvKI7plWhVQeBCQ9iKhk3jgvVWFyiwL2yHJDlEwOM5v9oVES5Xmw== + dependencies: + cookie "^0.3.1" + mustache "^2.3.0" + stack-trace "0.0.10" + +"@oclif/color@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@oclif/color/-/color-0.0.0.tgz#54939bbd16d1387511bf1a48ccda1a417248e6a9" + integrity sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw== + dependencies: + ansi-styles "^3.2.1" + supports-color "^5.4.0" + tslib "^1" + +"@oclif/command@1.5.19": + version "1.5.19" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.19.tgz#13f472450eb83bd6c6871a164c03eadb5e1a07ed" + integrity sha512-6+iaCMh/JXJaB2QWikqvGE9//wLEVYYwZd5sud8aLoLKog1Q75naZh2vlGVtg5Mq/NqpqGQvdIjJb3Bm+64AUQ== + dependencies: + "@oclif/config" "^1" + "@oclif/errors" "^1.2.2" + "@oclif/parser" "^3.8.3" + "@oclif/plugin-help" "^2" + debug "^4.1.1" + semver "^5.6.0" + +"@oclif/command@^1.4.31", "@oclif/command@^1.5.1", "@oclif/command@^1.5.10", "@oclif/command@^1.5.12", "@oclif/command@^1.5.13", "@oclif/command@^1.5.3": + version "1.5.18" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.18.tgz#57125b501fafa155ad280bf8dc9f36a911c44f11" + integrity sha512-sfLb5UUCwyQ0w9LyQ1/3DUuD/RWnPZk6uvcK5P7pqD65WgRJaOPCqzuNZyb56kPsj6FftRp1UudApNKd7U0KBQ== + dependencies: + "@oclif/config" "^1" + "@oclif/errors" "^1.2.2" + "@oclif/parser" "^3.8.3" + "@oclif/plugin-help" "^2" + debug "^4.1.1" + semver "^5.6.0" + +"@oclif/config@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.13.3.tgz#1b13e18d0e4242ddbd9cbd100f0eec819aa2bf8c" + integrity sha512-qs5XvGRw+1M41abOKCjd0uoeHCgsMxa2MurD2g2K8CtQlzlMXl0rW5idVeimIg5208LLuxkfzQo8TKAhhRCWLg== + dependencies: + "@oclif/parser" "^3.8.0" + debug "^4.1.1" + tslib "^1.9.3" + +"@oclif/config@^1", "@oclif/config@^1.12.8", "@oclif/config@^1.6.22": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.13.2.tgz#c1dc25296bf06c039fd5fb0b90e4132be2213b2a" + integrity sha512-RUOKeuAaopo3zrA5hcgE0PT2lbAUT72+eJdqTlWyI9sbPrGHZgUwV+vrL6Qal7ywWYDkL0vrKd1YS4yXtKIDKw== + dependencies: + "@oclif/parser" "^3.8.0" + debug "^4.1.1" + tslib "^1.9.3" + +"@oclif/errors@1.2.2", "@oclif/errors@^1.2.1", "@oclif/errors@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.2.2.tgz#9d8f269b15f13d70aa93316fed7bebc24688edc2" + integrity sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg== + dependencies: + clean-stack "^1.3.0" + fs-extra "^7.0.0" + indent-string "^3.2.0" + strip-ansi "^5.0.0" + wrap-ansi "^4.0.0" + +"@oclif/linewrap@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" + integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== + +"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.3": + version "3.8.3" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.3.tgz#717fbbe5bfafef4270224b8bd41a2d3c80b9554e" + integrity sha512-zN+3oGuv9Lg8NjFvxZTDKFEmhAMfAvd/JWeQp3Ri8pDezoyJQi4OSHHLM8sdHjBh8sePewfWI7+fDUXdrVbrqg== + dependencies: + "@oclif/linewrap" "^1.0.0" + chalk "^2.4.2" + tslib "^1.9.3" + +"@oclif/plugin-autocomplete@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@oclif/plugin-autocomplete/-/plugin-autocomplete-0.1.4.tgz#ae993f196ca0085a63e3141814eaf9dc6c178418" + integrity sha512-ZyxJyL6jSt9Df68Smeu14xhZZwELE9IB5twhie1/56rt62nG6TJB4CZhaMqRk+33MDfU3JyWxNbIDMNMESlGqg== + dependencies: + "@oclif/command" "^1.4.31" + "@oclif/config" "^1.6.22" + "@types/fs-extra" "^5.0.2" + chalk "^2.4.1" + cli-ux "^4.4.0" + debug "^3.1.0" + fs-extra "^6.0.1" + moment "^2.22.1" + +"@oclif/plugin-help@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.2.1.tgz#cb4d23e453b19340b07c48fb299948b7c74366d3" + integrity sha512-psEA3t41MSGBErLk6xCaAq2jKrRtx3Br+kHpd43vZeGEeZ7Gos4wgK0JAaHBbvhvUQskCHg8dzoqv4XEeTWeVQ== + dependencies: + "@oclif/command" "^1.5.13" + chalk "^2.4.1" + indent-string "^3.2.0" + lodash.template "^4.4.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + widest-line "^2.0.1" + wrap-ansi "^4.0.0" + +"@oclif/plugin-help@^2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.2.0.tgz#8dfc1c80deae47a205fbc70b018747ba93f31cc3" + integrity sha512-56iIgE7NQfwy/ZrWrvrEfJGb5rrMUt409yoQGw4feiU101UudA1btN1pbUbcKBr7vY9KFeqZZcftXEGxOp7zBg== + dependencies: + "@oclif/command" "^1.5.13" + chalk "^2.4.1" + indent-string "^3.2.0" + lodash.template "^4.4.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + widest-line "^2.0.1" + wrap-ansi "^4.0.0" + +"@oclif/plugin-not-found@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-1.2.3.tgz#00f9e7a0a793a5e2f616d8280075f4592de8f079" + integrity sha512-Igbw2T4gLrb/f28Llr730FeMXBSI2PXdky2YvQfsZeQGDsyBZmC4gprJJtmrMWQcjz0B51IInRBnZYERvwfIpw== + dependencies: + "@oclif/color" "^0.0.0" + "@oclif/command" "^1.5.3" + cli-ux "^4.9.0" + fast-levenshtein "^2.0.6" + lodash "^4.17.13" + +"@oclif/plugin-plugins@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@oclif/plugin-plugins/-/plugin-plugins-1.7.8.tgz#51e07cb85bf9cd36a6de8f3e441b7d705a5e7105" + integrity sha512-GxLxaf8Lk1RqHVAIBZyA7hmhU7u5oV97i/OsWgFPdjPaT+BmWlWXR8IpmtA8giNo6atR+JpfgDmYndMU75zYUQ== + dependencies: + "@oclif/color" "^0.0.0" + "@oclif/command" "^1.5.12" + chalk "^2.4.2" + cli-ux "^5.2.1" + debug "^4.1.0" + fs-extra "^7.0.1" + http-call "^5.2.2" + load-json-file "^5.2.0" + npm-run-path "^3.0.0" + semver "^5.6.0" + tslib "^1.9.3" + yarn "^1.15.0" + +"@oclif/plugin-warn-if-update-available@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-1.7.0.tgz#5a72abe39ce0b831eb4ae81cb64eb4b9f3ea424a" + integrity sha512-Nwyz3BJ8RhsfQ+OmFSsJSPIfn5YJqMrCzPh72Zgo2jqIjKIBWD8N9vTTe4kZlpeUUn77SyXFfwlBQbNCL5OEuQ== + dependencies: + "@oclif/command" "^1.5.10" + "@oclif/config" "^1.12.8" + "@oclif/errors" "^1.2.2" + chalk "^2.4.1" + debug "^4.1.0" + fs-extra "^7.0.0" + http-call "^5.2.2" + lodash.template "^4.4.0" + semver "^5.6.0" + +"@oclif/screen@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" + integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== + +"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" + integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@reach/router@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e" + integrity sha512-kTaX08X4g27tzIFQGRukaHmNbtMYDS3LEWIS8+l6OayGIw6Oyo1HIF/JzeuR2FoF9z6oV+x/wJSVSq4v8tcUGQ== + dependencies: + create-react-context "^0.2.1" + invariant "^2.2.3" + prop-types "^15.6.1" + react-lifecycles-compat "^3.0.4" + warning "^3.0.0" + +"@reach/router@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c" + integrity sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA== + dependencies: + create-react-context "0.3.0" + invariant "^2.2.3" + prop-types "^15.6.1" + react-lifecycles-compat "^3.0.4" + +"@rollup/pluginutils@^4.1.2": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + +"@sentry/apm@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.15.0.tgz#76972fce07793a28203704f3aaf6b7916d07d562" + integrity sha512-2N33gcl+MIcRDAdV150pRb+IkSnoqLdu0mZV9Cm7dIYvCxeZ6J+k903qAwTPdoR6/MCu795aiw4zUvsRbMJy6Q== + dependencies: + "@sentry/browser" "5.15.0" + "@sentry/hub" "5.15.0" + "@sentry/minimal" "5.15.0" + "@sentry/types" "5.15.0" + "@sentry/utils" "5.15.0" + tslib "^1.9.3" + +"@sentry/browser@5.15.0", "@sentry/browser@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.0.tgz#ea0ba1ceccc82a6467e10e4e94070e4cfb7accee" + integrity sha512-9sgqWGaoT5jb3vk8sgQ1bz1LzhUf3oKoDMp/c6vX0reuA6Vz+/jwOC7a/FPWtQir2PwRJfbak2QOxw8W6Mwa3g== + dependencies: + "@sentry/core" "5.15.0" + "@sentry/types" "5.15.0" + "@sentry/utils" "5.15.0" + tslib "^1.9.3" + +"@sentry/cli@^1.49.0": + version "1.49.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.49.0.tgz#174152978acbe6023986a8fb0b247cf58b4653d8" + integrity sha512-Augz7c42Cxz/xWQ/NOVjUGePKVA370quvskWbCICMUwxcTvKnCLI+7KDdzEoCexj4MSuxFfBzLnrrn4w2+c9TQ== + dependencies: + fs-copy-file-sync "^1.1.1" + https-proxy-agent "^3.0.0" + mkdirp "^0.5.1" + node-fetch "^2.1.2" + progress "2.0.0" + proxy-from-env "^1.0.0" + +"@sentry/core@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.0.tgz#46380a747faa0ac2973523de3c47b9a12f7f4c9f" + integrity sha512-ujwHMwinPwuADoIBFjh1BiC6Li7RpEG3Mmo0MxOqKm7xKngkRUk5uH5e36roORnx+ngr/3NCe80QuvSqK7gQsw== + dependencies: + "@sentry/hub" "5.15.0" + "@sentry/minimal" "5.15.0" + "@sentry/types" "5.15.0" + "@sentry/utils" "5.15.0" + tslib "^1.9.3" + +"@sentry/hub@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.0.tgz#6af4e7407ff2309306e9675fce96e321371ed18f" + integrity sha512-wIDcaIuaYpg+Ma01NfFQTOnZLDCKSx2D06TTBqlo93WfMFNgyEgdMbU5Fk1PFZzjj2AMtzlc9DJzAfvt1hZx3w== + dependencies: + "@sentry/types" "5.15.0" + "@sentry/utils" "5.15.0" + tslib "^1.9.3" + +"@sentry/integrations@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.15.0.tgz#02ae2737b066aee08426cb4df22c700685505ea1" + integrity sha512-50OLHL26EMOCeyVlwLk9P7YocaUF02RYuCD3BPofTswgXSDe61Qy3ntT/RuOTiUV1sjmpc4FjDBJdtp/miFfOg== + dependencies: + "@sentry/types" "5.15.0" + "@sentry/utils" "5.15.0" + tslib "^1.9.3" + +"@sentry/minimal@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.0.tgz#81193a588cf637dcaf0d0913ecd7b697cdebc286" + integrity sha512-VBkMfR6ahmuJrx4V51BNYd6XzGZ7GB8sfnBufMzqK6MsKe+g5oSyXeqHFd4oFC0co0YlFIw7IphF2JZLwVs0zA== + dependencies: + "@sentry/hub" "5.15.0" + "@sentry/types" "5.15.0" + tslib "^1.9.3" + +"@sentry/node@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.15.0.tgz#c3960ed90bddfa1606e638d38f4d42f5000d5b7a" + integrity sha512-uy53L3O7Ood0RGRnFPT+EDTkK63qkbvGM5Al7Le6r9Sl6joACng+K3zmkJWzW5xrjcG6m8ExT3bm1hPjVOmOJA== + dependencies: + "@sentry/apm" "5.15.0" + "@sentry/core" "5.15.0" + "@sentry/hub" "5.15.0" + "@sentry/types" "5.15.0" + "@sentry/utils" "5.15.0" + cookie "^0.3.1" + https-proxy-agent "^4.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/types@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.15.0.tgz#7bc101b2f1a433b0086f1ac7e00b830691814c80" + integrity sha512-MC96wUAHhzRuH3xo4Qd+EXTOap8+d+SWbAdLBukScxuwhOSY/HNRh1TW17CuAu7s1oXa7xxO2ZCdyamSZinIiQ== + +"@sentry/utils@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.15.0.tgz#3577c1bae0c18b53d7500538b8b6894f74ad9dd5" + integrity sha512-td+wSBdVUPO3mEPcEHZwJiVEQ0+wplJCHBvM1PHqwQd+miB2mQAaiSkzdAAHzUpTeqPBI3rzjWPn59WkCcVF5Q== + dependencies: + "@sentry/types" "5.15.0" + tslib "^1.9.3" + +"@sentry/webpack-plugin@^1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.10.0.tgz#7f7727b18dbdd3eaeb0998102be89d8733ddbca5" + integrity sha512-keT6cH8732bFjdH/v+C/UwbJu6byZ5L8t7QRLjgj+fqDyc/RlVEw9VzIQSJGUtd2XgImpdduWzgxythLkwKJjg== + dependencies: + "@sentry/cli" "^1.49.0" + +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@storybook/addon-a11y@^6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-6.3.6.tgz#6d9dbdaa067a8f6ad15cef64f2103568457d2aae" + integrity sha512-IYVDFEGgKORdm7NPZPqltOvu29R9LaZwGBvfzbS3GUc3I9XLbT/cxkZN68Zzmjn2GtP/X1v4uLqp57OsPb4Cdg== + dependencies: + "@storybook/addons" "6.3.6" + "@storybook/api" "6.3.6" + "@storybook/channels" "6.3.6" + "@storybook/client-api" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/components" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/theming" "6.3.6" + axe-core "^4.2.0" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" + react-sizeme "^3.0.1" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-actions@^5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.3.21.tgz#16eed3eb24996adfcbf70bd476a261324d6de593" + integrity sha512-6SAF/j8UBZaAbRz/rYUlcCXda+c4LQvvNlbVJc9GHjNNNMJQQVc3/EU+M7PyFz6uDUxudAW1+AFchGk04ACJ2g== + dependencies: + "@storybook/addons" "5.3.21" + "@storybook/api" "5.3.21" + "@storybook/client-api" "5.3.21" + "@storybook/components" "5.3.21" + "@storybook/core-events" "5.3.21" + "@storybook/theming" "5.3.21" + core-js "^3.0.1" + fast-deep-equal "^2.0.1" + global "^4.3.2" + polished "^3.3.1" + prop-types "^15.7.2" + react "^16.8.3" + react-inspector "^4.0.0" + uuid "^3.3.2" + +"@storybook/addon-notes@^5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/addon-notes/-/addon-notes-5.3.18.tgz#dc8be958bbb082188c529aa31853e8cad389a642" + integrity sha512-P8d5P6+MErodRz2whP1f33ovhGMcOc/g4a+8qatiUotsPbg/2LKNRlY1QSfHWtm26NIGsgOTqSb0z1q6cyMNvQ== + dependencies: + "@storybook/addons" "5.3.18" + "@storybook/api" "5.3.18" + "@storybook/client-logger" "5.3.18" + "@storybook/components" "5.3.18" + "@storybook/core-events" "5.3.18" + "@storybook/router" "5.3.18" + "@storybook/theming" "5.3.18" + core-js "^3.0.1" + global "^4.3.2" + markdown-to-jsx "^6.10.3" + memoizerific "^1.11.3" + prop-types "^15.7.2" + util-deprecate "^1.0.2" + +"@storybook/addons@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.2.8.tgz#f8bf8bd555b7a69fb1e9a52ab8cdb96384d931ff" + integrity sha512-yAo1N5z/45bNIQP8SD+HVTr7X898bYAtz1EZBrQ6zD8bGamzA2Br06rOLL9xXw29eQhsaVnPlqgDwCS1sTC7aQ== + dependencies: + "@storybook/api" "5.2.8" + "@storybook/channels" "5.2.8" + "@storybook/client-logger" "5.2.8" + "@storybook/core-events" "5.2.8" + core-js "^3.0.1" + global "^4.3.2" + util-deprecate "^1.0.2" + +"@storybook/addons@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.18.tgz#5cbba6407ef7a802041c5ee831473bc3bed61f64" + integrity sha512-ZQjDgTUDFRLvAiBg2d8FgPgghfQ+9uFyXQbtiGlTBLinrPCeQd7J86qiUES0fcGoohCCw0wWKtvB0WF2z1XNDg== + dependencies: + "@storybook/api" "5.3.18" + "@storybook/channels" "5.3.18" + "@storybook/client-logger" "5.3.18" + "@storybook/core-events" "5.3.18" + core-js "^3.0.1" + global "^4.3.2" + util-deprecate "^1.0.2" + +"@storybook/addons@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.21.tgz#ee312c738c33e8c34dc11777ef93522c3c36e56a" + integrity sha512-Ji/21WADTLVbTbiKcZ64BcL0Es+h1Afxx3kNmGJqPSTUYroCwIFCT9mUzCqU6G+YyWaISAmTii5UJkTwMkChwA== + dependencies: + "@storybook/api" "5.3.21" + "@storybook/channels" "5.3.21" + "@storybook/client-logger" "5.3.21" + "@storybook/core-events" "5.3.21" + core-js "^3.0.1" + global "^4.3.2" + util-deprecate "^1.0.2" + +"@storybook/addons@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.3.6.tgz#330fd722bdae8abefeb029583e89e51e62c20b60" + integrity sha512-tVV0vqaEEN9Md4bgScwfrnZYkN8iKZarpkIOFheLev+PHjSp8lgWMK5SNWDlbBYqfQfzrz9xbs+F07bMjfx9jQ== + dependencies: + "@storybook/api" "6.3.6" + "@storybook/channels" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/router" "6.3.6" + "@storybook/theming" "6.3.6" + core-js "^3.8.2" + global "^4.4.0" + regenerator-runtime "^0.13.7" + +"@storybook/api@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.2.8.tgz#21f03df8041114eb929bd10b570a17f266568b7f" + integrity sha512-rFrPtTFDIPQoicLwq1AVsOvZNTUKnjD1w/NX1kKcyuWLL9BcOkU3YNLBlliGBg2JX/yS+fJKMyKk4NMzNBCZCg== + dependencies: + "@storybook/channels" "5.2.8" + "@storybook/client-logger" "5.2.8" + "@storybook/core-events" "5.2.8" + "@storybook/router" "5.2.8" + "@storybook/theming" "5.2.8" + core-js "^3.0.1" + fast-deep-equal "^2.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + prop-types "^15.6.2" + react "^16.8.3" + semver "^6.0.0" + shallow-equal "^1.1.0" + store2 "^2.7.1" + telejson "^3.0.2" + util-deprecate "^1.0.2" + +"@storybook/api@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.18.tgz#95582ab90d947065e0e34ed603650a3630dcbd16" + integrity sha512-QXaccNCARHzPWOuxYndiebGWBZmwiUvRgB9ji0XTJBS3y8K0ZPb5QyuqiKPaEWUj8dBA8rzdDtkW3Yt95Namaw== + dependencies: + "@reach/router" "^1.2.1" + "@storybook/channels" "5.3.18" + "@storybook/client-logger" "5.3.18" + "@storybook/core-events" "5.3.18" + "@storybook/csf" "0.0.1" + "@storybook/router" "5.3.18" + "@storybook/theming" "5.3.18" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + fast-deep-equal "^2.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + prop-types "^15.6.2" + react "^16.8.3" + semver "^6.0.0" + shallow-equal "^1.1.0" + store2 "^2.7.1" + telejson "^3.2.0" + util-deprecate "^1.0.2" + +"@storybook/api@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.21.tgz#8f1772de53b65e1a65d2f0257463d621a8617c58" + integrity sha512-K1o4an/Rx8daKRDooks6qzN6ZGyqizeacZZbair3F8CsSfTgrr2zCcf9pgKojLQa9koEmMHlcdb2KnS+GwPEgA== + dependencies: + "@reach/router" "^1.2.1" + "@storybook/channels" "5.3.21" + "@storybook/client-logger" "5.3.21" + "@storybook/core-events" "5.3.21" + "@storybook/csf" "0.0.1" + "@storybook/router" "5.3.21" + "@storybook/theming" "5.3.21" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + fast-deep-equal "^2.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + prop-types "^15.6.2" + react "^16.8.3" + semver "^6.0.0" + shallow-equal "^1.1.0" + store2 "^2.7.1" + telejson "^3.2.0" + util-deprecate "^1.0.2" + +"@storybook/api@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.3.6.tgz#b110688ae0a970c9443d47b87616a09456f3708e" + integrity sha512-F5VuR1FrEwD51OO/EDDAZXNfF5XmJedYHJLwwCB4az2ZMrzG45TxGRmiEohrSTO6wAHGkAvjlEoX5jWOCqQ4pw== + dependencies: + "@reach/router" "^1.3.4" + "@storybook/channels" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/csf" "0.0.1" + "@storybook/router" "6.3.6" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.3.6" + "@types/reach__router" "^1.3.7" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.20" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + store2 "^2.12.0" + telejson "^5.3.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/builder-webpack4@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.3.6.tgz#fe444abfc178e005ea077e2bcfd6ae7509522908" + integrity sha512-LhTPQQowS2t6BRnyfusWZLbhjjf54/HiQyovJTTDnqrCiO6QoCMbVnp79LeO1aSkpQCKoeqOZ7TzH87fCytnZA== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-decorators" "^7.12.12" + "@babel/plugin-proposal-export-default-from" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.12" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-react" "^7.12.10" + "@babel/preset-typescript" "^7.12.7" + "@storybook/addons" "6.3.6" + "@storybook/api" "6.3.6" + "@storybook/channel-postmessage" "6.3.6" + "@storybook/channels" "6.3.6" + "@storybook/client-api" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/components" "6.3.6" + "@storybook/core-common" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/node-logger" "6.3.6" + "@storybook/router" "6.3.6" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.3.6" + "@storybook/ui" "6.3.6" + "@types/node" "^14.0.10" + "@types/webpack" "^4.41.26" + autoprefixer "^9.8.6" + babel-loader "^8.2.2" + babel-plugin-macros "^2.8.0" + babel-plugin-polyfill-corejs3 "^0.1.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + core-js "^3.8.2" + css-loader "^3.6.0" + dotenv-webpack "^1.8.0" + file-loader "^6.2.0" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^4.1.6" + fs-extra "^9.0.1" + glob "^7.1.6" + glob-promise "^3.4.0" + global "^4.4.0" + html-webpack-plugin "^4.0.0" + pnp-webpack-plugin "1.6.4" + postcss "^7.0.36" + postcss-flexbugs-fixes "^4.2.1" + postcss-loader "^4.2.0" + raw-loader "^4.0.2" + react-dev-utils "^11.0.3" + stable "^0.1.8" + style-loader "^1.3.0" + terser-webpack-plugin "^4.2.3" + ts-dedent "^2.0.0" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + webpack "4" + webpack-dev-middleware "^3.7.3" + webpack-filter-warnings-plugin "^1.2.1" + webpack-hot-middleware "^2.25.0" + webpack-virtual-modules "^0.2.2" + +"@storybook/channel-postmessage@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.21.tgz#9c08bf1c108ff973dbca18e582680d25178db1d4" + integrity sha512-CfoP7aEbZtJ35R9zeujMRdIwprETUi+Ve+y84DhXYQ2uJ0rR3vO4zHLZnxMMyJ5VnYOfuO042uch07+EKBz40Q== + dependencies: + "@storybook/channels" "5.3.21" + "@storybook/client-logger" "5.3.21" + core-js "^3.0.1" + global "^4.3.2" + telejson "^3.2.0" + +"@storybook/channel-postmessage@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.3.6.tgz#f29c3678161462428e78c9cfed2da11ffca4acb0" + integrity sha512-GK7hXnaa+1pxEeMpREDzAZ3+2+k1KN1lbrZf+V7Kc1JZv1/Ji/vxk8AgxwiuzPAMx5J0yh/FduPscIPZ87Pibw== + dependencies: + "@storybook/channels" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/core-events" "6.3.6" + core-js "^3.8.2" + global "^4.4.0" + qs "^6.10.0" + telejson "^5.3.2" + +"@storybook/channels@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.2.8.tgz#79a99ad85dcacb688073c22340c5b7d16b801202" + integrity sha512-mFwQec27QSrqcl+IH0xA+4jfoEqC4m1G99LBHt/aTDjLZXclX1A470WqeZCp7Gx4OALpaPEVTaaaKPbiKz4C6w== + dependencies: + core-js "^3.0.1" + +"@storybook/channels@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.18.tgz#490c9eaa8292b0571c0f665052b12addf7c35f21" + integrity sha512-scP/6td/BJSEOgfN+qaYGDf3E793xye7tIw6W+sYqwg+xdMFO39wVXgVZNpQL6sLEwpJZTaPywCjC6p6ksErqQ== + dependencies: + core-js "^3.0.1" + +"@storybook/channels@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.21.tgz#53ba622b171d68b3b102983a62aa05149a49497b" + integrity sha512-OXoFs9XtBVg/cCk6lYMrxkzaNlJRf54ABdorp7YAAj7S9tRL1JxOZHxmjNQwEoiRvssmem2rAWtEAxfuEANsAA== + dependencies: + core-js "^3.0.1" + +"@storybook/channels@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.3.6.tgz#a258764ed78fd836ff90489ae74ac055312bf056" + integrity sha512-gCIQVr+dS/tg3AyCxIvkOXMVAs08BCIHXsaa2+XzmacnJBSP+CEHtI6IZ8WEv7tzZuXOiKLVg+wugeIh4j2I4g== + dependencies: + core-js "^3.8.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-api@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.21.tgz#5b218a28f24219c32ab4b92a6af2a3e452fb8089" + integrity sha512-vS4DfA2Avvl7JNQymO4e3RUNoTWIGVfZJ70Irnd6PTAZNojbCXTYuigDavrmyf83F3g5rQpwmSAPjuoi/X/FRA== + dependencies: + "@storybook/addons" "5.3.21" + "@storybook/channel-postmessage" "5.3.21" + "@storybook/channels" "5.3.21" + "@storybook/client-logger" "5.3.21" + "@storybook/core-events" "5.3.21" + "@storybook/csf" "0.0.1" + "@types/webpack-env" "^1.15.0" + core-js "^3.0.1" + eventemitter3 "^4.0.0" + global "^4.3.2" + is-plain-object "^3.0.0" + lodash "^4.17.15" + memoizerific "^1.11.3" + qs "^6.6.0" + stable "^0.1.8" + ts-dedent "^1.1.0" + util-deprecate "^1.0.2" + +"@storybook/client-api@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.3.6.tgz#4826ce366ae109f608da6ade24b29efeb9b7f7dd" + integrity sha512-Q/bWuH691L6k7xkiKtBmZo8C+ijgmQ+vc2Fz8pzIRZuMV8ROL74qhrS4BMKV4LhiYm4f8todtWfaQPBjawZMIA== + dependencies: + "@storybook/addons" "6.3.6" + "@storybook/channel-postmessage" "6.3.6" + "@storybook/channels" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/csf" "0.0.1" + "@types/qs" "^6.9.5" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + stable "^0.1.8" + store2 "^2.12.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-logger@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.2.8.tgz#5affe2f9dbbee374721fd2e8729116f5ac39c779" + integrity sha512-+oVSEJdeh7TQ1Bhanb3mCr7fc3Bug3+K79abZ28J45Ub5x4L/ZVClj1xMgUsJs30BZ5FB8vhdgH6TQb0NSxR4A== + dependencies: + core-js "^3.0.1" + +"@storybook/client-logger@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.18.tgz#27c9d09d788965db0164be6e168bc3f03adbf88f" + integrity sha512-RZjxw4uqZX3Yk27IirbB/pQG+wRsQSSRlKqYa8KQ5bSanm4IrcV9VA1OQbuySW9njE+CexAnakQJ/fENdmurNg== + dependencies: + core-js "^3.0.1" + +"@storybook/client-logger@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.21.tgz#912c83b0d358e70acad1ad4abe199de4c38b109f" + integrity sha512-OzQkwpZ5SK9cXD9Mv6lxPGPot+hSZvnkEW12kpt1AHfJz4ET26YTDOI3oetPsjfRJo6qYLeQX8+wF7rklfXbzA== + dependencies: + core-js "^3.0.1" + +"@storybook/client-logger@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.3.6.tgz#020ba518ab8286194ce103a6ff91767042e296c0" + integrity sha512-qpXQ52ylxPm7l3+WAteV42NmqWA+L1FaJhMOvm2gwl3PxRd2cNXn2BwEhw++eA6qmJH/7mfOKXG+K+QQwOTpRA== + dependencies: + core-js "^3.8.2" + global "^4.4.0" + +"@storybook/components@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.2.8.tgz#f5d4a06ba4ba8c700b2d962deae182105b72fb99" + integrity sha512-h9l/LAMaj+emUCOyY/+ETy/S3P0npwQU280J88uL4O9XJALJ72EKfyttBCvMLvpM50E+fAPeDzuYn0t5qzGGxg== + dependencies: + "@storybook/client-logger" "5.2.8" + "@storybook/theming" "5.2.8" + "@types/react-syntax-highlighter" "10.1.0" + "@types/react-textarea-autosize" "^4.3.3" + core-js "^3.0.1" + global "^4.3.2" + markdown-to-jsx "^6.9.1" + memoizerific "^1.11.3" + polished "^3.3.1" + popper.js "^1.14.7" + prop-types "^15.7.2" + react "^16.8.3" + react-dom "^16.8.3" + react-focus-lock "^1.18.3" + react-helmet-async "^1.0.2" + react-popper-tooltip "^2.8.3" + react-syntax-highlighter "^8.0.1" + react-textarea-autosize "^7.1.0" + simplebar-react "^1.0.0-alpha.6" + +"@storybook/components@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.18.tgz#528f6ab1660981e948993a04b407a6fad7751589" + integrity sha512-LIN4aVCCDY7klOwtuqQhfYz4tHaMADhXEzZpij+3r8N68Inck6IJ1oo9A9umXQPsTioQi8e6FLobH1im90j/2A== + dependencies: + "@storybook/client-logger" "5.3.18" + "@storybook/theming" "5.3.18" + "@types/react-syntax-highlighter" "11.0.4" + "@types/react-textarea-autosize" "^4.3.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + markdown-to-jsx "^6.9.1" + memoizerific "^1.11.3" + polished "^3.3.1" + popper.js "^1.14.7" + prop-types "^15.7.2" + react "^16.8.3" + react-dom "^16.8.3" + react-focus-lock "^2.1.0" + react-helmet-async "^1.0.2" + react-popper-tooltip "^2.8.3" + react-syntax-highlighter "^11.0.2" + react-textarea-autosize "^7.1.0" + simplebar-react "^1.0.0-alpha.6" + ts-dedent "^1.1.0" + +"@storybook/components@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.21.tgz#17ee371a2455c6e807c3d3135a9266e63ad7651a" + integrity sha512-42QQk6qZl6wrtajP8yNCfmNS2t8Iod5QY+4V/l6iNnnT9O+j6cWOlnO+ZyvjNv0Xm0zIOt+VyVjdkKh8FUjQmA== + dependencies: + "@storybook/client-logger" "5.3.21" + "@storybook/theming" "5.3.21" + "@types/react-syntax-highlighter" "11.0.4" + "@types/react-textarea-autosize" "^4.3.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + markdown-to-jsx "^6.11.4" + memoizerific "^1.11.3" + polished "^3.3.1" + popper.js "^1.14.7" + prop-types "^15.7.2" + react "^16.8.3" + react-dom "^16.8.3" + react-focus-lock "^2.1.0" + react-helmet-async "^1.0.2" + react-popper-tooltip "^2.8.3" + react-syntax-highlighter "^11.0.2" + react-textarea-autosize "^7.1.0" + simplebar-react "^1.0.0-alpha.6" + ts-dedent "^1.1.0" + +"@storybook/components@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.3.6.tgz#bc2fa1dbe59f42b5b2aeb9f84424072835d4ce8b" + integrity sha512-aZkmtAY8b+LFXG6dVp6cTS6zGJuxkHRHcesRSWRQPxtgitaz1G58clRHxbKPRokfjPHNgYA3snogyeqxSA7YNQ== + dependencies: + "@popperjs/core" "^2.6.0" + "@storybook/client-logger" "6.3.6" + "@storybook/csf" "0.0.1" + "@storybook/theming" "6.3.6" + "@types/color-convert" "^2.0.0" + "@types/overlayscrollbars" "^1.12.0" + "@types/react-syntax-highlighter" "11.0.5" + color-convert "^2.0.1" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.20" + markdown-to-jsx "^7.1.3" + memoizerific "^1.11.3" + overlayscrollbars "^1.13.1" + polished "^4.0.5" + prop-types "^15.7.2" + react-colorful "^5.1.2" + react-popper-tooltip "^3.1.1" + react-syntax-highlighter "^13.5.3" + react-textarea-autosize "^8.3.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/core-client@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.3.6.tgz#7def721aa15d4faaff574780d30b92055db7261c" + integrity sha512-Bq86flEdXdMNbdHrGMNQ6OT1tcBQU8ym56d+nG46Ctjf5GN+Dl+rPtRWuu7cIZs10KgqJH+86DXp+tvpQIDidg== + dependencies: + "@storybook/addons" "6.3.6" + "@storybook/channel-postmessage" "6.3.6" + "@storybook/client-api" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/csf" "0.0.1" + "@storybook/ui" "6.3.6" + airbnb-js-shims "^2.2.1" + ansi-to-html "^0.6.11" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" + +"@storybook/core-common@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.3.6.tgz#da8eed703b609968e15177446f0f1609d1d6d0d0" + integrity sha512-nHolFOmTPymI50j180bCtcf1UJZ2eOnYaECRtHvVrCUod5KFF7wh2EHrgWoKqrKrsn84UOY/LkX2C2WkbYtWRg== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-decorators" "^7.12.12" + "@babel/plugin-proposal-export-default-from" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.12" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-react" "^7.12.10" + "@babel/preset-typescript" "^7.12.7" + "@babel/register" "^7.12.1" + "@storybook/node-logger" "6.3.6" + "@storybook/semver" "^7.3.2" + "@types/glob-base" "^0.3.0" + "@types/micromatch" "^4.0.1" + "@types/node" "^14.0.10" + "@types/pretty-hrtime" "^1.0.0" + babel-loader "^8.2.2" + babel-plugin-macros "^3.0.1" + babel-plugin-polyfill-corejs3 "^0.1.0" + chalk "^4.1.0" + core-js "^3.8.2" + express "^4.17.1" + file-system-cache "^1.0.5" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.0.4" + glob "^7.1.6" + glob-base "^0.3.0" + interpret "^2.2.0" + json5 "^2.1.3" + lazy-universal-dotenv "^3.0.1" + micromatch "^4.0.2" + pkg-dir "^5.0.0" + pretty-hrtime "^1.0.3" + resolve-from "^5.0.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "4" + +"@storybook/core-events@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.2.8.tgz#93fc458ea0820ff1409d268b0fe51abba200f5a4" + integrity sha512-NkQKC5doO/YL9gsO61bqaxgveKktkiJWZ3XyyhL1ZebgnO9wTlrU+i9b5aX73Myk1oxbicQw9KcwDGYk0qFuNQ== + dependencies: + core-js "^3.0.1" + +"@storybook/core-events@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.18.tgz#e5d335f8a2c7dd46502b8f505006f1e111b46d49" + integrity sha512-uQ6NYJ5WODXK8DJ7m8y3yUAtWB3n+6XtYztjY+tdkCsLYvTYDXNS+epV+f5Hu9+gB+/Dm+b5Su4jDD+LZB2QWA== + dependencies: + core-js "^3.0.1" + +"@storybook/core-events@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.21.tgz#41d81c3f107302a032545fc86ff344230c04b9e9" + integrity sha512-/Zsm1sKAh6pzQv8jQUmuhM7nuM01ZljIRKy8p2HjPNlMjDB5yaRkBfyeAUXUg+qXNI6aHVWa4jGdPEdwwY4oLA== + dependencies: + core-js "^3.0.1" + +"@storybook/core-events@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.3.6.tgz#c4a09e2c703170995604d63e46e45adc3c9cd759" + integrity sha512-Ut1dz96bJ939oSn5t1ckPXd3WcFejK96Sb3+R/z23vEHUWGBFtygGyw8r/SX/WNDVzGmQU8c+mzJJTZwCBJz8A== + dependencies: + core-js "^3.8.2" + +"@storybook/core-server@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.3.6.tgz#43c1415573c3b72ec6b9ae48d68e1bb446722f7c" + integrity sha512-47ZcfxYn7t891oAMG98iH1BQIgQT9Yk/2BBNVCWY43Ong+ME1xJ6j4C/jkRUOseP7URlfLUQsUYKAYJNVijDvg== + dependencies: + "@storybook/builder-webpack4" "6.3.6" + "@storybook/core-client" "6.3.6" + "@storybook/core-common" "6.3.6" + "@storybook/csf-tools" "6.3.6" + "@storybook/manager-webpack4" "6.3.6" + "@storybook/node-logger" "6.3.6" + "@storybook/semver" "^7.3.2" + "@types/node" "^14.0.10" + "@types/node-fetch" "^2.5.7" + "@types/pretty-hrtime" "^1.0.0" + "@types/webpack" "^4.41.26" + better-opn "^2.1.1" + boxen "^4.2.0" + chalk "^4.1.0" + cli-table3 "0.6.0" + commander "^6.2.1" + compression "^1.7.4" + core-js "^3.8.2" + cpy "^8.1.1" + detect-port "^1.3.0" + express "^4.17.1" + file-system-cache "^1.0.5" + fs-extra "^9.0.1" + globby "^11.0.2" + ip "^1.1.5" + node-fetch "^2.6.1" + pretty-hrtime "^1.0.3" + prompts "^2.4.0" + regenerator-runtime "^0.13.7" + serve-favicon "^2.5.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "4" + +"@storybook/core@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.3.6.tgz#604419d346433103675901b3736bfa1ed9bc534f" + integrity sha512-y71VvVEbqCpG28fDBnfNg3RnUPnicwFYq9yuoFVRF0LYcJCy5cYhkIfW3JG8mN2m0P+LzH80mt2Rj6xlSXrkdQ== + dependencies: + "@storybook/core-client" "6.3.6" + "@storybook/core-server" "6.3.6" + +"@storybook/csf-tools@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.3.6.tgz#603d9e832f946998b75ff8368fe862375d6cb52c" + integrity sha512-MQevelkEUVNCSjKMXLNc/G8q/BB5babPnSeI0IcJq4k+kLUSHtviimLNpPowMgGJBPx/y9VihH8N7vdJUWVj9w== + dependencies: + "@babel/generator" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/preset-env" "^7.12.11" + "@babel/traverse" "^7.12.11" + "@babel/types" "^7.12.11" + "@mdx-js/mdx" "^1.6.22" + "@storybook/csf" "^0.0.1" + core-js "^3.8.2" + fs-extra "^9.0.1" + js-string-escape "^1.0.1" + lodash "^4.17.20" + prettier "~2.2.1" + regenerator-runtime "^0.13.7" + +"@storybook/csf@0.0.1", "@storybook/csf@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== + dependencies: + lodash "^4.17.15" + +"@storybook/manager-webpack4@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.3.6.tgz#a5334aa7ae1e048bca8f4daf868925d7054fb715" + integrity sha512-qh/jV4b6mFRpRFfhk1JSyO2gKRz8PLPvDt2AD52/bTAtNRzypKoiWqyZNR2CJ9hgNQtDrk2CO3eKPrcdKYGizQ== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@storybook/addons" "6.3.6" + "@storybook/core-client" "6.3.6" + "@storybook/core-common" "6.3.6" + "@storybook/node-logger" "6.3.6" + "@storybook/theming" "6.3.6" + "@storybook/ui" "6.3.6" + "@types/node" "^14.0.10" + "@types/webpack" "^4.41.26" + babel-loader "^8.2.2" + case-sensitive-paths-webpack-plugin "^2.3.0" + chalk "^4.1.0" + core-js "^3.8.2" + css-loader "^3.6.0" + dotenv-webpack "^1.8.0" + express "^4.17.1" + file-loader "^6.2.0" + file-system-cache "^1.0.5" + find-up "^5.0.0" + fs-extra "^9.0.1" + html-webpack-plugin "^4.0.0" + node-fetch "^2.6.1" + pnp-webpack-plugin "1.6.4" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + style-loader "^1.3.0" + telejson "^5.3.2" + terser-webpack-plugin "^4.2.3" + ts-dedent "^2.0.0" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + webpack "4" + webpack-dev-middleware "^3.7.3" + webpack-virtual-modules "^0.2.2" + +"@storybook/node-logger@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.3.6.tgz#10356608593440a8e3acf2aababef40333a3401b" + integrity sha512-XMDkMN7nVRojjiezrURlkI57+nz3OoH4UBV6qJZICKclxtdKAy0wwOlUSYEUq+axcJ4nvdfzPPoDfGoj37SW7A== + dependencies: + "@types/npmlog" "^4.1.2" + chalk "^4.1.0" + core-js "^3.8.2" + npmlog "^4.1.2" + pretty-hrtime "^1.0.3" + +"@storybook/router@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.2.8.tgz#d7de2d401701857c033e28560c30e16512f7f72f" + integrity sha512-wnbyKESUMyv9fwo9W+n4Fev/jXylB8whpjtHrOttjguUOYX1zGSHdwNI66voPetbtVLxUeHyJteJwdyRDSirJg== + dependencies: + "@reach/router" "^1.2.1" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + qs "^6.6.0" + +"@storybook/router@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.18.tgz#8ab22f1f2f7f957e78baf992030707a62289076e" + integrity sha512-6B2U2C75KTSVaCuYYgcubeJGcCSnwsXuEf50hEd5mGqWgHZfojCtGvB7Ko4X+0h8rEC+eNA4p7YBOhlUv9WNrQ== + dependencies: + "@reach/router" "^1.2.1" + "@storybook/csf" "0.0.1" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + qs "^6.6.0" + util-deprecate "^1.0.2" + +"@storybook/router@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.21.tgz#32b08e5daa90a6ffa024bb670b874525a712a901" + integrity sha512-c29m5UikK5Q1lyd6FltOGFhIcpd6PIb855YS3OUNe3F6ZA1tfJ+aNKrCBc65d1c+fvCGG76dYYYv0RvwEmKXXg== + dependencies: + "@reach/router" "^1.2.1" + "@storybook/csf" "0.0.1" + "@types/reach__router" "^1.2.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + memoizerific "^1.11.3" + qs "^6.6.0" + util-deprecate "^1.0.2" + +"@storybook/router@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.3.6.tgz#cea20d64bae17397dc9e1689a656b80a98674c34" + integrity sha512-fQ1n7cm7lPFav7I+fStQciSVMlNdU+yLY6Fue252rpV5Q68bMTjwKpjO9P2/Y3CCj4QD3dPqwEkn4s0qUn5tNA== + dependencies: + "@reach/router" "^1.3.4" + "@storybook/client-logger" "6.3.6" + "@types/reach__router" "^1.3.7" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.20" + memoizerific "^1.11.3" + qs "^6.10.0" + ts-dedent "^2.0.0" + +"@storybook/semver@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" + integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg== + dependencies: + core-js "^3.6.5" + find-up "^4.1.0" + +"@storybook/theming@5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.2.8.tgz#a4c9e0e9a5789c1aa71e4fcb7a8ee86efe3dadcf" + integrity sha512-rGb66GkXb0jNJMH8UQ3Ru4FL+m1x0+UdxM8a8HSE/qb1GMv2qOwjVETfAL6nVL9u6ZmrtbhHoero4f6xDwZdRg== + dependencies: + "@emotion/core" "^10.0.14" + "@emotion/styled" "^10.0.14" + "@storybook/client-logger" "5.2.8" + common-tags "^1.8.0" + core-js "^3.0.1" + deep-object-diff "^1.1.0" + emotion-theming "^10.0.14" + global "^4.3.2" + memoizerific "^1.11.3" + polished "^3.3.1" + prop-types "^15.7.2" + resolve-from "^5.0.0" + +"@storybook/theming@5.3.18": + version "5.3.18" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.18.tgz#35e78de79d9cf8f1248af0dd1c7fa60555761312" + integrity sha512-lfFTeLoYwLMKg96N3gn0umghMdAHgJBGuk2OM8Ll84yWtdl9RGnzfiI1Fl7Cr5k95dCF7drLJlJCao1VxUkFSA== + dependencies: + "@emotion/core" "^10.0.20" + "@emotion/styled" "^10.0.17" + "@storybook/client-logger" "5.3.18" + core-js "^3.0.1" + deep-object-diff "^1.1.0" + emotion-theming "^10.0.19" + global "^4.3.2" + memoizerific "^1.11.3" + polished "^3.3.1" + prop-types "^15.7.2" + resolve-from "^5.0.0" + ts-dedent "^1.1.0" + +"@storybook/theming@5.3.21": + version "5.3.21" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.21.tgz#ae2dc101aa57c3be4df1724ae729e11bad118e0b" + integrity sha512-FZbxjizqdO9lV5LUixPio/7+6UdPiswCzTJn8Hcot9uwwgfnrViRdN7xyjmSYRqv9nHP3OlYbtdeCAgZ4aPq8g== + dependencies: + "@emotion/core" "^10.0.20" + "@emotion/styled" "^10.0.17" + "@storybook/client-logger" "5.3.21" + core-js "^3.0.1" + deep-object-diff "^1.1.0" + emotion-theming "^10.0.19" + global "^4.3.2" + memoizerific "^1.11.3" + polished "^3.3.1" + prop-types "^15.7.2" + resolve-from "^5.0.0" + ts-dedent "^1.1.0" + +"@storybook/theming@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.3.6.tgz#75624f6d4e01530b87afca3eab9996a16c0370ab" + integrity sha512-mPrQrMUREajNEWxzgR8t0YIZsI9avPv25VNA08fANnwVsc887p4OL5eCTL2dFIlD34YDzAwiyRKYoLj2vDW4nw== + dependencies: + "@emotion/core" "^10.1.1" + "@emotion/is-prop-valid" "^0.8.6" + "@emotion/styled" "^10.0.27" + "@storybook/client-logger" "6.3.6" + core-js "^3.8.2" + deep-object-diff "^1.1.0" + emotion-theming "^10.0.27" + global "^4.4.0" + memoizerific "^1.11.3" + polished "^4.0.5" + resolve-from "^5.0.0" + ts-dedent "^2.0.0" + +"@storybook/ui@6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.3.6.tgz#a9ed8265e34bb8ef9f0dd08f40170b3dcf8a8931" + integrity sha512-S9FjISUiAmbBR7d6ubUEcELQdffDfRxerloxkXs5Ou7n8fEPqpgQB01Hw5MLRUwTEpxPzHn+xtIGYritAGxt/Q== + dependencies: + "@emotion/core" "^10.1.1" + "@storybook/addons" "6.3.6" + "@storybook/api" "6.3.6" + "@storybook/channels" "6.3.6" + "@storybook/client-logger" "6.3.6" + "@storybook/components" "6.3.6" + "@storybook/core-events" "6.3.6" + "@storybook/router" "6.3.6" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.3.6" + "@types/markdown-to-jsx" "^6.11.3" + copy-to-clipboard "^3.3.1" + core-js "^3.8.2" + core-js-pure "^3.8.2" + downshift "^6.0.15" + emotion-theming "^10.0.27" + fuse.js "^3.6.1" + global "^4.4.0" + lodash "^4.17.20" + markdown-to-jsx "^6.11.4" + memoizerific "^1.11.3" + polished "^4.0.5" + qs "^6.10.0" + react-draggable "^4.4.3" + react-helmet-async "^1.0.7" + react-sizeme "^3.0.1" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + store2 "^2.12.0" + +"@storybook/vue@~6.3.6": + version "6.3.6" + resolved "https://registry.yarnpkg.com/@storybook/vue/-/vue-6.3.6.tgz#b657cab0a72a44d205c78e6c3a25be04826bf062" + integrity sha512-ugWz+YMkq6zIVU20Ufgyn4b7XiwDNa0y1tqVlV2DCvLLXjIy+Vbop9W5JlDWT5mMQI4akQKNDB1ieSGiRSdOEQ== + dependencies: + "@storybook/addons" "6.3.6" + "@storybook/core" "6.3.6" + "@storybook/core-common" "6.3.6" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + global "^4.4.0" + react "16.14.0" + react-dom "16.14.0" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + ts-loader "^8.0.14" + vue-docgen-api "^4.38.0" + vue-docgen-loader "^1.5.0" + webpack "4" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/accepts@*", "@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*", "@types/body-parser@1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/braces@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.1.tgz#5a284d193cfc61abb2e5a50d36ebbc50d942a32b" + integrity sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ== + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/cheerio@^0.22.10": + version "0.22.14" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.14.tgz#d150889891e7db892c6a0b16bd5583cc70b3fc44" + integrity sha512-SVtcP2fvPYrebTwpyqxjxb7K5v3ZOAdH409yAEWFPpZThCSGa1K2IFfx6Rg6ttvThCBQXP4fU9WF94sqLoiQGg== + dependencies: + "@types/node" "*" + +"@types/color-convert@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.0.tgz#8f5ee6b9e863dcbee5703f5a517ffb13d3ea4e22" + integrity sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ== + dependencies: + "@types/color-name" "*" + +"@types/color-name@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" + integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== + +"@types/cookie@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" + integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== + +"@types/cookies@*": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.5.tgz#aa42c9a9834724bffee597028da5319b38e85e84" + integrity sha512-3+TAFSm78O7/bAeYdB8FoYGntuT87vVP9JKuQRL8sRhv9313LP2SpHHL50VeFtnyjIcb3UELddMk5Yt0eOSOkg== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/cors@2.8.8": + version "2.8.8" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.8.tgz#317a8d8561995c60e35b9e0fcaa8d36660c98092" + integrity sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w== + dependencies: + "@types/express" "*" + +"@types/estree@^0.0.48": + version "0.0.48" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" + integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" + integrity sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.9.tgz#f5f2df6add703ff28428add52bdec8a1091b0a78" + integrity sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@4.17.7": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59" + integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-capacitor@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" + integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== + dependencies: + "@types/node" "*" + +"@types/fs-extra@^5.0.2": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.1.0.tgz#2a325ef97901504a3828718c390d34b8426a10a1" + integrity sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ== + dependencies: + "@types/node" "*" + +"@types/glob-base@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/glob-base/-/glob-base-0.3.0.tgz#a581d688347e10e50dd7c17d6f2880a10354319d" + integrity sha1-pYHWiDR+EOUN18F9byiAoQNUMZ0= + +"@types/glob@*", "@types/glob@^7.1.1": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/graphql-upload@^8.0.0": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.4.tgz#23a8ffb3d2fe6e0ee07e6f16ee9d9d5e995a2f4f" + integrity sha512-0TRyJD2o8vbkmJF8InppFcPVcXKk+Rvlg/xvpHBIndSJYpmDWfmtx/ZAtl4f3jR2vfarpTqYgj8MZuJssSoU7Q== + dependencies: + "@types/express" "*" + "@types/fs-capacitor" "*" + "@types/koa" "*" + graphql "^15.3.0" + +"@types/hast@^2.0.0": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.2.tgz#236201acca9e2695e42f713d7dd4f151dc2982e4" + integrity sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow== + dependencies: + "@types/unist" "*" + +"@types/history@*": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.3.tgz#856c99cdc1551d22c22b18b5402719affec9839a" + integrity sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw== + +"@types/html-minifier-terser@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== + +"@types/http-assert@*": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" + integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + +"@types/http-errors@*": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" + integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== + +"@types/is-function@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83" + integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-coverage@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== + +"@types/json-schema@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.6.tgz#b7030caa6b44af801c2aea13ba77d74aff7484d5" + integrity sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/long@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/markdown-to-jsx@^6.11.3": + version "6.11.3" + resolved "https://registry.yarnpkg.com/@types/markdown-to-jsx/-/markdown-to-jsx-6.11.3.tgz#cdd1619308fecbc8be7e6a26f3751260249b020e" + integrity sha512-30nFYpceM/ZEvhGiqWjm5quLUxNeld0HCzJEXMZZDpq53FPkS85mTwkWtCXzCqq8s5JYLgM5W392a02xn8Bdaw== + dependencies: + "@types/react" "*" + +"@types/mdast@^3.0.0": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.7.tgz#cba63d0cc11eb1605cea5c0ad76e02684394166b" + integrity sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg== + dependencies: + "@types/unist" "*" + +"@types/micromatch@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.2.tgz#ce29c8b166a73bf980a5727b1e4a4d099965151d" + integrity sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA== + dependencies: + "@types/braces" "*" + +"@types/mime@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/node-fetch@2.5.7": + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" + integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node-fetch@^2.5.7": + version "2.5.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*": + version "14.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" + integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== + +"@types/node@>=6": + version "12.6.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.9.tgz#ffeee23afdc19ab16e979338e7b536fdebbbaeaf" + integrity sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw== + +"@types/node@^10.1.0": + version "10.17.46" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.46.tgz#1cd867ebfe9957ab45951f2f715f8de5f3dab7a3" + integrity sha512-Tice8a+sJtlP9C1EUo0DYyjq52T37b3LexVu3p871+kfIBIN+OQ7PKPei1oF3MgF39olEpUfxaLtD+QFc1k69Q== + +"@types/node@^14.0.10": + version "14.17.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.6.tgz#cc61c8361c89e70c468cda464d1fa3dd7e5ebd62" + integrity sha512-iBxsxU7eswQDGhlr3AiamBxOssaYxbM+NKXVil8jg9yFXvrfEFbDumLD/2dMTB+zYyg7w+Xjt8yuxfdbUHAtcQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/npmlog@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4" + integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA== + +"@types/object-assign@^4.0.30": + version "4.0.30" + resolved "https://registry.yarnpkg.com/@types/object-assign/-/object-assign-4.0.30.tgz#8949371d5a99f4381ee0f1df0a9b7a187e07e652" + integrity sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI= + +"@types/overlayscrollbars@^1.12.0": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz#fb637071b545834fb12aea94ee309a2ff4cdc0a8" + integrity sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/pretty-hrtime@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" + integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== + +"@types/prop-types@*": + version "15.7.2" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.2.tgz#0e58ae66773d7fd7c372a493aff740878ec9ceaa" + integrity sha512-f8JzJNWVhKtc9dg/dyDNfliTKNOJSLa7Oht/ElZdF/UbMUmAH3rLmAk3ODNjw0mZajDEgatA03tRjB4+Dp/tzA== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/qs@*": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + +"@types/qs@^6.9.5": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/reach__router@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.2.4.tgz#44a701fdf15934880f6dfdef38ca49bc30e2d372" + integrity sha512-a+MFhebeSGi0LwHZ0UhH/ke77rWtNQnt8YmaHnquSaY3HmyEi+BPQi3GhPcUPnC9X5BLw/qORw3BPxGb1mCtEw== + dependencies: + "@types/history" "*" + "@types/react" "*" + +"@types/reach__router@^1.3.7": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.9.tgz#d3aaac0072665c81063cc6c557c18dadd642b226" + integrity sha512-N6rqQqTTAV/zKLfK3iq9Ww3wqCEhTZvsilhl0zI09zETdVq1QGmJH6+/xnj8AFUWIrle2Cqo+PGM/Ltr1vBb9w== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-10.1.0.tgz#9c534e29bbe05dba9beae1234f3ae944836685d4" + integrity sha512-dF49hC4FZp1dIKyzacOrHvqMUe8U2IXyQCQXOcT1e6n64gLBp+xM6qGtPsThIT9XjiIHSg2W5Jc2V5IqekBfnA== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.4.tgz#d86d17697db62f98046874f62fdb3e53a0bbc4cd" + integrity sha512-9GfTo3a0PHwQeTVoqs0g5bS28KkSY48pp5659wA+Dp4MqceDEa8EHBqrllJvvtyusszyJhViUEap0FDvlk/9Zg== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@11.0.5": + version "11.0.5" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087" + integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg== + dependencies: + "@types/react" "*" + +"@types/react-textarea-autosize@^4.3.3": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/react-textarea-autosize/-/react-textarea-autosize-4.3.4.tgz#9a93f751c91ad5e86387bce75e3b7e11ed195813" + integrity sha512-LLqG27BJGt8ja9x4umQXbnK9pRd0dI23X/GXBcuf476feOZ+e5QiKJYmWOHwAJC3YLl3YixDSigzfF4gzVQZ5w== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "16.9.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.2.tgz#6d1765431a1ad1877979013906731aae373de268" + integrity sha512-jYP2LWwlh+FTqGd9v7ynUKZzjj98T8x7Yclz479QdRhHfuW9yQ+0jjnD31eXSXutmBpppj5PYNLYLRfnZJvcfg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + +"@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/serve-static@*": + version "1.13.8" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46" + integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" + integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + +"@types/throttle-debounce@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" + integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/uglify-js@*": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== + dependencies: + source-map "^0.6.1" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/webpack-env@^1.15.0", "@types/webpack-env@^1.16.0": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.2.tgz#8db514b059c1b2ae14ce9d7bb325296de6a9a0fa" + integrity sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw== + +"@types/webpack-sources@*": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.1.tgz#6af17e3a3ded71eec2b98008d7c12f498a0a4506" + integrity sha512-MjM1R6iuw8XaVbtkCBz0N349cyqBjJHCbQiOeppe3VBeFvxqs74RKHAVt9LkxTnUWc7YLZOEsUfPUnmK6SBPKQ== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.26", "@types/webpack@^4.41.8": + version "4.41.30" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc" + integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/ws@^7.0.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" + integrity sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== + dependencies: + "@types/yargs-parser" "*" + +"@types/zen-observable@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" + integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== + +"@typescript-eslint/experimental-utils@^4.0.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.1.tgz#27275c20fa4336df99ebcf6195f7d7aa7aa9f22d" + integrity sha512-WigyLn144R3+lGATXW4nNcDJ9JlTkG8YdBWHkDlN0lC3gUGtDi7Pe3h5GPvFKMcRz8KbZpm9FJV9NTW8CpRHpg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.8.1" + "@typescript-eslint/types" "4.8.1" + "@typescript-eslint/typescript-estree" "4.8.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/scope-manager@4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz#e343c475f8f1d15801b546cb17d7f309b768fdce" + integrity sha512-r0iUOc41KFFbZdPAdCS4K1mXivnSZqXS5D9oW+iykQsRlTbQRfuFRSW20xKDdYiaCoH+SkSLeIF484g3kWzwOQ== + dependencies: + "@typescript-eslint/types" "4.8.1" + "@typescript-eslint/visitor-keys" "4.8.1" + +"@typescript-eslint/types@4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.8.1.tgz#23829c73c5fc6f4fcd5346a7780b274f72fee222" + integrity sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA== + +"@typescript-eslint/typescript-estree@4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.1.tgz#7307e3f2c9e95df7daa8dc0a34b8c43b7ec0dd32" + integrity sha512-bJ6Fn/6tW2g7WIkCWh3QRlaSU7CdUUK52shx36/J7T5oTQzANvi6raoTsbwGM11+7eBbeem8hCCKbyvAc0X3sQ== + dependencies: + "@typescript-eslint/types" "4.8.1" + "@typescript-eslint/visitor-keys" "4.8.1" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.1.tgz#794f68ee292d1b2e3aa9690ebedfcb3a8c90e3c3" + integrity sha512-3nrwXFdEYALQh/zW8rFwP4QltqsanCDz4CwWMPiIZmwlk9GlvBeueEIbq05SEq4ganqM0g9nh02xXgv5XI3PeQ== + dependencies: + "@typescript-eslint/types" "4.8.1" + eslint-visitor-keys "^2.0.0" + +"@vue/babel-helper-vue-jsx-merge-props@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz#048fe579958da408fb7a8b2a3ec050b50a661040" + integrity sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw== + +"@vue/babel-plugin-transform-vue-jsx@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz#c0a3e6efc022e75e4247b448a8fc6b86f03e91c0" + integrity sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0" + html-tags "^2.0.0" + lodash.kebabcase "^4.1.1" + svg-tags "^1.0.0" + +"@vue/babel-preset-jsx@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz#2e169eb4c204ea37ca66c2ea85a880bfc99d4f20" + integrity sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ== + dependencies: + "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.1.2" + "@vue/babel-sugar-functional-vue" "^1.1.2" + "@vue/babel-sugar-inject-h" "^1.1.2" + "@vue/babel-sugar-v-model" "^1.1.2" + "@vue/babel-sugar-v-on" "^1.1.2" + +"@vue/babel-sugar-functional-vue@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz#f7e24fba09e6f1ee70104560a8808057555f1a9a" + integrity sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-inject-h@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz#8a5276b6d8e2ed16ffc8078aad94236274e6edf0" + integrity sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-v-model@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz#1ff6fd1b800223fc9cb1e84dceb5e52d737a8192" + integrity sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.1.2" + camelcase "^5.0.0" + html-tags "^2.0.0" + svg-tags "^1.0.0" + +"@vue/babel-sugar-v-on@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz#b2ef99b8f2fab09fbead25aad70ef42e1cf5b13b" + integrity sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ== + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.1.2" + camelcase "^5.0.0" + +"@vue/cli-shared-utils@~4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.3.1.tgz#a74bf4d53825d4a4b05a84b03e023974871bc38a" + integrity sha512-lcfRalou7Z9jZgIh9PeTIpwDK7RIjr9OxfLGwbdR8czUZYUeUa67zVEMJD0OPYh/CCoREtzNbVfLPb/IYYxWEA== + dependencies: + "@hapi/joi" "^15.0.1" + chalk "^2.4.2" + execa "^1.0.0" + launch-editor "^2.2.1" + lru-cache "^5.1.1" + node-ipc "^9.1.1" + open "^6.3.0" + ora "^3.4.0" + read-pkg "^5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + semver "^6.1.0" + strip-ansi "^6.0.0" + +"@vue/compiler-core@3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.1.5.tgz#298f905b6065d6d81ff63756f98c60876b393c87" + integrity sha512-TXBhFinoBaXKDykJzY26UEuQU1K07FOp/0Ie+OXySqqk0bS0ZO7Xvl7UmiTUPYcLrWbxWBR7Bs/y55AI0MNc2Q== + dependencies: + "@babel/parser" "^7.12.0" + "@babel/types" "^7.12.0" + "@vue/shared" "3.1.5" + estree-walker "^2.0.1" + source-map "^0.6.1" + +"@vue/compiler-core@3.2.45", "@vue/compiler-core@^3.2.26": + version "3.2.45" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b" + integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.45" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.1.5", "@vue/compiler-dom@^3.0.7": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.1.5.tgz#cbb97020c62a5faa3fbc2a97916bd98041ac9856" + integrity sha512-ZsL3jqJ52OjGU/YiT/9XiuZAmWClKInZM2aFJh9gnsAPqOrj2JIELMbkIFpVKR/CrVO/f2VxfPiiQdQTr65jcQ== + dependencies: + "@vue/compiler-core" "3.1.5" + "@vue/shared" "3.1.5" + +"@vue/compiler-dom@^3.2.26": + version "3.2.45" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce" + integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw== + dependencies: + "@vue/compiler-core" "3.2.45" + "@vue/shared" "3.2.45" + +"@vue/compiler-sfc@^3.0.7": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.1.5.tgz#e61e54f3a963b0f4a8e523fbb8632390dc52b0d6" + integrity sha512-mtMY6xMvZeSRx9MTa1+NgJWndrkzVTdJ1pQAmAKQuxyb5LsHVvrgP7kcQFvxPHVpLVTORbTJWHaiqoKrJvi1iA== + dependencies: + "@babel/parser" "^7.13.9" + "@babel/types" "^7.13.0" + "@types/estree" "^0.0.48" + "@vue/compiler-core" "3.1.5" + "@vue/compiler-dom" "3.1.5" + "@vue/compiler-ssr" "3.1.5" + "@vue/shared" "3.1.5" + consolidate "^0.16.0" + estree-walker "^2.0.1" + hash-sum "^2.0.0" + lru-cache "^5.1.1" + magic-string "^0.25.7" + merge-source-map "^1.1.0" + postcss "^8.1.10" + postcss-modules "^4.0.0" + postcss-selector-parser "^6.0.4" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.1.5.tgz#f068652774293256a1e53084bed48a67682df9d2" + integrity sha512-CU5N7Di/a4lyJ18LGJxJYZS2a8PlLdWpWHX9p/XcsjT2TngMpj3QvHVRkuik2u8QrIDZ8OpYmTyj1WDNsOV+Dg== + dependencies: + "@vue/compiler-dom" "3.1.5" + "@vue/shared" "3.1.5" + +"@vue/component-compiler-utils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.0.tgz#64cd394925f5af1f9c3228c66e954536f5311857" + integrity sha512-OJ7swvl8LtKtX5aYP8jHhO6fQBIRIGkU6rvWzK+CGJiNOnvg16nzcBkd9qMZzW8trI2AsqAKx263nv7kb5rhZw== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.14" + postcss-selector-parser "^5.0.0" + prettier "^1.18.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + +"@vue/composition-api@^1.4.6": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.7.1.tgz#aa6831be5a12817d93e89e247460c310dd7a3a32" + integrity sha512-xDWoEtxGXhH9Ku3ROYX/rzhcpt4v31hpPU5zF3UeVC/qxA3dChmqU8zvTUYoKh3j7rzpNsoFOwqsWG7XPMlaFA== + +"@vue/eslint-config-prettier@~6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz#ad5912b308f4ae468458e02a2b05db0b9d246700" + integrity sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ== + dependencies: + eslint-config-prettier "^6.0.0" + +"@vue/reactivity-transform@^3.2.26": + version "3.2.45" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d" + integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.45" + "@vue/shared" "3.2.45" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/server-test-utils@~1.0.0-beta.31": + version "1.0.0-beta.32" + resolved "https://registry.yarnpkg.com/@vue/server-test-utils/-/server-test-utils-1.0.0-beta.32.tgz#698424d5d76fea10ee3d2ec45f2416e31681f01e" + integrity sha512-1dxJyrO805pr4tyNckAwRojxby3g37IHpmBURInz4yccsiwHsOhSi1tR23HovOocqmu1/NttiI5rHtv9MtL9Ig== + dependencies: + "@types/cheerio" "^0.22.10" + cheerio "^1.0.0-rc.2" + +"@vue/shared@3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.1.5.tgz#74ee3aad995d0a3996a6bb9533d4d280514ede03" + integrity sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA== + +"@vue/shared@3.2.45", "@vue/shared@^3.2.26": + version "3.2.45" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" + integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== + +"@vue/test-utils@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.3.4.tgz#83a68179178cb3da4b2b7c5c59ac660dbdff8ef5" + integrity sha512-yh2sbosCxk5FfwjXYXdY9rUffaJqYEFjsod5sCD4oosRn2x8LfBLEzQH0scdo5n7z8VkBUThpYzbkI6DVAWimA== + dependencies: + dom-event-types "^1.0.0" + lodash "^4.17.15" + pretty "^2.0.0" + +"@vue/vue2-jest@29": + version "29.2.4" + resolved "https://registry.yarnpkg.com/@vue/vue2-jest/-/vue2-jest-29.2.4.tgz#f17b61bbde629a2809db5ed85f88bee972ebe97b" + integrity sha512-oU/Ai4sufLlrhsj8GqRqfhMr6Ud4rehmwYP358/SjKcvUqOCoKa2lOBndDzG4uZVMNnQqQbKWIg7wqL3aRYPBA== + dependencies: + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@vue/component-compiler-utils" "^3.1.0" + chalk "^2.1.0" + css-tree "^2.0.1" + source-map "0.5.6" + tsconfig "^7.0.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@wry/context@^0.4.0": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" + integrity sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag== + dependencies: + "@types/node" ">=6" + tslib "^1.9.3" + +"@wry/equality@^0.1.2": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== + dependencies: + tslib "^1.9.3" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@1, abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@^1.3.5, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +accounting@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/accounting/-/accounting-0.4.1.tgz#87dd4103eff7f4460f1e186f5c677ed6cf566883" + integrity sha1-h91BA+/39EYPHhhvXGd+1s9WaIM= + +acorn-globals@^4.1.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn-walk@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== + +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" + integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +acorn@^8.1.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +address@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +address@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.0.tgz#ef8e047847fcd2c5b6f50c16965f924fd99fe709" + integrity sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ== + +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +aggregate-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" + integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + dependencies: + clean-stack "^2.0.0" + indent-string "^3.2.0" + +airbnb-js-shims@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" + integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + array.prototype.flatmap "^1.2.1" + es5-shim "^4.5.13" + es6-shim "^0.35.5" + function.prototype.name "^1.1.0" + globalthis "^1.0.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0 || ^1.0.0" + object.getownpropertydescriptors "^2.0.3" + object.values "^1.1.0" + promise.allsettled "^1.0.0" + promise.prototype.finally "^3.1.0" + string.prototype.matchall "^4.0.0 || ^3.0.1" + string.prototype.padend "^3.0.0" + string.prototype.padstart "^3.0.0" + symbol.prototype.description "^1.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + +ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" + integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== + dependencies: + type-fest "^0.5.2" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.0.0.tgz#f6b84e8fc97ea7add7a53b7530ef28f3fde0e048" + integrity sha512-8zjUtFJ3db/QoPXuuEMloS2AUf79/yeyttJ7Abr3hteopJu9HK8vsgGviGUMq+zyA6cZZO6gAyZoMTF6TgaEjA== + dependencies: + color-convert "^2.0.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-to-html@^0.6.11: + version "0.6.11" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.11.tgz#5093fc4962186c0e9343dec572a4f71abdc93439" + integrity sha512-88XZtrcwrfkyn6fGstHnkaF1kl7hGtNCYh4vSmItgEV+6JnQHryDBf7udF4f2RhTRQmYvJvPcTtqgaqrxzc9oA== + dependencies: + entities "^1.1.1" + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.0, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-cache-control@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.4.tgz#06d57d728e6f928e03b9cc3b993f6102f305c32e" + integrity sha512-FUKE8ASr8GxVq5rmky/tY8bsf++cleGT591lfLiqnPsP1fo3kAfgRfWA2QRHTCKFNlQxzUhVOEDv+PaysqiOjw== + dependencies: + apollo-server-env "^2.4.5" + apollo-server-plugin-base "^0.10.2" + +apollo-cache-inmemory@^1.6.3, apollo-cache-inmemory@~1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz#56d1f2a463a6b9db32e9fa990af16d2a008206fd" + integrity sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A== + dependencies: + apollo-cache "^1.3.5" + apollo-utilities "^1.3.4" + optimism "^0.10.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-cache@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.4.tgz#0c9f63c793e1cd6e34c450f7668e77aff58c9a42" + integrity sha512-7X5aGbqaOWYG+SSkCzJNHTz2ZKDcyRwtmvW4mGVLRqdQs+HxfXS4dUS2CcwrAj449se6tZ6NLUMnjko4KMt3KA== + dependencies: + apollo-utilities "^1.3.3" + tslib "^1.10.0" + +apollo-cache@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.5.tgz#9dbebfc8dbe8fe7f97ba568a224bca2c5d81f461" + integrity sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA== + dependencies: + apollo-utilities "^1.3.4" + tslib "^1.10.0" + +apollo-client@^2.6.4, apollo-client@~2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.8.tgz#01cebc18692abf90c6b3806414e081696b0fa537" + integrity sha512-0zvJtAcONiozpa5z5zgou83iEKkBaXhhSSXJebFHRXs100SecDojyUWKjwTtBPn9HbM6o5xrvC5mo9VQ5fgAjw== + dependencies: + "@types/zen-observable" "^0.8.0" + apollo-cache "1.3.4" + apollo-link "^1.0.0" + apollo-utilities "1.3.3" + symbol-observable "^1.0.2" + ts-invariant "^0.4.0" + tslib "^1.10.0" + zen-observable "^0.8.0" + +apollo-codegen-core@^0.35.7: + version "0.35.7" + resolved "https://registry.yarnpkg.com/apollo-codegen-core/-/apollo-codegen-core-0.35.7.tgz#665b70c5ed5be0acb0cbde64f6e439b8cc0389a8" + integrity sha512-Aj8bzwUnnsILaOxjPLJKpkzb4yNNQCpY21Atj0NZYGi6Zzfl9EK/PZn7BE2/4pyNpomErjd2C7X3m9bdvndTAg== + dependencies: + "@babel/generator" "7.6.4" + "@babel/parser" "^7.1.3" + "@babel/types" "7.6.3" + apollo-env "^0.5.1" + apollo-language-server "^1.17.0" + ast-types "^0.13.0" + common-tags "^1.5.1" + recast "^0.18.0" + +apollo-codegen-flow@^0.33.32: + version "0.33.32" + resolved "https://registry.yarnpkg.com/apollo-codegen-flow/-/apollo-codegen-flow-0.33.32.tgz#8c26156357726fb8b4d7a3befec495b9eb78ae48" + integrity sha512-/DWh6/8/BKYlwPg5/kQQQU78skC3TCRxhg4rUaR0s23px/N3YiLCcqmcV6HzcMKpjNE+dIxpha+WLNMAtb4ypg== + dependencies: + "@babel/generator" "7.6.4" + "@babel/types" "7.6.3" + apollo-codegen-core "^0.35.7" + apollo-env "^0.5.1" + change-case "^3.0.1" + common-tags "^1.5.1" + inflected "^2.0.3" + +apollo-codegen-scala@^0.34.32: + version "0.34.32" + resolved "https://registry.yarnpkg.com/apollo-codegen-scala/-/apollo-codegen-scala-0.34.32.tgz#6f34b2c8a053bcc31062b269dda5a59d2df3802e" + integrity sha512-c41a6NdEsPo/uRSY1FBbEJ2MUfM+NKlLVe3hBulc3huqaStz3PuQuOtQ5ZA0XjCwL8GhLFgC1D8TAiuDCA5+tQ== + dependencies: + apollo-codegen-core "^0.35.7" + apollo-env "^0.5.1" + change-case "^3.0.1" + common-tags "^1.5.1" + inflected "^2.0.3" + +apollo-codegen-swift@^0.35.12: + version "0.35.12" + resolved "https://registry.yarnpkg.com/apollo-codegen-swift/-/apollo-codegen-swift-0.35.12.tgz#51033aa2bb43c3e369a4ee634536200728ff81aa" + integrity sha512-pbeUwkLEpfr/hkCLnwmxfxroib5QFP0xz7cvORN3Hh9xxtpqfd0SdnrbXS8RpRxBN2jTbV78ubA6hDFm4B0BCA== + dependencies: + apollo-codegen-core "^0.35.7" + apollo-env "^0.5.1" + change-case "^3.0.1" + common-tags "^1.5.1" + inflected "^2.0.3" + +apollo-codegen-typescript@^0.35.7: + version "0.35.7" + resolved "https://registry.yarnpkg.com/apollo-codegen-typescript/-/apollo-codegen-typescript-0.35.7.tgz#fbfaaed7883b01433e91ae6852bf1c83a8b89894" + integrity sha512-r5MzXwWVPvkuyWfUV5kWzIsezoiDw2o459L3i07iM2JwOl7AW88/wkPsp/GrKh5q/Y2HRABg4oSqEiaQtrVazQ== + dependencies: + "@babel/generator" "7.6.4" + "@babel/types" "7.6.3" + apollo-codegen-core "^0.35.7" + apollo-env "^0.5.1" + change-case "^3.0.1" + common-tags "^1.5.1" + inflected "^2.0.3" + +apollo-datasource@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.6.1.tgz#697870f564da90bee53fa30d07875cb46c4d6b06" + integrity sha512-oy7c+9Up8PSZwJ1qTK9Idh1acDpIocvw+C0zcHg14ycvNz7qWHSwLUSaAjuQMd9SYFzB3sxfyEhyfyhIogT2+Q== + dependencies: + apollo-server-caching "0.5.0" + apollo-server-env "2.4.1" + +apollo-datasource@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.2.tgz#1662ee93453a9b89af6f73ce561bde46b41ebf31" + integrity sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw== + dependencies: + apollo-server-caching "^0.5.2" + apollo-server-env "^2.4.5" + +apollo-env@0.5.1, apollo-env@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.5.1.tgz#b9b0195c16feadf0fe9fd5563edb0b9b7d9e97d3" + integrity sha512-fndST2xojgSdH02k5hxk1cbqA9Ti8RX4YzzBoAB4oIe1Puhq7+YlhXGXfXB5Y4XN0al8dLg+5nAkyjNAR2qZTw== + dependencies: + core-js "^3.0.1" + node-fetch "^2.2.0" + sha.js "^2.4.11" + +apollo-env@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.5.tgz#5a36e699d39e2356381f7203493187260fded9f3" + integrity sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg== + dependencies: + "@types/node-fetch" "2.5.7" + core-js "^3.0.1" + node-fetch "^2.2.0" + sha.js "^2.4.11" + +apollo-graphql@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.3.4.tgz#c1f68591a4775945441d049eff9323542ab0401f" + integrity sha512-w+Az1qxePH4oQ8jvbhQBl5iEVvqcqynmU++x/M7MM5xqN1C7m1kyIzpN17gybXlTJXY4Oxej2WNURC2/hwpfYw== + dependencies: + apollo-env "^0.5.1" + lodash.sortby "^4.7.0" + +apollo-graphql@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.6.0.tgz#37bee7dc853213269137f4c60bfdf2ee28658669" + integrity sha512-BxTf5LOQe649e9BNTPdyCGItVv4Ll8wZ2BKnmiYpRAocYEXAVrQPWuSr3dO4iipqAU8X0gvle/Xu9mSqg5b7Qg== + dependencies: + apollo-env "^0.6.5" + lodash.sortby "^4.7.0" + +apollo-language-server@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/apollo-language-server/-/apollo-language-server-1.17.0.tgz#4f933dd4d2eb18869cacb79a6b875f268e42f882" + integrity sha512-x/CfKYl+GSFGLxLDx6d3aWLzpQssnHUdwczZxTHyU/RkQlfnNyLdZXodCmWBRpSj2Ifkuzii+uxwj4kjWG6jOA== + dependencies: + "@apollo/federation" "0.10.2" + "@apollographql/apollo-tools" "^0.4.0" + "@apollographql/graphql-language-service-interface" "^2.0.2" + "@endemolshinegroup/cosmiconfig-typescript-loader" "^1.0.0" + apollo-datasource "^0.6.0" + apollo-env "^0.5.1" + apollo-graphql "^0.3.4" + apollo-link "^1.2.3" + apollo-link-context "^1.0.9" + apollo-link-error "^1.1.1" + apollo-link-http "^1.5.5" + apollo-server-errors "^2.0.2" + await-to-js "^2.0.1" + core-js "^3.0.1" + cosmiconfig "^5.0.6" + dotenv "^8.0.0" + glob "^7.1.3" + graphql "14.0.2 - 14.2.0 || ^14.3.1" + graphql-tag "^2.10.1" + lodash.debounce "^4.0.8" + lodash.merge "^4.6.1" + minimatch "^3.0.4" + moment "^2.24.0" + vscode-languageserver "^5.1.0" + vscode-uri "1.0.6" + +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== + dependencies: + apollo-link "^1.2.13" + tslib "^1.9.3" + +apollo-link-context@^1.0.9: + version "1.0.18" + resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.18.tgz#9e700e3314da8ded50057fee0a18af2bfcedbfc3" + integrity sha512-aG5cbUp1zqOHHQjAJXG7n/izeMQ6LApd/whEF5z6qZp5ATvcyfSNkCfy3KRJMMZZ3iNfVTs6jF+IUA8Zvf+zeg== + dependencies: + apollo-link "^1.2.12" + tslib "^1.9.3" + +apollo-link-error@^1.1.1: + version "1.1.11" + resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.11.tgz#7cd363179616fb90da7866cee85cb00ee45d2f3b" + integrity sha512-442DNqn3CNRikDaenMMkoDmCRmkoUx/XyUMlRTZBEFdTw3FYPQLsmDO3hzzC4doY5/BHcn9/jdYh9EeLx4HPsA== + dependencies: + apollo-link "^1.2.12" + apollo-link-http-common "^0.2.14" + tslib "^1.9.3" + +apollo-link-http-common@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.14.tgz#d3a195c12e00f4e311c417f121181dcc31f7d0c8" + integrity sha512-v6mRU1oN6XuX8beVIRB6OpF4q1ULhSnmy7ScnHnuo1qV6GaFmDcbdvXqxIkAV1Q8SQCo2lsv4HeqJOWhFfApOg== + dependencies: + apollo-link "^1.2.12" + ts-invariant "^0.4.0" + 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== + dependencies: + apollo-link "^1.2.13" + 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== + dependencies: + apollo-link "^1.2.13" + apollo-link-http-common "^0.2.15" + tslib "^1.9.3" + +apollo-link-http@^1.5.5: + version "1.5.15" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.15.tgz#106ab23bb8997bd55965d05855736d33119652cf" + integrity sha512-epZFhCKDjD7+oNTVK3P39pqWGn4LEhShAoA1Q9e2tDrBjItNfviiE33RmcLcCURDYyW5JA6SMgdODNI4Is8tvQ== + dependencies: + apollo-link "^1.2.12" + apollo-link-http-common "^0.2.14" + tslib "^1.9.3" + +apollo-link-persisted-queries@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/apollo-link-persisted-queries/-/apollo-link-persisted-queries-0.2.2.tgz#156597cb259b7bb56cf4e967a7be0312954f4591" + integrity sha512-YL7XBu/5QsSbbYaWUXgm87T2Hn/2AQZk5Wr8CLXGDr3Wl3E/TRhBhKgQQTly9xhaTi7jgBO+AeIyTH5wCBHA9w== + dependencies: + apollo-link "^1.2.1" + hash.js "^1.1.3" + +apollo-link-state@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.2.tgz#ac00e9be9b0ca89eae0be6ba31fe904b80bbe2e8" + integrity sha512-xMPcAfuiPVYXaLwC6oJFIZrKgV3GmdO31Ag2eufRoXpvT0AfJZjdaPB4450Nu9TslHRePN9A3quxNueILlQxlw== + dependencies: + apollo-utilities "^1.0.8" + graphql-anywhere "^4.1.0-alpha.0" + +apollo-link-ws@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.19.tgz#dfa871d4df883a8777c9556c872fc892e103daa5" + integrity sha512-mRXmeUkc55ixOdYRtfq5rq3o9sboKghKABKroDVhJnkdS56zthBEWMAD+phajujOUbqByxjok0te8ABqByBdeQ== + dependencies: + apollo-link "^1.2.13" + tslib "^1.9.3" + +apollo-link@^1.0.0, apollo-link@^1.2.1, apollo-link@^1.2.12, 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== + dependencies: + apollo-utilities "^1.3.0" + ts-invariant "^0.4.0" + tslib "^1.9.3" + zen-observable-ts "^0.8.20" + +apollo-link@^1.2.14: + 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.21" + +apollo-reporting-protobuf@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.1.tgz#09294e5f5f6b2285eb94b40621ed42113eaabea3" + integrity sha512-qr4DheFP154PGZsd93SSIS9RkqHnR5b6vT+eCloWjy3UIpY+yZ3cVLlttlIjYvOG4xTJ25XEwcHiAExatQo/7g== + dependencies: + "@apollo/protobufjs" "^1.0.3" + +apollo-server-caching@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.0.tgz#446a37ce2d4e24c81833e276638330a634f7bd46" + integrity sha512-l7ieNCGxUaUAVAAp600HjbUJxVaxjJygtPV0tPTe1Q3HkPy6LEWoY6mNHV7T268g1hxtPTxcdRu7WLsJrg7ufw== + dependencies: + lru-cache "^5.0.0" + +apollo-server-caching@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz#bef5d5e0d48473a454927a66b7bb947a0b6eb13e" + integrity sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ== + dependencies: + lru-cache "^5.0.0" + +apollo-server-core@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.19.0.tgz#ff14e788f228c2d6739478a68cf93f46a16e5bfa" + integrity sha512-2aMKUVPyNbomJQaG2tkpfqvp1Tfgxgkdr7nX5zHudYNSzsPrHw+CcYlCbIVFFI/mTZsjoK9czNq1qerFRxZbJw== + dependencies: + "@apollographql/apollo-tools" "^0.4.3" + "@apollographql/graphql-playground-html" "1.6.26" + "@types/graphql-upload" "^8.0.0" + "@types/ws" "^7.0.0" + apollo-cache-control "^0.11.4" + apollo-datasource "^0.7.2" + apollo-graphql "^0.6.0" + apollo-reporting-protobuf "^0.6.1" + apollo-server-caching "^0.5.2" + apollo-server-env "^2.4.5" + apollo-server-errors "^2.4.2" + apollo-server-plugin-base "^0.10.2" + apollo-server-types "^0.6.1" + apollo-tracing "^0.12.0" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.0.0" + graphql-extensions "^0.12.6" + graphql-tag "^2.9.2" + graphql-tools "^4.0.0" + graphql-upload "^8.0.2" + loglevel "^1.6.7" + lru-cache "^5.0.0" + sha.js "^2.4.11" + subscriptions-transport-ws "^0.9.11" + uuid "^8.0.0" + ws "^6.0.0" + +apollo-server-env@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.1.tgz#58264ecfeb151919e0f480320b4e3769be9f18f3" + integrity sha512-J4G1Q6qyb7KjjqvQdVM5HUH3QDb52VK1Rv+MWL0rHcstJx9Fh/NK0sS+nujrMfKw57NVUs2d4KuYtl/EnW/txg== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-env@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.3.tgz#9bceedaae07eafb96becdfd478f8d92617d825d2" + integrity sha512-23R5Xo9OMYX0iyTu2/qT0EUb+AULCBriA9w8HDfMoChB8M+lFClqUkYtaTTHDfp6eoARLW8kDBhPOBavsvKAjA== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-env@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.5.tgz#73730b4f0439094a2272a9d0caa4079d4b661d5f" + integrity sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-errors@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.1.tgz#033cf331463ebb99a563f8354180b41ac6714eb6" + integrity sha512-errZvnh0vUQChecT7M4A/h94dnBSRL213dNxpM5ueMypaLYgnp4hiCTWIEaooo9E4yMGd1qA6WaNbLDG2+bjcg== + +apollo-server-errors@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz#1128738a1d14da989f58420896d70524784eabe5" + integrity sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ== + +apollo-server-express@^2.9.6: + version "2.19.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.19.0.tgz#a8735e854e2da20e624583bef3c2e54b0cdd6a9b" + integrity sha512-3rgSrTme1SlLoecAYtSa8ThH6vYvz29QecgZCigq5Vdc6bFP2SZrCk0ls6BAdD8OZbVKUtizzRxd0yd/uREPAw== + dependencies: + "@apollographql/graphql-playground-html" "1.6.26" + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.19.0" + "@types/cors" "2.8.8" + "@types/express" "4.17.7" + "@types/express-serve-static-core" "4.17.13" + accepts "^1.3.5" + apollo-server-core "^2.19.0" + apollo-server-types "^0.6.1" + body-parser "^1.18.3" + cors "^2.8.4" + express "^4.17.1" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.0" + parseurl "^1.3.2" + subscriptions-transport-ws "^0.9.16" + type-is "^1.6.16" + +apollo-server-plugin-base@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.2.tgz#185aea98ba22afe275fb01659070edeb480a89a7" + integrity sha512-uM5uL1lOxbXdgvt/aEIbgs40fV9xA45Y3Mmh0VtQ/ddqq0MXR5aG92nnf8rM+URarBCUfxKJKaYzJJ/CXAnEdA== + dependencies: + apollo-server-types "^0.6.1" + +apollo-server-types@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.6.1.tgz#61486980b44cacee2cb4939f0b369a0eb661a098" + integrity sha512-IEQ37aYvMLiTUzsySVLOSuvvhxuyYdhI05f3cnH6u2aN1HgGp7vX6bg+U3Ue8wbHfdcifcGIk5UEU+Q+QO6InA== + dependencies: + apollo-reporting-protobuf "^0.6.1" + apollo-server-caching "^0.5.2" + apollo-server-env "^2.4.5" + +apollo-tracing@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.12.0.tgz#26250d7789c28aa89d63226eb674706dd69a568a" + integrity sha512-cMUYGE6mOEwb9HDqhf4fiPEo2JMhjPIqEprAQEC57El76avRpRig5NM0bnqMZcYJZR5QmLlNcttNccOwf9WrNg== + dependencies: + apollo-server-env "^2.4.5" + apollo-server-plugin-base "^0.10.2" + +apollo-upload-client@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-11.0.0.tgz#465a2ed5756e6155f53befaf82d17bdb08c82060" + integrity sha512-JChTrBi1VSF8u6OPrkWUApJlyUvzwhw98kqRB3fSi7/CU6z0OUD42Mee9s5h8mfjKEfOanK6GNZhF4t2tIPXSw== + dependencies: + "@babel/runtime" "^7.5.4" + apollo-link "^1.2.12" + apollo-link-http-common "^0.2.14" + extract-files "^5.0.1" + +apollo-utilities@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.3.tgz#f1854715a7be80cd810bc3ac95df085815c0787c" + integrity sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-utilities@^1.0.1, apollo-utilities@^1.0.8, apollo-utilities@^1.2.1, apollo-utilities@^1.3.0, apollo-utilities@^1.3.2, apollo-utilities@^1.3.3, apollo-utilities@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo@^2.20.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/apollo/-/apollo-2.21.0.tgz#a456315d4e22801c807ed4ff526e8bb28e2534a4" + integrity sha512-S0PzWA6Ja3E68/LjG3D4wbOW5BiWo+PdST/TZD7n4TjRKV4eeMONEd95OSv5OzMMYaLtHSRq8xZmQEDe4l0NsA== + dependencies: + "@apollographql/apollo-tools" "^0.4.0" + "@oclif/command" "1.5.19" + "@oclif/config" "1.13.3" + "@oclif/errors" "1.2.2" + "@oclif/plugin-autocomplete" "0.1.4" + "@oclif/plugin-help" "2.2.1" + "@oclif/plugin-not-found" "1.2.3" + "@oclif/plugin-plugins" "1.7.8" + "@oclif/plugin-warn-if-update-available" "1.7.0" + apollo-codegen-core "^0.35.7" + apollo-codegen-flow "^0.33.32" + apollo-codegen-scala "^0.34.32" + apollo-codegen-swift "^0.35.12" + apollo-codegen-typescript "^0.35.7" + apollo-env "^0.5.1" + apollo-graphql "^0.3.4" + apollo-language-server "^1.17.0" + chalk "2.4.2" + env-ci "3.2.2" + gaze "1.1.3" + git-parse "1.0.3" + git-rev-sync "1.12.0" + glob "7.1.4" + graphql "14.0.2 - 14.2.0 || ^14.3.1" + graphql-tag "2.10.1" + listr "0.14.3" + lodash.identity "3.0.0" + lodash.pickby "4.6.0" + moment "2.24.0" + strip-ansi "5.2.0" + table "5.4.6" + tty "1.0.1" + vscode-uri "1.0.6" + +app-root-dir@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" + integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg= + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.flat@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" + integrity sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.10.0" + function-bind "^1.1.1" + +array.prototype.flatmap@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.1.tgz#3103cd4826ef90019c9b0a4839b2535fa6faf4e9" + integrity sha512-i18e2APdsiezkcqDyZor78Pbfjfds3S94dG6dgIV2ZASJaUf1N0dz2tGdrmwrmlZuNUgxH+wz6Z0zYVH2c5xzQ== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.10.0" + function-bind "^1.1.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-never@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" + integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +assignment@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assignment/-/assignment-2.0.0.tgz#ffd17b21bf5d6b22e777b989681a815456a3dd3e" + integrity sha1-/9F7Ib9dayLnd7mJaBqBVFaj3T4= + +assignment@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/assignment/-/assignment-2.2.0.tgz#f5b5bc2d160d69986e8700cd38f567c0aabe101e" + integrity sha1-9bW8LRYNaZhuhwDNOPVnwKq+EB4= + +ast-types@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.1.tgz#9461428a270c5a27fda44b738dd3bab2e9353003" + integrity sha512-b+EeK0WlzrSmpMw5jktWvQGxblpWnvMrV+vOp69RLjzGiHwWV0vgq75DPKtUjppKni3yWwSW8WLGV3Ch/XIWcQ== + +ast-types@0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + +ast-types@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-retry@^1.1.4, async-retry@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + +async-validator@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.2.4.tgz#4e773a1d0d741016b455b7995b469a47cce0dbe0" + integrity sha512-mTgzMJixkrh+5t2gbYoua8MLy11GHkQqFE6tbhY5Aqc4jEDGsR4BWP+sVQiYDHtzTMB8WIwI/ypObTVPcTZInw== + +async@^2.1.4: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" + integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== + dependencies: + browserslist "^4.6.3" + caniuse-lite "^1.0.30000980" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.17" + postcss-value-parser "^4.0.0" + +autoprefixer@^9.8.6: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +await-to-js@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/await-to-js/-/await-to-js-2.1.1.tgz#c2093cd5a386f2bb945d79b292817bbc3f41b31b" + integrity sha512-CHBC6gQGCIzjZ09tJ+XmpQoZOn4GdWePB4qUweCaKNJ0D3f115YdhmYVTZ4rMVpiJ3cFzZcTYK1VMYEICV4YXw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axe-core@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.1.tgz#0c6a076e4a1c3e0544ba6a9479158f9be7a7928e" + integrity sha512-3WVgVPs/7OnKU3s+lqMtkv3wQlg3WxK1YifmpJSDO0E1aPBrZWlrrTO6cxRqCXLuX2aYgCljqXIQd0VnRidV0g== + +axios-retry@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.1.2.tgz#4f4dcbefb0b434e22b72bd5e28a027d77b8a3458" + integrity sha512-+X0mtJ3S0mmia1kTVi1eA3DAC+oWnT2A29g3CpkzcBPMT6vJm+hn/WiV9wPt/KXLHVmg5zev9mWqkPx7bHMovg== + dependencies: + is-retry-allowed "^1.1.0" + +axios@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-eslint@~10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-helper-vue-jsx-merge-props@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" + integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== + +babel-jest@29.5, babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.1.0, babel-loader@~8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-loader@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-emotion@^10.0.14: + version "10.0.14" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.14.tgz#c1d0e4621e303507ea7da57daa3cd771939d6df4" + integrity sha512-T7hdxJ4xXkKW3OXcizK0pnUJlBeNj/emjQZPDIZvGOuwl2adIgicQWRNkz6BuwKdDTrqaXQn1vayaL6aL8QW5A== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/hash" "0.7.2" + "@emotion/memoize" "0.7.2" + "@emotion/serialize" "^0.11.8" + babel-plugin-macros "^2.0.0" + babel-plugin-syntax-jsx "^6.18.0" + convert-source-map "^1.5.0" + escape-string-regexp "^1.0.5" + find-root "^1.1.0" + source-map "^0.5.7" + +babel-plugin-emotion@^10.0.17: + version "10.0.17" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.17.tgz#5673fbed7b1ed61b4b98d5530f33c8a4d1b08484" + integrity sha512-KNuBadotqYWpQexHhHOu7M9EV1j2c+Oh/JJqBfEQDusD6mnORsCZKHkl+xYwK82CPQ/23wRrsBIEYnKjtbMQJw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/hash" "0.7.2" + "@emotion/memoize" "0.7.2" + "@emotion/serialize" "^0.11.10" + babel-plugin-macros "^2.0.0" + babel-plugin-syntax-jsx "^6.18.0" + convert-source-map "^1.5.0" + escape-string-regexp "^1.0.5" + find-root "^1.1.0" + source-map "^0.5.7" + +babel-plugin-emotion@^10.0.27: + version "10.0.27" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz#59001cf5de847c1d61f2079cd906a90a00d3184f" + integrity sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/hash" "0.7.4" + "@emotion/memoize" "0.7.4" + "@emotion/serialize" "^0.11.15" + babel-plugin-macros "^2.0.0" + babel-plugin-syntax-jsx "^6.18.0" + convert-source-map "^1.5.0" + escape-string-regexp "^1.0.5" + find-root "^1.1.0" + source-map "^0.5.7" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jsx-event-modifiers@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz#93e6ebb5d7553bb08f9fedbf7a0bee3af09a0472" + integrity sha512-tWGnCk0whZ+nZcj9tYLw4+y08tPJXqaEjIxRJZS6DkUUae72Kz4BsoGpxt/Kow7mmgQJpvFCw8IPLSNh5rkZCg== + +babel-plugin-jsx-v-model@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jsx-v-model/-/babel-plugin-jsx-v-model-2.0.3.tgz#c396416b99cb1af782087315ae1d3e62e070f47d" + integrity sha512-SIx3Y3XxwGEz56Q1atwr5GaZsxJ2IRYmn5dl38LFkaTAvjnbNQxsZHO+ylJPsd+Hmv+ixJBYYFEekPBTHwiGfQ== + dependencies: + babel-plugin-syntax-jsx "^6.18.0" + html-tags "^2.0.0" + svg-tags "^1.0.0" + +babel-plugin-macros@^2.0.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" + integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== + dependencies: + "@babel/runtime" "^7.4.2" + cosmiconfig "^5.2.0" + resolve "^1.10.0" + +babel-plugin-macros@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-macros@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.4.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" + integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.14.0" + +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" + +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + +babel-plugin-require-context-hook@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-require-context-hook/-/babel-plugin-require-context-hook-1.0.0.tgz#3f0e7cce87c338f53639b948632fd4e73834632d" + integrity sha512-EMZD1563QUqLhzrqcThk759RhuNVX/ZJdrtGK6drwzgvnR+ARjWyXIHPbu+tUNaMGtPz/gQeAM2M6VUw2UiUeA== + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-transform-vue-jsx@^3.5.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz#d40492e6692a36b594f7e9a1928f43e969740960" + integrity sha512-W39X07/n3oJMQd8tALBO+440NraGSF//Lo1ydd/9Nme3+QiRGFBb1Q39T9iixh0jZPPbfv3so18tNoIgLatymw== + dependencies: + esutils "^2.0.2" + +babel-polyfill@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" + integrity sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q== + 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-import-meta" "^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/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-vue@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-vue/-/babel-preset-vue-2.0.2.tgz#cfadf1bd736125397481b5f8525ced0049a0c71f" + integrity sha1-z63xvXNhJTl0gbX4UlztAEmgxx8= + dependencies: + babel-helper-vue-jsx-merge-props "^2.0.2" + babel-plugin-jsx-event-modifiers "^2.0.2" + babel-plugin-jsx-v-model "^2.0.1" + babel-plugin-syntax-jsx "^6.18.0" + babel-plugin-transform-vue-jsx "^3.5.0" + +babel-runtime@^6.18.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-walk@3.0.0-canary-5: + version "3.0.0-canary-5" + resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" + integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== + dependencies: + "@babel/types" "^7.9.6" + +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch-processor@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" + integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +better-opn@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-2.1.1.tgz#94a55b4695dc79288f31d7d0e5f658320759f7c6" + integrity sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA== + dependencies: + open "^7.0.3" + +bezier-easing@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bezier-easing/-/bezier-easing-2.1.0.tgz#c04dfe8b926d6ecaca1813d69ff179b7c2025d86" + integrity sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY= + +bfj@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" + integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== + dependencies: + bluebird "^3.5.1" + check-types "^7.3.0" + hoopy "^0.1.2" + tryer "^1.0.0" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bluebird@^3.1.1, bluebird@^3.5.1: + version "3.5.4" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" + integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== + +bluebird@^3.3.5, bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +body-parser@1.19.0, body-parser@^1.18.3: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.14.2: + version "4.14.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== + dependencies: + caniuse-lite "^1.0.30001125" + electron-to-chromium "^1.3.564" + escalade "^3.0.2" + node-releases "^1.1.61" + +browserslist@^4.0.0, browserslist@^4.6.3, browserslist@^4.6.4, 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== + dependencies: + caniuse-lite "^1.0.30001030" + electron-to-chromium "^1.3.363" + node-releases "^1.1.50" + +browserslist@^4.12.0, browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +busboy@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" + integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== + dependencies: + dicer "0.3.0" + +byline@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c" + integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cacache@^15.0.5: + version "15.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" + integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@3.0.x, camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +can-use-dom@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" + integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0: + version "1.0.30000967" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz#a5039577806fccee80a04aaafb2c0890b1ee2f73" + integrity sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ== + +caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981: + version "1.0.30000989" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" + integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== + +caniuse-lite@^1.0.30001030: + version "1.0.30001035" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" + integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== + +caniuse-lite@^1.0.30001036: + version "1.0.30001038" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" + integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== + +caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001219: + version "1.0.30001247" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001247.tgz#105be7a8fb30cdd303275e769a9dfb87d4b3577a" + integrity sha512-4rS7co+7+AoOSPRPOPUt5/GdaqZc0EsUpWk66ofE3HJTAajUK2Ss2VwoNzVN69ghg8lYYlh0an0Iy4LIHHo9UQ== + +caniuse-lite@^1.0.30001400: + version "1.0.30001441" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" + integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== + +caniuse-lite@^1.0.30001449: + version "1.0.30001451" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" + integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + +case-sensitive-paths-webpack-plugin@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" + integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-legacy@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz#3c729991d9293da0ede6dddcaf1f2ce1009ee8b4" + integrity sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww== + +character-entities@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.3.tgz#bbed4a52fe7ef98cc713c6d80d9faa26916d54e6" + integrity sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w== + +character-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= + dependencies: + is-regex "^1.0.3" + +character-reference-invalid@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz#1647f4f726638d3ea4a750cf5d1975c1c7919a85" + integrity sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-types@^7.3.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" + integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== + +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" + integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.1" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + +"chokidar@>=2.0.0 <4.0.0": + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^3.4.1, chokidar@^3.4.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chownr@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^1.5.0, ci-info@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@4.2.x, clean-css@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-boxes@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" + integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7" + integrity sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA== + +cli-table3@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== + dependencies: + object-assign "^4.1.0" + string-width "^4.2.0" + optionalDependencies: + colors "^1.1.2" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-ux@^4.4.0, cli-ux@^4.9.0: + version "4.9.3" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-4.9.3.tgz#4c3e070c1ea23eef010bbdb041192e0661be84ce" + integrity sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA== + dependencies: + "@oclif/errors" "^1.2.2" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.3" + ansi-escapes "^3.1.0" + ansi-styles "^3.2.1" + cardinal "^2.1.1" + chalk "^2.4.1" + clean-stack "^2.0.0" + extract-stack "^1.0.0" + fs-extra "^7.0.0" + hyperlinker "^1.0.0" + indent-string "^3.2.0" + is-wsl "^1.1.0" + lodash "^4.17.11" + password-prompt "^1.0.7" + semver "^5.6.0" + strip-ansi "^5.0.0" + supports-color "^5.5.0" + supports-hyperlinks "^1.0.1" + treeify "^1.1.0" + tslib "^1.9.3" + +cli-ux@^5.2.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.3.1.tgz#3bed8b37c44b03a5d1b9d71d39a69a919a101835" + integrity sha512-l2MXbitx0FjtHKSbHytuxfxWv6MdWBRh23ItRJjU17cjj0dqZxfAL863tzbR1FIs7jccPllPUvn3QWK6BQg3Pg== + dependencies: + "@oclif/command" "^1.5.1" + "@oclif/errors" "^1.2.1" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.3" + ansi-escapes "^3.1.0" + ansi-styles "^3.2.1" + cardinal "^2.1.1" + chalk "^2.4.1" + clean-stack "^2.0.0" + extract-stack "^1.0.0" + fs-extra "^7.0.1" + hyperlinker "^1.0.0" + indent-string "^3.2.0" + is-wsl "^1.1.0" + lodash "^4.17.11" + natural-orderby "^2.0.1" + password-prompt "^1.1.2" + semver "^5.6.0" + string-width "^3.1.0" + strip-ansi "^5.1.0" + supports-color "^5.5.0" + supports-hyperlinks "^1.0.1" + treeify "^1.1.0" + tslib "^1.9.3" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +clipboard@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" + integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collect-v8-coverage@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz#150ee634ac3650b71d9c985eb7f608942334feb1" + integrity sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.0, color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0, color@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +colors@^1.1.2: + version "1.3.3" + 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: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" + integrity sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ== + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.18.0, commander@^2.20.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@^2.19.0, commander@^2.20.3, commander@^2.9.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +common-tags@^1.5.1, common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.17" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" + integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== + dependencies: + mime-db ">= 1.40.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +condense-newlines@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" + integrity sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg== + dependencies: + extend-shallow "^2.0.1" + is-whitespace "^0.3.0" + kind-of "^3.0.2" + +config-chain@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +consola@^2.10.0, consola@^2.10.1, consola@^2.11.3, consola@^2.4.0, consola@^2.5.6, consola@^2.6.0, consola@^2.9.0: + version "2.11.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.11.3.tgz#f7315836224c143ac5094b47fd4c816c2cd1560e" + integrity sha512-aoW0YIIAmeftGR8GSpw6CGQluNdkWMWh3yEFjH/hmynTYnMtibXszii3lxCXmk8YxJtI3FAK5aTiquA5VH68Gw== + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +consolidate@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" + integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== + dependencies: + bluebird "^3.7.2" + +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + +constantinople@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" + integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== + dependencies: + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@^1.0.4, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie-universal-nuxt@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/cookie-universal-nuxt/-/cookie-universal-nuxt-2.2.2.tgz#107815f03f5b769de7018670d6370368205387bb" + integrity sha512-Pr6P5UCzl1EAvPh7z7jFkknBw0KTdykm6gFmPHrH4LV9s3flVmAH0ZP/ZqUXcp6b0SKZfizkn+XR1cO+QinGhQ== + dependencies: + "@types/cookie" "^0.3.3" + cookie-universal "^2.2.2" + +cookie-universal@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/cookie-universal/-/cookie-universal-2.2.2.tgz#415a4d67b6f7f0819c4914cd69b8c2f496111d30" + integrity sha512-nUXF6HH2YKbn8vGcdSzWJhjRkDHbnbekuVu2nsRu00zYsX7o/H3xGJRlPVoM4wX/8cpJYpyi9nDt+boER0Wjug== + dependencies: + "@types/cookie" "^0.3.3" + cookie "^0.4.0" + +cookie@0.4.0, cookie@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +copy-to-clipboard@^3.0.8: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz#d2724a3ccbfed89706fac8a894872c979ac74467" + integrity sha512-eOZERzvCmxS8HWzugj4Uxl8OJxa7T2k1Gi0X5qavwydHIfuSHq2dTD09LOg/XyGq4Zpb5IsR/2OJ5lbOegz78w== + dependencies: + toggle-selection "^1.0.6" + +copy-to-clipboard@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.14.0, core-js-compat@^3.15.0, core-js-compat@^3.8.1: + version "3.15.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" + integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== + dependencies: + browserslist "^4.21.5" + +core-js-compat@^3.6.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.3.tgz#41e281ca771209d5f2eb63ce34f96037d0928538" + integrity sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + +core-js-pure@^3.8.2: + version "3.15.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" + integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5, core-js@~2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" + integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== + +core-js@^3.0.1, core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: + version "3.15.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" + integrity sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cors@^2.8.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" + +cosmiconfig@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" + integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.0" + parse-json "^4.0.0" + +cosmiconfig@^5.0.6, cosmiconfig@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cp-file@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" + integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== + dependencies: + graceful-fs "^4.1.2" + make-dir "^3.0.0" + nested-error-stacks "^2.0.0" + p-event "^4.1.0" + +cpy@^8.1.1: + version "8.1.2" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" + integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== + dependencies: + arrify "^2.0.1" + cp-file "^7.0.0" + globby "^9.2.0" + has-glob "^1.0.0" + junk "^3.1.0" + nested-error-stacks "^2.1.0" + p-all "^2.1.0" + p-filter "^2.1.0" + p-map "^3.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-react-context@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" + integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + +create-react-context@<=0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" + integrity sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A== + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + +create-react-context@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" + integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag== + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + +cropperjs@^1.5.5: + version "1.5.6" + resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.5.6.tgz#82faf432bec709d828f2f7a96d1179198edaf0e2" + integrity sha512-eAgWf4j7sNJIG329qUHIFi17PSV0VtuWyAu9glZSgu/KlQSrfTQOC2zAz+jHGa5fAB+bJldEnQwvJEaJ8zRf5A== + +cross-env@~7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-fetch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.4.tgz#7bef7020207e684a7638ef5f2f698e24d9eb283c" + integrity sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw== + dependencies: + node-fetch "2.6.0" + whatwg-fetch "3.0.0" + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@^3.4.2, css-loader@~3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.2.tgz#6483ae56f48a7f901fbe07dde2fc96b01eafab3c" + integrity sha512-hDL0DPopg6zQQSRlZm0hyeaqIRnL0wbWjay9BZxoiJBpbfOW4WHfbaYQhwnDmEa0kZUc1CJ3IFo15ot1yULMIQ== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.27" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.3" + schema-utils "^2.6.5" + semver "^6.3.0" + +css-loader@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0, css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@2.1, css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + dependencies: + css-tree "1.0.0-alpha.37" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== + dependencies: + cssom "0.3.x" + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^2.2.0, csstype@^2.5.7: + version "2.6.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41" + integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg== + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +date-fns@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4" + integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg== + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +date-format-parse@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/date-format-parse/-/date-format-parse-0.2.7.tgz#a2f78bca857a821785b48abedd4426c65aa7b918" + integrity sha512-/+lyMUKoRogMuTeOVii6lUwjbVlesN9YRYLzZT/g3TEZ3uD9QnpjResujeEqUW+OSNbT7T1+SYdyEkTcRv+KDQ== + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deep-object-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" + integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw== + +deepmerge@^4.1.1, 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== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defu@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defu/-/defu-1.0.0.tgz#43acb09dfcf81866fa3b0fc047ece18e5c30df71" + integrity sha512-1Y1KRFxiiq+LYsZ3iP7xYSR8bHfmHFOUpDunZCN1ld1fGfDJWJIvkUBtjl3apnBwPuJtL/H7cwwlLYX8xPkraQ== + +defu@^5.0.0, defu@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/defu/-/defu-5.0.1.tgz#a034278f9b032bf0845d261aa75e9ad98da878ac" + integrity sha512-EPS1carKg+dkEVy3qNTqIdp2qV7mUP08nIsupfwQpz++slCVRw7qbQyWvSTig+kFPwz2XXp5/kIIkH+CwrJKkQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@^1.0.4, destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dicer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== + dependencies: + streamsearch "0.1.2" + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dimport@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dimport/-/dimport-1.0.0.tgz#d5c09564f621e7b24b2e333cccdf9b2303011644" + integrity sha512-r5Cb8jvJ9YOTKQje2wrD6ncjpyDM4l94+OqgatYNzTb0viKS0/XomCjty1+F827u1pBiPt1ubSYdowZfE1L5Tw== + dependencies: + rewrite-imports "^2.0.3" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" + integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-event-types@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.1.0.tgz#120c1f92ddea7758db1ccee0a100a33c39f4701b" + integrity sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ== + +dom-serializer@0, dom-serializer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.4.2: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= + dependencies: + no-case "^2.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^4.1.0, dot-prop@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== + dependencies: + is-obj "^1.0.0" + +dotenv-defaults@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.0.2.tgz#441cf5f067653fca4bbdce9dd3b803f6f84c585d" + integrity sha512-iXFvHtXl/hZPiFj++1hBg4lbKwGM+t/GlvELDnRtOFdjXyWP7mubkVr+eZGWG62kdsbulXAef6v/j6kiWc/xGA== + dependencies: + dotenv "^6.2.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv-webpack@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz#7ca79cef2497dd4079d43e81e0796bc9d0f68a5e" + integrity sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg== + dependencies: + dotenv-defaults "^1.0.2" + +dotenv@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== + +dotenv@^8.0.0, dotenv@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.1.0.tgz#d811e178652bfb8a1e593c6dd704ec7e90d85ea2" + integrity sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA== + +dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +downshift@^6.0.15: + version "6.1.3" + resolved "https://registry.yarnpkg.com/downshift/-/downshift-6.1.3.tgz#e794b7805d24810968f21e81ad6bdd9f3fdc40da" + integrity sha512-RA1MuaNcTbt0j+sVLhSs8R2oZbBXYAtdQP/V+uHhT3DoDteZzJPjlC+LQVm9T07Wpvo84QXaZtUCePLDTDwGXg== + dependencies: + "@babel/runtime" "^7.13.10" + compute-scroll-into-view "^1.0.17" + prop-types "^15.7.2" + react-is "^17.0.2" + +dropzone@^5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/dropzone/-/dropzone-5.5.1.tgz#06e2f513e61d6aa363d4b556f18574f47cf7ba26" + integrity sha512-3VduRWLxx9hbVr42QieQN25mx/I61/mRdUSuxAmDGdDqZIN8qtP7tcKMa3KfpJjuGjOJGYYUzzeq6eGDnkzesA== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +earcut@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== + +easy-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" + integrity sha1-EskbMIWjfwuqM26UhurEv5Tj54g= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +electron-to-chromium@^1.3.363: + version "1.3.376" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz#7cb7b5205564a06c8f8ecfbe832cbd47a1224bb1" + integrity sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw== + +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723: + version "1.3.786" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.786.tgz#1fc572abc77e2f474725f8a61acf7e25ced9fbe2" + integrity sha512-AmvbLBj3hepRk8v/DHrFF8gINxOFfDbrn6Ts3PcK46/FBdQb5OMmpamSpZQXSkfi77FfBzYtQtAk+00LCLYMVw== + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +electron-to-chromium@^1.4.284: + version "1.4.295" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" + integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +element-resize-detector@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" + integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== + dependencies: + batch-processor "1.0.0" + +elliptic@^6.0.0: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-picker-element@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/emoji-picker-element/-/emoji-picker-element-1.12.1.tgz#854a9bbae4d9a04fa2b5cd0763845921f4904c83" + integrity sha512-F9AY/re8uqZmBcCXLHLGvyy7fxuMQdZl9R8OToLRH8Vnns+WMX8RYUbI2nSJklzl5+82qzpYWeus1/puDepWcQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emotion-theming@^10.0.14: + version "10.0.18" + resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.18.tgz#7d636eb465cb190590e17d815b8d318be512ef7d" + integrity sha512-zFAax4setUIKDj+cmbl3nxXDBRIMsPmiRNpg+qDmX9wTHW2TPWpETMGaDWB67LwK63rfSIkeTH7stFFnyKd2pQ== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/weak-memoize" "0.2.3" + hoist-non-react-statics "^3.3.0" + +emotion-theming@^10.0.19, emotion-theming@^10.0.27: + version "10.0.27" + resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.27.tgz#1887baaec15199862c89b1b984b79806f2b9ab10" + integrity sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/weak-memoize" "0.2.5" + hoist-non-react-statics "^3.3.0" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +env-ci@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-3.2.2.tgz#06936f1fcfbc999102a2211fc2539df64062b61f" + integrity sha512-AOiNZ3lmxrtva3r/roqaYDF+1PX2V+ouUzuGqJf7KNxyyYkuU+CsfFbbUeibQPdixxjI/lP6eDtvtkX1/wymJw== + dependencies: + execa "^1.0.0" + java-properties "^1.0.0" + +env-ci@^2.1.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-2.6.0.tgz#3fc46537c972b4d3ab5f0b82d07dfc1491297662" + integrity sha512-tnOi9qgtDxY3mvf69coXLHbSZtFMNGAJ1s/huirAhJZTx9rs/1qgFjl+6Z5ULQCfpDmlsf34L7wm+eJGwMazYg== + dependencies: + execa "^1.0.0" + java-properties "^0.2.9" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d" + integrity sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw== + dependencies: + stackframe "^1.0.4" + +es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.7.0, es-abstract@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-abstract@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-shim@^4.5.13: + version "4.5.13" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.13.tgz#5d88062de049f8969f83783f4a4884395f21d28b" + integrity sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw== + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-shim@^0.35.5: + version "0.35.5" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" + integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== + +escalade@^3.0.2, escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^6.0.0, eslint-config-prettier@~6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== + dependencies: + get-stdin "^6.0.0" + +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" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-loader@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-4.0.0.tgz#ab096ce9168fa167e4159afff66692c173fc7b79" + integrity sha512-QoaFRdh3oXt5i2uonSjO8dDnncsG05w7qvA7yYMvGDne8zAEk9R+R1rsfunp3OKVdO5mAJelf1x2Z1kYp664kA== + dependencies: + fs-extra "^9.0.0" + loader-fs-cache "^1.0.3" + loader-utils "^2.0.0" + object-hash "^2.0.3" + schema-utils "^2.6.5" + +eslint-module-utils@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz#cdf0b40d623032274ccd2abd7e64c4e524d6e19c" + integrity sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-es@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" + integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +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" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-jest@~24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz#fa4b614dbd46a98b652d830377971f097bda9262" + integrity sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +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" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-prettier@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" + integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@~4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" + integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== + +eslint-plugin-standard@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" + integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== + +eslint-plugin-vue@~6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" + integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ== + dependencies: + natural-compare "^1.4.0" + semver "^5.6.0" + vue-eslint-parser "^7.0.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@~6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" + integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== + +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource-polyfill@^0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz#10e0d187f111b167f28fdab918843ce7d818f13c" + integrity sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw= + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.2.0, execa@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +express@^4.16.3, express@^4.17.1, express@~4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-css-chunks-webpack-plugin@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/extract-css-chunks-webpack-plugin/-/extract-css-chunks-webpack-plugin-4.7.4.tgz#db6465ca18d1fe8a89bad3dc72803127638fb477" + integrity sha512-Q0iLfJnS+MT8L/KbiPxFeTLi06dBzJaAphXJg00rIlcyjSqNx5yI0/V8ODGWCcwUO1V7W2z3dpjC+8eBKBoQrA== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-external-import "^1.1.0-beta.3" + webpack-sources "^1.1.0" + +extract-files@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-5.0.1.tgz#c9492a8410be643e260a376f0151361993d5f659" + integrity sha512-qRW6y9eKF0VbCyOoOEtFhzJ3uykAw8GKwQVXyAIqwocyEWW4m+v+evec34RwtUkkxxHh7NKBLJ6AnXM8W4dH5w== + +extract-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa" + integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo= + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fake-tag@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fake-tag/-/fake-tag-1.0.1.tgz#1d59da482240a02bd83500ca98976530ed154b0d" + integrity sha512-qmewZoBpa71mM+y6oxXYW/d1xOYQmeIvnEXAt1oCmdP0sqcogWYLepR87QL1jQVLSVMVYDq2cjY6ec/Wu8/4pg== + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-parse@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" + integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-safe-stringify@^1.0.8, fast-safe-stringify@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.3.tgz#9fe22c37fb2f7f86f06b8f004377dbf8f1ee7bc1" + integrity sha512-QJYT/i0QYoiZBQ71ivxdyTqkwKkQ0oxACXHYxH2zYHJEgzi2LsbjgvtzTbLi1SZcF190Db2YP7I7eTsU2egOlw== + +fastq@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +fault@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.3.tgz#4da88cf979b6b792b4e13c7ec836767725170b7e" + integrity sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA== + dependencies: + format "^0.2.2" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fbjs@^0.8.0: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-system-cache@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" + integrity sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08= + dependencies: + bluebird "^3.3.5" + fs-extra "^0.30.0" + ramda "^0.21.0" + +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" + integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.0" + pkg-dir "^4.1.0" + +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatstr@^1.0.4: + version "1.0.12" + resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" + integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= + +flow-parser@0.*: + version "0.156.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.156.0.tgz#5b463ea4923fe8ca34e38eb367497060d9707d0b" + integrity sha512-OCE3oIixhOttaV4ahIGtxf9XfaDdxujiTnXuHu+0dvDVVDiSDJlQpgCWdDKqP0OHfFnxQKrjMamArDAXtrBtZw== + +flush-promises@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-promises/-/flush-promises-1.0.2.tgz#4948fd58f15281fed79cbafc86293d5bb09b2ced" + integrity sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +focus-lock@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.5.tgz#f6eb37832a9b1b205406175f5277396a28c0fce1" + integrity sha512-i/mVBOoa9o+tl+u9owOJUF8k8L85odZNIsctB+JAK2HFT8jckiBwmk+3uydlm6FN8czgnkIwQtBv6yyAbrzXjw== + +focus-lock@^0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.6.tgz#98119a755a38cfdbeda0280eaa77e307eee850c7" + integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw== + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@4.1.6, fork-ts-checker-webpack-plugin@^4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== + dependencies: + "@babel/code-frame" "^7.5.5" + chalk "^2.4.1" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +fork-ts-checker-webpack-plugin@^6.0.4: + version "6.2.13" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.2.13.tgz#ee90a21c36d794eca481991a4233bbed6dc703d5" + integrity sha512-+j/DfwevcZeSXn5WOv32c/shbcbhcKi88asC2A4TDPtURS3MW/qXiVucGiL1PXdt9PCGB88R3BfaSWZ1C/XGHA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + 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" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +format@^0.2.0, format@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-capacitor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" + integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== + +fs-copy-file-sync@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" + integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-minipass@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" + integrity sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A== + dependencies: + minipass "^3.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" + integrity sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + functions-have-names "^1.1.1" + is-callable "^1.1.4" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +functions-have-names@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.1.1.tgz#79d35927f07b8e7103d819fed475b64ccf7225ea" + integrity sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw== + +fuse.js@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" + integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== + +fuzzy@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8" + integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +generic-names@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" + integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + dependencies: + loader-utils "^1.1.0" + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-parse@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/git-parse/-/git-parse-1.0.3.tgz#82f165201892688ec9286184b3eee5c4cf0655ac" + integrity sha512-LlGDePBQ9Lr/jsL3ULrnV8SQL8sk3cdScyc+vAk6jVLkHBOxdIj3JosNWemH2o9pNnGtcqukl+ym1Nl6k5jw0Q== + dependencies: + babel-polyfill "6.26.0" + byline "5.0.0" + util.promisify "1.0.0" + +git-rev-sync@1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/git-rev-sync/-/git-rev-sync-1.12.0.tgz#4468406c7e6c3ba4cf4587999e1adb28d9d1af55" + integrity sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U= + dependencies: + escape-string-regexp "1.0.5" + graceful-fs "4.1.11" + shelljs "0.7.7" + +gl-matrix@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + +glob-all@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" + integrity sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs= + dependencies: + glob "^7.0.5" + yargs "~1.2.6" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-promise@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.4.0.tgz#b6b8f084504216f702dc2ce8c9bc9ac8866fdb20" + integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw== + dependencies: + "@types/glob" "*" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.6, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global@^4.3.2, global@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + +globalthis@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.0.tgz#c5fb98213a9b4595f59cf3e7074f141b4169daae" + integrity sha512-vcCAZTJ3r5Qcu5l8/2oyVdoFwxKgfYnMTR2vwWeux/NAVZK3PwcMaWkdUIn4GJbmKuRK7xcvDsLuK+CKcXyodg== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + object-keys "^1.0.12" + +globby@11.0.1, globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.2: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +gonzales-pe@4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" + integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== + dependencies: + minimist "1.1.x" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graphql-anywhere@^4.1.0-alpha.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.2.1.tgz#1f7c3a3d9004dbe81b1c553d7fd1ef2e16e14a85" + integrity sha512-4zlzTFzixGXtIYjX7BiXQOGhQ5yQVohj/EKNxUHUTAR7lHnCmrXU17gGtZ+108l9TkoHNfc33ieJ9U8trnHE1w== + dependencies: + apollo-utilities "^1.2.1" + tslib "^1.9.3" + +graphql-extensions@^0.12.6: + version "0.12.6" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.6.tgz#c66be43035662a8cfb0b8efe9df96595338bd13c" + integrity sha512-EUNw+OIRXYTPxToSoJjhJvS5aGa94KkdkZnL1I9DCZT64/+rzQNeLeGj+goj2RYuYvoQe1Bmcx0CNZ1GqwBhng== + dependencies: + "@apollographql/apollo-tools" "^0.4.3" + apollo-server-env "^2.4.5" + apollo-server-types "^0.6.1" + +graphql-subscriptions@^1.0.0, graphql-subscriptions@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz#5f2fa4233eda44cf7570526adfcf3c16937aef11" + integrity sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA== + dependencies: + iterall "^1.2.1" + +graphql-tag@2.10.1, graphql-tag@^2.10.1: + version "2.10.1" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" + integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== + +graphql-tag@^2.9.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" + integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== + +graphql-tools@^4.0.0, graphql-tools@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" + integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== + dependencies: + apollo-link "^1.2.14" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + +graphql-upload@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.1.0.tgz#6d0ab662db5677a68bfb1f2c870ab2544c14939a" + integrity sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q== + dependencies: + busboy "^0.3.1" + fs-capacitor "^2.0.4" + http-errors "^1.7.3" + object-path "^0.11.4" + +"graphql@14.0.2 - 14.2.0 || ^14.3.1", graphql@^14.5.8, graphql@~14.7.0: + version "14.7.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" + integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA== + dependencies: + iterall "^1.2.2" + +graphql@^15.3.0: + version "15.4.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" + integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== + +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +gzip-size@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.0.tgz#2db0396c71f5c902d5cf6b52add5030b93c99bd2" + integrity sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +hable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hable/-/hable-3.0.0.tgz#6de089b2df946635cf8134b9e4859f1b62de255f" + integrity sha512-7+G0/2/COR8pwteYFqHIVYfQpuEiO2HXwJrhCBJVgrNrl9O5eaUoJVDGXUJX+0RpGncNVTuestexjk1afj01wQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +hard-source-webpack-plugin@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.13.1.tgz#a99071e25b232f1438a5bc3c99f10a3869e4428e" + integrity sha512-r9zf5Wq7IqJHdVAQsZ4OP+dcUSvoHqDMxJlIzaE2J0TZWn3UjMMrHqwDHR8Jr/pzPfG7XxSe36E7Y8QGNdtuAw== + dependencies: + chalk "^2.4.1" + find-cache-dir "^2.0.0" + graceful-fs "^4.1.11" + lodash "^4.15.0" + mkdirp "^0.5.1" + node-object-hash "^1.2.0" + parse-json "^4.0.0" + pkg-dir "^3.0.0" + rimraf "^2.6.2" + semver "^5.6.0" + tapable "^1.0.0-beta.5" + webpack-sources "^1.0.1" + write-json-file "^2.3.0" + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" + integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= + dependencies: + is-glob "^3.0.0" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasha@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.1.0.tgz#dd05ccdfcfe7dab626247ce2a58efe461922f4ca" + integrity sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-parse-selector@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz#66aabccb252c47d94975f50a281446955160380b" + integrity sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.0.tgz#a19b3cca6a26a2bcd0f1b1eac574af9427c1c7df" + integrity sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.2.0" + property-information "^5.0.1" + space-separated-tokens "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" + integrity sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI= + +he@1.2.x, he@^1.1.0, he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +highlight.js@^10.1.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +highlight.js@~9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" + integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4= + +highlight.js@~9.13.0: + version "9.13.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" + integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== + +highlight.js@~9.16.0: + version "9.16.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e" + integrity sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-minifier@^3.2.3: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-minifier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-4.0.0.tgz#cca9aad8bce1175e02e17a8c33e46d8988889f56" + integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^2.19.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + uglify-js "^3.5.1" + +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +html-webpack-plugin@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.20" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" + integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.3.0" + domutils "^2.4.2" + entities "^2.0.0" + +htmlparser2@^3.3.0, htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-call@^5.2.2: + version "5.2.5" + resolved "https://registry.yarnpkg.com/http-call/-/http-call-5.2.5.tgz#cccb144230dd2f379cf61800fd4461e24571c1be" + integrity sha512-SfJ9j2xfi8zhQuJxcBCN1AhPCUAvPhipNaoeHWHfHiV0gz4uf9RUt2kl+xu9mxJLKxhNP7We87aRGbaSGPjr8A== + dependencies: + content-type "^1.0.4" + debug "^4.1.1" + is-retry-allowed "^1.1.0" + is-stream "^2.0.0" + parse-json "^4.0.0" + tunnel-agent "^0.6.0" + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" + integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz#0106efa5d63d6d6f3ab87c999fa4877a3fd1ff97" + integrity sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +icss-utils@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.12: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +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== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^3.0.0, indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflected@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" + integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +insane@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/insane/-/insane-2.6.1.tgz#c7dcae7b51c20346883b71078fad6ce0483c198f" + integrity sha1-x9yue1HCA0aIO3EHj61s4Eg8GY8= + dependencies: + assignment "2.0.0" + he "0.5.0" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +intersection-observer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.0.tgz#6c84628f67ce8698e5f9ccf857d97718745837aa" + integrity sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ== + +invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphabetical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.3.tgz#eb04cc47219a8895d8450ace4715abff2258a1f8" + integrity sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA== + +is-alphanumerical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz#57ae21c374277b3defe0274c640a5704b8f6657c" + integrity sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-buffer@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.3.tgz#381068759b9dc807d8c0dc0bfbae2b68e1da48b7" + integrity sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-dom@^1.0.9: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" + integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== + dependencies: + is-object "^1.0.1" + is-window "^1.0.2" + +is-expression@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" + integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== + dependencies: + acorn "^7.1.1" + object-assign "^4.1.1" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + +is-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" + integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw== + +is-glob@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.0.0, is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee" + integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA== + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= + dependencies: + lower-case "^1.1.0" + +is-nan@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.0.tgz#85d1f5482f7051c2019f5673ccebdb06f3b0db03" + integrity sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ== + dependencies: + define-properties "^1.1.3" + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-promise@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.3, is-regex@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= + dependencies: + upper-case "^1.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-whitespace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" + integrity sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== + +is-window@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" + integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +izitoast@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/izitoast/-/izitoast-1.4.0.tgz#1aa4e3408b7159fba743506af66d8be54fd929fb" + integrity sha512-Oc1X2wiQtPp39i5VpIjf3GJf5sfCtHKXZ5szx7RareyEeFLUlcEW0FSfBni28+Ul6KNKZRKzhVuWzSP4Xngh0w== + +java-properties@^0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-0.2.10.tgz#2551560c25fa1ad94d998218178f233ad9b18f60" + integrity sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w== + +java-properties@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" + integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== + +javascript-detect-element-resize@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/javascript-detect-element-resize/-/javascript-detect-element-resize-0.5.3.tgz#1a71cd51dfe565907f299012fe73a294104025de" + integrity sha1-GnHNUd/lZZB/KZAS/nOilBBAJd4= + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-jsdom@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.4.2.tgz#0cf95ad846949280dd58bc91a9ca463b6b232dd8" + integrity sha512-v1sH4Q0JGM+LPEGqHNM+m+uTMf3vpXpKiuDYqWUAh+0c9+nc7scGE+qTR5JuE+OOTDnwfzPgcv9sMq6zWAOaVg== + dependencies: + "@jest/environment" "^29.4.2" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.4.2" + jest-util "^29.4.2" + jsdom "^20.0.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.2.tgz#309a2924eae6ca67cf7f25781a2af1902deee717" + integrity sha512-SElcuN4s6PNKpOEtTInjOAA8QvItu0iugkXqhYyguRvQoXapg5gN+9RQxLAkakChZA7Y26j6yUCsFWN+hlKD6g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.4.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.2.tgz#e1054be66fb3e975d26d4528fcde6979e4759de8" + integrity sha512-x1FSd4Gvx2yIahdaIKoBjwji6XpboDunSJ95RpntGrYulI1ByuYQCKN/P7hvk09JB74IonU3IPLdkutEWYt++g== + dependencies: + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-util "^29.4.2" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" + +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + +jest-util@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.2.tgz#3db8580b295df453a97de4a1b42dd2578dabd2c2" + integrity sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g== + dependencies: + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + +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== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^26.5.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@29.5: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== + dependencies: + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" + import-local "^3.0.2" + jest-cli "^29.5.0" + +jimp-compact@^0.8.0: + version "0.8.4" + resolved "https://registry.yarnpkg.com/jimp-compact/-/jimp-compact-0.8.4.tgz#0878a0c30f22d2d4f8b33e96722eb09d20770627" + integrity sha512-9mvZ7/TJ28bWtdx0RxmfiOTzSom4zuRniFTLtJHfNL6HxQdnRtjmX8XIRjmofgVXj2TW/GgSuZKB3dSZ5hNhKg== + +js-beautify@^1.6.12: + version "1.14.7" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.7.tgz#9206296de33f86dc106d3e50a35b7cf8729703b2" + integrity sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A== + dependencies: + config-chain "^1.1.13" + editorconfig "^0.15.3" + glob "^8.0.3" + nopt "^6.0.0" + +js-message@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15" + integrity sha1-IwDSSxrwjondCVvBpMnJz8uJLRU= + +js-queue@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz#362213cf860f468f0125fc6c96abc1742531f948" + integrity sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug= + dependencies: + easy-stack "^1.0.0" + +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + +js-stringify@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" + integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.0, js-yaml@^3.9.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jscodeshift@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.7.1.tgz#0236ad475d6f0770ca998a0160925d62b57d2507" + integrity sha512-YMkZSyoc8zg5woZL23cmWlnFLPH/mHilonGA7Qbzs7H6M4v4PH0Qsn4jeDyw+CHhVoAnm9UxQyB0Yw1OT+mktA== + dependencies: + "@babel/core" "^7.1.6" + "@babel/parser" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/preset-env" "^7.1.6" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/register" "^7.0.0" + babel-core "^7.0.0-bridge.0" + colors "^1.1.2" + flow-parser "0.*" + graceful-fs "^4.1.11" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.18.1" + temp "^0.8.1" + write-file-atomic "^2.3.0" + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@5.0.x, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.1.3, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonwebtoken@~9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" + integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + +keyv@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" + integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== + dependencies: + json-buffer "3.0.1" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.2, kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +launch-editor-middleware@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" + integrity sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg== + dependencies: + launch-editor "^2.2.1" + +launch-editor@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.2.1.tgz#871b5a3ee39d6680fcc26d37930b6eeda89db0ca" + integrity sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw== + dependencies: + chalk "^2.3.0" + shell-quote "^1.6.1" + +lazy-universal-dotenv@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz#a6c8938414bca426ab8c9463940da451a911db38" + integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ== + dependencies: + "@babel/runtime" "^7.5.0" + app-root-dir "^1.0.2" + core-js "^3.0.4" + dotenv "^8.0.0" + dotenv-expand "^5.1.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +linkify-it@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" + integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== + dependencies: + uc.micro "^1.0.1" + +linkifyjs@2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.9.tgz#af06e45a2866ff06c4766582590d098a4d584702" + integrity sha512-74ivurkK6WHvHFozVaGtQWV38FzBwSTGNmJolEgFp7QgR2bl6ArUWlvT4GcHKbPe1z3nWYi+VUdDZk16zDOVug== + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" + integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== + dependencies: + graceful-fs "^4.1.15" + parse-json "^4.0.0" + pify "^4.0.1" + strip-bom "^3.0.0" + type-fest "^0.3.0" + +loader-fs-cache@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== + dependencies: + find-cache-dir "^0.1.1" + mkdirp "^0.5.1" + +loader-runner@^2.3.1, loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loadjs@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loadjs/-/loadjs-4.2.0.tgz#2a0336376397a6a43edf98c9ec3229ddd5abb6f6" + integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.debounce@^4.0.6, lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.get@^4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.identity@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-3.0.0.tgz#ad7bc6a4e647d79c972e1b80feef7af156267876" + integrity sha1-rXvGpOZH15yXLhuA/u968VYmeHY= + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.1: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pickby@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + integrity sha1-feoh2MGNdwOifHBMFdO4SmfjOv8= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.2.4, lodash.template@^4.4.0, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.xorby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.xorby/-/lodash.xorby-4.7.0.tgz#9c19a6f9f063a6eb53dd03c1b6871799801463d7" + integrity sha1-nBmm+fBjputT3QPBtocXmYAUY9c= + +lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5, lodash@~4.17.10: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +loglevel@^1.6.7: + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= + dependencies: + lower-case "^1.1.2" + +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lowlight@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.13.1.tgz#c4f0e03906ebd23fedf2d258f6ab2f6324cf90eb" + integrity sha512-kQ71/T6RksEVz9AlPq07/2m+SU/1kGvt9k39UtvHX760u4SaWakaYH7hYgH5n6sTsCWk4MVYzUzLU59aN5CSmQ== + dependencies: + fault "^1.0.0" + highlight.js "~9.16.0" + +lowlight@^1.14.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lowlight@~1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc" + integrity sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A== + dependencies: + fault "^1.0.2" + highlight.js "~9.13.0" + +lowlight@~1.9.1: + version "1.9.2" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.2.tgz#0b9127e3cec2c3021b7795dd81005c709a42fdd1" + integrity sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q== + dependencies: + fault "^1.0.2" + highlight.js "~9.12.0" + +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.0.0, lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1, make-error@^1.1.1: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +map-or-similar@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" + integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg= + +map-promisified@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/map-promisified/-/map-promisified-0.4.0.tgz#c33cc8b93d2d28b0df0b0937ffabcd145b9b9a82" + integrity sha512-VYBQ3rTMykg2CSVgSrZBvhAwxuIuYbAHCtjjq/ATnD5kMq7I/ROmMBckwlmfwtEIx9yXufF+3QY5WxUH5EeM/Q== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +mapbox-gl@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.13.2.tgz#76639c44f141f8dff71b7d8f1504f2aed11f7517" + integrity sha512-CPjtWygL+f7naL+sGHoC2JQR0DG7u+9ik6WdkjjVmz2uy0kBC2l+aKfdi3ZzUR7VKSQJ6Mc/CeCN+6iVNah+ww== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.5.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.1" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.2.1" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.1.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +markdown-to-jsx@^6.10.3, markdown-to-jsx@^6.11.4, markdown-to-jsx@^6.9.1: + version "6.11.4" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5" + integrity sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw== + dependencies: + prop-types "^15.6.2" + unquote "^1.1.0" + +markdown-to-jsx@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.1.3.tgz#f00bae66c0abe7dd2d274123f84cb6bd2a2c7c6a" + integrity sha512-jtQ6VyT7rMT5tPV0g2EJakEnXLiPksnvlYtwQsVVZ611JsWGN8bQ1tVSDX4s6JllfEH6wmsYxNjTUAMrPmNA8w== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.1.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.2.tgz#5de461389d596e3f23d48bb7c2afb6161f4df40e" + integrity sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q== + dependencies: + fs-monkey "1.0.3" + +memoizerific@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" + integrity sha1-fIekZGREwy11Q4VwkF8tvRsagFo= + dependencies: + map-or-similar "^1.5.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +mensch@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd" + integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g== + +meow@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.4.tgz#c9269589e6885a60cf80605d9522d4b67ca646e3" + integrity sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + +mime-types@^2.1.12, mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mime-types@^2.1.19, mime-types@~2.1.19: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime-types@^2.1.27: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.3.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" + integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.2, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@1.1.x: + version "1.1.3" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" + integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= + +minimist@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4= + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.0.1.tgz#b4fec73bd61e8a40f0b374ddd04260ade2c8ec20" + integrity sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w== + dependencies: + yallist "^4.0.0" + +minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" + integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +moment@2.24.0, moment@^2.18.1, moment@^2.22.1, moment@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== + +mustache@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" + integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== + +mutation-observer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mutation-observer/-/mutation-observer-1.0.3.tgz#42e9222b101bca82e5ba9d5a7acf4a14c0f263d0" + integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@2.17.0, nan@^2.12.1: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nanoid@^3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + +nanoid@^3.1.31: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +natural-orderby@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" + integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== + +needle@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388" + integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg== + dependencies: + debug "^4.1.0" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-ask@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/node-ask/-/node-ask-1.0.1.tgz#caaa1076cc58e0364267a0903e3eadfac158396b" + integrity sha1-yqoQdsxY4DZCZ6CQPj6t+sFYOWs= + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= + dependencies: + minimatch "^3.0.2" + +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== + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-ipc@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz#4e245ed6938e65100e595ebc5dc34b16e8dd5d69" + integrity sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w== + dependencies: + event-pubsub "4.3.0" + js-message "1.0.5" + js-queue "2.0.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-loggly-bulk@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/node-loggly-bulk/-/node-loggly-bulk-2.2.4.tgz#bdd8638d97c43ecf1e1831ca98b250968fa6dee9" + integrity sha512-DfhtsDfkSBU6Dp1zvK+H1MgHRcA2yb4z07ctyA6uo+bNwKtv1exhohN910zcWNkdSYq1TImCq+O+3bOTuYHvmQ== + dependencies: + json-stringify-safe "5.0.x" + moment "^2.18.1" + request ">=2.76.0 <3.0.0" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ== + +node-object-hash@^1.2.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.2.tgz#385833d85b229902b75826224f6077be969a9e94" + integrity sha512-UdS4swXs85fCGWWf6t6DMGgpN/vnlKeSGEQ7hJcrs7PBFoxoKLmibc3QRb7fwiYsjdL7PX8iI/TMSlZ90dgHhQ== + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.50: + version "1.1.51" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.51.tgz#70d0e054221343d2966006bfbd4d98622cc00bd0" + integrity sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw== + dependencies: + semver "^6.3.0" + +node-releases@^1.1.61, node-releases@^1.1.71: + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + +node-releases@^2.0.6: + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +node-res@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/node-res/-/node-res-5.0.1.tgz#ffaa462e206509d66d0ba28a4daf1f032daa6460" + integrity sha512-YOleO9c7MAqoHC+Ccu2vzvV1fL6Ku49gShq3PIMKWHRgrMSih3XcwL05NbLBi6oU2J471gTBfdpVVxwT6Pfhxg== + dependencies: + destroy "^1.0.4" + etag "^1.8.1" + mime-types "^2.1.19" + on-finished "^2.3.0" + vary "^1.1.2" + +nodemon@^1.19.4: + version "1.19.4" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.4.tgz#56db5c607408e0fdf8920d2b444819af1aae0971" + integrity sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ== + dependencies: + chokidar "^2.1.8" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npm-run-path@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" + integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + dependencies: + path-key "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.2, npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nuxt-dropzone@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nuxt-dropzone/-/nuxt-dropzone-1.0.4.tgz#ef10af35938f95bfe6a9ba3eb7b7de17db7cbb14" + integrity sha512-1QuthM3bDGBN2ugXE5HfcvBmekNy4YUYfMurTeuBrwIGId0JSF9HasspwndxsSNL42eGET83eezRcH4ekLGqeA== + dependencies: + vue2-dropzone "3.6.0" + +nuxt-env@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/nuxt-env/-/nuxt-env-0.1.0.tgz#8ac50b9ff45391ad3044ea932cbd05f06a585f87" + integrity sha512-7mTao3qG0zfN0hahk3O6SuDy0KEwYmNojammWQsMwhqMn3aUjX4nMYnWDa0pua+2/rwAY9oG53jQtLgJdG7f9w== + +nuxt@~2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-2.12.1.tgz#68489eeeaa287e8b8896d425265c6d951dae8247" + integrity sha512-L37yoOCerBE/vhn9dgpTWrd0yZMW0irjiTkjBZ4ogIMEXH2McAVK9IGP4gBsp+/GRdhrni516kzevDXQjSo8Tg== + dependencies: + "@nuxt/builder" "2.12.1" + "@nuxt/cli" "2.12.1" + "@nuxt/core" "2.12.1" + "@nuxt/generator" "2.12.1" + "@nuxt/loading-screen" "^1.2.0" + "@nuxt/opencollective" "^0.3.0" + "@nuxt/webpack" "2.12.1" + +nwsapi@^2.0.7: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + +nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@^0.11.4: + version "0.11.5" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" + integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +"object.fromentries@^2.0.0 || ^1.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" + integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.11.0" + function-bind "^1.1.1" + has "^1.0.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@^1.0.2, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +open@^7.0.2, open@^7.0.3: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opener@1.5.1, opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= + +optimism@^0.10.0: + version "0.10.2" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.2.tgz#626b6fd28b0923de98ecb36a3fd2d3d4e5632dd9" + integrity sha512-zPfBIxFFWMmQboM9+Z4MSJqc1PXp82v1PFq/GfQaufI69mHKlup7ykGNnfuGIGssXJQkmhSodQ/k9EWwjd8O8A== + dependencies: + "@wry/context" "^0.4.0" + +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +orderedmap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.0.tgz#dc41a147130b51e203e8523ea5ea57724af2b63d" + integrity sha512-abUlPCcmyI/17BWWoUWeAbnniTFUZuczP6iowD9XMBcUoD9jRtUO6w+KXkw64TDk+iHdyDfTAjIH7mTRzhXcaw== + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +overlayscrollbars@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz#0b840a88737f43a946b9d87875a2f9e421d0338a" + integrity sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ== + +p-all@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" + integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== + dependencies: + p-map "^2.0.0" + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-event@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x, param-case@^2.1.0, param-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +password-prompt@^1.0.7, password-prompt@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.2.tgz#85b2f93896c5bd9e9f2d6ff0627fa5af3dc00923" + integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA== + dependencies: + ansi-escapes "^3.1.0" + cross-spawn "^6.0.5" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= + dependencies: + no-case "^2.2.0" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pino@4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/pino/-/pino-4.10.2.tgz#77e93cdfa1cdb58f688cbb0abaebe67eb2f315f4" + integrity sha512-hNNDgOju2UvK4iKqXR3ZwEutoOujBRN9jfQgty/X4B3q1QOqpWqvmVn+GT/a20o8Jw5Wd7VkGJAdgFQg55a+mw== + dependencies: + chalk "^2.3.0" + fast-json-parse "^1.0.0" + fast-safe-stringify "^1.2.1" + flatstr "^1.0.4" + pump "^1.0.3" + quick-format-unescaped "^1.1.1" + split2 "^2.2.0" + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +pkg-up@3.1.0, pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +polished@^3.3.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.4.1.tgz#1eb5597ec1792206365635811d465751f5cbf71c" + integrity sha512-GflTnlP5rrpDoigjczEkS6Ye7NDA4sFvAnlr5hSDrEvjiVj97Xzev3hZlLi3UB27fpxyTS9rWU64VzVLWkG+mg== + dependencies: + "@babel/runtime" "^7.4.5" + +polished@^4.0.5: + version "4.1.3" + resolved "https://registry.yarnpkg.com/polished/-/polished-4.1.3.tgz#7a3abf2972364e7d97770b827eec9a9e64002cfc" + integrity sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA== + dependencies: + "@babel/runtime" "^7.14.0" + +popper.js@^1.14.4, popper.js@^1.14.7, popper.js@^1.16.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7" + integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0" + +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import-resolver@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz#95c61ac5489047bd93ff42a9cd405cfe9041e2c0" + integrity sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw== + dependencies: + enhanced-resolve "^4.1.1" + +postcss-import@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + dependencies: + postcss "^7.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.0.tgz#1772512faf11421b791fb2ca6879df5f68aa0517" + integrity sha512-WzrqZ5nG9R9fUtrA+we92R4jhVvEB32IIRTzfIG/PLL8UV4CvbF1ugTEHEFX6vWxl41Xt5RTCJPEZkuWzrOM+Q== + dependencies: + lodash.template "^4.2.4" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" + integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== + dependencies: + cosmiconfig "^4.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" + integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-modules@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.2.2.tgz#5e7777c5a8964ea176919d90b2e54ef891321ce5" + integrity sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg== + dependencies: + generic-names "^2.0.1" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + +postcss-nesting@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.0.tgz#6e26a770a0c8fcba33782a6b6f350845e1a448f6" + integrity sha512-WSsbVd5Ampi3Y0nk/SKr5+K34n52PqMqEfswu6RtU4r7wA8vSD+gM8/D9qq4aJkHImwn1+9iEFTbjoWsQeqtaQ== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.4: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca" + integrity sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw== + dependencies: + mime "^2.3.1" + minimatch "^3.0.4" + mkdirp "^0.5.0" + postcss "^7.0.2" + xxhashjs "^0.2.1" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.1.10: + version "8.3.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" + integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^1.18.2: + 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.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + +prettier@~2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +pretty-bytes@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + +pretty-error@^2.0.2, pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-format@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.2.tgz#64bf5ccc0d718c03027d94ac957bdd32b3fb2401" + integrity sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg== + dependencies: + "@jest/schemas" "^29.4.2" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +pretty@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" + integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== + dependencies: + condense-newlines "^0.2.1" + extend-shallow "^2.0.1" + js-beautify "^1.6.12" + +prismjs@^1.21.0, prismjs@~1.24.0: + version "1.24.1" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.24.1.tgz#c4d7895c4d6500289482fa8936d9cdd192684036" + integrity sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow== + +prismjs@^1.8.4, prismjs@~1.17.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" + integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q== + optionalDependencies: + clipboard "^2.0.0" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-2.0.0.tgz#fac63a0b3d11deacbb0969abcc93b214bce19ed5" + integrity sha1-+sY6Cz0R3qy7CWmrzJOyFLzhntU= + dependencies: + speedometer "~1.0.0" + through2 "~2.0.3" + +progress@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + +progress@^2.0.0, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise.allsettled@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.1.tgz#afe4bfcc13b26e2263a97a7fbbb19b8ca6eb619c" + integrity sha512-3ST7RS7TY3TYLOIe+OACZFvcWVe1osbgz2x07nTb446pa3t4GUZWidMDzQ4zf9jC2l6mRa1/3X81icFYbi+D/g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + function-bind "^1.1.1" + +promise.prototype.finally@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" + integrity sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.9.0" + function-bind "^1.1.1" + +promise@^7.0.1, promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prompts@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" + integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" + +prompts@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@15.7.2, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proper-lockfile@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.1.tgz#284cf9db9e30a90e647afad69deb7cb06881262c" + integrity sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg== + dependencies: + graceful-fs "^4.1.11" + retry "^0.12.0" + signal-exit "^3.0.2" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^5.0.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.2.2.tgz#20555eafd2296278a682e5a51d5123e7878ecc30" + integrity sha512-N2moasZmjn2mjVGIWpaqz5qnz6QyeQSGgGvMtl81gA9cPTWa6wpesRSe/quNnOjUHpvSH1oZx0pdz0EEckLFnA== + dependencies: + xtend "^4.0.1" + +prosemirror-collab@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.2.2.tgz#8d2c0e82779cfef5d051154bd0836428bd6d9c4a" + integrity sha512-tBnHKMLgy5Qmx9MYVcLfs3pAyjtcqYYDd9kp3y+LSiQzkhMQDfZSV3NXWe4Gsly32adSef173BvObwfoSQL5MA== + dependencies: + prosemirror-state "^1.0.0" + +prosemirror-commands@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.3.tgz#4ee481ff062a02498ff3d50cfcca2f6327fd1fde" + integrity sha512-YVbKwTR4likoyhuwIUC9egbzHvnFrFUNbiesB0DB/HZ8hBcopQ42Tb4KGlYrS3n+pNDTFObN73CLFY6mYLN2IQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-dropcursor@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz#28738c4ed7102e814d7a8a26d70018523fc7cd6d" + integrity sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-gapcursor@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.4.tgz#7c293e1baf3bfa7c9d9387dec394787a7534a4dc" + integrity sha512-6WJRDcd5jeKDZfzM6nD8aLtA9y54aPgUzVD0rudNrirq8qWgugiN29BfvIVdiDzV0Q+/cwr2yNs5/ssSAvZ0Kw== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.1.3.tgz#4f76a1e71db4ef7cdf0e13dec6d8da2aeaecd489" + integrity sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz#487e46c763e1212a4577397aba7706139084f012" + integrity sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@1.1.3, prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.3.tgz#be22d6108df2521608e9216a87b1a810f0ed361e" + integrity sha512-PRA4NzkUMzV/NFf5pyQ6tmlIHiW/qjQ1kGWUlV2rF/dvlOxtpGpTEjIMhWgLuMf+HiDEFnUEP7uhYXu+t+491g== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-model@1.9.1, prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.8.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.9.1.tgz#8c08cf556f593c5f015548d2c1a6825661df087f" + integrity sha512-Qblh8pm1c7Ll64sYLauwwzjimo/tFg1zW3Q3IWhKRhvfOEgRKqa6dC5pRrAa+XHOIjBFEYrqbi52J5bqA2dV8Q== + dependencies: + orderedmap "^1.1.0" + +prosemirror-schema-list@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz#310809209094b03425da7f5c337105074913da6c" + integrity sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-state@1.3.3, prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.3.tgz#b2862866b14dec2b3ae1ab18229f2bd337651a2c" + integrity sha512-PLXh2VJsIgvlgSTH6I2Yg6vk1CzPDp21DFreVpQtDMY2S6WaMmrQgDTLRcsrD8X38v8Yc873H7+ogdGzyIPn+w== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-tables@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.0.0.tgz#ec3d0b11e638c6a92dd14ae816d0a2efd1719b70" + integrity sha512-zFw5Us4G5Vdq0yIj8GiqZOGA6ud5UKpMKElux9O0HrfmhkuGa1jf1PCpz2R5pmIQJv+tIM24H1mox/ODBAX37Q== + dependencies: + prosemirror-keymap "^1.1.2" + prosemirror-model "^1.8.1" + prosemirror-state "^1.3.1" + prosemirror-transform "^1.2.1" + prosemirror-view "^1.13.3" + +prosemirror-transform@1.2.4, prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.4.tgz#8d5843834f5ccedfb614faa9220672bb4834b00a" + integrity sha512-0A668uf0EN89L9O9brE05kHcqp7FHmT5YN7Tom58Kj926QqOBs7iNRHDLWxrSaQB5MNZtzDOD9T3EyJ88YDcBg== + dependencies: + prosemirror-model "^1.0.0" + +prosemirror-utils@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz#3d97bd85897e3b535555867dc95a51399116a973" + integrity sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA== + +prosemirror-view@1.14.6, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3: + version "1.14.6" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.14.6.tgz#fa1e7ed14a38f2cb234f622037a07dbd9d2830de" + integrity sha512-0qNSFWVBHPrdQaZtIO3aou/NRsxMGER3IuI3cePHYbk5pf9wSsbMIWWaeHtXqblL+rqtgkLfcw0D2na6+WBgpA== + dependencies: + prosemirror-model "^1.1.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pug-attrs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" + integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== + dependencies: + constantinople "^4.0.1" + js-stringify "^1.0.2" + pug-runtime "^3.0.0" + +pug-code-gen@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" + integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== + dependencies: + constantinople "^4.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.2" + pug-attrs "^3.0.0" + pug-error "^2.0.0" + pug-runtime "^3.0.0" + void-elements "^3.1.0" + with "^7.0.0" + +pug-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" + integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== + +pug-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" + integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== + dependencies: + constantinople "^4.0.1" + jstransformer "1.0.0" + pug-error "^2.0.0" + pug-walk "^2.0.0" + resolve "^1.15.1" + +pug-lexer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" + integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== + dependencies: + character-parser "^2.2.0" + is-expression "^4.0.0" + pug-error "^2.0.0" + +pug-linker@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" + integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== + dependencies: + pug-error "^2.0.0" + pug-walk "^2.0.0" + +pug-load@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" + integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== + dependencies: + object-assign "^4.1.1" + pug-walk "^2.0.0" + +pug-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" + integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== + dependencies: + pug-error "^2.0.0" + token-stream "1.0.0" + +pug-runtime@^3.0.0, pug-runtime@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" + integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== + +pug-strip-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" + integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== + dependencies: + pug-error "^2.0.0" + +pug-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" + integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== + +pug@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" + integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== + dependencies: + pug-code-gen "^3.0.2" + pug-filters "^4.0.0" + pug-lexer "^5.0.1" + pug-linker "^4.0.0" + pug-load "^3.0.0" + pug-parser "^6.0.0" + pug-runtime "^3.0.1" + pug-strip-comments "^2.0.0" + +pump@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pure-rand@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" + integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0, qs@^6.6.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@^6.10.0: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0, 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.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +quick-format-unescaped@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-1.1.2.tgz#0ca581de3174becef25ac3c2e8956342381db698" + integrity sha1-DKWB3jF0vs7yWsPC6JVjQjgdtpg= + dependencies: + fast-safe-stringify "^1.0.8" + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + +ramda@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" + integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-loader@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f" + integrity sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA== + dependencies: + loader-utils "^1.1.0" + schema-utils "^2.0.1" + +raw-loader@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-clientside-effect@^1.2.0, react-clientside-effect@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz#6212fb0e07b204e714581dd51992603d1accc837" + integrity sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A== + dependencies: + "@babel/runtime" "^7.0.0" + +react-colorful@^5.1.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.3.0.tgz#bcbae49c1affa9ab9a3c8063398c5948419296bd" + integrity sha512-zWE5E88zmjPXFhv6mGnRZqKin9s5vip1O3IIGynY9EhZxN8MATUxZkT3e/9OwTEm4DjQBXc6PFWP6AetY+Px+A== + +react-dev-utils@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== + dependencies: + "@babel/code-frame" "7.10.4" + address "1.1.2" + browserslist "4.14.2" + chalk "2.4.2" + cross-spawn "7.0.3" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.1.0" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "4.1.6" + global-modules "2.0.0" + globby "11.0.1" + gzip-size "5.1.1" + immer "8.0.1" + is-root "2.1.0" + loader-utils "2.0.0" + open "^7.0.2" + pkg-up "3.1.0" + prompts "2.4.0" + react-error-overlay "^6.0.9" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@16.14.0, react-dom@^16.8.3: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-draggable@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" + integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-fast-compare@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + +react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-focus-lock@^1.18.3: + version "1.19.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-1.19.1.tgz#2f3429793edaefe2d077121f973ce5a3c7a0651a" + integrity sha512-TPpfiack1/nF4uttySfpxPk4rGZTLXlaZl7ncZg/ELAk24Iq2B1UUaUioID8H8dneUXqznT83JTNDHDj+kwryw== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.6.3" + prop-types "^15.6.2" + react-clientside-effect "^1.2.0" + +react-focus-lock@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.2.1.tgz#1d12887416925dc53481914b7cedd39494a3b24a" + integrity sha512-47g0xYcCTZccdzKRGufepY8oZ3W1Qg+2hn6u9SHZ0zUB6uz/4K4xJe7yYFNZ1qT6m+2JDm82F6QgKeBTbjW4PQ== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.6.6" + prop-types "^15.6.2" + react-clientside-effect "^1.2.2" + use-callback-ref "^1.2.1" + use-sidecar "^1.0.1" + +react-helmet-async@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.2.tgz#bb55dd8268f7b15aac69c6b22e2f950abda8cc44" + integrity sha512-qzzchrM/ibHuPS/60ief8jaibPunuRdeta4iBDQV+ri2SFKwOV+X2NlEpvevZOauhmHrH/I6dI4E90EPVfJBBg== + dependencies: + "@babel/runtime" "7.3.4" + invariant "2.2.4" + prop-types "15.7.2" + react-fast-compare "2.0.4" + shallowequal "1.1.0" + +react-helmet-async@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.9.tgz#5b9ed2059de6b4aab47f769532f9fbcbce16c5ca" + integrity sha512-N+iUlo9WR3/u9qGMmP4jiYfaD6pe9IvDTapZLFJz2D3xlTlCM1Bzy4Ab3g72Nbajo/0ZyW+W9hdz8Hbe4l97pQ== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-inspector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-4.0.0.tgz#ad73200ca18452aff333df2e2791be4544c422a9" + integrity sha512-heh4THBeJg0HLYO/3VBAOaFPkdEHoTZq9VFgP4rOzGw/jyqdVd5spfXSl3LNB1fwrwaWef75Q1hCuwlY4GaKjQ== + dependencies: + babel-runtime "^6.26.0" + is-dom "^1.0.9" + prop-types "^15.6.1" + storybook-chromatic "^2.2.2" + +react-is@^16.7.0: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-popper-tooltip@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.8.3.tgz#1c63e7473a96362bd93be6c94fa404470a265197" + integrity sha512-g5tfxmuj8ClNVwH4zswYJcD3GKoc5RMeRawd/WZnbyZGEDecsRKaVL+Kj7L3BG7w5qb6/MHcLTG8yE4CidwezQ== + dependencies: + "@babel/runtime" "^7.4.5" + react-popper "^1.3.3" + +react-popper-tooltip@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz#329569eb7b287008f04fcbddb6370452ad3f9eac" + integrity sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@popperjs/core" "^2.5.4" + react-popper "^2.2.4" + +react-popper@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.3.tgz#2c6cef7515a991256b4f0536cd4bdcb58a7b6af6" + integrity sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w== + dependencies: + "@babel/runtime" "^7.1.2" + create-react-context "<=0.2.2" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react-popper@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" + integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" + +react-sizeme@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.1.tgz#4d12f4244e0e6a0fb97253e7af0314dc7c83a5a0" + integrity sha512-9Hf1NLgSbny1bha77l9HwvwwxQUJxFUqi44Ih+y3evA+PezBpGdCGlnvye6avss2cIgs9PgdYgMnfuzJWn/RUw== + dependencies: + element-resize-detector "^1.2.2" + invariant "^2.2.4" + shallowequal "^1.1.0" + throttle-debounce "^3.0.1" + +react-storage-hooks@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/react-storage-hooks/-/react-storage-hooks-3.0.3.tgz#c1cbb79398434af0694e9c6f0c687cb87bbe85b4" + integrity sha512-kRUk+ZnRx4dIAkNwmwRhTHxMZlVpXAW5a3qmbqr17CH+/ZfhJ9ksxyYjCUufB/BCkKOXIOEka7sp3HvtB1A1Gw== + +react-syntax-highlighter@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz#4e3f376e752b20d2f54e4c55652fd663149e4029" + integrity sha512-kqmpM2OH5OodInbEADKARwccwSQWBfZi0970l5Jhp4h39q9Q65C4frNcnd6uHE5pR00W8pOWj9HDRntj2G4Rww== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "~9.13.0" + lowlight "~1.11.0" + prismjs "^1.8.4" + refractor "^2.4.1" + +react-syntax-highlighter@^13.5.3: + version "13.5.3" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz#9712850f883a3e19eb858cf93fad7bb357eea9c6" + integrity sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.1.1" + lowlight "^1.14.0" + prismjs "^1.21.0" + refractor "^3.1.0" + +react-syntax-highlighter@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz#59103ff17a828a27ed7c8f035ae2558f09b6b78c" + integrity sha512-G2bkZxmF3VOa4atEdXIDSfwwCqjw6ZQX5znfTaHcErA1WqHIS0o6DaSCDKFPVaOMXQEB9Hf1UySYQvuJmV8CXg== + dependencies: + babel-runtime "^6.18.0" + highlight.js "~9.12.0" + lowlight "~1.9.1" + prismjs "^1.8.4" + refractor "^2.4.1" + +react-textarea-autosize@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz#3132cb77e65d94417558d37c0bfe415a5afd3445" + integrity sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.6.0" + +react-textarea-autosize@^8.3.0: + version "8.3.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" + +react-use-clipboard@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/react-use-clipboard/-/react-use-clipboard-0.1.4.tgz#aa622a3d7dc2525be2bf1d2af8ca04c6108bd7a7" + integrity sha512-TK1RTDTNHhmr7cZpheECh0Ys6bCBZqN3RiXTdvt57g+5+gU5fpLhL7Zl3v8D6irR0X2a7MqwQmZJdgKhwI5w7g== + dependencies: + copy-to-clipboard "^3.0.8" + +react@16.14.0, react@^16.8.3: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^5.1.1, read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" + integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recast@0.20.4: + version "0.20.4" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.4.tgz#db55983eac70c46b3fff96c8e467d65ffb4a7abc" + integrity sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +recast@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.1.tgz#dd1788cfa403be8be06a10f201317f881adc602b" + integrity sha512-Ri42yIOwHetqKgEhQSS4N1B9wSLn+eYcyLoQfuSpvd661Jty1Q3P0FXkzjIQ9XxTN+3+kRu1JFXbRmUCUmde5Q== + dependencies: + ast-types "0.13.1" + esprima "~4.0.0" + private "^0.1.8" + source-map "~0.6.1" + +recast@^0.18.1: + version "0.18.10" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.10.tgz#605ebbe621511eb89b6356a7e224bff66ed91478" + integrity sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ== + dependencies: + ast-types "0.13.3" + esprima "~4.0.0" + private "^0.1.8" + source-map "~0.6.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + dependencies: + esprima "~4.0.0" + +refractor@^2.4.1: + version "2.10.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.0.tgz#4cc7efc0028a87924a9b31d82d129dec831a287b" + integrity sha512-maW2ClIkm9IYruuFYGTqKzj+m31heq92wlheW4h7bOstP+gf8bocmMec+j7ljLcaB1CAID85LMB3moye31jH1g== + dependencies: + hastscript "^5.0.0" + parse-entities "^1.1.2" + prismjs "~1.17.0" + +refractor@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.4.0.tgz#62bd274b06c942041f390c371b676eb67cb0a678" + integrity sha512-dBeD02lC5eytm9Gld2Mx0cMcnR+zhSnsTfPpWqFaMgUMJfC9A6bcN3Br/NaXrnBJcuxnLFR90k1jrkaSyV8umg== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.24.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + 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" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.2.tgz#949d9d87468ff88d5a7e4734ebb994a892de1ff2" + integrity sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.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" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + 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" + +regexpu-core@^5.2.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.0.tgz#4d0d044b76fedbad6238703ae84bfdedee2cf074" + integrity sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.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" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +regjsgen@^0.5.0: + version "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" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + 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" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x, relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.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" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5, request-promise-native@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +"request@>=2.76.0 <3.0.0", request@^2.87.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.19.0, resolve@^1.2.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@0.12.0, retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rewrite-imports@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/rewrite-imports/-/rewrite-imports-2.0.3.tgz#210fc05ebda6a6c6a2e396608b0146003d510dda" + integrity sha512-R7ICJEeP3y+d/q4C8YEJj9nRP0JyiSqG07uc0oQh8JvAe706dDFVL95GBZYCjADqmhArZWWjfM/5EcmVu4/B+g== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rope-sequence@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b" + integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + +rxjs@^6.3.3: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + dependencies: + tslib "^1.9.0" + +rxjs@^6.4.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.1.tgz#f7a005a9386361921b8524f38f54cbf80e5d08f4" + integrity sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + +safe-buffer@5.1.2, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@~10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" + integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass-resources-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-2.0.0.tgz#88569c542fbf1f18f33a6578b77cc5b36c56911d" + integrity sha512-I+5FfV+Hb29U5Nt8DbslWOBgRmTv1M/EwOn4/4rc6Aqy9yjygoa8UTnyCFXfTZV8FoQyIBZbEyKSBryhByqQbA== + dependencies: + async "^2.1.4" + chalk "^1.1.3" + glob "^7.1.1" + loader-utils "^1.0.4" + +sass@^1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.30.0.tgz#60bbbbaf76ba10117e61c6c24f00161c3d60610e" + integrity sha512-26EUhOXRLaUY7+mWuRFqGeGGNmhB1vblpTENO1Z7mAzzIZeVxZr9EZoaY1kyGLFWdSOZxRMAufiN2mkbO6dAlw== + dependencies: + chokidar ">=2.0.0 <4.0.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= + dependencies: + no-case "^2.2.0" + upper-case-first "^1.1.2" + +serialize-javascript@^2.1.0, serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serialize-javascript@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e" + integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw== + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-favicon@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" + integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.1.1" + parseurl "~1.3.2" + safe-buffer "5.1.1" + +serve-placeholder@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/serve-placeholder/-/serve-placeholder-1.2.2.tgz#034960945b5950f873b2be4e4ea3a4653b9e33e5" + integrity sha512-4zczakjRPVbX5XBcJqUoyiwiMEXWPBj0rEexQkiQitKEkj36szAmw5DgcgOpWiXtRTU7aqJ47hjnYJg+2FSj5g== + dependencies: + defu "^1.0.0" + +serve-static@1.14.1, serve-static@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +server-destroy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallow-equal@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.0.tgz#fd828d2029ff4e19569db7e19e535e94e2d1f5cc" + integrity sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA== + +shallowequal@1.1.0, shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shelljs@0.7.7: + version "0.7.7" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + integrity sha1-svXHfvlxSPS09uImguELuoZnz/E= + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +simplebar-react@^1.0.0-alpha.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simplebar-react/-/simplebar-react-1.1.0.tgz#9241817265aee28b40abced66d6a2663e046d721" + integrity sha512-0nbUpoB5Gq3z2dbhRjPxwTLlscgFjCw8vKQRmbXIr47JMc5BeHj/WbZdVAESuKAvua7ESh6mkxbzywMNgRdbCw== + dependencies: + prop-types "^15.6.1" + simplebar "^4.1.0" + +simplebar@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/simplebar/-/simplebar-4.1.0.tgz#c4b78b278dd0ce41ed70a71473bfad8132a6260f" + integrity sha512-kX+CsWbWLeufIsqJl8xg5J4WbYMyq5NONR/aTaehN8XLQxOthSgRT/uAXsqX9Yrw3iiGxD9PPwM1PmEJfWAdcg== + dependencies: + can-use-dom "^0.1.0" + core-js "^3.0.1" + lodash.debounce "^4.0.8" + lodash.memoize "^4.1.2" + lodash.throttle "^4.1.1" + resize-observer-polyfill "^1.5.1" + +sisteransi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= + dependencies: + no-case "^2.2.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.13, source-map-support@~0.5.12: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.16, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.6: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz#27910835ae00d0adfcdbd0ad7e611fb9544351fa" + integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + +speedometer@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.0.0.tgz#cd671cb06752c22bca3370e2f334440be4fc62e2" + integrity sha1-zWccsGdSwivKM3Di8zREC+T8YuI= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.0.1.tgz#b0cab7bbb11ac9ea07f003453e2011f8cbed9f34" + integrity sha512-FfndBvkXL9AHyGLNzU3r9AvYIBBZ7gm+m+kd0p8cT3/v4OliMAyipZAhLVEv1Zi/k4QFq9CstRGVd9pW/zcHFQ== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.0.0" + +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +stack-utils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b" + integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ== + dependencies: + ci-info "^1.6.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +store2@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf" + integrity sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw== + +store2@^2.7.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.8.0.tgz#032d5dcbd185a5d74049d67a1765ff1e75faa04b" + integrity sha512-FBJpcOEZQLZBIGL4Yp7W5RgZ0ejaURmcfUjIpyOb64BpI8z/iJXw7zd/NTBeq304dVMxuWVDZEUUCGn7llaVrA== + +storybook-chromatic@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/storybook-chromatic/-/storybook-chromatic-2.2.2.tgz#eade5178f334d6dd173dbe980c902ae90e727cb0" + integrity sha512-n79eX0MQEHzDCnXqgOjvDOQ1xfBOTyQHy1RNxEMQvZolfAle8YVS0NnRpcW0xh/Ye621Iote3dwFI3uQmlcqPw== + dependencies: + "@babel/runtime" "^7.3.1" + "@chromaui/localtunnel" "1.10.1" + async-retry "^1.1.4" + commander "^2.9.0" + debug "^3.0.1" + denodeify "^1.2.1" + env-ci "^2.1.0" + fake-tag "^1.0.0" + jsdom "^11.5.1" + jsonfile "^4.0.0" + minimatch "^3.0.4" + node-ask "^1.0.1" + node-fetch "^2.6.0" + node-loggly-bulk "^2.2.4" + param-case "^2.1.1" + pino "4.10.2" + progress "^2.0.3" + progress-stream "^2.0.0" + semver "^6.2.0" + strip-color "^0.1.0" + tmp "^0.1.0" + tree-kill "^1.1.0" + uuid "^3.3.2" + +storybook-design-token@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/storybook-design-token/-/storybook-design-token-0.8.1.tgz#55da2f979799711f2d02c2082a36dffca6b57fae" + integrity sha512-kcAEW38oHuDfuJ0Zvfgp/HphAZEdZeXiMOdWpoV4bwg2U7MC49T2kf86J+QkTOESL0HkfEkHyziurV9Um5AQAA== + dependencies: + "@storybook/addons" "5.2.8" + "@storybook/api" "5.2.8" + "@storybook/components" "5.2.8" + "@storybook/theming" "5.2.8" + gonzales-pe "4.2.4" + javascript-detect-element-resize "^0.5.3" + mensch "0.3.4" + raw-loader "3.1.0" + react-storage-hooks "^3.0.3" + react-use-clipboard "0.1.4" + +storybook-vue-router@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/storybook-vue-router/-/storybook-vue-router-1.0.7.tgz#366451212149d9d0a32557545b244667bb01768e" + integrity sha512-R+DYARQ40YVbMbV5moLDmQvodJX5FQPVy5cULb782P1gD5rAkulWtgt8yrM7pmjYru+LTPdLS4blrFPnWlb0sQ== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" + +string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string.prototype.matchall@^4.0.0 || ^3.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.padend@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" + integrity sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.4.3" + function-bind "^1.0.2" + +string.prototype.padstart@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz#5bcfad39f4649bb2d031292e19bcf0b510d4b242" + integrity sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.4.3" + function-bind "^1.0.2" + +string.prototype.trimend@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimstart@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-color@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/strip-color/-/strip-color-0.1.0.tgz#106f65d3d3e6a2d9401cac0eb0ce8b8a702b4f7b" + integrity sha1-EG9l09PmotlAHKwOsM6LinArT3s= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +style-loader@~0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +style-resources-loader@^1.3.3, style-resources-loader@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/style-resources-loader/-/style-resources-loader-1.3.3.tgz#e4b3ab93e7c3d1606e86f9549522a0b5c4ad6812" + integrity sha512-vDD2HyG6On8H9gWUN9O9q1eXR/JnXpCkNvpusvgFsRQ9JZGF9drzvwKEigR9vqlmUbXO2t/vIIabpYMmis0eAQ== + dependencies: + glob "^7.1.6" + is-promise "^2.1.0" + loader-utils "^1.2.3" + schema-utils "^2.6.1" + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16: + version "0.9.18" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz#bcf02320c911fbadb054f7f928e51c6041a37b97" + integrity sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0" + +subtag@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/subtag/-/subtag-0.5.0.tgz#1728a8df5257fb98ded4fb981b2ac7af10cf58ba" + integrity sha512-CaIBcTSb/nyk4xiiSOtZYz1B+F12ZxW8NEp54CdT+84vmh/h4sUnHGC6+KQXUfED8u22PQjCYWfZny8d2ELXwg== + +suggestions@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/suggestions/-/suggestions-1.7.1.tgz#2fefcbde8967353056d1d6eaed891b46d98a7e5c" + integrity sha512-gl5YPAhPYl07JZ5obiD9nTZsg4SyZswAQU/NNtnYiSnFkI3+ZHuXAiEsYm7AaZ71E0LXSFaGVaulGSWN3Gd71A== + dependencies: + fuzzy "^0.1.1" + xtend "^4.0.0" + +supercluster@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.5.tgz#65a6ce4a037a972767740614c19051b64b8be5a3" + integrity sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg== + dependencies: + kdbush "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + +svg-to-vue@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/svg-to-vue/-/svg-to-vue-0.7.0.tgz#ec86deb1742be38319462e36703af1dfa2f9fad9" + integrity sha512-Tg2nMmf3BQorYCAjxbtTkYyWPVSeox5AZUFvfy4MoWK/5tuQlnA/h3LAlTjV3sEvOC5FtUNovRSj3p784l4KOA== + dependencies: + svgo "^1.3.2" + +svgo@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" + integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.1" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + +symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +symbol.prototype.description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.0.tgz#6e355660eb1e44ca8ad53a68fdb72ef131ca4b12" + integrity sha512-I9mrbZ5M96s7QeJDv95toF1svkUjeBybe8ydhY7foPaBmr0SPJMFupArmMkDrOKTTj0sJVr+nvQNxWLziQ7nDQ== + dependencies: + has-symbols "^1.0.0" + +table@5.4.6, table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +tar@^6.0.2: + version "6.1.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.1.tgz#4d7da4b132b334bb8c175ed1de466fe9157ea0eb" + integrity sha512-GG0R7yt/CQkvG4fueXDi52Zskqxe2AyRJ+Wm54yqarnBgcX3qRIWh10qLVAAN+mlPFGTfP5UxvD3Fbi11UOTUQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +telejson@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.0.3.tgz#442af55f78d791d3744c9e7a696be6cdf789a4b5" + integrity sha512-gUOh6wox1zJjbGMg+e26NquZcp/F18EbIaqVvjiGqikRqVB4fYEAM8Nyin8smgwX30XhaRBOg+kCj4vInmvwAg== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.1" + is-regex "^1.0.4" + is-symbol "^1.0.2" + isobject "^4.0.0" + lodash "^4.17.15" + memoizerific "^1.11.3" + +telejson@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.3.0.tgz#6d814f3c0d254d5c4770085aad063e266b56ad03" + integrity sha512-er08AylQ+LEbDLp1GRezORZu5wKOHaBczF6oYJtgC3Idv10qZ8A3p6ffT+J5BzDKkV9MqBvu8HAKiIIOp6KJ2w== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.1" + is-regex "^1.0.4" + is-symbol "^1.0.3" + isobject "^4.0.0" + lodash "^4.17.15" + memoizerific "^1.11.3" + +telejson@^5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.3.3.tgz#fa8ca84543e336576d8734123876a9f02bf41d2e" + integrity sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.2" + is-regex "^1.1.2" + is-symbol "^1.0.3" + isobject "^4.0.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + +temp@^0.8.1: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +term-size@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2" + integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg== + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" + integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^25.1.0" + p-limit "^2.2.2" + schema-utils "^2.6.4" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391" + integrity sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^4.4.3: + version "4.6.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.2.tgz#cb1cf055e7f70caa5863f00ba3e67dc3c97b5150" + integrity sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.4: + version "5.7.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thread-loader@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda" + integrity sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg== + dependencies: + loader-runner "^2.3.1" + loader-utils "^1.1.0" + neo-async "^2.6.0" + +throttle-debounce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" + integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== + +throttle-debounce@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" + integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== + +through2@^2.0.0, through2@^2.0.2, through2@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-fix-plugin@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/time-fix-plugin/-/time-fix-plugin-2.0.6.tgz#3210121d269b475a7e7661766e682bd768ba1ced" + integrity sha512-2cjjg3672ppNm/uKhHAoCFp1ItEAiH+xJOjO9WGIF8hXuxPAJ2adfYgFiyooVbsOb948c+WrRh+edxFUMxYHoQ== + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tippy.js@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-4.3.5.tgz#882bff8d92f09bb0546d2826d5668c0560006f54" + integrity sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA== + dependencies: + popper.js "^1.14.7" + +tiptap-commands@^1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.12.7.tgz#7161a84e9fffb9c6b48f4a7d95cd8a72916abfcf" + integrity sha512-y63MEA9Nyj8zw0klSqKuQsqsRcvgvm3WLtBkcJ/FWRTEL+wufQzT7/AshUuX/Tb1Ss2Fl6Id5S7N1Rr/NaCsaA== + dependencies: + prosemirror-commands "1.1.3" + prosemirror-inputrules "1.1.2" + prosemirror-model "1.9.1" + prosemirror-schema-list "1.1.2" + prosemirror-state "1.3.3" + prosemirror-tables "1.0.0" + prosemirror-utils "0.9.6" + tiptap-utils "^1.8.4" + +tiptap-extensions@~1.28.8: + version "1.28.8" + resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.28.8.tgz#1a631fa2c7878c81616e50ea37e61c9be388e486" + integrity sha512-1e2LiZWEDL8df0Na3RnciAFP2OePeT1MGem54kjTouId9rP6ouDF6u3jfqMw1NF4VpeSClLdnKrNtEDqCkRfWw== + dependencies: + lowlight "1.13.1" + prosemirror-collab "1.2.2" + prosemirror-history "1.1.3" + prosemirror-model "1.9.1" + prosemirror-state "1.3.3" + prosemirror-tables "1.0.0" + prosemirror-transform "1.2.4" + prosemirror-utils "0.9.6" + prosemirror-view "1.14.6" + tiptap "^1.26.8" + tiptap-commands "^1.12.7" + +tiptap-utils@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.8.4.tgz#5465c41abbbd0ddb127d22a1bb56e64cf3f3ff03" + integrity sha512-n8nYB96rphfjmDnPBYgLzGpyLH30H1PoBVqFzmQ+K8sNMkW7vHTA5Yrt5E3rcfgt15HF7VldqUTpKyAjDwdkCw== + dependencies: + prosemirror-model "1.9.1" + prosemirror-state "1.3.3" + prosemirror-tables "1.0.0" + prosemirror-utils "0.9.6" + +tiptap@^1.26.8, tiptap@~1.26.6: + version "1.26.8" + resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.26.8.tgz#31017a0d3f5c51464caab4f1ac1581f21474da43" + integrity sha512-Bd80+ymPCsfkDkwpBbuJpx913BjkMi7ZHYqoFLoZ7V37tAznvJRQ35966r0s5imxD195lnlrKzN7af7E+/6lLA== + dependencies: + prosemirror-commands "1.1.3" + prosemirror-dropcursor "1.3.2" + prosemirror-gapcursor "1.1.4" + prosemirror-inputrules "1.1.2" + prosemirror-keymap "1.1.3" + prosemirror-model "1.9.1" + prosemirror-state "1.3.3" + prosemirror-view "1.14.6" + tiptap-commands "^1.12.7" + tiptap-utils "^1.8.4" + +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +token-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" + integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tree-kill@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +trunc-html@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trunc-html/-/trunc-html-1.1.2.tgz#1e97d51f67d470b67662b1a670e6d0ea7a8edafe" + integrity sha1-HpfVH2fUcLZ2YrGmcObQ6nqO2v4= + dependencies: + assignment "2.2.0" + insane "2.6.1" + trunc-text "1.0.1" + +trunc-text@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trunc-text/-/trunc-text-1.0.1.tgz#58f876d8ac59b224b79834bb478b8656e69622b5" + integrity sha1-WPh22KxZsiS3mDS7R4uGVuaWIrU= + +tryer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-dedent@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-1.1.0.tgz#67983940793183dc7c7f820acb66ba02cdc33c6e" + integrity sha512-CVCvDwMBWZKjDxpN3mU/Dx1v3k+sJgE8nrhXcC9vRopRfoa7vVzilNvHEAUi5jQnmFHpnxDx5jZdI1TpG8ny2g== + +ts-dedent@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.1.1.tgz#6dd56870bb5493895171334fa5d7e929107e5bbc" + integrity sha512-riHuwnzAUCfdIeTBNUq7+Yj+ANnrMXo/7+Z74dIdudS7ys2k8aSGMzpJRMFDF7CLwUTbtvi1ZZff/Wl+XxmqIA== + +ts-essentials@^2.0.3: + version "2.0.12" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" + integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== + +ts-invariant@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" + integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== + dependencies: + tslib "^1.9.3" + +ts-loader@^8.0.14: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33" + integrity sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^4.0.0" + loader-utils "^2.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-map@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-map/-/ts-map-1.0.3.tgz#1c4d218dec813d2103b7e04e4bcf348e1471c1ff" + integrity sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w== + +ts-node@^8: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" + integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^3.0.0" + +ts-node@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.4.1.tgz#270b0dba16e8723c9fa4f9b4775d3810fd994b4f" + integrity sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^3.0.0" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1, tslib@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tslib@^2.3.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tty@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tty/-/tty-1.0.1.tgz#e4409ac98b0dd1c50b59ff38e86eac3f0764ee45" + integrity sha1-5ECayYsN0cULWf846G6sPwdk7kU= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.0.tgz#ee92ee2ec95479869dec66d17d9698666b90f29d" + integrity sha512-M8BLNtxNWRbRmJ8Iu+4j4qZLlE7Y75ldC42cvw9KPOFkFwY/KlSJuj9eeGmoB/k3QAAnuN3M35Z59+lBm1+C+g== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@^0.7.18: + version "0.7.20" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" + integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== + +ua-parser-js@^0.7.21: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + +uc.micro@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +ufo@^0.7.9: + version "0.7.11" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.7.11.tgz#17defad497981290383c5d26357773431fdbadcb" + integrity sha512-IT3q0lPvtkqQ8toHQN/BkOi4VIqoqheqM1FnkNWT9y0G8B3xJhwnoKBu5OHx8zHDOvveQzfKuFowJ0VSARiIDg== + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +uglify-js@^3.5.1: + version "3.5.11" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.11.tgz#833442c0aa29b3a7d34344c7c63adaa3f3504f6a" + integrity sha512-izPJg8RsSyqxbdnqX36ExpbH3K7tDBsAU/VfNv89VkMFy3z39zFjunQGsSHOlGlyIfGLGprGeosgQno3bo2/Kg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +unfetch@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" + integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg== + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^1.1.0: + version "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-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +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" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universal-cookie@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/universal-cookie/-/universal-cookie-4.0.2.tgz#c3398a64c72ff0c31fecb1ac4966c424e8669c6d" + integrity sha512-n14lhA//lQeYRweP9j9uXsshN9Cs4LunVSnvAGmnA69SofwsjpUU03geaCaPC9LlsH2rkBy99o3zxQyVOldGvA== + dependencies: + "@types/cookie" "^0.3.3" + "@types/object-assign" "^4.0.30" + cookie "^0.4.0" + object-assign "^4.1.1" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unplugin-vue2-script-setup@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/unplugin-vue2-script-setup/-/unplugin-vue2-script-setup-0.9.3.tgz#aec08378bace9f8d159db4b3a2073b244da5e326" + integrity sha512-m2QESHiFNmx0fIo/P0AiCrH6E5WtijRB/Ldrj8zjwRIYYbiOgmTfRmWQquW0H8ei5OwhYT30WAgepFjWrJ5oJg== + dependencies: + "@antfu/utils" "^0.4.0" + "@babel/core" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/parser" "^7.16.8" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@rollup/pluginutils" "^4.1.2" + "@vue/compiler-core" "^3.2.26" + "@vue/compiler-dom" "^3.2.26" + "@vue/reactivity-transform" "^3.2.26" + "@vue/shared" "^3.2.26" + defu "^5.0.0" + htmlparser2 "5.0.1" + magic-string "^0.25.7" + tslib "^2.3.1" + unplugin "^0.3.0" + +unplugin@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-0.3.3.tgz#e9b148f84cabef5e6529f232a10e674a7c020930" + integrity sha512-WjZWpUqqcYPQ/efR00Zm2m1+J1LitwoZ4uhHV4VdZ+IpW0Nh/qnDYtVf+nLhozXdGxslMPecOshVR7NiWFl4gA== + dependencies: + webpack-virtual-modules "^0.4.3" + +unquote@^1.1.0, unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upath@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= + dependencies: + upper-case "^1.1.1" + +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-loader@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-callback-ref@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.1.tgz#898759ccb9e14be6c7a860abafa3ffbd826c89bb" + integrity sha512-C3nvxh0ZpaOxs9RCnWwAJ+7bJPwQI8LHF71LzbQ3BvzH5XkdtlkMadqElGevg5bYBDFip4sAnD4m06zAKebg1w== + +use-composed-ref@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz#9220e4e94a97b7b02d7d27eaeab0b37034438bbc" + integrity sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg== + dependencies: + ts-essentials "^2.0.3" + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + +use-latest@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" + integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + +use-sidecar@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.2.tgz#e72f582a75842f7de4ef8becd6235a4720ad8af6" + integrity sha512-287RZny6m5KNMTb/Kq9gmjafi7lQL0YHO1lYolU6+tY1h9+Z3uCtkJJ3OSOq3INwYf2hBryCcDh4520AhJibMA== + dependencies: + detect-node "^2.0.4" + tslib "^1.9.3" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +util@^0.12.0: + version "0.12.2" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.2.tgz#54adb634c9e7c748707af2bf5a8c7ab640cbba2b" + integrity sha512-XE+MkWQvglYa+IOfBt5UFG93EmncEMP23UqpgDvVZVFBPxwmkK10QRp6pgU4xICPnWRf/t0zPv4noYSUq9gqUQ== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + safe-buffer "^5.1.2" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.1.0, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.0.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v-mapbox@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/v-mapbox/-/v-mapbox-1.11.2.tgz#35782aabcd66f459c3223ce4cccf6c862d40e0c9" + integrity sha512-52OyFD3OCdRorJoX6XKfWXQKW5DGv67CxbBHJqYpyUhlSUHRCdsHHZdoepebjenOAi3D/rQP5p5SmLJpD+/aZw== + dependencies: + map-promisified "^0.4.0" + +v-tooltip@~2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/v-tooltip/-/v-tooltip-2.1.3.tgz#281c2015d1e73787f13c8956aa295b8c3a73f261" + integrity sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w== + dependencies: + "@babel/runtime" "^7.13.10" + lodash "^4.17.21" + popper.js "^1.16.1" + vue-resize "^1.0.1" + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +validate-color@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/validate-color/-/validate-color-2.1.1.tgz#1330bd71d340ed3420a08fa63b61acbba95e958c" + integrity sha512-hKG4b7TdXtqom+Uby8LyyxaGK8gEpk60T0stdKXdPSHW+sPOBjJX6B9mFUa9gwQKkNCxvz6e1nxmohZmBWlnBg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.0.0.tgz#0fb6c6bb5218ea23d368a8347e6d0f5a70e3bcab" + integrity sha512-anYx5fURbgF04lQV18nEQWZ/3wHGnxiKdG4aL8J+jEDsm98n/sU/bey+tYk6tnGJzm7ioh5FoqrAiQ6m03IgaA== + +vary@^1, vary@^1.1.2, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vm-browserify@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +void-elements@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + +vscode-jsonrpc@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" + integrity sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg== + +vscode-languageserver-protocol@3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz#b8aab6afae2849c84a8983d39a1cf742417afe2f" + integrity sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g== + dependencies: + vscode-jsonrpc "^4.0.0" + vscode-languageserver-types "3.14.0" + +vscode-languageserver-types@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" + integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== + +vscode-languageserver@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz#0d2feddd33f92aadf5da32450df498d52f6f14eb" + integrity sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A== + dependencies: + vscode-languageserver-protocol "3.14.1" + vscode-uri "^1.0.6" + +vscode-uri@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.6.tgz#6b8f141b0bbc44ad7b07e94f82f168ac7608ad4d" + integrity sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww== + +vscode-uri@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" + integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== + +vt-pbf@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + +vue-advanced-chat@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/vue-advanced-chat/-/vue-advanced-chat-2.0.7.tgz#bd35830c19fc5eb4e26545dc554d88e7808913cc" + integrity sha512-s+6v+KtVT46lFM8YohneLLS/vN10sSTAPfZiqAczXf13Q8vQWD9rSeWAokL0zuJeQ+jguNgFI6oN2wbI/RC1iw== + dependencies: + emoji-picker-element "1.12.1" + linkifyjs "2.1.9" + +vue-apollo@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.2.tgz#b198ecfa3765850a0b9f2b84ffaa7fbd8ec15f52" + integrity sha512-lrKyTT1L5mjDEp7nyqnTRJwD/kTpLDBIqFfZ+TGQVivjlUz6o5VA0pLYGCx5cGa1gEF/ERWc0AEdNSdKgs7Ygg== + dependencies: + chalk "^2.4.2" + serialize-javascript "^2.1.0" + throttle-debounce "^2.1.0" + +vue-cli-plugin-apollo@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/vue-cli-plugin-apollo/-/vue-cli-plugin-apollo-0.21.3.tgz#520d336db0e88b26fe854833a555e2e29fe26571" + integrity sha512-8CzRVrAsFkB9lpl600cRCNR9OUnrSYYAIVF9/qW4pP0TMXbhrd1F1wEAAN6E0CPimjTLB+qSt6zWS4vb2wC8Wg== + dependencies: + apollo "^2.20.0" + apollo-cache-inmemory "^1.6.3" + apollo-client "^2.6.4" + apollo-link "^1.2.13" + apollo-link-context "^1.0.19" + apollo-link-http "^1.5.16" + apollo-link-persisted-queries "^0.2.2" + apollo-link-state "^0.4.2" + apollo-link-ws "^1.0.19" + apollo-server-express "^2.9.6" + apollo-upload-client "^11.0.0" + apollo-utilities "^1.3.2" + chalk "^2.4.2" + deepmerge "^4.1.1" + dotenv "^8.2.0" + esm "^3.2.25" + execa "^3.2.0" + express "^4.17.1" + fs-extra "^8.1.0" + graphql "^14.5.8" + graphql-subscriptions "^1.1.0" + graphql-tag "^2.10.1" + graphql-tools "^4.0.5" + node-fetch "^2.6.0" + nodemon "^1.19.4" + subscriptions-transport-ws "^0.9.16" + ts-node "^8.4.1" + +vue-client-only@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vue-client-only/-/vue-client-only-2.0.0.tgz#ddad8d675ee02c761a14229f0e440e219de1da1c" + integrity sha512-arhk1wtWAfLsJyxGMoEYhoBowM87/i6HLSG2LH/03Yog6i2d9JEN1peMP0Ceis+/n9DxdenGYZZTxbPPJyHciA== + +vue-count-to@~1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/vue-count-to/-/vue-count-to-1.0.13.tgz#3e7573ea6e64c2b2972f64e0a2ab2e23c7590ff3" + integrity sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ== + +vue-docgen-api@^4.38.0: + version "4.40.0" + resolved "https://registry.yarnpkg.com/vue-docgen-api/-/vue-docgen-api-4.40.0.tgz#18a6b25359a2340c051df612ad73f0c7714cb0d1" + integrity sha512-wQKnLILHJpJjaWGfQ4gvlg9yvI5I+qgB0YppPZUmz6PEpqaFZDoBejDfCjmpM9Hzf8OB9N0zyRmgvT4UxP3Ifg== + dependencies: + "@babel/parser" "^7.13.12" + "@babel/types" "^7.13.12" + "@vue/compiler-dom" "^3.0.7" + "@vue/compiler-sfc" "^3.0.7" + ast-types "0.14.2" + hash-sum "^1.0.2" + lru-cache "^4.1.5" + pug "^3.0.2" + recast "0.20.4" + ts-map "^1.0.3" + vue-inbrowser-compiler-utils "^4.40.0" + +vue-docgen-loader@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/vue-docgen-loader/-/vue-docgen-loader-1.5.0.tgz#bf8797ea9dde87a8d734b56176f105477d9bf266" + integrity sha512-LKZ8mxeIQ44uSUMTplnwOXbC4bO4E2vyZDTbn7/1QlVwJPEIjk3ahL0DA1m27IEw6YTlHOwtWS0PrHmDkFgyAg== + dependencies: + clone "^2.1.2" + jscodeshift "^0.7.0" + loader-utils "^1.2.3" + querystring "^0.2.0" + +vue-eslint-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz#a4ed2669f87179dedd06afdd8736acbb3a3864d6" + integrity sha512-yR0dLxsTT7JfD2YQo9BhnQ6bUTLsZouuzt9SKRP7XNaZJV459gvlsJo4vT2nhZ/2dH9j3c53bIx9dnqU2prM9g== + dependencies: + debug "^4.1.1" + eslint-scope "^5.0.0" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + lodash "^4.17.15" + +vue-hot-reload-api@^2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" + integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g== + +vue-inbrowser-compiler-utils@^4.40.0: + version "4.40.0" + resolved "https://registry.yarnpkg.com/vue-inbrowser-compiler-utils/-/vue-inbrowser-compiler-utils-4.40.0.tgz#9ba62e66d63461b47877655f45a4e86975e5b2e5" + integrity sha512-uJVt2fGpfs3g1x4zQWzbv7eFmI7PnoYTagZdWEOQIbqbKXJEJW3S22NIvImfW5DYVwjpGFPUpakK1R0TE3IE3A== + dependencies: + camelcase "^5.3.1" + +vue-infinite-loading@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/vue-infinite-loading/-/vue-infinite-loading-2.4.5.tgz#cc20fd40af7f20188006443c99b60470cf1de1b3" + integrity sha512-xhq95Mxun060bRnsOoLE2Be6BR7jYwuC89kDe18+GmCLVrRA/dU0jrGb12Xu6NjmKs+iTW0AA6saSEmEW4cR7g== + +vue-izitoast@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vue-izitoast/-/vue-izitoast-1.2.1.tgz#cd2cbfbd96ea438dede8fb00f2c328364cb7141d" + integrity sha512-5krrKyAftSR3TnnO3zhMihYCSt0Lay4SBO1AWWKD3jhTErJrR+q9kOKyuAYhn1SttNER87hpnRKqdvLjzjHWQQ== + dependencies: + izitoast "^1.4.0" + +vue-loader@^15.9.1: + version "15.9.1" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.1.tgz#bd2ab8f3d281e51d7b81d15390a58424d142243e" + integrity sha512-IaPU2KOPjs/QjMlxFs/TiTtQUSbftQ7lsAvoxe21rtcQohsMhx+1AltXCNhZIpIn46PtODiAgz+o8RbMpKtmJw== + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-meta@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/vue-meta/-/vue-meta-2.3.3.tgz#2a097f62817204b0da78be4d62aee0cb566eaee0" + integrity sha512-FmeekLkd5+BI7NFBnU4bEnTpVZqmu3q8ztW4R4U3GBQljgDM7QAuwMXs8/aJP0U1tjtxobX8T6HcyZXimGj1DQ== + dependencies: + deepmerge "^4.2.2" + +vue-no-ssr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vue-no-ssr/-/vue-no-ssr-1.1.1.tgz#875f3be6fb0ae41568a837f3ac1a80eaa137b998" + integrity sha512-ZMjqRpWabMPqPc7gIrG0Nw6vRf1+itwf0Itft7LbMXs2g3Zs/NFmevjZGN1x7K3Q95GmIjWbQZTVerxiBxI+0g== + +vue-observe-visibility@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vue-observe-visibility/-/vue-observe-visibility-1.0.0.tgz#17cf1b2caf74022f0f3c95371468ddf2b9573152" + integrity sha512-s5TFh3s3h3Mhd3jaz3zGzkVHKHnc/0C/gNr30olO99+yw2hl3WBhK3ng3/f9OF+qkW4+l7GkmwfAzDAcY3lCFg== + +vue-resize@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-1.0.1.tgz#c120bed4e09938771d622614f57dbcf58a5147ee" + integrity sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w== + dependencies: + "@babel/runtime" "^7.13.10" + +vue-router@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.1.6.tgz#45f5a3a3843e31702c061dd829393554e4328f89" + integrity sha512-GYhn2ynaZlysZMkFE5oCHRUTqE8BWs/a9YbKpNLi0i7xD6KG1EzDqpHQmv1F5gXjr8kL5iIVS8EOtRaVUEXTqA== + +vue-scrollto@^2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/vue-scrollto/-/vue-scrollto-2.20.0.tgz#3ba52239a62710c97003d12d4393f1f3393cd5cc" + integrity sha512-7i+AGKJTThZnMEkhIPgrZjyAX+fXV7/rGdg+CV283uZZwCxwiMXaBLTmIc5RTA4uwGnT+E6eJle3mXQfM2OD3A== + dependencies: + bezier-easing "2.1.0" + +vue-server-renderer@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.6.11.tgz#be8c9abc6aacc309828a755c021a05fc474b4bc3" + integrity sha512-V3faFJHr2KYfdSIalL+JjinZSHYUhlrvJ9pzCIjjwSh77+pkrsXpK4PucdPcng57+N77pd1LrKqwbqjQdktU1A== + dependencies: + chalk "^1.1.3" + hash-sum "^1.0.2" + he "^1.1.0" + lodash.template "^4.5.0" + lodash.uniq "^4.5.0" + resolve "^1.2.0" + serialize-javascript "^2.1.2" + source-map "0.5.6" + +vue-style-loader@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-svg-loader@~0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/vue-svg-loader/-/vue-svg-loader-0.16.0.tgz#adccbdc9aca90132bde9c9d96cd49f74efecd345" + integrity sha512-2RtFXlTCYWm8YAEO2qAOZ2SuIF2NvLutB5muc3KDYoZq5ZeCHf8ggzSan3ksbbca7CJ/Aw57ZnDF4B7W/AkGtw== + dependencies: + loader-utils "^1.2.3" + svg-to-vue "^0.7.0" + +vue-sweetalert-icons@~4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/vue-sweetalert-icons/-/vue-sweetalert-icons-4.3.1.tgz#dad763abb5084b015ba3e209dd28dcf1371b030c" + integrity sha512-FqKcMB8Ebgb32UyzvhIBzj23U0NRP91cTXovDYfYwNHpJ1TAFBEHoemgyu01h2Wp+UJhytvQ+13GL+GAs8QkWw== + dependencies: + color "^3.1.2" + validate-color "^2.1.0" + +vue-template-compiler@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" + integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== + +vue2-datepicker@^3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/vue2-datepicker/-/vue2-datepicker-3.11.1.tgz#b2124e15f694d0fd43a92558f6929ec29338d241" + integrity sha512-6PU/+pnp2mgZAfnSXmbdwj9516XsEvTiw61Q5SNrvvdy8W/FCxk1GAe9UZn/m9YfS5A47yK6XkcjMHbp7aFApA== + dependencies: + date-format-parse "^0.2.7" + +vue2-dropzone@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vue2-dropzone/-/vue2-dropzone-3.6.0.tgz#b4bb4b64de1cbbb3b88f04b24878e06780a51546" + integrity sha512-YXC1nCWIZvfa98e/i6h+EshZCkFSxFEh0Sxr9ODfThAPPDVhAzLLlz/4XIx0NGO1QeSy6htwSstte47R7vVhLQ== + dependencies: + dropzone "^5.5.1" + +vue@^2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" + integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ== + +vue@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" + integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== + +vuex-i18n@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/vuex-i18n/-/vuex-i18n-1.13.1.tgz#f9f6bf5de44f85929ff684170ed9bb5724cbba88" + integrity sha512-VTy5QAyMI6BJwpRfN5qncWQT0ohKiAYK+iTRW4JxgV9dkNoPMuKKDqExbOm1fzpitdrIoIipC3Zqr5fJ706VQg== + +vuex@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.1.3.tgz#f2ad73e3fb73691698b38c93f66e58e267947180" + integrity sha512-k8vZqNMSNMgKelVZAPYw5MNb2xWSmVgCKtYKAptvm9YtZiOXnRXFWu//Y9zQNORTrm3dNj1n/WaZZI26tIX6Mw== + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +w3c-keyname@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.1.tgz#c4fe1a4b9e303c95e833b3d854b7d81070400db9" + integrity sha512-j5k4xGK6k8TCna/08778KUEL98WvTogiG/TN/YStl8GNeXg5tI3Dvq3+JjwJhP4l7ogs6KWo1VYEdc1Qaioy3Q== + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-bundle-analyzer@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz#bdb637c2304424f2fbff9a950c7be42a839ae73b" + integrity sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-middleware@^3.7.3: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-external-import@^1.1.0-beta.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/webpack-external-import/-/webpack-external-import-1.1.3.tgz#9782c1df397f5847c02be6507eadbf16be9991b6" + integrity sha512-vK2h9WZEukZzPT4T2GYTkaH4Ow7ZpJkH4279lHKyrMc1BhS98LHezahX8qansDOvkNwyaSVmLF+ltX1G1Y5t1Q== + dependencies: + assert "^2.0.0" + dimport "^1.0.0" + fs-extra "^8.1.0" + loadjs "^4.2.0" + pkg-up "^3.1.0" + +webpack-filter-warnings-plugin@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" + integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg== + +webpack-hot-middleware@^2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706" + integrity sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA== + dependencies: + ansi-html "0.0.7" + html-entities "^1.2.0" + querystring "^0.2.0" + strip-ansi "^3.0.0" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-node-externals@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3" + integrity sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg== + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.1.tgz#b91b2c5b1c4e890ff50d1d35b7fa3657040da1da" + integrity sha512-XSz38193PTo/1csJabKaV4b53uRVotlMgqJXm3s3eje0Bu6gQTxYDqpD38CmQfDBA+gN+QqaGjasuC8I/7eW3Q== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-virtual-modules@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299" + integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== + dependencies: + debug "^3.0.0" + +webpack-virtual-modules@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" + integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== + +webpack@4, webpack@^4.42.1: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpackbar@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-4.0.0.tgz#ee7a87f16077505b5720551af413c8ecd5b1f780" + integrity sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + consola "^2.10.0" + figures "^3.0.0" + pretty-time "^1.1.0" + std-env "^2.2.1" + text-table "^0.2.0" + wrap-ansi "^6.0.0" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0, widest-line@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +with@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" + integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== + dependencies: + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + assert-never "^1.2.1" + babel-walk "3.0.0-canary-5" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-cdn@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cdn/-/workbox-cdn-4.3.1.tgz#f1ffed5368c20291048498ba0744baf27dbd7294" + integrity sha512-Adkgo+/7S+bBsDTzdeH0xxQCrfBM1EiyZlvu1tMh0cJ/ipC6TtA8KDr12PBREdbL0zO9hG+7OSzvi2NLchPAEg== + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131" + integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg== + dependencies: + ansi-styles "^3.2.0" + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.0.0.tgz#47c7b7329e0b8000f5756b0693a861e357e4043e" + integrity sha512-8YwLklVkHe4QNpGFrK6Mxm+BaMY7da6C9GlDED3xs3XwThyJHSbVwg9qC4s1N8tBFcnM1S0s8I390RC6SgGe+g== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-json-file@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^3.0.0" + sort-keys "^2.0.0" + write-file-atomic "^2.0.0" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^8.11.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xml-name-validator@^3.0.0: + version "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== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + +xss@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.8.tgz#32feb87feb74b3dcd3d404b7a68ababf10700535" + integrity sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xxhashjs@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" + integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== + dependencies: + cuint "^0.2.2" + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" + integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== + dependencies: + "@babel/runtime" "^7.6.3" + +yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= + dependencies: + camelcase "^3.0.0" + +yargs@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@^17.3.1: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@~1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + integrity sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s= + dependencies: + minimist "^0.1.0" + +yarn@^1.15.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.0.tgz#acf82906e36bcccd1ccab1cfb73b87509667c881" + integrity sha512-KMHP/Jq53jZKTY9iTUt3dIVl/be6UPs2INo96+BnZHLKxYNTfwMmlgHTaMWyGZoO74RI4AIFvnWhYrXq2USJkg== + +yn@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114" + integrity sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +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== + dependencies: + tslib "^1.9.3" + zen-observable "^0.8.0" + +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" + +zen-observable@^0.8.0: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== + +zxcvbn@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/zxcvbn/-/zxcvbn-4.4.2.tgz#28ec17cf09743edcab056ddd8b1b06262cc73c30" + integrity sha1-KOwXzwl0PtyrBW3dixsGJizHPDA= diff --git a/docs/yarn.lock b/docs/yarn.lock new file mode 100644 index 000000000..492672d87 --- /dev/null +++ b/docs/yarn.lock @@ -0,0 +1,5506 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== + +"@babel/core@^7.16.0", "@babel/core@^7.22.5": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" + integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + +"@babel/generator@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" + integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-validator-option" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" + lru-cache "^5.1.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950" + integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz#87afd63012688ad792de430ceb3b6dc28e4e7a40" + integrity sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + regexpu-core "^5.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.18.8", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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.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.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-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.16.0": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz#eb9094b5fb756cc2d98d398b2c88aeefa9205de9" + integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.16.0", "@babel/preset-env@^7.22.4": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.7.tgz#a1ef34b64a80653c22ce4d9c25603cfa76fc168a" + integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@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/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + 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/preset-react@^7.16.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/register@^7.12.10": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.5.tgz#e4d8d0f615ea3233a27b5c6ada6750ee59559939" + integrity sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime-corejs3@^7.12.1": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.6.tgz#e8e625eb3db29491e0326b3aeb9929c43b270ae4" + integrity sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.16.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@badeball/cypress-configuration@^4.0.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@badeball/cypress-configuration/-/cypress-configuration-4.2.0.tgz#4c19bada0e40600b572b4d91933e0bd226cb2e3f" + integrity sha512-8Dc6diBW8zUycpCFbr7vqQ8ioNZMvpHV79KGdHVpwpRtkFX6enwG82CKU9DeWys6Ou5dFpXw6NYNYNb46y7UYA== + dependencies: + "@babel/parser" "^7.18.8" + debug "^4.3.2" + esbuild "^0.14.23" + glob "^7.1.6" + minimatch "^3.0.4" + node-hook "^1.0.0" + +"@badeball/cypress-cucumber-preprocessor@^15.1.4": + version "15.1.5" + resolved "https://registry.yarnpkg.com/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-15.1.5.tgz#af12e9d8e386458670402dabaf8a60ba3ccc2038" + integrity sha512-b98Y46n/pWe8qqkLUH5mfO4KaMGWpRt+bpSE0TTc35WoPtuB9uhGXNri1ThowuVVqJfX62IXHHImm0YmrFOLQg== + dependencies: + "@badeball/cypress-configuration" "^4.0.0" + "@cucumber/cucumber-expressions" "^16.0.0" + "@cucumber/gherkin" "^24.0.0" + "@cucumber/html-formatter" "^19.2.0" + "@cucumber/message-streams" "^4.0.1" + "@cucumber/messages" "^19.1.2" + "@cucumber/tag-expressions" "^4.1.0" + base64-js "^1.5.1" + chalk "^4.1.2" + cli-table "^0.3.11" + common-ancestor-path "^1.0.1" + cosmiconfig "^7.0.1" + debug "^4.2.0" + error-stack-parser "^2.0.7" + esbuild "^0.17.8" + glob "^9.3.0" + is-path-inside "^3.0.3" + module-alias "^2.2.2" + node-hook "^1.0.0" + resolve-pkg "^2.0.0" + source-map "^0.7.4" + uuid "^8.3.2" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cucumber/cucumber-expressions@^16.0.0": + version "16.1.2" + resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.2.tgz#8c7200a4490b48a0309f5cc4e058cf6578b5b578" + integrity sha512-CfHEbxJ5FqBwF6mJyLLz4B353gyHkoi6cCL4J0lfDZ+GorpcWw4n2OUAdxJmP7ZlREANWoTFlp4FhmkLKrCfUA== + dependencies: + regexp-match-indices "1.0.2" + +"@cucumber/gherkin@^24.0.0": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-24.1.0.tgz#ca2dcbe11f5f7d7f30fd073280550bd6eca2363c" + integrity sha512-B48XrUod4y3SoXe6mv12q7U1zThUNSK3yHSm/hBJCJZ6RJUJhFk3FVMN/83qOEbsYZe6iG9v+4L1Myf8/q8C6g== + dependencies: + "@cucumber/messages" "^19.1.4" + +"@cucumber/html-formatter@^19.2.0": + version "19.2.0" + resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-19.2.0.tgz#47b9fcb58fbb48d0e6124fd2e867d9c6fe299470" + integrity sha512-qGms4588jmVF/G3fTbgZvxn6OQw9GaTFV007nZZ9/10M9DfrgRqjFjVxVI9TPV63xOLPicEVoqsKZtcECbdMSA== + +"@cucumber/message-streams@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-4.0.1.tgz#a5339d3504594bb2edb5732aaae94dddb24d0970" + integrity sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA== + +"@cucumber/messages@^19.1.2", "@cucumber/messages@^19.1.4": + version "19.1.4" + resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-19.1.4.tgz#5cefc47cac3004c0bc38d42933042ec248bb747c" + integrity sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA== + dependencies: + "@types/uuid" "8.3.4" + class-transformer "0.5.1" + reflect-metadata "0.1.13" + uuid "9.0.0" + +"@cucumber/tag-expressions@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz#9a91b0e0dd2f2ba703e3038c52b49b9ac06c2c6f" + integrity sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA== + +"@cypress/browserify-preprocessor@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@cypress/browserify-preprocessor/-/browserify-preprocessor-3.0.2.tgz#1dbecae394937aed47a3524cad47086c2ded8c50" + integrity sha512-y6mlFR+IR2cqcm3HabSp7AEcX9QfF1EUL4eOaw/7xexdhmdQU8ez6piyRopZQob4BK8oKTsc9PkupsU2rzjqMA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.0" + "@babel/preset-env" "^7.16.0" + "@babel/preset-react" "^7.16.0" + "@babel/runtime" "^7.16.0" + babel-plugin-add-module-exports "^1.0.4" + babelify "^10.0.0" + bluebird "^3.7.2" + browserify "^16.2.3" + coffeeify "^3.0.1" + coffeescript "^1.12.7" + debug "^4.3.2" + fs-extra "^9.0.0" + lodash.clonedeep "^4.5.0" + through2 "^2.0.0" + watchify "^4.0.0" + +"@cypress/request@^2.88.11": + version "2.88.11" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" + integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.10.3" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + +"@faker-js/faker@8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.0.2.tgz#bab698c5d3da9c52744e966e0e3eedb6c8b05c37" + integrity sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A== + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/joi@^15.1.1": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jest/expect-utils@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.1.tgz#ab83b27a15cdd203fe5f68230ea22767d5c3acc5" + integrity sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw== + dependencies: + jest-get-type "^29.4.3" + +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + dependencies: + "@jest/schemas" "^29.6.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/node@*": + version "20.4.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" + integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== + +"@types/node@^14.14.31": + version "14.18.53" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.53.tgz#42855629b8773535ab868238718745bf56c56219" + integrity sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/uuid@8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +JSONStream@^1.0.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.1.0, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assert@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assertion-error-formatter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz#be9c8825dee6a8a6c72183d915912d9b57d5d265" + integrity sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ== + dependencies: + diff "^4.0.1" + pad-right "^0.2.2" + repeat-string "^1.6.1" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +auto-changelog@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/auto-changelog/-/auto-changelog-2.4.0.tgz#a2d57d49b70ada7ca2e7c6a20a71572561d19cd9" + integrity sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw== + dependencies: + commander "^7.2.0" + handlebars "^4.7.7" + node-fetch "^2.6.1" + parse-github-url "^1.0.2" + semver "^7.3.5" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +babel-plugin-add-module-exports@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz#6caa4ddbe1f578c6a5264d4d3e6c8a2720a7ca2b" + integrity sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg== + +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" + +babelify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" + integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bcryptjs@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== + +becke-ch--regex--s0-0-v1--base--pl--lib@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz#429ceebbfa5f7e936e78d73fbdc7da7162b20e20" + integrity sha512-FnWonOyaw7Vivg5nIkrUll9HSS5TjFbyuURAiDssuL6VxrBe3ERzudRxOcWRhZYlP89UArMDikz7SapRPQpmZQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.4.1, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserify@^16.2.3: + version "16.5.2" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.2.tgz#d926835e9280fa5fd57f5bc301f2ef24a972ddfe" + integrity sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserify@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" + integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.1" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^3.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.2.1" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "^1.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum-object "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^3.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.12.0" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" + integrity sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA== + +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001503: + version "1.0.30001514" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz#e2a7e184a23affc9367b7c8d734e7ec4628c1309" + integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-transformer@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +cli-table3@~0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-table@^0.3.11: + version "0.3.11" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" + integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== + dependencies: + colors "1.0.3" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +coffeeify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/coffeeify/-/coffeeify-3.0.1.tgz#5e2753000c50bd24c693115f33864248dd11136c" + integrity sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g== + dependencies: + convert-source-map "^1.3.0" + through2 "^2.0.0" + +coffeescript@^1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" + integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg== + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +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== + dependencies: + delayed-stream "~1.0.0" + +commander@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +convert-source-map@^1.3.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg== + +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== + dependencies: + browserslist "^4.21.9" + +core-js-pure@^3.30.2: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.31.1.tgz#73d154958881873bc19381df80bddb20c8d0cdb5" + integrity sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cucumber-expressions@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-8.3.0.tgz#67f48307dc8f53540c7f3530ad7b744aa918dd5c" + integrity sha512-cP2ya0EiorwXBC7Ll7Cj7NELYbasNv9Ty42L4u7sso9KruWemWG1ZiTq4PMqir3SNDSrbykoqI5wZgMbLEDjLQ== + dependencies: + becke-ch--regex--s0-0-v1--base--pl--lib "^1.4.0" + xregexp "^4.2.4" + +cucumber-tag-expressions@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.3.tgz#5525d60fbecb3fa2707051ace27004e0512e700e" + integrity sha512-+x5j1IfZrBtbvYHuoUX0rl4nUGxaey6Do9sM0CABmZfDCcWXuuRm1fQeCaklIYQgOFHQ6xOHvDSdkMHHpni6tQ== + +cucumber@^6.0.5: + version "6.0.7" + resolved "https://registry.yarnpkg.com/cucumber/-/cucumber-6.0.7.tgz#66a803bee90978b14b5d546ec2b06eb329cc6fc2" + integrity sha512-pN3AgWxHx8rOi+wOlqjASNETOjf3TgeyqhMNLQam7nSTXgQzju1oAmXkleRQRcXvpVvejcDHiZBLFSfBkqbYpA== + dependencies: + assertion-error-formatter "^3.0.0" + bluebird "^3.4.1" + cli-table3 "^0.5.1" + colors "^1.1.2" + commander "^3.0.1" + cucumber-expressions "^8.1.0" + cucumber-tag-expressions "^2.0.2" + duration "^0.2.1" + escape-string-regexp "^2.0.0" + figures "^3.0.0" + gherkin "5.0.0" + glob "^7.1.3" + indent-string "^4.0.0" + is-generator "^1.0.2" + is-stream "^2.0.0" + knuth-shuffle-seeded "^1.0.6" + lodash "^4.17.14" + mz "^2.4.0" + progress "^2.0.0" + resolve "^1.3.3" + serialize-error "^4.1.0" + stack-chain "^2.0.0" + stacktrace-js "^2.0.0" + string-argv "^0.3.0" + title-case "^2.1.1" + util-arity "^1.0.2" + verror "^1.9.0" + +cypress-network-idle@^1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/cypress-network-idle/-/cypress-network-idle-1.14.2.tgz#0837100861feeb5a18f4c2d9815be079f8590f4d" + integrity sha512-xAdR8dH58KFPv8eCDWjviScITrJOcUpuMXYfYTc175nk2/NvnJ+I6ylSn1CM7yZmoV/gLbFa36QLiH5NfNEaLQ== + +cypress@^12.17.0: + version "12.17.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.17.1.tgz#777fdcceec4ecd642fc90795f5994853b6ea03f8" + integrity sha512-eKfBgO6t8waEyhegL4gxD7tcI6uTCGttu+ZU7y9Hq8BlpMztd7iLeIF4AJFAnbZH1xjX+wwgg4cRKFNSvv3VWQ== + dependencies: + "@cypress/request" "^2.88.11" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^6.2.1" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.8" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.5.3" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +date-fns@^2.25.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +dayjs@^1.10.4: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +deps-sort@^2.0.0, deps-sort@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== + dependencies: + JSONStream "^1.0.3" + shasum-object "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detective@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + integrity sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ== + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + dependencies: + readable-stream "^2.0.2" + +duration@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529" + integrity sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg== + dependencies: + d "1" + es5-ext "~0.10.46" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +electron-to-chromium@^1.4.431: + version "1.4.455" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" + integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6, error-stack-parser@^2.0.7: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.46: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild@^0.14.23: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + +esbuild@^0.17.8: + version "0.17.19" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +expect@^29.5.0: + version "29.6.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.1.tgz#64dd1c8f75e2c0b209418f2b8d36a07921adfdf1" + integrity sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g== + dependencies: + "@jest/expect-utils" "^29.6.1" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.1" + jest-message-util "^29.6.1" + jest-util "^29.6.1" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.0.0, figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" + integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== + dependencies: + traverse-chain "~0.1.0" + +follow-redirects@^1.14.9: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + 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" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +gherkin@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gherkin/-/gherkin-5.0.0.tgz#96def41198ec3908258b511af74f655a2764d2a1" + integrity sha512-Y+93z2Nh+TNIKuKEf+6M0FQrX/z0Yv9C2LFfc5NlcGJWRrrTeI/jOg2374y1FOw6ZYQ3RgJBezRkli7CLDubDA== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^9.3.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphql-request@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-2.0.0.tgz#8dd12cf1eb2ce0c80f4114fd851741e091134862" + integrity sha512-Ww3Ax+G3l2d+mPT8w7HC9LfrKjutnCKtnDq7ZZp2ghVk5IQDjwAk3/arRF1ix17Ky15rm0hrSKVKxRhIVlSuoQ== + +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg== + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/import/-/import-0.0.6.tgz#d0eb79df86aa2677c6db61578a5212b3031e6042" + integrity sha512-QPhTdjy9J4wUzmWSG7APkSgMFuPGPw+iJTYUblcfc2AfpqaatbwgCldK1HoLYx+v/+lWvab63GWZtNkcnj9JcQ== + dependencies: + optimist "0.3.x" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA== + dependencies: + source-map "~0.5.3" + +insert-module-globals@^7.0.0, insert-module-globals@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" + integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-generator@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" + integrity sha512-G56jBpbJeg7ds83HW1LuShNs8J73Fv3CPz/bmROHOHlnKkN8sWb9ujiagjmxxMUywftgq48HlBZELKKqFLk0oA== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.2, is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +jest-diff@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.1.tgz#13df6db0a89ee6ad93c747c75c85c70ba941e545" + integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-matcher-utils@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz#6c60075d84655d6300c5d5128f46531848160b53" + integrity sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.1" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-message-util@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.1.tgz#d0b21d87f117e1b9e165e24f245befd2ff34ff8d" + integrity sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-util@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.1.tgz#c9e29a87a6edbf1e39e6dee2b4689b8a146679cb" + integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +joi@^17.7.0: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw== + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1, jsonfile@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +knuth-shuffle-seeded@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz#01f1b65733aa7540ee08d8b0174164d22081e4e1" + integrity sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg== + dependencies: + seed-random "~2.2.0" + +labeled-stream-splicer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== + dependencies: + inherits "^2.0.1" + stream-splicer "^2.0.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A== + +lodash.once@^4.0.0, lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.14, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== + +luxon@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48" + integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg== + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.1.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.1.tgz#dff63464407cd8b83d7f008c0f116fa8c9b77ebf" + integrity sha512-NQ8MCKimInjVlaIqx51RKJJB7mINVkLTJbsZKmto4UAAOC/CWXES8PGaOgoBZyqoUsUA/U3DToGK7GJkkHbjJw== + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mock-socket@^9.0.3: + version "9.2.1" + resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.2.1.tgz#cc9c0810aa4d0afe02d721dcb2b7e657c00e2282" + integrity sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag== + +module-alias@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.3.tgz#ec2e85c68973bda6ab71ce7c93b763ec96053221" + integrity sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q== + +module-deps@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" + integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^2.0.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.2.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multiple-cucumber-html-reporter@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/multiple-cucumber-html-reporter/-/multiple-cucumber-html-reporter-3.4.0.tgz#03db1772834952c70555ee16074d26c308d18ca4" + integrity sha512-Y2FQA/OosmlsB/ZQUPJvnkKKYFKa/J+Qv2QUl5PsO3BC77jXwyPE8fAWopLH+CEYlRTs7fcdfydmWFitGMFi0A== + dependencies: + find "^0.3.0" + fs-extra "^11.1.1" + jsonfile "^6.1.0" + lodash "^4.17.21" + luxon "^3.3.0" + open "^8.4.2" + uuid "^9.0.0" + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +neo4j-driver-bolt-connection@4.4.11: + version "4.4.11" + resolved "https://registry.yarnpkg.com/neo4j-driver-bolt-connection/-/neo4j-driver-bolt-connection-4.4.11.tgz#aeaee9faa620e6309698b4cedf5b354d8898ea05" + integrity sha512-2sCgx3Lpg7fnYAU/kb9wOKY8ResUeur88MhLNUWyINxa+CMP7aB+t70zBcOlJ7hcCf6ghEiz6ZXhd9WikGW9bA== + dependencies: + buffer "^6.0.3" + neo4j-driver-core "4.4.11" + string_decoder "^1.3.0" + +neo4j-driver-core@4.4.11: + version "4.4.11" + resolved "https://registry.yarnpkg.com/neo4j-driver-core/-/neo4j-driver-core-4.4.11.tgz#62ea7152cc3e0f861c01789ef0cc2b2585de9431" + integrity sha512-7+7Ue9RNsg5TAwkPvl4/st2ZdktN3qH8A/MYmJkZ6Ait8MuXP8ppTvZ3ugPxbrSOJEwvZYpKqV+FNZ17mOSfcQ== + +neo4j-driver@^4.2.2, neo4j-driver@^4.3.4: + version "4.4.11" + resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-4.4.11.tgz#e414283de384bbe016b91dc4c9b247d50ff2de94" + integrity sha512-1dhThyuNZt4FIwAlmzsbYNnSn28avjO2TVairuFO3P/aql5iPnwTNGmQJc/MB8BlrzDhOo1+jfAO4pc49XHh1Q== + dependencies: + "@babel/runtime" "^7.5.5" + neo4j-driver-bolt-connection "4.4.11" + neo4j-driver-core "4.4.11" + rxjs "^6.6.3" + +neode@^0.4.8: + version "0.4.9" + resolved "https://registry.yarnpkg.com/neode/-/neode-0.4.9.tgz#11c46c50d0348751dc6db828f3ca59252e7c247f" + integrity sha512-3RufLD2cmTXrPpvsgkEAqS3maRjXJ89vjbyYmyqJMJl5uv6gcUa32N6hRwHcqfjWRWUaFKaoGLEJLaOQobs4eA== + dependencies: + "@hapi/joi" "^15.1.1" + dotenv "^4.0.0" + neo4j-driver "^4.2.2" + uuid "^3.4.0" + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-fetch@^2.6.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-hook@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-hook/-/node-hook-1.0.0.tgz#82ca39af991d726d5c7952e59c992378bb296f7e" + integrity sha512-tBTIHwkzXvbesP0fY495VsqSWCOS5Ttt5+mAmeqUC1yglCiSYarNewfi2Q+HOL+M6pZYYqwGU6jIi5+gIHQbpg== + +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optimist@0.3.x: + version "0.3.7" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" + integrity sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ== + dependencies: + wordwrap "~0.0.2" + +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +outpipe@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA== + dependencies: + shell-quote "^1.4.2" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pad-right@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" + integrity sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g== + dependencies: + repeat-string "^1.5.2" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg== + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-github-url@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" + integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg== + +path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-format@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.1.tgz#ec838c288850b7c4f9090b867c2d4f4edbfb0f3e" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@^6.11.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +qs@~6.10.3: + version "6.10.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" + integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + dependencies: + side-channel "^1.0.4" + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w== + dependencies: + readable-stream "^2.0.2" + +readable-stream@3, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp-match-indices@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz#cf20054a6f7d5b3e116a701a7b00f82889d10da6" + integrity sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ== + dependencies: + regexp-tree "^0.1.11" + +regexp-tree@^0.1.11: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41" + integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== + dependencies: + resolve-from "^5.0.0" + +resolve@^1.1.4, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.3.3, resolve@^1.4.0: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rosie@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/rosie/-/rosie-2.1.0.tgz#0213a9d2b0401a2549cbce5f1cd914caffa22358" + integrity sha512-Dbzdc+prLXZuB/suRptDnBUY29SdGvND3bLg6cll8n7PNqzuyCxSlRfrkn8PqjS9n4QVsiM7RCvxCkKAkTQRjA== + +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.5.1, rxjs@^7.8.0: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +seed-random@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" + integrity sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ== + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^7.3.5, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serialize-error@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-4.1.0.tgz#63e1e33ede20bcd89d9f0528ea4c15fbf0f2b78a" + integrity sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw== + dependencies: + type-fest "^0.3.0" + +set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw== + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.4.2, shell-quote@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slug@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/slug/-/slug-6.1.0.tgz#a3523f49533ea4a6bee6fa684064f4a0f70a3861" + integrity sha512-x6vLHCMasg4DR2LPiyFGI0gJJhywY6DTiGhCrOMzb3SOk/0JVLIaL4UhyFSHu04SD3uAavrKY/K3zZ3i6iRcgA== + +source-map-support@^0.5.16: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +split-string@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sshpk@^1.14.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-chain@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-2.0.0.tgz#d73d1172af89565f07438b5bcc086831b6689b2d" + integrity sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg== + +stack-generator@^2.0.5: + version "2.0.10" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" + integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== + dependencies: + stackframe "^1.3.4" + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-gps@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== + dependencies: + source-map "0.5.6" + stackframe "^1.3.4" + +stacktrace-js@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== + dependencies: + error-stack-parser "^2.0.6" + stack-generator "^2.0.5" + stacktrace-gps "^3.0.4" + +stream-browserify@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw== + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-http@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +string-argv@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg== + dependencies: + minimist "^1.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q== + dependencies: + process "~0.11.0" + +title-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +traverse-chain@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" + integrity sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg== + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +umd@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +undeclared-identifiers@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== + dependencies: + acorn-node "^1.3.0" + dash-ast "^1.0.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +upper-case@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== + +url@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + +util-arity@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/util-arity/-/util-arity-1.1.0.tgz#59d01af1fdb3fede0ac4e632b0ab5f6ce97c9330" + integrity sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== + dependencies: + inherits "2.0.1" + +util@~0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@~0.12.0: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +uuid@9.0.0, uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +verror@^1.9.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +wait-on@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" + integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== + dependencies: + axios "^0.27.2" + joi "^17.7.0" + lodash "^4.17.21" + minimist "^1.2.7" + rxjs "^7.8.0" + +watchify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-4.0.0.tgz#53b002d51e7b0eb640b851bb4de517a689973392" + integrity sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA== + dependencies: + anymatch "^3.1.0" + browserify "^17.0.0" + chokidar "^3.4.0" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^4.0.2" + xtend "^4.0.2" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.2: + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xregexp@^4.2.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.4.1.tgz#c84a88fa79e9ab18ca543959712094492185fe65" + integrity sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag== + dependencies: + "@babel/runtime-corejs3" "^7.12.1" + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0"