diff --git a/.codecov.yml b/.codecov.yml
deleted file mode 100644
index 82b50aba3..000000000
--- a/.codecov.yml
+++ /dev/null
@@ -1,157 +0,0 @@
-codecov:
- #token: uuid # Your private repository token
- #url: "http" # for Codecov Enterprise customers
- #slug: "owner/repo" # for Codecov Enterprise customers
- #branch: master # override the default branch
- #bot: username # set user whom will be the consumer of oauth requests
- #ci: # Custom CI domains if Codecov does not identify them automatically
- # - ci.domain.com
- # - !provider # ignore these providers when checking if CI passed
- # # ex. You may test on Travis, Circle, and AppVeyor, but only need
- # # to check if Travis passes. Therefore add: !circle and !appveyor
- notify:
- #after_n_builds: null # number of expected builds to recieve before sending notifications
- # # after: check ci status unless disabled via require_ci_to_pass
- require_ci_to_pass: yes # yes: will delay sending notifications until all ci is finished
- # no: will send notifications without checking ci status and wait till "after_n_builds" are uploaded
- #countdown: null # number of seconds to wait before first ci build check
- #delay: null # number of seconds to wait between ci build checks
-
-coverage:
- precision: 2 # 2 = xx.xx%, 0 = xx%
- round: nearest # down|up|nearest - default down
- # range: 50...60 # default 70...90. red...green
-
- #notify:
- # irc:
- # default:
- # server: "chat.freenode.net"|encrypted
- # branches: null # all branches by default
- # threshold: 1%
- # message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
- # flags: null
- # paths: null
- #
- # slack:
- # default:
- # url: "http"|encrypted
- # threshold: 1%
- # branches: null # all branches by default
- # message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
- # attachments: "sunburst, diff"
- # only_pulls: false
- # flags: null
- # paths: null
- #
- # email:
- # default:
- # to:
- # - example@domain.com
- # - &author
- # threshold: 1%
- # only_pulls: false
- # layout: header, diff, trends
- # flags: null
- # paths: null
- #
- # hipchat:
- # default:
- # url: "http"|encrypted
- # room: name|id
- # threshold: 1%
- # token: encrypted
- # branches: null # all branches by default
- # notify: false # if the hipchat message is silent or loud (default false)
- # message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
- # flags: null
- # paths: null
- #
- # gitter:
- # url: "http"|encrypted
- # threshold: 1%
- # branches: null # all branches by default
- # message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
- #
- # webhooks:
- # _name_:
- # url: "http"|encrypted
- # threshold: 1%
- # branches: null # all branches by default
-
- status:
- project:
- default: false # disable the default status that measures entire project
- backend: # declare a new status context "backend"
- against: parent
- target: auto
- threshold: null
- #threshold: 1%
- base: auto
- if_no_uploads: error
- if_not_found: success
- if_ci_failed: error
- only_pulls: false
- #branches:
- # - master
- #flags:
- # - integration
- paths:
- - backend/ # only include coverage in "backend/" folder
- webapp: # declare a new status context "frontend"
- against: parent
- target: auto
- threshold: null
- #threshold: 1%
- base: auto
- if_no_uploads: error
- if_not_found: success
- if_ci_failed: error
- only_pulls: false
- #branches:
- # - master
- #flags:
- # - integration
- paths:
- - webapp/ # only include coverage in "webapp/" folder
-
- patch:
- default: false
- # against: parent
- # target: 80%
- # branches: null
- # if_no_uploads: success
- # if_not_found: success
- # if_ci_failed: error
- # only_pulls: false
- # flags:
- # - integration
- # paths:
- # - folder
-
- #changes:
- # default:
- # against: parent
- # branches: null
- # if_no_uploads: error
- # if_not_found: success
- # if_ci_failed: error
- # only_pulls: false
- # flags:
- # - integration
- # paths:
- # - folder
-
- #flags:
- # integration:
- # branches:
- # - master
- # ignore:
- # - app/ui
-
- #ignore: # files and folders for processing
- # - tests/*
-
- #fixes:
- # - "old_path::new_path"
-
-comment: off
diff --git a/.github/file-filters.yml b/.github/file-filters.yml
new file mode 100644
index 000000000..eb0791ffa
--- /dev/null
+++ b/.github/file-filters.yml
@@ -0,0 +1,13 @@
+backend: &backend
+ - '.github/workflows/test-backend.yml'
+ - 'backend/**/*'
+ - 'neo4j/**/*'
+ - 'package.json'
+
+docker: &docker
+ - 'docker-compose.*'
+
+webapp: &webapp
+ - '.github/workflows/test-webapp.yml'
+ - 'webapp/**/*'
+ - 'package.json'
diff --git a/.github/workflows/cleanup-cache-at-pr-closing.yml b/.github/workflows/cleanup-cache-at-pr-closing.yml
new file mode 100644
index 000000000..6512d1d64
--- /dev/null
+++ b/.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@v4
+
+ - 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/.github/workflows/publish.yml b/.github/workflows/publish.yml
index ca5e52945..e9546685a 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup env
run: |
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
@@ -47,7 +47,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup env
run: |
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
@@ -96,7 +96,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup env
run: |
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
@@ -145,7 +145,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup env
run: |
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
@@ -243,7 +243,7 @@ jobs:
needs: [upload_to_dockerhub]
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch full History for changelog
- name: Setup env
@@ -283,7 +283,7 @@ jobs:
needs: [github_tag]
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch full History for changelog
- name: Setup env
@@ -306,4 +306,12 @@ jobs:
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/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml
new file mode 100644
index 000000000..5371c56c1
--- /dev/null
+++ b/.github/workflows/test-backend.yml
@@ -0,0 +1,141 @@
+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@v4
+
+ - 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@v4
+
+ - 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.2
+ 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@v4
+
+ - 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.2
+ 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@v4
+
+ - 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@v4
+
+ - name: Restore Neo4J cache
+ uses: actions/cache/restore@v3.3.2
+ 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.2
+ 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
+ permissions: write-all
+ 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/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
new file mode 100644
index 000000000..7a449261b
--- /dev/null
+++ b/.github/workflows/test-e2e.yml
@@ -0,0 +1,113 @@
+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@v4
+
+ - 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.2
+ 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.2
+ 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
+ permissions: write-all
+ 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/.github/workflows/test-webapp.yml b/.github/workflows/test-webapp.yml
new file mode 100644
index 000000000..3f8063bd7
--- /dev/null
+++ b/.github/workflows/test-webapp.yml
@@ -0,0 +1,116 @@
+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@v4
+
+ - 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@v4
+
+ - 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@v4
+
+ - 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.2
+ 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@v4
+
+ - 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@v4
+
+ - name: Restore webapp cache
+ uses: actions/cache/restore@v3.3.2
+ 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
+ permissions: write-all
+ 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/.github/workflows/test.yml b/.github/workflows/test.yml
deleted file mode 100644
index 1740c09fe..000000000
--- a/.github/workflows/test.yml
+++ /dev/null
@@ -1,344 +0,0 @@
-name: ocelot.social test CI
-
-
-on: [push]
-
-jobs:
- ##############################################################################
- # JOB: PREPARE #####################################################
- ##############################################################################
- prepare:
- name: Prepare
- runs-on: ubuntu-latest
- # needs: [nothing]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # TODO: DO STUFF ??? #####################################################
- ##########################################################################
- - name: Check translation files
- run: |
- scripts/translations/sort.sh
- scripts/translations/missing-keys.sh
-
- ##############################################################################
- # JOB: DOCKER BUILD TEST NEO4J ###############################################
- ##############################################################################
- build_test_neo4j:
- name: Docker Build Test - Neo4J
- runs-on: ubuntu-latest
- needs: [prepare]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # NEO4J ##################################################################
- ##########################################################################
- - 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: Upload Artifact
- uses: actions/upload-artifact@v3
- with:
- name: docker-neo4j-image
- path: /tmp/neo4j.tar
-
- ##############################################################################
- # JOB: DOCKER BUILD TEST BACKEND #############################################
- ##############################################################################
- build_test_backend:
- name: Docker Build Test - Backend
- runs-on: ubuntu-latest
- needs: [prepare]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # BUILD BACKEND DOCKER IMAGE (build) #####################################
- ##########################################################################
- - name: backend | Build `test` image
- run: |
- docker build --target test -t "ocelotsocialnetwork/backend:test" backend/
- docker save "ocelotsocialnetwork/backend:test" > /tmp/backend.tar
- - name: Upload Artifact
- uses: actions/upload-artifact@v3
- with:
- name: docker-backend-test
- path: /tmp/backend.tar
-
- ##############################################################################
- # JOB: DOCKER BUILD TEST WEBAPP ##############################################
- ##############################################################################
- build_test_webapp:
- name: Docker Build Test - WebApp
- runs-on: ubuntu-latest
- needs: [prepare]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # BUILD WEBAPP DOCKER IMAGE (build) ######################################
- ##########################################################################
- - name: webapp | Build `test` image
- run: |
- docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/
- docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar
- - name: Upload Artifact
- uses: actions/upload-artifact@v3
- with:
- name: docker-webapp-test
- path: /tmp/webapp.tar
-
- ##############################################################################
- # JOB: LINT BACKEND ##########################################################
- ##############################################################################
- lint_backend:
- name: Lint backend
- runs-on: ubuntu-latest
- needs: [build_test_backend]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # DOWNLOAD DOCKER IMAGE ##################################################
- ##########################################################################
- - name: Download Docker Image (Backend)
- uses: actions/download-artifact@v3
- with:
- name: docker-backend-test
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/backend.tar
- ##########################################################################
- # LINT BACKEND ###########################################################
- ##########################################################################
- - name: backend | Lint
- run: docker run --rm ocelotsocialnetwork/backend:test yarn run lint
-
- ##############################################################################
- # JOB: LINT WEBAPP ###########################################################
- ##############################################################################
- lint_webapp:
- name: Lint webapp
- runs-on: ubuntu-latest
- needs: [build_test_webapp]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # DOWNLOAD DOCKER IMAGE ##################################################
- ##########################################################################
- - name: Download Docker Image (Webapp)
- uses: actions/download-artifact@v3
- with:
- name: docker-webapp-test
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/webapp.tar
- ##########################################################################
- # LINT WEBAPP ############################################################
- ##########################################################################
- - name: webapp | Lint
- run: docker run --rm ocelotsocialnetwork/webapp:test yarn run lint
-
- ##############################################################################
- # JOB: UNIT TEST BACKEND #####################################################
- ##############################################################################
- unit_test_backend:
- name: Unit tests - backend
- runs-on: ubuntu-latest
- needs: [build_test_neo4j,build_test_backend]
- permissions:
- checks: write
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # DOWNLOAD DOCKER IMAGES #################################################
- ##########################################################################
- - name: Download Docker Image (Neo4J)
- uses: actions/download-artifact@v3
- with:
- name: docker-neo4j-image
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/neo4j.tar
- - name: Download Docker Image (Backend)
- uses: actions/download-artifact@v3
- with:
- name: docker-backend-test
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/backend.tar
- ##########################################################################
- # UNIT TESTS BACKEND #####################################################
- ##########################################################################
- - name: backend | copy env files webapp
- run: cp webapp/.env.template webapp/.env
- - name: backend | copy env files backend
- run: 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
- run: docker-compose exec -T backend yarn test
- ##########################################################################
- # COVERAGE CHECK BACKEND #################################################
- ##########################################################################
- - name: backend | Coverage check
- uses: webcraftmedia/coverage-check-action@master
- with:
- report_name: Coverage Backend
- type: lcov
- result_path: ./coverage/lcov.info
- min_coverage: 57
- token: ${{ github.token }}
-
- ##############################################################################
- # JOB: UNIT TEST WEBAPP ######################################################
- ##############################################################################
- unit_test_webapp:
- name: Unit tests - webapp
- runs-on: ubuntu-latest
- needs: [build_test_webapp]
- permissions:
- checks: write
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # DOWNLOAD DOCKER IMAGES #################################################
- ##########################################################################
- - name: Download Docker Image (Webapp)
- uses: actions/download-artifact@v3
- with:
- name: docker-webapp-test
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/webapp.tar
- ##########################################################################
- # UNIT TESTS WEBAPP ######################################################
- ##########################################################################
- - name: backend | copy env files webapp
- run: cp webapp/.env.template webapp/.env
- - name: backend | copy env files backend
- run: 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
- run: docker-compose exec -T webapp yarn test
- ##########################################################################
- # COVERAGE REPORT FRONTEND ################################################
- ##########################################################################
- #- name: frontend | Coverage report
- # uses: romeovs/lcov-reporter-action@v0.2.21
- # with:
- # github-token: ${{ secrets.GITHUB_TOKEN }}
- # lcov-file: ./coverage/lcov.info
- ##########################################################################
- # COVERAGE CHECK WEBAPP ##################################################
- ##########################################################################
- - name: webapp | Coverage check
- uses: webcraftmedia/coverage-check-action@master
- with:
- report_name: Coverage Webapp
- type: lcov
- result_path: ./coverage/lcov.info
- min_coverage: 83
- token: ${{ github.token }}
-
- ##############################################################################
- # JOB: FULLSTACK TESTS #######################################################
- ##############################################################################
- fullstack_tests:
- name: Fullstack tests
- runs-on: ubuntu-latest
- needs: [build_test_webapp, build_test_backend, build_test_neo4j]
- env:
- jobs: 8
- strategy:
- matrix:
- # run copies of the current job in parallel
- job: [1, 2, 3, 4, 5, 6, 7, 8]
- steps:
- ##########################################################################
- # CHECKOUT CODE ##########################################################
- ##########################################################################
- - name: Checkout code
- uses: actions/checkout@v3
- ##########################################################################
- # DOWNLOAD DOCKER IMAGES #################################################
- ##########################################################################
- - name: Download Docker Image (Neo4J)
- uses: actions/download-artifact@v3
- with:
- name: docker-neo4j-image
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/neo4j.tar
- - name: Download Docker Image (Backend)
- uses: actions/download-artifact@v3
- with:
- name: docker-backend-test
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/backend.tar
- - name: Download Docker Image (Webapp)
- uses: actions/download-artifact@v3
- with:
- name: docker-webapp-test
- path: /tmp
- - name: Load Docker Image
- run: docker load < /tmp/webapp.tar
- ##########################################################################
- # FULLSTACK TESTS CYPRESS ################################################
- ##########################################################################
- - name: webapp | copy env files webapp
- run: cp webapp/.env.template webapp/.env
- - name: backend | copy env files backend
- run: 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 neo4j backend
- - name: cypress | Fullstack tests
- id: e2e-tests
- run: |
- yarn install
- yarn run cypress:run --spec $(cypress/parallel-features.sh ${{ matrix.job }} ${{ env.jobs }} )
- ##########################################################################
- # UPLOAD SCREENSHOTS - IF TESTS FAIL #####################################
- ##########################################################################
- - name: Full stack tests | if any test failed, upload screenshots
- if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
- uses: actions/upload-artifact@v3
- with:
- name: cypress-screenshots
- path: cypress/screenshots/
diff --git a/.nvmrc b/.nvmrc
index cb77acbfe..58b8c2a00 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v19.4.0
\ No newline at end of file
+v20.2.0
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3cd77a905..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,84 +0,0 @@
-dist: xenial
-language: node_js
-node_js: lts/*
-cache:
- yarn: false
- npm: false
-
-addons:
- apt:
- packages:
- - libgconf-2-4
- snaps:
- - docker
- firefox: "latest-esr"
-
-install:
- - yarn global add wait-on
- # Install Codecov
- - yarn install --frozen-lockfile
- - cp backend/.env.template backend/.env
-
-before_script:
- - docker-compose -f docker-compose.yml build --parallel
- - docker-compose -f docker-compose.yml -f docker-compose.build-and-test.yml build # just tagging, just be quite fast
- - docker-compose -f docker-compose.yml -f docker-compose.build-and-test.yml up -d
- - wait-on http://localhost:7474
- - docker-compose -f docker-compose.yml -f docker-compose.build-and-test.yml exec backend yarn run db:migrate init
-
-script:
- - export CYPRESS_RETRIES=1
- - export BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi)
- - echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, PR=$PR, BRANCH=$BRANCH"
- # Miscellaneous
- - ./scripts/translations/sort.sh
- - ./scripts/translations/missing-keys.sh
- # Backend
- - docker-compose exec backend yarn run lint
- - docker-compose exec backend yarn run test --ci --verbose=false --coverage
- - docker-compose exec backend yarn run db:seed
- - docker-compose exec backend yarn run db:reset
- # Frontend
- - docker-compose exec webapp yarn run lint
- - docker-compose exec webapp yarn run test --ci --verbose=false --coverage
- # Fullstack
- - docker-compose down
- - docker-compose -f docker-compose.yml up -d
- - wait-on http://localhost:7474
- # disable for last deploy, because of flakiness!
- # - yarn run cypress:run --record
- # - yarn run cucumber
- # Coverage
- # disable this uneffective thing for last deploy, because of easyness!
- # - yarn run codecov
-
-after_success:
- - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh
- - chmod +x send.sh
- - ./send.sh success $WEBHOOK_URL
- - if [ $TRAVIS_BRANCH == "master" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then
- wget https://raw.githubusercontent.com/Human-Connection/Discord-Bot/develop/tester.sh &&
- chmod +x tester.sh &&
- ./tester.sh staging $WEBHOOK_URL;
- fi
-
-after_failure:
- - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh
- - chmod +x send.sh
- - ./send.sh failure $WEBHOOK_URL
-
-before_deploy:
- - go get -u github.com/tcnksm/ghr
- # stop deployment to kubernetes until we have set it up
- # - ./scripts/setup_kubernetes.sh
-
-deploy:
- - provider: script
- script: bash scripts/docker_push.sh
- on:
- branch: master
- # stop deployment to kubernetes until we have set it up
- # - provider: script
- # script: bash scripts/deploy.sh
- # on:
- # branch: master
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ccbb7156a..c2a9fee3f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,8 +4,310 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
+#### [3.1.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.1.0...3.1.2)
+
+- fix(other): kubernetes error by degrading node version from v20.7.0 to v20.2.0 [`#6779`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6779)
+- fix(backend): cypher statement in user locales unit test [`#6780`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6780)
+- chore(release): release v3.1.1 – move dkim to secrets and fix search etc. [`#6763`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6763)
+- chore(other): move kubrnetes dkim from confmap to secret yaml [`#6761`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6761)
+- build(other): bump @babel/preset-env from 7.22.9 to 7.22.20 in /backend [`#6741`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6741)
+- build(other): bump @babel/register from 7.22.5 to 7.22.15 [`#6745`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6745)
+- chore(other): add tail command as template comment to `docker-compose.yml` [`#6755`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6755)
+- chore(other): upgrade node version in '.nvmrc' files to v20.6.0 [`#6758`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6758)
+- build(other): bump @babel/plugin-proposal-throw-expressions from 7.8.3 to 7.22.5 in /backend [`#6742`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6742)
+- build(other): bump @faker-js/faker from 8.0.2 to 8.1.0 [`#6743`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6743)
+- fix(webapp): chat-only show counter if unread messages exist [`#6752`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6752)
+- build(other): bump node from 20.6.0-alpine3.17 to 20.7.0-alpine3.17 in /webapp [`#6749`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6749)
+- build(other): bump node from 20.6.0-alpine3.17 to 20.7.0-alpine3.17 in /backend [`#6748`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6748)
+- fix(backend): post type as array in search posts query [`#6756`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6756)
+- refactor(backend): remove redundant package metascraper-audio from backend [`#6724`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6724)
+- test(other): update cypress related packages [`#6382`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6382)
+- build(other): bump @storybook/vue from 6.3.6 to 7.4.0 in /webapp [`#6708`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6708)
+- build(other): bump chai from 4.2.0 to 4.3.8 in /backend [`#6738`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6738)
+- build(other): bump eslint-config-prettier from 8.8.0 to 9.0.0 in /backend [`#6737`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6737)
+- build(other): bump slug from 6.1.0 to 8.2.3 [`#6716`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6716)
+- build(other): bump jsonwebtoken from 8.5.1 to 9.0.2 [`#6707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6707)
+- build(other): bump expect from 29.6.1 to 29.6.4 [`#6699`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6699)
+- build(other): bump node from 20.2.0-alpine3.17 to 20.6.0-alpine3.17 in /webapp [`#6709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6709)
+- build(other): bump node from 20.2.0-alpine3.17 to 20.6.0-alpine3.17 in /backend [`#6710`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6710)
+- build(other): bump actions/cache from 3.3.1 to 3.3.2 [`#6714`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6714)
+- build(other): bump actions/checkout from 3 to 4 [`#6713`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6713)
+- Bump @storybook/vue from 6.3.6 to 7.4.0 in /webapp [`8113d47`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8113d47dfcbfa0a63ae1f035d9d24a4c548d2089)
+- Revert "update cypress packages" [`2229baf`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2229baff6fb74d92ed395fb90a1421f994368a20)
+- update cypress packages [`dbedcf9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/dbedcf901d3040d1a6a8db62170bdea86d020bb1)
+
+#### [3.1.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.0.4...3.1.0)
+
+> 13 September 2023
+
+- chore(release): release v3.1.0 – use of dkim in deployment [`#6733`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6733)
+- chore(other): use dkim values in helm script of backend [`#6731`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6731)
+- fix(other): add global package.json to workflow file filters [`#6706`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6706)
+- Release v3.1.0 [`6276d87`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/6276d87c6a427438c5fbf56c0f7bc414293e671d)
+- Fix super fluid spaces [`ecdaf83`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ecdaf83ac57bd4186f064d891d2570ce2438d47f)
+- Use DKIM values in Helm script of backend [`2ea98b1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2ea98b1900c1b33712a2456dde6ba3dfb6d95b00)
+
+#### [3.0.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.0.3...3.0.4)
+
+> 12 September 2023
+
+- chore(other): release v3.0.4 – fix group link on map, embed backend shot down and bug on post language detect [`#6725`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6725)
+- fix(other): fix backup script for neo4j v4 [`#6662`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6662)
+- fix(other): fix workflow cache cleanup fail [`#6722`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6722)
+- fix(backend): fix post language detection [`#6720`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6720)
+- fix(webapp): add jsconfig.json to navigate in webapp. [`#6645`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6645)
+- fix(backend): metascraper crash [`#6704`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6704)
+- build(other): bump aws-sdk from 2.652.0 to 2.1425.0 in /backend [`#6651`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6651)
+- build(other): bump @babel/preset-env from 7.9.5 to 7.22.9 in /backend [`#6578`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6578)
+- build(other): bump @babel/preset-env from 7.22.7 to 7.22.9 [`#6572`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6572)
+- build(other): bump dotenv from 8.6.0 to 16.3.1 [`#6483`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6483)
+- Bump @babel/preset-env from 7.9.5 to 7.22.9 in /backend [`ae0c6f1`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ae0c6f12bd86c39b33a2b48c2eeb0eccb880821c)
+- Revert "Revert "Revert "update metascraper packages""" [`7fdc5e8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7fdc5e8f5ed8e191763acfcd74c510138145f612)
+- Revert "Revert "update metascraper packages"" [`d5c1421`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/d5c142129291264d5508b3f32b8500c2451a5f39)
+
+#### [3.0.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.0.2...3.0.3)
+
+> 4 September 2023
+
+- chore(release): release v3.0.3 – fix chat avatar error, adjust layout of filter and enable e-mail dkim [`#6702`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6702)
+- build(other): bump @babel/core from 7.22.8 to 7.22.9 [`#6573`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6573)
+- feat(backend): implement dkim config for nodemailer [`#6692`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6692)
+- fix(webapp): filtermenu mobile bug [`#6694`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6694)
+- fix(webapp): fix proxyapiurl in chat rooms for the avatars [`#6693`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6693)
+- fix(webapp): fix the group link in the map [`#6698`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6698)
+- Bump @babel/core from 7.22.8 to 7.22.9 [`209390a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/209390a7e026b03ee92f7b1ecb3b1a7b3b2e0232)
+- Write documentation for DKIM e-mail setting [`9f5d32e`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9f5d32e527151854f1888614c59e0aa5f2b504d0)
+- Release v3.0.3 [`7d761c2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7d761c262a6e7bf6382cc49148c55ac8037db12a)
+
+#### [3.0.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.0.1...3.0.2)
+
+> 11 August 2023
+
+- chore(release): release v3.0.2 – fix chat avatar error and wrong font in network [`#6674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6674)
+- fix(webapp): fix wrong font in whole network comming from chat component [`#6672`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6672)
+- fix(webapp): fix 'm.avatar is null' error message [`#6671`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6671)
+- Release v3.0.2 [`7bcad81`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7bcad81785de39115ba03aa37fb26caeff7775f2)
+- Remove font 'Quicksand' from the chat [`5b95419`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5b954197dc93bd5715f657539ca1b9b32d7d557a)
+- Fix 'm.avatar is null' error message [`2c12331`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/2c123313ed6267bb1c88470ba7ae3f4f693cfc15)
+
+#### [3.0.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.0.0...3.0.1)
+
+> 9 August 2023
+
+- chore(release): release v3.0.1 – fix chat avatars [`#6667`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6667)
+- fix(webapp): try to fix avatars [`#6660`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6660)
+- Releasde v3.0.1 – fix chat avatars [`0daeb5b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0daeb5b957e11d206ceddc3e8b275929e1850d18)
+- 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)
+
+### [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)
diff --git a/README.md b/README.md
index 06e8d4929..2062865dd 100644
--- a/README.md
+++ b/README.md
@@ -8,9 +8,11 @@
[ocelot.social](https://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.
diff --git a/SUMMARY.md b/SUMMARY.md
index f848633d5..453a809b4 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -16,7 +16,7 @@
* [Frontend tests](webapp/testing.md)
* [Backend tests](backend/testing.md)
* [Docker More Closely](DOCKER_MORE_CLOSELY.md)
-* [Deployment](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/blob/master/deployment/README.md)
+* [Deployment](deployment/README.md)
* [Contributing](CONTRIBUTING.md)
* [Feature Specification](cypress/features.md)
* [Code of conduct](CODE_OF_CONDUCT.md)
diff --git a/backend/.dockerignore b/backend/.dockerignore
index 25a941824..a0883bf4d 100644
--- a/backend/.dockerignore
+++ b/backend/.dockerignore
@@ -12,8 +12,7 @@ docker-compose*.yml
./*.log
node_modules/
-scripts/
-dist/
+build/
maintenance-worker/
neo4j/
diff --git a/backend/.env.template b/backend/.env.template
index dd46846a9..d398c2265 100644
--- a/backend/.env.template
+++ b/backend/.env.template
@@ -1,13 +1,23 @@
+DEBUG=true
+
NEO4J_URI=bolt://localhost:7687
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=letmein
GRAPHQL_URI=http://localhost:4000
CLIENT_URI=http://localhost:3000
+
+# EMail
+EMAIL_SUPPORT="devops@ocelot.social"
+EMAIL_DEFAULT_SENDER="devops@ocelot.social"
SMTP_HOST=
SMTP_PORT=
SMTP_IGNORE_TLS=true
SMTP_USERNAME=
SMTP_PASSWORD=
+SMTP_SECURE="false" # true for 465, false for other ports
+SMTP_DKIM_DOMAINNAME=
+SMTP_DKIM_KEYSELECTOR=
+SMTP_DKIM_PRIVATKEY=
JWT_SECRET="b/&&7b78BF&fv/Vd"
JWT_EXPIRES="2y"
@@ -26,7 +36,4 @@ AWS_ENDPOINT=
AWS_REGION=
AWS_BUCKET=
-EMAIL_DEFAULT_SENDER="devops@ocelot.social"
-EMAIL_SUPPORT="devops@ocelot.social"
-
CATEGORIES_ACTIVE=false
diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js
index 0000bb066..cc5440d82 100644
--- a/backend/.eslintrc.js
+++ b/backend/.eslintrc.js
@@ -1,25 +1,219 @@
module.exports = {
+ root: true,
env: {
- es6: true,
+ // es6: true,
node: true,
- jest: true
},
- parserOptions: {
+ /* parserOptions: {
parser: 'babel-eslint'
- },
+ },*/
+ parser: '@typescript-eslint/parser',
+ plugins: ['prettier', '@typescript-eslint' /*, 'import', 'n', 'promise'*/],
extends: [
'standard',
- 'plugin:prettier/recommended'
+ // 'eslint:recommended',
+ 'plugin:prettier/recommended',
+ // 'plugin:import/recommended',
+ // 'plugin:import/typescript',
+ // 'plugin:security/recommended',
+ // 'plugin:@eslint-community/eslint-comments/recommended',
],
- plugins: [
- 'jest'
- ],
- rules: {
+ 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'],
+ > '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/backend/.gitignore b/backend/.gitignore
index 81a29c8e6..833f7e34e 100644
--- a/backend/.gitignore
+++ b/backend/.gitignore
@@ -3,7 +3,7 @@ node_modules/
.vscode
.idea
yarn-error.log
-dist/*
+build/*
coverage.lcov
.nyc_output/
public/uploads/*
diff --git a/backend/.nvmrc b/backend/.nvmrc
index cb77acbfe..58b8c2a00 100644
--- a/backend/.nvmrc
+++ b/backend/.nvmrc
@@ -1 +1 @@
-v19.4.0
\ No newline at end of file
+v20.2.0
\ No newline at end of file
diff --git a/backend/Dockerfile b/backend/Dockerfile
index c04cd9bc9..fc6c1f4b3 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -1,7 +1,7 @@
##################################################################################
# BASE (Is pushed to DockerHub for rebranding) ###################################
##################################################################################
-FROM node:19.4.0-alpine3.17 as base
+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
@@ -74,7 +74,7 @@ FROM code as build
# yarn install
RUN yarn install --production=false --frozen-lockfile --non-interactive
# yarn build
-RUN yarn run build
+RUN /bin/sh -c "yarn run build"
##################################################################################
# TEST ###########################################################################
@@ -90,7 +90,7 @@ CMD /bin/sh -c "yarn run dev"
FROM base as production
# Copy "binary"-files from build image
-COPY --from=build ${DOCKER_WORKDIR}/dist ./dist
+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
diff --git a/backend/jest.config.js b/backend/jest.config.js
index aabb59083..d1cc7bd3f 100644
--- a/backend/jest.config.js
+++ b/backend/jest.config.js
@@ -1,14 +1,19 @@
module.exports = {
verbose: true,
+ preset: 'ts-jest',
collectCoverage: true,
collectCoverageFrom: [
- '**/*.js',
+ '**/*.ts',
'!**/node_modules/**',
'!**/test/**',
- '!**/dist/**',
- '!**/src/**/?(*.)+(spec|test).js?(x)'
+ '!**/build/**',
+ '!**/src/**/?(*.)+(spec|test).ts?(x)'
],
- coverageReporters: ['lcov', 'text'],
- testMatch: ['**/src/**/?(*.)+(spec|test).js?(x)'],
- setupFilesAfterEnv: ['/test/setup.js']
+ coverageThreshold: {
+ global: {
+ lines: 67,
+ },
+ },
+ testMatch: ['**/src/**/?(*.)+(spec|test).ts?(x)'],
+ setupFilesAfterEnv: ['/test/setup.ts']
}
diff --git a/backend/package.json b/backend/package.json
index 79a2640cd..802b86382 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,35 +1,34 @@
{
"name": "ocelot-social-backend",
- "version": "2.5.0",
+ "version": "3.1.2",
"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.js",
+ "main": "src/index.ts",
"scripts": {
- "__migrate": "migrate --compiler 'js:@babel/register' --migrations-dir ./src/db/migrations",
- "prod:migrate": "migrate --migrations-dir ./dist/db/migrations --store ./dist/db/migrate/store.js",
- "start": "node dist/",
- "build": "babel src/ -d dist/ --copy-files",
- "dev": "nodemon --exec babel-node src/ -e js,gql",
- "dev:debug": "nodemon --exec babel-node --inspect=0.0.0.0:9229 src/ -e js,gql",
- "lint": "eslint src --config .eslintrc.js",
+ "__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": "babel-node src/db/clean.js",
+ "db:clean": "ts-node src/db/clean.ts",
"db:reset": "yarn run db:clean",
- "db:seed": "babel-node src/db/seed.js",
- "db:migrate": "yarn run __migrate --store ./src/db/migrate/store.js",
- "db:migrate:create": "yarn run __migrate --template-file ./src/db/migrate/template.js --date-format 'yyyymmddHHmmss' create"
+ "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/plugin-proposal-throw-expressions": "^7.22.5",
+ "@babel/preset-env": "~7.22.20",
"@babel/register": "^7.9.0",
- "@hapi/joi": "^17.1.1",
"@sentry/node": "^5.15.4",
"apollo-cache-inmemory": "~1.6.5",
"apollo-client": "~2.6.8",
@@ -37,7 +36,7 @@
"apollo-link-http": "~1.5.17",
"apollo-server": "~2.14.2",
"apollo-server-express": "^2.14.2",
- "aws-sdk": "^2.652.0",
+ "aws-sdk": "^2.1425.0",
"babel-core": "~7.0.0-0",
"babel-eslint": "~10.1.0",
"babel-jest": "~25.2.6",
@@ -46,19 +45,15 @@
"cheerio": "~1.0.0-rc.3",
"cors": "~2.8.5",
"cross-env": "~7.0.3",
- "date-fns": "2.22.1",
- "debug": "~4.1.1",
"dotenv": "~8.2.0",
"express": "^4.17.1",
"graphql": "^14.6.0",
- "graphql-custom-directives": "~0.2.14",
- "graphql-iso-date": "~3.6.1",
"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": "~3.22.0",
+ "helmet": "~7.0.0",
"ioredis": "^4.16.1",
"jsonwebtoken": "~8.5.1",
"languagedetect": "^2.0.0",
@@ -66,9 +61,7 @@
"lodash": "~4.17.14",
"merge-graphql-schemas": "^1.7.8",
"metascraper": "^5.33.5",
- "metascraper-audio": "^5.33.5",
"metascraper-author": "^5.33.5",
- "metascraper-clearbit-logo": "^5.3.0",
"metascraper-date": "^5.33.5",
"metascraper-description": "^5.33.5",
"metascraper-image": "^5.33.5",
@@ -76,51 +69,56 @@
"metascraper-lang-detector": "^4.10.2",
"metascraper-logo": "^5.33.5",
"metascraper-publisher": "^5.33.5",
- "metascraper-soundcloud": "^5.33.5",
- "metascraper-title": "^5.33.5",
- "metascraper-url": "^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": "^1.7.0",
+ "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.8",
+ "neode": "^0.4.9",
"node-fetch": "~2.6.1",
"nodemailer": "^6.4.4",
"nodemailer-html-to-text": "^3.2.0",
- "npm-run-all": "~4.1.5",
"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.0.0",
- "wait-on": "~4.0.1",
+ "validator": "^13.9.0",
"xregexp": "^4.3.0"
},
"devDependencies": {
- "@faker-js/faker": "5.1.0",
+ "@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",
+ "chai": "~4.3.8",
"cucumber": "~6.0.5",
- "eslint": "~6.8.0",
- "eslint-config-prettier": "~6.15.0",
- "eslint-config-standard": "~14.1.1",
- "eslint-plugin-import": "~2.20.2",
- "eslint-plugin-jest": "~23.8.2",
- "eslint-plugin-node": "~11.1.0",
- "eslint-plugin-prettier": "~3.4.1",
- "eslint-plugin-promise": "~4.3.1",
- "eslint-plugin-standard": "~4.0.1",
- "jest": "29.4",
+ "eslint": "^8.37.0",
+ "eslint-config-prettier": "^9.0.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.3.2",
+ "prettier": "^2.8.7",
"rosie": "^2.0.1",
- "supertest": "~4.0.2"
+ "ts-jest": "^27.0.5",
+ "ts-node": "^10.9.1",
+ "typescript": "^4.9.4"
},
"resolutions": {
"**/**/fs-capacitor": "^6.2.0",
diff --git a/backend/scripts/build.copy.files.sh b/backend/scripts/build.copy.files.sh
new file mode 100755
index 000000000..9d17f46ae
--- /dev/null
+++ b/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/backend/src/activitypub/ActivityPub.js b/backend/src/activitypub/ActivityPub.js
deleted file mode 100644
index 7ecc9d3fe..000000000
--- a/backend/src/activitypub/ActivityPub.js
+++ /dev/null
@@ -1,240 +0,0 @@
-// import { extractDomainFromUrl, signAndSend } from './utils'
-import { extractNameFromId, signAndSend } from './utils'
-import { isPublicAddressed } from './utils/activity'
-// import { isPublicAddressed, sendAcceptActivity, sendRejectActivity } from './utils/activity'
-import request from 'request'
-// import as from 'activitystrea.ms'
-import NitroDataSource from './NitroDataSource'
-import router from './routes'
-import Collections from './Collections'
-import { v4 as uuid } from 'uuid'
-import CONFIG from '../config'
-const debug = require('debug')('ea')
-
-let activityPub = null
-
-export { activityPub }
-
-export default class ActivityPub {
- constructor(activityPubEndpointUri, internalGraphQlUri) {
- this.endpoint = activityPubEndpointUri
- this.dataSource = new NitroDataSource(internalGraphQlUri)
- this.collections = new Collections(this.dataSource)
- }
-
- static init(server) {
- if (!activityPub) {
- activityPub = new ActivityPub(CONFIG.CLIENT_URI, CONFIG.GRAPHQL_URI)
-
- // integrate into running graphql express server
- server.express.set('ap', activityPub)
- server.express.use(router)
- console.log('-> ActivityPub middleware added to the graphql express server') // eslint-disable-line no-console
- } else {
- console.log('-> ActivityPub middleware already added to the graphql express server') // eslint-disable-line no-console
- }
- }
-
- // handleFollowActivity(activity) {
- // debug(`inside FOLLOW ${activity.actor}`)
- // const toActorName = extractNameFromId(activity.object)
- // const fromDomain = extractDomainFromUrl(activity.actor)
- // const dataSource = this.dataSource
-
- // return new Promise((resolve, reject) => {
- // request(
- // {
- // url: activity.actor,
- // headers: {
- // Accept: 'application/activity+json',
- // },
- // },
- // async (err, response, toActorObject) => {
- // if (err) return reject(err)
- // // save shared inbox
- // toActorObject = JSON.parse(toActorObject)
- // await this.dataSource.addSharedInboxEndpoint(toActorObject.endpoints.sharedInbox)
-
- // const followersCollectionPage = await this.dataSource.getFollowersCollectionPage(
- // activity.object,
- // )
-
- // const followActivity = as
- // .follow()
- // .id(activity.id)
- // .actor(activity.actor)
- // .object(activity.object)
-
- // // add follower if not already in collection
- // if (followersCollectionPage.orderedItems.includes(activity.actor)) {
- // debug('follower already in collection!')
- // debug(`inbox = ${toActorObject.inbox}`)
- // resolve(
- // sendRejectActivity(followActivity, toActorName, fromDomain, toActorObject.inbox),
- // )
- // } else {
- // followersCollectionPage.orderedItems.push(activity.actor)
- // }
- // debug(`toActorObject = ${toActorObject}`)
- // toActorObject =
- // typeof toActorObject !== 'object' ? JSON.parse(toActorObject) : toActorObject
- // debug(`followers = ${JSON.stringify(followersCollectionPage.orderedItems, null, 2)}`)
- // debug(`inbox = ${toActorObject.inbox}`)
- // debug(`outbox = ${toActorObject.outbox}`)
- // debug(`followers = ${toActorObject.followers}`)
- // debug(`following = ${toActorObject.following}`)
-
- // try {
- // await dataSource.saveFollowersCollectionPage(followersCollectionPage)
- // debug('follow activity saved')
- // resolve(
- // sendAcceptActivity(followActivity, toActorName, fromDomain, toActorObject.inbox),
- // )
- // } catch (e) {
- // debug('followers update error!', e)
- // resolve(
- // sendRejectActivity(followActivity, toActorName, fromDomain, toActorObject.inbox),
- // )
- // }
- // },
- // )
- // })
- // }
-
- handleUndoActivity(activity) {
- debug('inside UNDO')
- switch (activity.object.type) {
- case 'Follow': {
- const followActivity = activity.object
- return this.dataSource.undoFollowActivity(followActivity.actor, followActivity.object)
- }
- case 'Like': {
- return this.dataSource.deleteShouted(activity)
- }
- }
- }
-
- handleCreateActivity(activity) {
- debug('inside create')
- switch (activity.object.type) {
- case 'Note': {
- const articleObject = activity.object
- if (articleObject.inReplyTo) {
- return this.dataSource.createComment(activity)
- } else {
- return this.dataSource.createPost(activity)
- }
- }
- }
- }
-
- handleDeleteActivity(activity) {
- debug('inside delete')
- switch (activity.object.type) {
- case 'Article':
- case 'Note':
- return this.dataSource.deletePost(activity)
- default:
- }
- }
-
- handleUpdateActivity(activity) {
- debug('inside update')
- switch (activity.object.type) {
- case 'Note':
- case 'Article':
- return this.dataSource.updatePost(activity)
- default:
- }
- }
-
- handleLikeActivity(activity) {
- // TODO differ if activity is an Article/Note/etc.
- return this.dataSource.createShouted(activity)
- }
-
- handleDislikeActivity(activity) {
- // TODO differ if activity is an Article/Note/etc.
- return this.dataSource.deleteShouted(activity)
- }
-
- async handleAcceptActivity(activity) {
- debug('inside accept')
- switch (activity.object.type) {
- case 'Follow': {
- const followObject = activity.object
- const followingCollectionPage = await this.collections.getFollowingCollectionPage(
- followObject.actor,
- )
- followingCollectionPage.orderedItems.push(followObject.object)
- await this.dataSource.saveFollowingCollectionPage(followingCollectionPage)
- }
- }
- }
-
- getActorObject(url) {
- return new Promise((resolve, reject) => {
- request(
- {
- url: url,
- headers: {
- Accept: 'application/json',
- },
- },
- (err, response, body) => {
- if (err) {
- reject(err)
- }
- resolve(JSON.parse(body))
- },
- )
- })
- }
-
- generateStatusId(slug) {
- return `https://${this.host}/activitypub/users/${slug}/status/${uuid()}`
- }
-
- async sendActivity(activity) {
- delete activity.send
- const fromName = extractNameFromId(activity.actor)
- if (Array.isArray(activity.to) && isPublicAddressed(activity)) {
- debug('is public addressed')
- const sharedInboxEndpoints = await this.dataSource.getSharedInboxEndpoints()
- // serve shared inbox endpoints
- sharedInboxEndpoints.map((sharedInbox) => {
- return this.trySend(activity, fromName, new URL(sharedInbox).host, sharedInbox)
- })
- activity.to = activity.to.filter((recipient) => {
- return !isPublicAddressed({ to: recipient })
- })
- // serve the rest
- activity.to.map(async (recipient) => {
- debug('serve rest')
- const actorObject = await this.getActorObject(recipient)
- return this.trySend(activity, fromName, new URL(recipient).host, actorObject.inbox)
- })
- } else if (typeof activity.to === 'string') {
- debug('is string')
- const actorObject = await this.getActorObject(activity.to)
- return this.trySend(activity, fromName, new URL(activity.to).host, actorObject.inbox)
- } else if (Array.isArray(activity.to)) {
- activity.to.map(async (recipient) => {
- const actorObject = await this.getActorObject(recipient)
- return this.trySend(activity, fromName, new URL(recipient).host, actorObject.inbox)
- })
- }
- }
-
- async trySend(activity, fromName, host, url, tries = 5) {
- try {
- return await signAndSend(activity, fromName, host, url)
- } catch (e) {
- if (tries > 0) {
- setTimeout(function () {
- return this.trySend(activity, fromName, host, url, --tries)
- }, 20000)
- }
- }
- }
-}
diff --git a/backend/src/activitypub/Collections.js b/backend/src/activitypub/Collections.js
deleted file mode 100644
index 4040468cf..000000000
--- a/backend/src/activitypub/Collections.js
+++ /dev/null
@@ -1,29 +0,0 @@
-export default class Collections {
- constructor(dataSource) {
- this.dataSource = dataSource
- }
-
- getFollowersCollection(actorId) {
- return this.dataSource.getFollowersCollection(actorId)
- }
-
- getFollowersCollectionPage(actorId) {
- return this.dataSource.getFollowersCollectionPage(actorId)
- }
-
- getFollowingCollection(actorId) {
- return this.dataSource.getFollowingCollection(actorId)
- }
-
- getFollowingCollectionPage(actorId) {
- return this.dataSource.getFollowingCollectionPage(actorId)
- }
-
- getOutboxCollection(actorId) {
- return this.dataSource.getOutboxCollection(actorId)
- }
-
- getOutboxCollectionPage(actorId) {
- return this.dataSource.getOutboxCollectionPage(actorId)
- }
-}
diff --git a/backend/src/activitypub/NitroDataSource.js b/backend/src/activitypub/NitroDataSource.js
deleted file mode 100644
index 476c91439..000000000
--- a/backend/src/activitypub/NitroDataSource.js
+++ /dev/null
@@ -1,575 +0,0 @@
-import {
- throwErrorIfApolloErrorOccurred,
- extractIdFromActivityId,
- extractNameFromId,
- constructIdFromName,
-} from './utils'
-import { createOrderedCollection, createOrderedCollectionPage } from './utils/collection'
-import { createArticleObject, isPublicAddressed } from './utils/activity'
-import crypto from 'crypto'
-import gql from 'graphql-tag'
-import { createHttpLink } from 'apollo-link-http'
-import { setContext } from 'apollo-link-context'
-import { InMemoryCache } from 'apollo-cache-inmemory'
-import fetch from 'node-fetch'
-import { ApolloClient } from 'apollo-client'
-import trunc from 'trunc-html'
-const debug = require('debug')('ea:datasource')
-
-export default class NitroDataSource {
- constructor(uri) {
- this.uri = uri
- const defaultOptions = {
- query: {
- fetchPolicy: 'network-only',
- errorPolicy: 'all',
- },
- }
- const link = createHttpLink({ uri: this.uri, fetch: fetch }) // eslint-disable-line
- const cache = new InMemoryCache()
- const authLink = setContext((_, { headers }) => {
- // generate the authentication token (maybe from env? Which user?)
- const token =
- 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYWRtaW4iLCJuYW1lIjoiUGV0ZXIgTHVzdGlnIiwiYXZhdGFyIjoiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL3VpZmFjZXMvZmFjZXMvdHdpdHRlci9qb2huY2FmYXp6YS8xMjguanBnIiwiaWQiOiJ1MSIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5vcmciLCJzbHVnIjoicGV0ZXItbHVzdGlnIiwiaWF0IjoxNTUyNDIwMTExLCJleHAiOjE2Mzg4MjAxMTEsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDAwMCIsInN1YiI6InUxIn0.G7An1yeQUViJs-0Qj-Tc-zm0WrLCMB3M02pfPnm6xzw'
- // return the headers to the context so httpLink can read them
- return {
- headers: {
- ...headers,
- Authorization: token ? `Bearer ${token}` : '',
- },
- }
- })
- this.client = new ApolloClient({
- link: authLink.concat(link),
- cache: cache,
- defaultOptions,
- })
- }
-
- async getFollowersCollection(actorId) {
- const slug = extractNameFromId(actorId)
- debug(`slug= ${slug}`)
- const result = await this.client.query({
- query: gql`
- query {
- User(slug: "${slug}") {
- followedByCount
- }
- }
- `,
- })
- debug('successfully fetched followers')
- debug(result.data)
- if (result.data) {
- const actor = result.data.User[0]
- const followersCount = actor.followedByCount
-
- const followersCollection = createOrderedCollection(slug, 'followers')
- followersCollection.totalItems = followersCount
-
- return followersCollection
- } else {
- throwErrorIfApolloErrorOccurred(result)
- }
- }
-
- async getFollowersCollectionPage(actorId) {
- const slug = extractNameFromId(actorId)
- debug(`getFollowersPage slug = ${slug}`)
- const result = await this.client.query({
- query: gql`
- query {
- User(slug:"${slug}") {
- followedBy {
- slug
- }
- followedByCount
- }
- }
- `,
- })
-
- debug(result.data)
- if (result.data) {
- const actor = result.data.User[0]
- const followers = actor.followedBy
- const followersCount = actor.followedByCount
-
- const followersCollection = createOrderedCollectionPage(slug, 'followers')
- followersCollection.totalItems = followersCount
- debug(`followers = ${JSON.stringify(followers, null, 2)}`)
- await Promise.all(
- followers.map(async (follower) => {
- followersCollection.orderedItems.push(constructIdFromName(follower.slug))
- }),
- )
-
- return followersCollection
- } else {
- throwErrorIfApolloErrorOccurred(result)
- }
- }
-
- async getFollowingCollection(actorId) {
- const slug = extractNameFromId(actorId)
- const result = await this.client.query({
- query: gql`
- query {
- User(slug:"${slug}") {
- followingCount
- }
- }
- `,
- })
-
- debug(result.data)
- if (result.data) {
- const actor = result.data.User[0]
- const followingCount = actor.followingCount
-
- const followingCollection = createOrderedCollection(slug, 'following')
- followingCollection.totalItems = followingCount
-
- return followingCollection
- } else {
- throwErrorIfApolloErrorOccurred(result)
- }
- }
-
- async getFollowingCollectionPage(actorId) {
- const slug = extractNameFromId(actorId)
- const result = await this.client.query({
- query: gql`
- query {
- User(slug:"${slug}") {
- following {
- slug
- }
- followingCount
- }
- }
- `,
- })
-
- debug(result.data)
- if (result.data) {
- const actor = result.data.User[0]
- const following = actor.following
- const followingCount = actor.followingCount
-
- const followingCollection = createOrderedCollectionPage(slug, 'following')
- followingCollection.totalItems = followingCount
-
- await Promise.all(
- following.map(async (user) => {
- followingCollection.orderedItems.push(await constructIdFromName(user.slug))
- }),
- )
-
- return followingCollection
- } else {
- throwErrorIfApolloErrorOccurred(result)
- }
- }
-
- async getOutboxCollection(actorId) {
- const slug = extractNameFromId(actorId)
- const result = await this.client.query({
- query: gql`
- query {
- User(slug:"${slug}") {
- contributions {
- title
- slug
- content
- contentExcerpt
- createdAt
- }
- }
- }
- `,
- })
-
- debug(result.data)
- if (result.data) {
- const actor = result.data.User[0]
- const posts = actor.contributions
-
- const outboxCollection = createOrderedCollection(slug, 'outbox')
- outboxCollection.totalItems = posts.length
-
- return outboxCollection
- } else {
- throwErrorIfApolloErrorOccurred(result)
- }
- }
-
- async getOutboxCollectionPage(actorId) {
- const slug = extractNameFromId(actorId)
- debug(`inside getting outbox collection page => ${slug}`)
- const result = await this.client.query({
- query: gql`
- query {
- User(slug:"${slug}") {
- actorId
- contributions {
- id
- activityId
- objectId
- title
- slug
- content
- contentExcerpt
- createdAt
- author {
- slug
- }
- }
- }
- }
- `,
- })
-
- debug(result.data)
- if (result.data) {
- const actor = result.data.User[0]
- const posts = actor.contributions
-
- const outboxCollection = createOrderedCollectionPage(slug, 'outbox')
- outboxCollection.totalItems = posts.length
- await Promise.all(
- posts.map(async (post) => {
- outboxCollection.orderedItems.push(
- await createArticleObject(
- post.activityId,
- post.objectId,
- post.content,
- post.author.slug,
- post.id,
- post.createdAt,
- ),
- )
- }),
- )
-
- debug('after createNote')
- return outboxCollection
- } else {
- throwErrorIfApolloErrorOccurred(result)
- }
- }
-
- async undoFollowActivity(fromActorId, toActorId) {
- const fromUserId = await this.ensureUser(fromActorId)
- const toUserId = await this.ensureUser(toActorId)
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- RemoveUserFollowedBy(from: {id: "${fromUserId}"}, to: {id: "${toUserId}"}) {
- from { name }
- }
- }
- `,
- })
- debug(`undoFollowActivity result = ${JSON.stringify(result, null, 2)}`)
- throwErrorIfApolloErrorOccurred(result)
- }
-
- async saveFollowersCollectionPage(followersCollection, onlyNewestItem = true) {
- debug('inside saveFollowers')
- let orderedItems = followersCollection.orderedItems
- const toUserName = extractNameFromId(followersCollection.id)
- const toUserId = await this.ensureUser(constructIdFromName(toUserName))
- orderedItems = onlyNewestItem ? [orderedItems.pop()] : orderedItems
-
- return Promise.all(
- orderedItems.map(async (follower) => {
- debug(`follower = ${follower}`)
- const fromUserId = await this.ensureUser(follower)
- debug(`fromUserId = ${fromUserId}`)
- debug(`toUserId = ${toUserId}`)
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- AddUserFollowedBy(from: {id: "${fromUserId}"}, to: {id: "${toUserId}"}) {
- from { name }
- }
- }
- `,
- })
- debug(`addUserFollowedBy edge = ${JSON.stringify(result, null, 2)}`)
- throwErrorIfApolloErrorOccurred(result)
- debug('saveFollowers: added follow edge successfully')
- }),
- )
- }
-
- async saveFollowingCollectionPage(followingCollection, onlyNewestItem = true) {
- debug('inside saveFollowers')
- let orderedItems = followingCollection.orderedItems
- const fromUserName = extractNameFromId(followingCollection.id)
- const fromUserId = await this.ensureUser(constructIdFromName(fromUserName))
- orderedItems = onlyNewestItem ? [orderedItems.pop()] : orderedItems
- return Promise.all(
- orderedItems.map(async (following) => {
- debug(`follower = ${following}`)
- const toUserId = await this.ensureUser(following)
- debug(`fromUserId = ${fromUserId}`)
- debug(`toUserId = ${toUserId}`)
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- AddUserFollowing(from: {id: "${fromUserId}"}, to: {id: "${toUserId}"}) {
- from { name }
- }
- }
- `,
- })
- debug(`addUserFollowing edge = ${JSON.stringify(result, null, 2)}`)
- throwErrorIfApolloErrorOccurred(result)
- debug('saveFollowing: added follow edge successfully')
- }),
- )
- }
-
- async createPost(activity) {
- // TODO how to handle the to field? Now the post is just created, doesn't matter who is the recipient
- // createPost
- const postObject = activity.object
- if (!isPublicAddressed(postObject)) {
- return debug(
- 'createPost: not send to public (sending to specific persons is not implemented yet)',
- )
- }
- const title = postObject.summary
- ? postObject.summary
- : postObject.content.split(' ').slice(0, 5).join(' ')
- const postId = extractIdFromActivityId(postObject.id)
- debug('inside create post')
- let result = await this.client.mutate({
- mutation: gql`
- mutation {
- CreatePost(content: "${postObject.content}", contentExcerpt: "${trunc(
- postObject.content,
- 120,
- )}", title: "${title}", id: "${postId}", objectId: "${postObject.id}", activityId: "${
- activity.id
- }") {
- id
- }
- }
- `,
- })
-
- throwErrorIfApolloErrorOccurred(result)
-
- // ensure user and add author to post
- const userId = await this.ensureUser(postObject.attributedTo)
- debug(`userId = ${userId}`)
- debug(`postId = ${postId}`)
- result = await this.client.mutate({
- mutation: gql`
- mutation {
- AddPostAuthor(from: {id: "${userId}"}, to: {id: "${postId}"}) {
- from {
- name
- }
- }
- }
- `,
- })
-
- throwErrorIfApolloErrorOccurred(result)
- }
-
- async deletePost(activity) {
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- DeletePost(id: "${extractIdFromActivityId(activity.object.id)}") {
- title
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- }
-
- async updatePost(activity) {
- const postObject = activity.object
- const postId = extractIdFromActivityId(postObject.id)
- const date = postObject.updated ? postObject.updated : new Date().toISOString()
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- UpdatePost(content: "${postObject.content}", contentExcerpt: "${
- trunc(postObject.content, 120).html
- }", id: "${postId}", updatedAt: "${date}") {
- title
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- }
-
- async createShouted(activity) {
- const userId = await this.ensureUser(activity.actor)
- const postId = extractIdFromActivityId(activity.object)
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- AddUserShouted(from: {id: "${userId}"}, to: {id: "${postId}"}) {
- from {
- name
- }
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- if (!result.data.AddUserShouted) {
- debug('something went wrong shouting post')
- throw Error('User or Post not exists')
- }
- }
-
- async deleteShouted(activity) {
- const userId = await this.ensureUser(activity.actor)
- const postId = extractIdFromActivityId(activity.object)
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- RemoveUserShouted(from: {id: "${userId}"}, to: {id: "${postId}"}) {
- from {
- name
- }
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- if (!result.data.AddUserShouted) {
- debug('something went wrong disliking a post')
- throw Error('User or Post not exists')
- }
- }
-
- async getSharedInboxEndpoints() {
- const result = await this.client.query({
- query: gql`
- query {
- SharedInboxEndpoint {
- uri
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- return result.data.SharedInboxEnpoint
- }
-
- async addSharedInboxEndpoint(uri) {
- try {
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- CreateSharedInboxEndpoint(uri: "${uri}")
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- return true
- } catch (e) {
- return false
- }
- }
-
- async createComment(activity) {
- const postObject = activity.object
- let result = await this.client.mutate({
- mutation: gql`
- mutation {
- CreateComment(content: "${
- postObject.content
- }", activityId: "${extractIdFromActivityId(activity.id)}") {
- id
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
-
- const toUserId = await this.ensureUser(activity.actor)
- const result2 = await this.client.mutate({
- mutation: gql`
- mutation {
- AddCommentAuthor(from: {id: "${result.data.CreateComment.id}"}, to: {id: "${toUserId}"}) {
- id
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result2)
-
- const postId = extractIdFromActivityId(postObject.inReplyTo)
- result = await this.client.mutate({
- mutation: gql`
- mutation {
- AddCommentPost(from: { id: "${result.data.CreateComment.id}", to: { id: "${postId}" }}) {
- id
- }
- }
- `,
- })
-
- throwErrorIfApolloErrorOccurred(result)
- }
-
- /**
- * This function will search for user existence and will create a disabled user with a random 16 bytes password when no user is found.
- *
- * @param actorId
- * @returns {Promise<*>}
- */
- async ensureUser(actorId) {
- debug(`inside ensureUser = ${actorId}`)
- const name = extractNameFromId(actorId)
- const queryResult = await this.client.query({
- query: gql`
- query {
- User(slug: "${name}") {
- id
- }
- }
- `,
- })
-
- if (
- queryResult.data &&
- Array.isArray(queryResult.data.User) &&
- queryResult.data.User.length > 0
- ) {
- debug('ensureUser: user exists.. return id')
- // user already exists.. return the id
- return queryResult.data.User[0].id
- } else {
- debug('ensureUser: user not exists.. createUser')
- // user does not exist.. create it
- const pw = crypto.randomBytes(16).toString('hex')
- const slug = name.toLowerCase().split(' ').join('-')
- const result = await this.client.mutate({
- mutation: gql`
- mutation {
- CreateUser(password: "${pw}", slug:"${slug}", actorId: "${actorId}", name: "${name}", email: "${slug}@test.org") {
- id
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
-
- return result.data.CreateUser.id
- }
- }
-}
diff --git a/backend/src/activitypub/routes/inbox.js b/backend/src/activitypub/routes/inbox.js
deleted file mode 100644
index f0f88f7e6..000000000
--- a/backend/src/activitypub/routes/inbox.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import express from 'express'
-import { activityPub } from '../ActivityPub'
-
-const debug = require('debug')('ea:inbox')
-
-const router = express.Router()
-
-// Shared Inbox endpoint (federated Server)
-// For now its only able to handle Note Activities!!
-router.post('/', async function (req, res, next) {
- debug(`Content-Type = ${req.get('Content-Type')}`)
- debug(`body = ${JSON.stringify(req.body, null, 2)}`)
- debug(`Request headers = ${JSON.stringify(req.headers, null, 2)}`)
- switch (req.body.type) {
- case 'Create':
- await activityPub.handleCreateActivity(req.body).catch(next)
- break
- case 'Undo':
- await activityPub.handleUndoActivity(req.body).catch(next)
- break
- // case 'Follow':
- // await activityPub.handleFollowActivity(req.body).catch(next)
- // break
- case 'Delete':
- await activityPub.handleDeleteActivity(req.body).catch(next)
- break
- /* eslint-disable */
- case 'Update':
- await activityPub.handleUpdateActivity(req.body).catch(next)
- break
- case 'Accept':
- await activityPub.handleAcceptActivity(req.body).catch(next)
- case 'Reject':
- // Do nothing
- break
- case 'Add':
- break
- case 'Remove':
- break
- case 'Like':
- await activityPub.handleLikeActivity(req.body).catch(next)
- break
- case 'Dislike':
- await activityPub.handleDislikeActivity(req.body).catch(next)
- break
- case 'Announce':
- debug('else!!')
- debug(JSON.stringify(req.body, null, 2))
- }
- /* eslint-enable */
- res.status(200).end()
-})
-
-export default router
diff --git a/backend/src/activitypub/routes/index.js b/backend/src/activitypub/routes/index.js
deleted file mode 100644
index 00ba7c22d..000000000
--- a/backend/src/activitypub/routes/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import user from './user'
-import inbox from './inbox'
-import express from 'express'
-import cors from 'cors'
-import verify from './verify'
-
-export default function () {
- const router = express.Router()
- router.use(
- '/activitypub/users',
- cors(),
- express.json({
- type: ['application/activity+json', 'application/ld+json', 'application/json'],
- }),
- express.urlencoded({ extended: true }),
- user,
- )
- router.use(
- '/activitypub/inbox',
- cors(),
- express.json({
- type: ['application/activity+json', 'application/ld+json', 'application/json'],
- }),
- express.urlencoded({ extended: true }),
- verify,
- inbox,
- )
- return router
-}
diff --git a/backend/src/activitypub/routes/serveUser.js b/backend/src/activitypub/routes/serveUser.js
deleted file mode 100644
index dd7d80811..000000000
--- a/backend/src/activitypub/routes/serveUser.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { createActor } from '../utils/actor'
-const gql = require('graphql-tag')
-const debug = require('debug')('ea:serveUser')
-
-export async function serveUser(req, res, next) {
- let name = req.params.name
-
- if (name.startsWith('@')) {
- name = name.slice(1)
- }
-
- debug(`name = ${name}`)
- const result = await req.app
- .get('ap')
- .dataSource.client.query({
- query: gql`
- query {
- User(slug: "${name}") {
- publicKey
- }
- }
- `,
- })
- .catch((reason) => {
- debug(`serveUser User fetch error: ${reason}`)
- })
-
- if (result.data && Array.isArray(result.data.User) && result.data.User.length > 0) {
- const publicKey = result.data.User[0].publicKey
- const actor = createActor(name, publicKey)
- debug(`actor = ${JSON.stringify(actor, null, 2)}`)
- debug(
- `accepts json = ${req.accepts([
- 'application/activity+json',
- 'application/ld+json',
- 'application/json',
- ])}`,
- )
- if (req.accepts(['application/activity+json', 'application/ld+json', 'application/json'])) {
- return res.json(actor)
- } else if (req.accepts('text/html')) {
- // TODO show user's profile page instead of the actor object
- /* const outbox = JSON.parse(result.outbox)
- const posts = outbox.orderedItems.filter((el) => { return el.object.type === 'Note'})
- const actor = result.actor
- debug(posts) */
- // res.render('user', { user: actor, posts: JSON.stringify(posts)})
- return res.json(actor)
- }
- } else {
- debug(`error getting publicKey for actor ${name}`)
- next()
- }
-}
diff --git a/backend/src/activitypub/routes/user.js b/backend/src/activitypub/routes/user.js
deleted file mode 100644
index 8dfdbc91d..000000000
--- a/backend/src/activitypub/routes/user.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import { sendCollection } from '../utils/collection'
-import express from 'express'
-import { serveUser } from './serveUser'
-import { activityPub } from '../ActivityPub'
-import verify from './verify'
-
-const router = express.Router()
-const debug = require('debug')('ea:user')
-
-router.get('/:name', async function (req, res, next) {
- debug('inside user.js -> serveUser')
- await serveUser(req, res, next)
-})
-
-router.get('/:name/following', (req, res) => {
- debug('inside user.js -> serveFollowingCollection')
- const name = req.params.name
- if (!name) {
- res.status(400).send('Bad request! Please specify a name.')
- } else {
- const collectionName = req.query.page ? 'followingPage' : 'following'
- sendCollection(collectionName, req, res)
- }
-})
-
-router.get('/:name/followers', (req, res) => {
- debug('inside user.js -> serveFollowersCollection')
- const name = req.params.name
- if (!name) {
- return res.status(400).send('Bad request! Please specify a name.')
- } else {
- const collectionName = req.query.page ? 'followersPage' : 'followers'
- sendCollection(collectionName, req, res)
- }
-})
-
-router.get('/:name/outbox', (req, res) => {
- debug('inside user.js -> serveOutboxCollection')
- const name = req.params.name
- if (!name) {
- return res.status(400).send('Bad request! Please specify a name.')
- } else {
- const collectionName = req.query.page ? 'outboxPage' : 'outbox'
- sendCollection(collectionName, req, res)
- }
-})
-
-router.post('/:name/inbox', verify, async function (req, res, next) {
- debug(`body = ${JSON.stringify(req.body, null, 2)}`)
- debug(`actorId = ${req.body.actor}`)
- // const result = await saveActorId(req.body.actor)
- switch (req.body.type) {
- case 'Create':
- await activityPub.handleCreateActivity(req.body).catch(next)
- break
- case 'Undo':
- await activityPub.handleUndoActivity(req.body).catch(next)
- break
- // case 'Follow':
- // await activityPub.handleFollowActivity(req.body).catch(next)
- // break
- case 'Delete':
- await activityPub.handleDeleteActivity(req.body).catch(next)
- break
- /* eslint-disable */
- case 'Update':
- await activityPub.handleUpdateActivity(req.body).catch(next)
- break
- case 'Accept':
- await activityPub.handleAcceptActivity(req.body).catch(next)
- case 'Reject':
- // Do nothing
- break
- case 'Add':
- break
- case 'Remove':
- break
- case 'Like':
- await activityPub.handleLikeActivity(req.body).catch(next)
- break
- case 'Dislike':
- await activityPub.handleDislikeActivity(req.body).catch(next)
- break
- case 'Announce':
- debug('else!!')
- debug(JSON.stringify(req.body, null, 2))
- }
- /* eslint-enable */
- res.status(200).end()
-})
-
-export default router
diff --git a/backend/src/activitypub/routes/verify.js b/backend/src/activitypub/routes/verify.js
deleted file mode 100644
index 33603805f..000000000
--- a/backend/src/activitypub/routes/verify.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { verifySignature } from '../security'
-const debug = require('debug')('ea:verify')
-
-export default async (req, res, next) => {
- debug(`actorId = ${req.body.actor}`)
- // TODO stop if signature validation fails
- if (
- await verifySignature(
- `${req.protocol}://${req.hostname}:${req.app.get('port')}${req.originalUrl}`,
- req.headers,
- )
- ) {
- debug('verify = true')
- next()
- } else {
- // throw Error('Signature validation failed!')
- debug('verify = false')
- next()
- }
-}
diff --git a/backend/src/activitypub/routes/webfinger.js b/backend/src/activitypub/routes/webfinger.js
deleted file mode 100644
index 6b8f3e14c..000000000
--- a/backend/src/activitypub/routes/webfinger.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import express from 'express'
-import CONFIG from '../../config/'
-import cors from 'cors'
-
-const debug = require('debug')('ea:webfinger')
-const regex = /acct:([a-z0-9_-]*)@([a-z0-9_-]*)/
-
-const createWebFinger = (name) => {
- const { host } = new URL(CONFIG.CLIENT_URI)
- return {
- subject: `acct:${name}@${host}`,
- links: [
- {
- rel: 'self',
- type: 'application/activity+json',
- href: `${CONFIG.CLIENT_URI}/activitypub/users/${name}`,
- },
- ],
- }
-}
-
-export async function handler(req, res) {
- const { resource = '' } = req.query
- // eslint-disable-next-line no-unused-vars
- const [_, name, domain] = resource.match(regex) || []
- if (!(name && domain))
- return res.status(400).json({
- error: 'Query parameter "?resource=acct:@" is missing.',
- })
-
- const session = req.app.get('driver').session()
- try {
- const [slug] = await session.readTransaction(async (t) => {
- const result = await t.run('MATCH (u:User {slug: $slug}) RETURN u.slug AS slug', {
- slug: name,
- })
- return result.records.map((record) => record.get('slug'))
- })
- if (!slug)
- return res.status(404).json({
- error: `No record found for "${name}@${domain}".`,
- })
- const webFinger = createWebFinger(name)
- return res.contentType('application/jrd+json').json(webFinger)
- } catch (error) {
- debug(error)
- return res.status(500).json({
- error: `Something went terribly wrong. Please visit ${CONFIG.SUPPORT_URL}`,
- })
- } finally {
- session.close()
- }
-}
-
-export default function () {
- const router = express.Router()
- router.use('/webfinger', cors(), express.urlencoded({ extended: true }), handler)
- return router
-}
diff --git a/backend/src/activitypub/routes/webfinger.spec.js b/backend/src/activitypub/routes/webfinger.spec.js
deleted file mode 100644
index 33b4f552f..000000000
--- a/backend/src/activitypub/routes/webfinger.spec.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import { handler } from './webfinger'
-import Factory, { cleanDatabase } from '../../db/factories'
-import { getDriver } from '../../db/neo4j'
-import CONFIG from '../../config'
-
-let resource, res, json, status, contentType
-
-const driver = getDriver()
-
-const request = () => {
- json = jest.fn()
- status = jest.fn(() => ({ json }))
- contentType = jest.fn(() => ({ json }))
- res = { status, contentType }
- const req = {
- app: {
- get: (key) => {
- return {
- driver,
- }[key]
- },
- },
- query: {
- resource,
- },
- }
- return handler(req, res)
-}
-
-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('webfinger', () => {
- describe('no ressource', () => {
- beforeEach(() => {
- resource = undefined
- })
-
- it('sends HTTP 400', async () => {
- await request()
- expect(status).toHaveBeenCalledWith(400)
- expect(json).toHaveBeenCalledWith({
- error: 'Query parameter "?resource=acct:@" is missing.',
- })
- })
- })
-
- describe('?resource query param', () => {
- describe('is missing acct:', () => {
- beforeEach(() => {
- resource = 'some-user@domain'
- })
-
- it('sends HTTP 400', async () => {
- await request()
- expect(status).toHaveBeenCalledWith(400)
- expect(json).toHaveBeenCalledWith({
- error: 'Query parameter "?resource=acct:@" is missing.',
- })
- })
- })
-
- describe('has no domain', () => {
- beforeEach(() => {
- resource = 'acct:some-user@'
- })
-
- it('sends HTTP 400', async () => {
- await request()
- expect(status).toHaveBeenCalledWith(400)
- expect(json).toHaveBeenCalledWith({
- error: 'Query parameter "?resource=acct:@" is missing.',
- })
- })
- })
-
- describe('with acct:', () => {
- beforeEach(() => {
- resource = 'acct:some-user@domain'
- })
-
- it('returns error as json', async () => {
- await request()
- expect(status).toHaveBeenCalledWith(404)
- expect(json).toHaveBeenCalledWith({
- error: 'No record found for "some-user@domain".',
- })
- })
-
- describe('given a user for acct', () => {
- beforeEach(async () => {
- await Factory.build('user', { slug: 'some-user' })
- })
-
- it('returns user object', async () => {
- await request()
- expect(contentType).toHaveBeenCalledWith('application/jrd+json')
- expect(json).toHaveBeenCalledWith({
- links: [
- {
- href: `${CONFIG.CLIENT_URI}/activitypub/users/some-user`,
- rel: 'self',
- type: 'application/activity+json',
- },
- ],
- subject: `acct:some-user@${new URL(CONFIG.CLIENT_URI).host}`,
- })
- })
- })
- })
- })
-})
diff --git a/backend/src/activitypub/security/httpSignature.spec.js b/backend/src/activitypub/security/httpSignature.spec.js
deleted file mode 100644
index 0c6fbb8b5..000000000
--- a/backend/src/activitypub/security/httpSignature.spec.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import { generateRsaKeyPair, createSignature, verifySignature } from '.'
-import crypto from 'crypto'
-import request from 'request'
-jest.mock('request')
-
-let privateKey
-let publicKey
-let headers
-const passphrase = 'a7dsf78sadg87ad87sfagsadg78'
-
-describe('activityPub/security', () => {
- beforeEach(() => {
- const pair = generateRsaKeyPair({ passphrase })
- privateKey = pair.privateKey
- publicKey = pair.publicKey
- headers = {
- Date: '2019-03-08T14:35:45.759Z',
- Host: 'democracy-app.de',
- 'Content-Type': 'application/json',
- }
- })
-
- describe('createSignature', () => {
- describe('returned http signature', () => {
- let signatureB64
- let httpSignature
-
- beforeEach(() => {
- const signer = crypto.createSign('rsa-sha256')
- signer.update(
- '(request-target): post /activitypub/users/max/inbox\ndate: 2019-03-08T14:35:45.759Z\nhost: democracy-app.de\ncontent-type: application/json',
- )
- signatureB64 = signer.sign({ key: privateKey, passphrase }, 'base64')
- httpSignature = createSignature({
- privateKey,
- keyId: 'https://human-connection.org/activitypub/users/lea#main-key',
- url: 'https://democracy-app.de/activitypub/users/max/inbox',
- headers,
- passphrase,
- })
- })
-
- it('contains keyId', () => {
- expect(httpSignature).toContain(
- 'keyId="https://human-connection.org/activitypub/users/lea#main-key"',
- )
- })
-
- it('contains default algorithm "rsa-sha256"', () => {
- expect(httpSignature).toContain('algorithm="rsa-sha256"')
- })
-
- it('contains headers', () => {
- expect(httpSignature).toContain('headers="(request-target) date host content-type"')
- })
-
- it('contains signature', () => {
- expect(httpSignature).toContain('signature="' + signatureB64 + '"')
- })
- })
- })
-
- describe('verifySignature', () => {
- let httpSignature
-
- beforeEach(() => {
- httpSignature = createSignature({
- privateKey,
- keyId: 'http://localhost:4001/activitypub/users/test-user#main-key',
- url: 'https://democracy-app.de/activitypub/users/max/inbox',
- headers,
- passphrase,
- })
- const body = {
- publicKey: {
- id: 'https://localhost:4001/activitypub/users/test-user#main-key',
- owner: 'https://localhost:4001/activitypub/users/test-user',
- publicKeyPem: publicKey,
- },
- }
-
- const mockedRequest = jest.fn((_, callback) => callback(null, null, JSON.stringify(body)))
- request.mockImplementation(mockedRequest)
- })
-
- it('resolves false', async () => {
- await expect(
- verifySignature('https://democracy-app.de/activitypub/users/max/inbox', headers),
- ).resolves.toEqual(false)
- })
-
- describe('valid signature', () => {
- beforeEach(() => {
- headers.Signature = httpSignature
- })
-
- it('resolves true', async () => {
- await expect(
- verifySignature('https://democracy-app.de/activitypub/users/max/inbox', headers),
- ).resolves.toEqual(true)
- })
- })
- })
-})
diff --git a/backend/src/activitypub/security/index.js b/backend/src/activitypub/security/index.js
deleted file mode 100644
index 399bc7d9b..000000000
--- a/backend/src/activitypub/security/index.js
+++ /dev/null
@@ -1,172 +0,0 @@
-// import dotenv from 'dotenv'
-// import { resolve } from 'path'
-import crypto from 'crypto'
-import request from 'request'
-import CONFIG from './../../config'
-const debug = require('debug')('ea:security')
-
-// TODO Does this reference a local config? Why?
-// dotenv.config({ path: resolve('src', 'activitypub', '.env') })
-
-export function generateRsaKeyPair(options = {}) {
- const { passphrase = CONFIG.PRIVATE_KEY_PASSPHRASE } = options
- return crypto.generateKeyPairSync('rsa', {
- modulusLength: 4096,
- publicKeyEncoding: {
- type: 'spki',
- format: 'pem',
- },
- privateKeyEncoding: {
- type: 'pkcs8',
- format: 'pem',
- cipher: 'aes-256-cbc',
- passphrase,
- },
- })
-}
-
-// signing
-export function createSignature(options) {
- const {
- privateKey,
- keyId,
- url,
- headers = {},
- algorithm = 'rsa-sha256',
- passphrase = CONFIG.PRIVATE_KEY_PASSPHRASE,
- } = options
- if (!SUPPORTED_HASH_ALGORITHMS.includes(algorithm)) {
- throw Error(`SIGNING: Unsupported hashing algorithm = ${algorithm}`)
- }
- const signer = crypto.createSign(algorithm)
- const signingString = constructSigningString(url, headers)
- signer.update(signingString)
- const signatureB64 = signer.sign({ key: privateKey, passphrase }, 'base64')
- const headersString = Object.keys(headers).reduce((result, key) => {
- return result + ' ' + key.toLowerCase()
- }, '')
- return `keyId="${keyId}",algorithm="${algorithm}",headers="(request-target)${headersString}",signature="${signatureB64}"`
-}
-
-// verifying
-export function verifySignature(url, headers) {
- return new Promise((resolve, reject) => {
- const signatureHeader = headers.signature ? headers.signature : headers.Signature
- if (!signatureHeader) {
- debug('No Signature header present!')
- resolve(false)
- }
- debug(`Signature Header = ${signatureHeader}`)
- const signature = extractKeyValueFromSignatureHeader(signatureHeader, 'signature')
- const algorithm = extractKeyValueFromSignatureHeader(signatureHeader, 'algorithm')
- const headersString = extractKeyValueFromSignatureHeader(signatureHeader, 'headers')
- const keyId = extractKeyValueFromSignatureHeader(signatureHeader, 'keyId')
-
- if (!SUPPORTED_HASH_ALGORITHMS.includes(algorithm)) {
- debug('Unsupported hash algorithm specified!')
- resolve(false)
- }
-
- const usedHeaders = headersString.split(' ')
- const verifyHeaders = {}
- Object.keys(headers).forEach((key) => {
- if (usedHeaders.includes(key.toLowerCase())) {
- verifyHeaders[key.toLowerCase()] = headers[key]
- }
- })
- const signingString = constructSigningString(url, verifyHeaders)
- debug(`keyId= ${keyId}`)
- request(
- {
- url: keyId,
- headers: {
- Accept: 'application/json',
- },
- },
- (err, response, body) => {
- if (err) reject(err)
- debug(`body = ${body}`)
- const actor = JSON.parse(body)
- const publicKeyPem = actor.publicKey.publicKeyPem
- resolve(httpVerify(publicKeyPem, signature, signingString, algorithm))
- },
- )
- })
-}
-
-// private: signing
-function constructSigningString(url, headers) {
- const urlObj = new URL(url)
- const signingString = `(request-target): post ${urlObj.pathname}${
- urlObj.search !== '' ? urlObj.search : ''
- }`
- return Object.keys(headers).reduce((result, key) => {
- return result + `\n${key.toLowerCase()}: ${headers[key]}`
- }, signingString)
-}
-
-// private: verifying
-function httpVerify(pubKey, signature, signingString, algorithm) {
- if (!SUPPORTED_HASH_ALGORITHMS.includes(algorithm)) {
- throw Error(`SIGNING: Unsupported hashing algorithm = ${algorithm}`)
- }
- const verifier = crypto.createVerify(algorithm)
- verifier.update(signingString)
- return verifier.verify(pubKey, signature, 'base64')
-}
-
-// private: verifying
-// This function can be used to extract the signature,headers,algorithm etc. out of the Signature Header.
-// Just pass what you want as key
-function extractKeyValueFromSignatureHeader(signatureHeader, key) {
- const keyString = signatureHeader.split(',').filter((el) => {
- return !!el.startsWith(key)
- })[0]
-
- let firstEqualIndex = keyString.search('=')
- // When headers are requested add 17 to the index to remove "(request-target) " from the string
- if (key === 'headers') {
- firstEqualIndex += 17
- }
- return keyString.substring(firstEqualIndex + 2, keyString.length - 1)
-}
-
-// Obtained from invoking crypto.getHashes()
-export const SUPPORTED_HASH_ALGORITHMS = [
- 'rsa-md4',
- 'rsa-md5',
- 'rsa-mdC2',
- 'rsa-ripemd160',
- 'rsa-sha1',
- 'rsa-sha1-2',
- 'rsa-sha224',
- 'rsa-sha256',
- 'rsa-sha384',
- 'rsa-sha512',
- 'blake2b512',
- 'blake2s256',
- 'md4',
- 'md4WithRSAEncryption',
- 'md5',
- 'md5-sha1',
- 'md5WithRSAEncryption',
- 'mdc2',
- 'mdc2WithRSA',
- 'ripemd',
- 'ripemd160',
- 'ripemd160WithRSA',
- 'rmd160',
- 'sha1',
- 'sha1WithRSAEncryption',
- 'sha224',
- 'sha224WithRSAEncryption',
- 'sha256',
- 'sha256WithRSAEncryption',
- 'sha384',
- 'sha384WithRSAEncryption',
- 'sha512',
- 'sha512WithRSAEncryption',
- 'ssl3-md5',
- 'ssl3-sha1',
- 'whirlpool',
-]
diff --git a/backend/src/activitypub/utils/activity.js b/backend/src/activitypub/utils/activity.js
deleted file mode 100644
index 2199361d8..000000000
--- a/backend/src/activitypub/utils/activity.js
+++ /dev/null
@@ -1,117 +0,0 @@
-import { activityPub } from '../ActivityPub'
-import { throwErrorIfApolloErrorOccurred } from './index'
-// import { signAndSend, throwErrorIfApolloErrorOccurred } from './index'
-
-import crypto from 'crypto'
-// import as from 'activitystrea.ms'
-import gql from 'graphql-tag'
-// const debug = require('debug')('ea:utils:activity')
-
-export function createNoteObject(text, name, id, published) {
- const createUuid = crypto.randomBytes(16).toString('hex')
-
- return {
- '@context': 'https://www.w3.org/ns/activitystreams',
- id: `${activityPub.endpoint}/activitypub/users/${name}/status/${createUuid}`,
- type: 'Create',
- actor: `${activityPub.endpoint}/activitypub/users/${name}`,
- object: {
- id: `${activityPub.endpoint}/activitypub/users/${name}/status/${id}`,
- type: 'Note',
- published: published,
- attributedTo: `${activityPub.endpoint}/activitypub/users/${name}`,
- content: text,
- to: 'https://www.w3.org/ns/activitystreams#Public',
- },
- }
-}
-
-export async function createArticleObject(activityId, objectId, text, name, id, published) {
- const actorId = await getActorId(name)
-
- return {
- '@context': 'https://www.w3.org/ns/activitystreams',
- id: `${activityId}`,
- type: 'Create',
- actor: `${actorId}`,
- object: {
- id: `${objectId}`,
- type: 'Article',
- published: published,
- attributedTo: `${actorId}`,
- content: text,
- to: 'https://www.w3.org/ns/activitystreams#Public',
- },
- }
-}
-
-export async function getActorId(name) {
- const result = await activityPub.dataSource.client.query({
- query: gql`
- query {
- User(slug: "${name}") {
- actorId
- }
- }
- `,
- })
- throwErrorIfApolloErrorOccurred(result)
- if (Array.isArray(result.data.User) && result.data.User[0]) {
- return result.data.User[0].actorId
- } else {
- throw Error(`No user with name: ${name}`)
- }
-}
-
-// export function sendAcceptActivity(theBody, name, targetDomain, url) {
-// as.accept()
-// .id(
-// `${activityPub.endpoint}/activitypub/users/${name}/status/` +
-// crypto.randomBytes(16).toString('hex'),
-// )
-// .actor(`${activityPub.endpoint}/activitypub/users/${name}`)
-// .object(theBody)
-// .prettyWrite((err, doc) => {
-// if (!err) {
-// return signAndSend(doc, name, targetDomain, url)
-// } else {
-// debug(`error serializing Accept object: ${err}`)
-// throw new Error('error serializing Accept object')
-// }
-// })
-// }
-
-// export function sendRejectActivity(theBody, name, targetDomain, url) {
-// as.reject()
-// .id(
-// `${activityPub.endpoint}/activitypub/users/${name}/status/` +
-// crypto.randomBytes(16).toString('hex'),
-// )
-// .actor(`${activityPub.endpoint}/activitypub/users/${name}`)
-// .object(theBody)
-// .prettyWrite((err, doc) => {
-// if (!err) {
-// return signAndSend(doc, name, targetDomain, url)
-// } else {
-// debug(`error serializing Accept object: ${err}`)
-// throw new Error('error serializing Accept object')
-// }
-// })
-// }
-
-export function isPublicAddressed(postObject) {
- if (typeof postObject.to === 'string') {
- postObject.to = [postObject.to]
- }
- if (typeof postObject === 'string') {
- postObject.to = [postObject]
- }
- if (Array.isArray(postObject)) {
- postObject.to = postObject
- }
- return (
- postObject.to.includes('Public') ||
- postObject.to.includes('as:Public') ||
- postObject.to.includes('https://www.w3.org/ns/activitystreams#Public')
- )
-}
diff --git a/backend/src/activitypub/utils/actor.js b/backend/src/activitypub/utils/actor.js
deleted file mode 100644
index e07397bdc..000000000
--- a/backend/src/activitypub/utils/actor.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { activityPub } from '../ActivityPub'
-
-export function createActor(name, pubkey) {
- return {
- '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'],
- id: `${activityPub.endpoint}/activitypub/users/${name}`,
- type: 'Person',
- preferredUsername: `${name}`,
- name: `${name}`,
- following: `${activityPub.endpoint}/activitypub/users/${name}/following`,
- followers: `${activityPub.endpoint}/activitypub/users/${name}/followers`,
- inbox: `${activityPub.endpoint}/activitypub/users/${name}/inbox`,
- outbox: `${activityPub.endpoint}/activitypub/users/${name}/outbox`,
- url: `${activityPub.endpoint}/activitypub/@${name}`,
- endpoints: {
- sharedInbox: `${activityPub.endpoint}/activitypub/inbox`,
- },
- publicKey: {
- id: `${activityPub.endpoint}/activitypub/users/${name}#main-key`,
- owner: `${activityPub.endpoint}/activitypub/users/${name}`,
- publicKeyPem: pubkey,
- },
- }
-}
diff --git a/backend/src/activitypub/utils/collection.js b/backend/src/activitypub/utils/collection.js
deleted file mode 100644
index 9cb71fe39..000000000
--- a/backend/src/activitypub/utils/collection.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import { activityPub } from '../ActivityPub'
-import { constructIdFromName } from './index'
-const debug = require('debug')('ea:utils:collections')
-
-export function createOrderedCollection(name, collectionName) {
- return {
- '@context': 'https://www.w3.org/ns/activitystreams',
- id: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}`,
- summary: `${name}s ${collectionName} collection`,
- type: 'OrderedCollection',
- first: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}?page=true`,
- totalItems: 0,
- }
-}
-
-export function createOrderedCollectionPage(name, collectionName) {
- return {
- '@context': 'https://www.w3.org/ns/activitystreams',
- id: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}?page=true`,
- summary: `${name}s ${collectionName} collection`,
- type: 'OrderedCollectionPage',
- totalItems: 0,
- partOf: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}`,
- orderedItems: [],
- }
-}
-export function sendCollection(collectionName, req, res) {
- const name = req.params.name
- const id = constructIdFromName(name)
-
- switch (collectionName) {
- case 'followers':
- attachThenCatch(activityPub.collections.getFollowersCollection(id), res)
- break
-
- case 'followersPage':
- attachThenCatch(activityPub.collections.getFollowersCollectionPage(id), res)
- break
-
- case 'following':
- attachThenCatch(activityPub.collections.getFollowingCollection(id), res)
- break
-
- case 'followingPage':
- attachThenCatch(activityPub.collections.getFollowingCollectionPage(id), res)
- break
-
- case 'outbox':
- attachThenCatch(activityPub.collections.getOutboxCollection(id), res)
- break
-
- case 'outboxPage':
- attachThenCatch(activityPub.collections.getOutboxCollectionPage(id), res)
- break
-
- default:
- res.status(500).end()
- }
-}
-
-function attachThenCatch(promise, res) {
- return promise
- .then((collection) => {
- res.status(200).contentType('application/activity+json').send(collection)
- })
- .catch((err) => {
- debug(`error getting a Collection: = ${err}`)
- res.status(500).end()
- })
-}
diff --git a/backend/src/activitypub/utils/index.js b/backend/src/activitypub/utils/index.js
deleted file mode 100644
index aa3ff2101..000000000
--- a/backend/src/activitypub/utils/index.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import { activityPub } from '../ActivityPub'
-import gql from 'graphql-tag'
-import { createSignature } from '../security'
-import request from 'request'
-import CONFIG from './../../config'
-const debug = require('debug')('ea:utils')
-
-export function extractNameFromId(uri) {
- const urlObject = new URL(uri)
- const pathname = urlObject.pathname
- const splitted = pathname.split('/')
-
- return splitted[splitted.indexOf('users') + 1]
-}
-
-export function extractIdFromActivityId(uri) {
- const urlObject = new URL(uri)
- const pathname = urlObject.pathname
- const splitted = pathname.split('/')
-
- return splitted[splitted.indexOf('status') + 1]
-}
-export function constructIdFromName(name, fromDomain = activityPub.endpoint) {
- return `${fromDomain}/activitypub/users/${name}`
-}
-
-export function extractDomainFromUrl(url) {
- return new URL(url).host
-}
-
-export function throwErrorIfApolloErrorOccurred(result) {
- if (result.error && (result.error.message || result.error.errors)) {
- throw new Error(
- `${result.error.message ? result.error.message : result.error.errors[0].message}`,
- )
- }
-}
-
-export function signAndSend(activity, fromName, targetDomain, url) {
- // fix for development: replace with http
- url = url.indexOf('localhost') > -1 ? url.replace('https', 'http') : url
- debug(`passhprase = ${CONFIG.PRIVATE_KEY_PASSPHRASE}`)
- return new Promise((resolve, reject) => {
- debug('inside signAndSend')
- // get the private key
- activityPub.dataSource.client
- .query({
- query: gql`
- query {
- User(slug: "${fromName}") {
- privateKey
- }
- }
- `,
- })
- .then((result) => {
- if (result.error) {
- reject(result.error)
- } else {
- // add security context
- const parsedActivity = JSON.parse(activity)
- if (Array.isArray(parsedActivity['@context'])) {
- parsedActivity['@context'].push('https://w3id.org/security/v1')
- } else {
- const context = [parsedActivity['@context']]
- context.push('https://w3id.org/security/v1')
- parsedActivity['@context'] = context
- }
-
- // deduplicate context strings
- parsedActivity['@context'] = [...new Set(parsedActivity['@context'])]
- const privateKey = result.data.User[0].privateKey
- const date = new Date().toUTCString()
-
- debug(`url = ${url}`)
- request(
- {
- url: url,
- headers: {
- Host: targetDomain,
- Date: date,
- Signature: createSignature({
- privateKey,
- keyId: `${activityPub.endpoint}/activitypub/users/${fromName}#main-key`,
- url,
- headers: {
- Host: targetDomain,
- Date: date,
- 'Content-Type': 'application/activity+json',
- },
- }),
- 'Content-Type': 'application/activity+json',
- },
- method: 'POST',
- body: JSON.stringify(parsedActivity),
- },
- (error, response) => {
- if (error) {
- debug(`Error = ${JSON.stringify(error, null, 2)}`)
- reject(error)
- } else {
- debug('Response Headers:', JSON.stringify(response.headers, null, 2))
- debug('Response Body:', JSON.stringify(response.body, null, 2))
- resolve()
- }
- },
- )
- }
- })
- })
-}
diff --git a/backend/src/config/emails.js b/backend/src/config/emails.ts
similarity index 100%
rename from backend/src/config/emails.js
rename to backend/src/config/emails.ts
diff --git a/backend/src/config/index.js b/backend/src/config/index.ts
similarity index 77%
rename from backend/src/config/index.js
rename to backend/src/config/index.ts
index 7df780cfc..9f03622a5 100644
--- a/backend/src/config/index.js
+++ b/backend/src/config/index.ts
@@ -1,6 +1,6 @@
import dotenv from 'dotenv'
-import emails from './emails.js'
-import metadata from './metadata.js'
+import emails from './emails'
+import metadata from './metadata'
// Load env file
if (require.resolve) {
@@ -15,10 +15,11 @@ if (require.resolve) {
}
// 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.NODE_ENV,
+ 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',
@@ -39,6 +40,8 @@ const server = {
JWT_EXPIRES: env.JWT_EXPIRES || '2y',
}
+const hasDKIMData = env.SMTP_DKIM_DOMAINNAME && env.SMTP_DKIM_KEYSELECTOR && env.SMTP_DKIM_PRIVATKEY
+
const smtp = {
SMTP_HOST: env.SMTP_HOST,
SMTP_PORT: env.SMTP_PORT,
@@ -46,6 +49,10 @@ const smtp = {
SMTP_SECURE: env.SMTP_SECURE === 'true',
SMTP_USERNAME: env.SMTP_USERNAME,
SMTP_PASSWORD: env.SMTP_PASSWORD,
+ SMTP_DKIM_DOMAINNAME: hasDKIMData && env.SMTP_DKIM_DOMAINNAME,
+ SMTP_DKIM_KEYSELECTOR: hasDKIMData && env.SMTP_DKIM_KEYSELECTOR,
+ // PEM format: https://docs.progress.com/bundle/datadirect-hybrid-data-pipeline-installation-46/page/PEM-file-format.html
+ SMTP_DKIM_PRIVATKEY: hasDKIMData && env.SMTP_DKIM_PRIVATKEY.replace(/\\n/g, '\n'), // replace all "\n" in .env string by real line break
}
const neo4j = {
@@ -90,14 +97,12 @@ const options = {
}
// Check if all required configs are present
-if (require.resolve) {
- // are we in a nodejs environment?
- Object.entries(required).map((entry) => {
- if (!entry[1]) {
- throw new Error(`ERROR: "${entry[0]}" env variable is missing.`)
- }
- })
-}
+Object.entries(required).map((entry) => {
+ if (!entry[1]) {
+ throw new Error(`ERROR: "${entry[0]}" env variable is missing.`)
+ }
+ return entry
+})
export default {
...environment,
diff --git a/backend/src/config/logos.js b/backend/src/config/logos.ts
similarity index 76%
rename from backend/src/config/logos.js
rename to backend/src/config/logos.ts
index d093c7b46..41b83b30c 100644
--- a/backend/src/config/logos.js
+++ b/backend/src/config/logos.ts
@@ -1,4 +1,4 @@
-// this file is duplicated in `backend/src/config/logos.js` and `webapp/constants/logos.js` and replaced on rebranding
+// 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',
diff --git a/backend/src/config/metadata.js b/backend/src/config/metadata.ts
similarity index 69%
rename from backend/src/config/metadata.js
rename to backend/src/config/metadata.ts
index d40308e80..282fcb655 100644
--- a/backend/src/config/metadata.js
+++ b/backend/src/config/metadata.ts
@@ -1,4 +1,4 @@
-// this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding
+// 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',
diff --git a/backend/src/constants/categories.js b/backend/src/constants/categories.ts
similarity index 95%
rename from backend/src/constants/categories.js
rename to backend/src/constants/categories.ts
index 0d61a041a..6365d268a 100644
--- a/backend/src/constants/categories.js
+++ b/backend/src/constants/categories.ts
@@ -1,4 +1,4 @@
-// this file is duplicated in `backend/src/constants/metadata.js` and `webapp/constants/metadata.js`
+// this file is duplicated in `backend/src/constants/metadata` and `webapp/constants/metadata.js`
export const CATEGORIES_MIN = 1
export const CATEGORIES_MAX = 3
diff --git a/backend/src/constants/groups.js b/backend/src/constants/groups.ts
similarity index 62%
rename from backend/src/constants/groups.js
rename to backend/src/constants/groups.ts
index aec19eac5..b1c305add 100644
--- a/backend/src/constants/groups.js
+++ b/backend/src/constants/groups.ts
@@ -1,3 +1,3 @@
-// this file is duplicated in `backend/src/constants/group.js` and `webapp/constants/group.js`
+// 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/backend/src/constants/registration.js b/backend/src/constants/registration.js
deleted file mode 100644
index 9e63e478e..000000000
--- a/backend/src/constants/registration.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// 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/backend/src/constants/registration.ts b/backend/src/constants/registration.ts
new file mode 100644
index 000000000..a08be3521
--- /dev/null
+++ b/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/backend/src/db/clean.js b/backend/src/db/clean.ts
similarity index 100%
rename from backend/src/db/clean.js
rename to backend/src/db/clean.ts
diff --git a/backend/src/db/compiler.ts b/backend/src/db/compiler.ts
new file mode 100644
index 000000000..8b09ac9c3
--- /dev/null
+++ b/backend/src/db/compiler.ts
@@ -0,0 +1,2 @@
+const tsNode = require('ts-node')
+module.exports = tsNode.register
diff --git a/backend/src/db/factories.js b/backend/src/db/factories.ts
similarity index 97%
rename from backend/src/db/factories.js
rename to backend/src/db/factories.ts
index 44af5bbea..4ec34e289 100644
--- a/backend/src/db/factories.js
+++ b/backend/src/db/factories.ts
@@ -2,10 +2,10 @@ 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 { faker } from '@faker-js/faker'
import { getDriver, getNeode } from './neo4j'
-import CONFIG from '../config/index.js'
-import generateInviteCode from '../schema/resolvers/helpers/generateInviteCode.js'
+import CONFIG from '../config/index'
+import generateInviteCode from '../schema/resolvers/helpers/generateInviteCode'
const neode = getNeode()
@@ -15,7 +15,7 @@ const uniqueImageUrl = (imageUrl) => {
return newUrl.toString()
}
-export const cleanDatabase = async (options = {}) => {
+export const cleanDatabase = async (options: any = {}) => {
const { driver = getDriver() } = options
const session = driver.session()
try {
@@ -63,7 +63,7 @@ Factory.define('basicUser')
.option('password', '1234')
.attrs({
id: uuid,
- name: faker.name.findName,
+ name: faker.name.fullName,
password: '1234',
role: 'user',
termsAndConditionsAgreedVersion: '0.0.1',
@@ -165,7 +165,7 @@ Factory.define('post')
})
.after(async (buildObject, options) => {
const [post, author, image, /* categories, */ tags] = await Promise.all([
- neode.create('Post', buildObject),
+ neode.create('Article', buildObject),
options.author,
options.image,
// options.categories,
diff --git a/backend/src/db/migrate/store.js b/backend/src/db/migrate/store.ts
similarity index 100%
rename from backend/src/db/migrate/store.js
rename to backend/src/db/migrate/store.ts
diff --git a/backend/src/db/migrate/template.js b/backend/src/db/migrate/template.ts
similarity index 100%
rename from backend/src/db/migrate/template.js
rename to backend/src/db/migrate/template.ts
diff --git a/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.js b/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.ts
similarity index 96%
rename from backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.js
rename to backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.ts
index 0914d6b22..7d98d9dcc 100644
--- a/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.js
+++ b/backend/src/db/migrations-examples/20200123150105-merge_duplicate_user_accounts.ts
@@ -18,13 +18,13 @@ export function up(next) {
rxSession
.beginTransaction()
.pipe(
- flatMap((txc) =>
+ flatMap((txc: any) =>
concat(
txc
.run('MATCH (email:EmailAddress) RETURN email {.email}')
.records()
.pipe(
- map((record) => {
+ map((record: any) => {
const { email } = record.get('email')
const normalizedEmail = normalizeEmail(email)
return { email, normalizedEmail }
@@ -45,7 +45,7 @@ export function up(next) {
)
.records()
.pipe(
- map((r) => ({
+ map((r: any) => ({
oldEmail: email,
email: r.get('email'),
user: r.get('user'),
diff --git a/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.js b/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.ts
similarity index 95%
rename from backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.js
rename to backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.ts
index 66560ec51..10b77c6dd 100644
--- a/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.js
+++ b/backend/src/db/migrations-examples/20200123150110-merge_duplicate_location_nodes.ts
@@ -12,7 +12,7 @@ export function up(next) {
rxSession
.beginTransaction()
.pipe(
- flatMap((transaction) =>
+ flatMap((transaction: any) =>
concat(
transaction
.run(
@@ -23,7 +23,7 @@ export function up(next) {
)
.records()
.pipe(
- map((record) => {
+ map((record: any) => {
const { id: locationId } = record.get('location')
return { locationId }
}),
@@ -40,7 +40,7 @@ export function up(next) {
)
.records()
.pipe(
- map((record) => ({
+ map((record: any) => ({
location: record.get('location'),
updatedLocation: record.get('updatedLocation'),
})),
diff --git a/backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.js b/backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.js
rename to backend/src/db/migrations-examples/20200127110135-create_muted_relationship_between_existing_blocked_relationships.ts
diff --git a/backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.js b/backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.js
rename to backend/src/db/migrations-examples/20200206190233-swap_latitude_with_longitude.ts
diff --git a/backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.js b/backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.js
rename to backend/src/db/migrations-examples/20200207080200-fulltext_index_for_tags.ts
diff --git a/backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.js b/backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.js
rename to backend/src/db/migrations-examples/20200213230248-add_unique_index_to_image_url.ts
diff --git a/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.js b/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.ts
similarity index 98%
rename from backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.js
rename to backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.ts
index ee9aba023..356004237 100644
--- a/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.js
+++ b/backend/src/db/migrations-examples/20200312140328-bulk_upload_to_s3.ts
@@ -3,7 +3,7 @@ import { existsSync, createReadStream } from 'fs'
import path from 'path'
import { S3 } from 'aws-sdk'
import mime from 'mime-types'
-import { s3Configs } from '../../config'
+import s3Configs from '../../config'
import https from 'https'
export const description = `
diff --git a/backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.js b/backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.js
rename to backend/src/db/migrations-examples/20200320200315-refactor_all_images_to_separate_type.ts
diff --git a/backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.js b/backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.js
rename to backend/src/db/migrations-examples/20200323140300-remove_deleted_users_obsolete_attributes.ts
diff --git a/backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.js b/backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.js
rename to backend/src/db/migrations-examples/20200323160336-remove_deleted_posts_obsolete_attributes.ts
diff --git a/backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.js b/backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.ts
similarity index 100%
rename from backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.js
rename to backend/src/db/migrations-examples/20200326160326-remove_dangling_image_urls.ts
diff --git a/backend/src/db/migrations/1613589876420-null_mutation.js b/backend/src/db/migrations/1613589876420-null_mutation.ts
similarity index 100%
rename from backend/src/db/migrations/1613589876420-null_mutation.js
rename to backend/src/db/migrations/1613589876420-null_mutation.ts
diff --git a/backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.js b/backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.ts
similarity index 100%
rename from backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.js
rename to backend/src/db/migrations/1614023644903-add-clickedCount-to-posts.ts
diff --git a/backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.js b/backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.ts
similarity index 100%
rename from backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.js
rename to backend/src/db/migrations/1614177130817-add-viewedTeaserCount-to-posts.ts
diff --git a/backend/src/db/migrations/20210506150512-add-donations-node.js b/backend/src/db/migrations/20210506150512-add-donations-node.ts
similarity index 100%
rename from backend/src/db/migrations/20210506150512-add-donations-node.js
rename to backend/src/db/migrations/20210506150512-add-donations-node.ts
diff --git a/backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.js b/backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.ts
similarity index 100%
rename from backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.js
rename to backend/src/db/migrations/20210923140939-add-sendNotificationEmails-property-to-all-users.ts
diff --git a/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js b/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.ts
similarity index 86%
rename from backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js
rename to backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.ts
index b87e5632a..63e40c72b 100644
--- a/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.js
+++ b/backend/src/db/migrations/20220803060819-create_fulltext_indices_and_unique_keys_for_groups.ts
@@ -11,13 +11,13 @@ export async function up(next) {
const transaction = session.beginTransaction()
try {
- // Implement your migration here.
- 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
- `)
+ // 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"])
`)
diff --git a/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js b/backend/src/db/migrations/20230320130345-fulltext-search-indexes.ts
similarity index 99%
rename from backend/src/db/migrations/20230320130345-fulltext-search-indexes.js
rename to backend/src/db/migrations/20230320130345-fulltext-search-indexes.ts
index 11029bea6..40ebc6c2e 100644
--- a/backend/src/db/migrations/20230320130345-fulltext-search-indexes.js
+++ b/backend/src/db/migrations/20230320130345-fulltext-search-indexes.ts
@@ -10,7 +10,7 @@ export async function up(next) {
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('indexName'))
+ 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")`)
}
diff --git a/backend/src/db/migrations/20230329150329-article-label-for-posts.ts b/backend/src/db/migrations/20230329150329-article-label-for-posts.ts
new file mode 100644
index 000000000..3cf435203
--- /dev/null
+++ b/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/backend/src/db/migrations/20230608130637-add-postType-property.ts b/backend/src/db/migrations/20230608130637-add-postType-property.ts
new file mode 100644
index 000000000..433577715
--- /dev/null
+++ b/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/backend/src/db/neo4j.js b/backend/src/db/neo4j.ts
similarity index 94%
rename from backend/src/db/neo4j.js
rename to backend/src/db/neo4j.ts
index 6d46a0279..78b52237e 100644
--- a/backend/src/db/neo4j.js
+++ b/backend/src/db/neo4j.ts
@@ -23,6 +23,7 @@ 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/backend/src/db/seed.js b/backend/src/db/seed.js
deleted file mode 100644
index 8339e48a8..000000000
--- a/backend/src/db/seed.js
+++ /dev/null
@@ -1,1513 +0,0 @@
-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 { 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)
-
- const [Hamburg, Berlin, Germany, Paris, France] = await Promise.all([
- 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: 'Гамбург',
- }),
- 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: 'Берлин',
- }),
- 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: 'Германия',
- }),
- 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: 'Париж',
- }),
- 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 Promise.all([
- Berlin.relateTo(Germany, 'isIn'),
- Hamburg.relateTo(Germany, 'isIn'),
- Paris.relateTo(France, 'isIn'),
- ])
-
- const [racoon, rabbit, wolf, bear, turtle, rhino] = await Promise.all([
- Factory.build('badge', {
- id: 'indiegogo_en_racoon',
- icon: '/img/badges/indiegogo_en_racoon.svg',
- }),
- Factory.build('badge', {
- id: 'indiegogo_en_rabbit',
- icon: '/img/badges/indiegogo_en_rabbit.svg',
- }),
- Factory.build('badge', {
- id: 'indiegogo_en_wolf',
- icon: '/img/badges/indiegogo_en_wolf.svg',
- }),
- Factory.build('badge', {
- id: 'indiegogo_en_bear',
- icon: '/img/badges/indiegogo_en_bear.svg',
- }),
- Factory.build('badge', {
- id: 'indiegogo_en_turtle',
- icon: '/img/badges/indiegogo_en_turtle.svg',
- }),
- Factory.build('badge', {
- id: 'indiegogo_en_rhino',
- icon: '/img/badges/indiegogo_en_rhino.svg',
- }),
- ])
-
- const [peterLustig, bobDerBaumeister, jennyRostock, huey, dewey, louie, dagobert] =
- await Promise.all([
- Factory.build(
- 'user',
- {
- id: 'u1',
- name: 'Peter Lustig',
- slug: 'peter-lustig',
- role: 'admin',
- },
- {
- email: 'admin@example.org',
- },
- ),
- Factory.build(
- 'user',
- {
- id: 'u2',
- name: 'Bob der Baumeister',
- slug: 'bob-der-baumeister',
- role: 'moderator',
- },
- {
- email: 'moderator@example.org',
- },
- ),
- Factory.build(
- 'user',
- {
- id: 'u3',
- name: 'Jenny Rostock',
- slug: 'jenny-rostock',
- role: 'user',
- },
- {
- email: 'user@example.org',
- },
- ),
- Factory.build(
- 'user',
- {
- id: 'u4',
- name: 'Huey',
- slug: 'huey',
- role: 'user',
- },
- {
- email: 'huey@example.org',
- },
- ),
- Factory.build(
- 'user',
- {
- id: 'u5',
- name: 'Dewey',
- slug: 'dewey',
- role: 'user',
- },
- {
- email: 'dewey@example.org',
- },
- ),
- Factory.build(
- 'user',
- {
- id: 'u6',
- name: 'Louie',
- slug: 'louie',
- role: 'user',
- },
- {
- email: 'louie@example.org',
- },
- ),
- Factory.build(
- 'user',
- {
- id: 'u7',
- name: 'Dagobert',
- slug: 'dagobert',
- role: 'user',
- },
- {
- email: 'dagobert@example.org',
- },
- ),
- ])
-
- await Promise.all([
- peterLustig.relateTo(Berlin, 'isIn'),
- bobDerBaumeister.relateTo(Hamburg, 'isIn'),
- jennyRostock.relateTo(Paris, 'isIn'),
- huey.relateTo(Paris, 'isIn'),
- ])
-
- await Promise.all([
- peterLustig.relateTo(racoon, 'rewarded'),
- peterLustig.relateTo(rhino, 'rewarded'),
- peterLustig.relateTo(wolf, 'rewarded'),
- bobDerBaumeister.relateTo(racoon, 'rewarded'),
- bobDerBaumeister.relateTo(turtle, 'rewarded'),
- jennyRostock.relateTo(bear, 'rewarded'),
- dagobert.relateTo(rabbit, 'rewarded'),
-
- peterLustig.relateTo(bobDerBaumeister, 'friends'),
- peterLustig.relateTo(jennyRostock, 'friends'),
- bobDerBaumeister.relateTo(jennyRostock, 'friends'),
-
- peterLustig.relateTo(jennyRostock, 'following'),
- peterLustig.relateTo(huey, 'following'),
- bobDerBaumeister.relateTo(huey, 'following'),
- jennyRostock.relateTo(huey, 'following'),
- huey.relateTo(dewey, 'following'),
- dewey.relateTo(huey, 'following'),
- louie.relateTo(jennyRostock, 'following'),
-
- huey.relateTo(dagobert, 'muted'),
- dewey.relateTo(dagobert, 'muted'),
- louie.relateTo(dagobert, 'muted'),
-
- dagobert.relateTo(huey, 'blocked'),
- dagobert.relateTo(dewey, 'blocked'),
- dagobert.relateTo(louie, 'blocked'),
- ])
-
- await Promise.all(
- categories.map(({ icon, name }, index) => {
- Factory.build('category', {
- id: `cat${index + 1}`,
- slug: name,
- name,
- icon,
- })
- }),
- )
-
- const [environment, nature, democracy, freedom] = await Promise.all([
- Factory.build('tag', {
- id: 'Environment',
- }),
- Factory.build('tag', {
- id: 'Nature',
- }),
- Factory.build('tag', {
- id: 'Democracy',
- }),
- Factory.build('tag', {
- id: 'Freedom',
- }),
- ])
-
- // Create Groups
-
- authenticatedUser = await peterLustig.toJson()
- await Promise.all([
- 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 Promise.all([
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g0',
- userId: 'u2',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g0',
- userId: 'u4',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g0',
- userId: 'u6',
- },
- }),
- ])
- await Promise.all([
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g0',
- userId: 'u2',
- roleInGroup: 'usual',
- },
- }),
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g0',
- userId: 'u4',
- roleInGroup: 'admin',
- },
- }),
- ])
-
- // post into group
- await Promise.all([
- 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 Promise.all([
- 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 Promise.all([
- 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 Promise.all([
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u1',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u2',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u5',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u6',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u7',
- },
- }),
- ])
- await Promise.all([
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u1',
- roleInGroup: 'usual',
- },
- }),
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u5',
- roleInGroup: 'admin',
- },
- }),
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g1',
- userId: 'u6',
- roleInGroup: 'owner',
- },
- }),
- ])
- // post into group
- await Promise.all([
- 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 Promise.all([
- 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 Promise.all([
- 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 Promise.all([
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u3',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u4',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u5',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u6',
- },
- }),
- mutate({
- mutation: joinGroupMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u7',
- },
- }),
- ])
- await Promise.all([
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u3',
- roleInGroup: 'usual',
- },
- }),
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u4',
- roleInGroup: 'pending',
- },
- }),
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u5',
- roleInGroup: 'admin',
- },
- }),
- mutate({
- mutation: changeGroupMemberRoleMutation(),
- variables: {
- groupId: 'g2',
- userId: 'u6',
- roleInGroup: 'usual',
- },
- }),
- ])
-
- authenticatedUser = await louie.toJson()
- await Promise.all([
- 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 Posts
-
- const [p0, p1, p3, p4, p5, p6, p9, p10, p11, p13, p14, p15] = await Promise.all([
- 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,
- }),
- },
- ),
- 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,
- }),
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p3',
- language: sample(languages),
- },
- {
- categoryIds: ['cat3'],
- author: huey,
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p4',
- language: sample(languages),
- },
- {
- categoryIds: ['cat4'],
- author: dewey,
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p5',
- language: sample(languages),
- },
- {
- categoryIds: ['cat5'],
- author: louie,
- },
- ),
- 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,
- }),
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p9',
- language: sample(languages),
- },
- {
- categoryIds: ['cat9'],
- author: huey,
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p10',
- },
- {
- categoryIds: ['cat10'],
- author: dewey,
- image: Factory.build('image', {
- sensitive: true,
- }),
- },
- ),
- 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,
- }),
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p13',
- language: sample(languages),
- },
- {
- categoryIds: ['cat13'],
- author: bobDerBaumeister,
- },
- ),
- 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,
- }),
- },
- ),
- Factory.build(
- 'post',
- {
- id: 'p15',
- language: sample(languages),
- },
- {
- categoryIds: ['cat15'],
- author: huey,
- },
- ),
- ])
-
- 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 Promise.all([
- mutate({
- mutation: createPostMutation(),
- variables: {
- id: 'p2',
- title: `Nature Philosophy Yoga`,
- content: hashtag1,
- categoryIds: ['cat2'],
- },
- }),
- mutate({
- mutation: createPostMutation(),
- variables: {
- id: 'p7',
- title: 'This is post #7',
- content: `${mention1} ${faker.lorem.paragraph()}`,
- categoryIds: ['cat7'],
- },
- }),
- mutate({
- mutation: createPostMutation(),
- variables: {
- id: 'p8',
- image: faker.image.unsplash.nature(),
- title: `Quantum Flow Theory explains Quantum Gravity`,
- content: hashtagAndMention1,
- categoryIds: ['cat8'],
- },
- }),
- mutate({
- mutation: createPostMutation(),
- variables: {
- id: 'p12',
- title: 'This is post #12',
- content: `${mention2} ${faker.lorem.paragraph()}`,
- categoryIds: ['cat12'],
- },
- }),
- ])
- const [p2, p7, p8, p12] = await Promise.all(
- ['p2', 'p7', 'p8', 'p12'].map((id) => neode.find('Post', id)),
- )
- 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 Promise.all([
- mutate({
- mutation: createCommentMutation,
- variables: {
- id: 'c4',
- postId: 'p2',
- content: mentionInComment1,
- },
- }),
- mutate({
- mutation: createCommentMutation,
- variables: {
- id: 'c4-1',
- postId: 'p2',
- content: mentionInComment2,
- },
- }),
- mutate({
- mutation: createCommentMutation,
- variables: {
- postId: 'p14',
- content: faker.lorem.paragraph(),
- },
- }), // should send a notification
- ])
- authenticatedUser = null
-
- const comments = await Promise.all([
- Factory.build(
- 'comment',
- {
- id: 'c1',
- },
- {
- author: jennyRostock,
- postId: 'p1',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c2',
- },
- {
- author: huey,
- postId: 'p1',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c3',
- },
- {
- author: louie,
- postId: 'p3',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c5',
- },
- {
- author: jennyRostock,
- postId: 'p3',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c6',
- },
- {
- author: peterLustig,
- postId: 'p4',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c7',
- },
- {
- author: jennyRostock,
- postId: 'p2',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c8',
- },
- {
- author: huey,
- postId: 'p15',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c9',
- },
- {
- author: dewey,
- postId: 'p15',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c10',
- },
- {
- author: louie,
- postId: 'p15',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c11',
- },
- {
- author: jennyRostock,
- postId: 'p15',
- },
- ),
- Factory.build(
- 'comment',
- {
- id: 'c12',
- },
- {
- author: jennyRostock,
- postId: 'p15',
- },
- ),
- ])
-
- const trollingComment = comments[0]
-
- await Promise.all([
- democracy.relateTo(p3, 'post'),
- democracy.relateTo(p11, 'post'),
- democracy.relateTo(p15, 'post'),
- democracy.relateTo(p7, 'post'),
- environment.relateTo(p1, 'post'),
- environment.relateTo(p5, 'post'),
- environment.relateTo(p9, 'post'),
- environment.relateTo(p13, 'post'),
- freedom.relateTo(p0, 'post'),
- freedom.relateTo(p4, 'post'),
- freedom.relateTo(p8, 'post'),
- freedom.relateTo(p12, 'post'),
- nature.relateTo(p2, 'post'),
- nature.relateTo(p6, 'post'),
- nature.relateTo(p10, 'post'),
- nature.relateTo(p14, 'post'),
- peterLustig.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- bobDerBaumeister.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- jennyRostock.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- huey.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- dewey.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- louie.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- dagobert.relateTo(p15, 'emoted', { emotion: 'surprised' }),
- bobDerBaumeister.relateTo(p14, 'emoted', { emotion: 'cry' }),
- jennyRostock.relateTo(p13, 'emoted', { emotion: 'angry' }),
- huey.relateTo(p12, 'emoted', { emotion: 'funny' }),
- dewey.relateTo(p11, 'emoted', { emotion: 'surprised' }),
- louie.relateTo(p10, 'emoted', { emotion: 'cry' }),
- dewey.relateTo(p9, 'emoted', { emotion: 'happy' }),
- huey.relateTo(p8, 'emoted', { emotion: 'angry' }),
- jennyRostock.relateTo(p7, 'emoted', { emotion: 'funny' }),
- bobDerBaumeister.relateTo(p6, 'emoted', { emotion: 'surprised' }),
- peterLustig.relateTo(p5, 'emoted', { emotion: 'cry' }),
- bobDerBaumeister.relateTo(p4, 'emoted', { emotion: 'happy' }),
- jennyRostock.relateTo(p3, 'emoted', { emotion: 'angry' }),
- huey.relateTo(p2, 'emoted', { emotion: 'funny' }),
- dewey.relateTo(p1, 'emoted', { emotion: 'surprised' }),
- louie.relateTo(p0, 'emoted', { emotion: 'cry' }),
- ])
-
- await Promise.all([
- peterLustig.relateTo(p1, 'shouted'),
- peterLustig.relateTo(p6, 'shouted'),
- bobDerBaumeister.relateTo(p0, 'shouted'),
- bobDerBaumeister.relateTo(p6, 'shouted'),
- jennyRostock.relateTo(p6, 'shouted'),
- jennyRostock.relateTo(p7, 'shouted'),
- huey.relateTo(p8, 'shouted'),
- huey.relateTo(p9, 'shouted'),
- dewey.relateTo(p10, 'shouted'),
- peterLustig.relateTo(p2, 'shouted'),
- peterLustig.relateTo(p6, 'shouted'),
- bobDerBaumeister.relateTo(p0, 'shouted'),
- bobDerBaumeister.relateTo(p6, 'shouted'),
- jennyRostock.relateTo(p6, 'shouted'),
- jennyRostock.relateTo(p7, 'shouted'),
- huey.relateTo(p8, 'shouted'),
- huey.relateTo(p9, 'shouted'),
- louie.relateTo(p10, 'shouted'),
- ])
-
- const reports = await Promise.all([
- Factory.build('report'),
- Factory.build('report'),
- Factory.build('report'),
- Factory.build('report'),
- ])
- const reportAgainstDagobert = reports[0]
- const reportAgainstTrollingPost = reports[1]
- const reportAgainstTrollingComment = reports[2]
- const reportAgainstDewey = reports[3]
-
- // report resource first time
- await Promise.all([
- reportAgainstDagobert.relateTo(jennyRostock, 'filed', {
- resourceId: 'u7',
- reasonCategory: 'discrimination_etc',
- reasonDescription: 'This user is harassing me with bigoted remarks!',
- }),
- reportAgainstDagobert.relateTo(dagobert, 'belongsTo'),
- reportAgainstTrollingPost.relateTo(jennyRostock, 'filed', {
- resourceId: 'p2',
- reasonCategory: 'doxing',
- reasonDescription: "This shouldn't be shown to anybody else! It's my private thing!",
- }),
- reportAgainstTrollingPost.relateTo(p2, 'belongsTo'),
- reportAgainstTrollingComment.relateTo(huey, 'filed', {
- resourceId: 'c1',
- reasonCategory: 'other',
- reasonDescription: 'This comment is bigoted',
- }),
- reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo'),
- reportAgainstDewey.relateTo(dagobert, 'filed', {
- resourceId: 'u5',
- reasonCategory: 'discrimination_etc',
- reasonDescription: 'This user is harassing me!',
- }),
- reportAgainstDewey.relateTo(dewey, 'belongsTo'),
- ])
-
- // report resource a second time
- await Promise.all([
- reportAgainstDagobert.relateTo(louie, 'filed', {
- resourceId: 'u7',
- reasonCategory: 'discrimination_etc',
- reasonDescription: 'this user is attacking me for who I am!',
- }),
- reportAgainstDagobert.relateTo(dagobert, 'belongsTo'),
- reportAgainstTrollingPost.relateTo(peterLustig, 'filed', {
- resourceId: 'p2',
- reasonCategory: 'discrimination_etc',
- reasonDescription: 'This post is bigoted',
- }),
- reportAgainstTrollingPost.relateTo(p2, 'belongsTo'),
-
- reportAgainstTrollingComment.relateTo(bobDerBaumeister, 'filed', {
- resourceId: 'c1',
- reasonCategory: 'pornographic_content_links',
- reasonDescription: 'This comment is porno!!!',
- }),
- reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo'),
- ])
-
- const disableVariables = {
- resourceId: 'undefined-resource',
- disable: true,
- closed: false,
- }
-
- // review resource first time
- await Promise.all([
- reportAgainstDagobert.relateTo(bobDerBaumeister, 'reviewed', {
- ...disableVariables,
- resourceId: 'u7',
- }),
- dagobert.update({ disabled: true, updatedAt: new Date().toISOString() }),
- reportAgainstTrollingPost.relateTo(peterLustig, 'reviewed', {
- ...disableVariables,
- resourceId: 'p2',
- }),
- p2.update({ disabled: true, updatedAt: new Date().toISOString() }),
- reportAgainstTrollingComment.relateTo(bobDerBaumeister, 'reviewed', {
- ...disableVariables,
- resourceId: 'c1',
- }),
- trollingComment.update({ disabled: true, updatedAt: new Date().toISOString() }),
- ])
-
- // second review of resource and close report
- await Promise.all([
- reportAgainstDagobert.relateTo(peterLustig, 'reviewed', {
- resourceId: 'u7',
- disable: false,
- closed: true,
- }),
- dagobert.update({ disabled: false, updatedAt: new Date().toISOString(), closed: true }),
- reportAgainstTrollingPost.relateTo(bobDerBaumeister, 'reviewed', {
- resourceId: 'p2',
- disable: true,
- closed: true,
- }),
- p2.update({ disabled: true, updatedAt: new Date().toISOString(), closed: true }),
- reportAgainstTrollingComment.relateTo(peterLustig, 'reviewed', {
- ...disableVariables,
- resourceId: 'c1',
- disable: true,
- closed: true,
- }),
- trollingComment.update({ disabled: true, updatedAt: new Date().toISOString(), closed: true }),
- ])
-
- const additionalUsers = await Promise.all(
- [...Array(30).keys()].map(() => Factory.build('user')),
- )
-
- await Promise.all(
- additionalUsers.map(async (user) => {
- await jennyRostock.relateTo(user, 'following')
- await user.relateTo(jennyRostock, 'following')
- }),
- )
-
- await Promise.all(
- [...Array(30).keys()].map((index) => Factory.build('user', { name: `Jenny${index}` })),
- )
-
- await Promise.all(
- [...Array(30).keys()].map(() =>
- Factory.build(
- 'post',
- { content: `Jenny ${faker.lorem.sentence()}` },
- {
- categoryIds: ['cat1'],
- author: jennyRostock,
- image: Factory.build('image', {
- url: faker.image.unsplash.objects(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(30).keys()].map(() =>
- Factory.build(
- 'post',
- {},
- {
- categoryIds: ['cat1'],
- author: jennyRostock,
- image: Factory.build('image', {
- url: faker.image.unsplash.objects(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(6).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: jennyRostock,
- postId: 'p2',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(4).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: jennyRostock,
- postId: 'p15',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(2).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: jennyRostock,
- postId: 'p4',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(21).keys()].map(() =>
- Factory.build(
- 'post',
- {},
- {
- categoryIds: ['cat1'],
- author: peterLustig,
- image: Factory.build('image', {
- url: faker.image.unsplash.buildings(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(3).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: peterLustig,
- postId: 'p4',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(3).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: peterLustig,
- postId: 'p14',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(6).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: peterLustig,
- postId: 'p0',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(11).keys()].map(() =>
- Factory.build(
- 'post',
- {},
- {
- categoryIds: ['cat1'],
- author: dewey,
- image: Factory.build('image', {
- url: faker.image.unsplash.food(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(7).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: dewey,
- postId: 'p2',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(5).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: dewey,
- postId: 'p6',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(2).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: dewey,
- postId: 'p9',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(16).keys()].map(() =>
- Factory.build(
- 'post',
- {},
- {
- categoryIds: ['cat1'],
- author: louie,
- image: Factory.build('image', {
- url: faker.image.unsplash.technology(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(4).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- postId: 'p1',
- author: louie,
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(8).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: louie,
- postId: 'p10',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(5).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: louie,
- postId: 'p13',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(45).keys()].map(() =>
- Factory.build(
- 'post',
- {},
- {
- categoryIds: ['cat1'],
- author: bobDerBaumeister,
- image: Factory.build('image', {
- url: faker.image.unsplash.people(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(2).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: bobDerBaumeister,
- postId: 'p2',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(3).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: bobDerBaumeister,
- postId: 'p12',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(7).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: bobDerBaumeister,
- postId: 'p13',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(8).keys()].map(() =>
- Factory.build(
- 'post',
- {},
- {
- categoryIds: ['cat1'],
- author: huey,
- image: Factory.build('image', {
- url: faker.image.unsplash.nature(),
- }),
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(6).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: huey,
- postId: 'p0',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(8).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: huey,
- postId: 'p13',
- },
- ),
- ),
- )
-
- await Promise.all(
- [...Array(8).keys()].map(() =>
- Factory.build(
- 'comment',
- {},
- {
- author: huey,
- postId: 'p15',
- },
- ),
- ),
- )
-
- await Factory.build('donations')
- /* 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/backend/src/db/seed.ts b/backend/src/db/seed.ts
new file mode 100644
index 000000000..53cd4cea6
--- /dev/null
+++ b/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/backend/src/graphql/GraphQL-Playground.md b/backend/src/graphql/GraphQL-Playground.md
index af248f112..33e371eb5 100644
--- a/backend/src/graphql/GraphQL-Playground.md
+++ b/backend/src/graphql/GraphQL-Playground.md
@@ -1,5 +1,7 @@
# 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?
diff --git a/backend/src/graphql/authentications.js b/backend/src/graphql/authentications.ts
similarity index 100%
rename from backend/src/graphql/authentications.js
rename to backend/src/graphql/authentications.ts
diff --git a/backend/src/graphql/comments.js b/backend/src/graphql/comments.ts
similarity index 100%
rename from backend/src/graphql/comments.js
rename to backend/src/graphql/comments.ts
diff --git a/backend/src/graphql/groups.js b/backend/src/graphql/groups.ts
similarity index 100%
rename from backend/src/graphql/groups.js
rename to backend/src/graphql/groups.ts
diff --git a/backend/src/graphql/messages.ts b/backend/src/graphql/messages.ts
new file mode 100644
index 000000000..2842c7230
--- /dev/null
+++ b/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/backend/src/graphql/notifications.js b/backend/src/graphql/notifications.ts
similarity index 100%
rename from backend/src/graphql/notifications.js
rename to backend/src/graphql/notifications.ts
diff --git a/backend/src/graphql/posts.js b/backend/src/graphql/posts.ts
similarity index 78%
rename from backend/src/graphql/posts.js
rename to backend/src/graphql/posts.ts
index 2669d6f24..d1dc3ee45 100644
--- a/backend/src/graphql/posts.js
+++ b/backend/src/graphql/posts.ts
@@ -11,6 +11,8 @@ export const createPostMutation = () => {
$content: String!
$categoryIds: [ID]
$groupId: ID
+ $postType: PostType
+ $eventInput: _EventInput
) {
CreatePost(
id: $id
@@ -19,11 +21,31 @@ export const createPostMutation = () => {
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
+ }
}
}
`
@@ -50,6 +72,7 @@ export const filterPosts = () => {
id
title
content
+ eventStart
}
}
`
diff --git a/backend/src/graphql/rooms.ts b/backend/src/graphql/rooms.ts
new file mode 100644
index 000000000..7612641f3
--- /dev/null
+++ b/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/backend/src/graphql/userManagement.js b/backend/src/graphql/userManagement.ts
similarity index 100%
rename from backend/src/graphql/userManagement.js
rename to backend/src/graphql/userManagement.ts
diff --git a/backend/src/helpers/asyncForEach.js b/backend/src/helpers/asyncForEach.ts
similarity index 100%
rename from backend/src/helpers/asyncForEach.js
rename to backend/src/helpers/asyncForEach.ts
diff --git a/backend/src/helpers/encryptPassword.js b/backend/src/helpers/encryptPassword.ts
similarity index 100%
rename from backend/src/helpers/encryptPassword.js
rename to backend/src/helpers/encryptPassword.ts
diff --git a/backend/src/helpers/jest.js b/backend/src/helpers/jest.ts
similarity index 100%
rename from backend/src/helpers/jest.js
rename to backend/src/helpers/jest.ts
diff --git a/backend/src/helpers/walkRecursive.js b/backend/src/helpers/walkRecursive.ts
similarity index 70%
rename from backend/src/helpers/walkRecursive.js
rename to backend/src/helpers/walkRecursive.ts
index 26a3a01b2..f3be67575 100644
--- a/backend/src/helpers/walkRecursive.js
+++ b/backend/src/helpers/walkRecursive.ts
@@ -5,14 +5,13 @@
* @property fieldName String
* @property callback Function
*/
-function walkRecursive(data, fields, fieldName, callback, _key) {
+function walkRecursive(data, fields, fieldName, callback, _key?) {
if (!Array.isArray(fields)) {
throw new Error('please provide an fields array for the walkRecursive helper')
}
- if (data && typeof data === 'string' && fields.includes(_key)) {
- // well we found what we searched for, lets replace the value with our callback result
- const key = _key.split('!')
- if (key.length === 1 || key[1] !== fieldName) data = callback(data, key[0])
+ 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) => {
diff --git a/backend/src/index.js b/backend/src/index.ts
similarity index 100%
rename from backend/src/index.js
rename to backend/src/index.ts
diff --git a/backend/src/jwt/decode.spec.js b/backend/src/jwt/decode.spec.ts
similarity index 100%
rename from backend/src/jwt/decode.spec.js
rename to backend/src/jwt/decode.spec.ts
diff --git a/backend/src/jwt/decode.js b/backend/src/jwt/decode.ts
similarity index 100%
rename from backend/src/jwt/decode.js
rename to backend/src/jwt/decode.ts
diff --git a/backend/src/jwt/encode.spec.js b/backend/src/jwt/encode.spec.ts
similarity index 100%
rename from backend/src/jwt/encode.spec.js
rename to backend/src/jwt/encode.spec.ts
diff --git a/backend/src/jwt/encode.js b/backend/src/jwt/encode.ts
similarity index 100%
rename from backend/src/jwt/encode.js
rename to backend/src/jwt/encode.ts
diff --git a/backend/src/middleware/activityPubMiddleware.js b/backend/src/middleware/activityPubMiddleware.js
deleted file mode 100644
index 712ca6c8a..000000000
--- a/backend/src/middleware/activityPubMiddleware.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import { generateRsaKeyPair } from '../activitypub/security'
-import { activityPub } from '../activitypub/ActivityPub'
-// import as from 'activitystrea.ms'
-
-// const debug = require('debug')('backend:schema')
-
-export default {
- Mutation: {
- // CreatePost: async (resolve, root, args, context, info) => {
- // args.activityId = activityPub.generateStatusId(context.user.slug)
- // args.objectId = activityPub.generateStatusId(context.user.slug)
-
- // const post = await resolve(root, args, context, info)
-
- // const { user: author } = context
- // const actorId = author.actorId
- // debug(`actorId = ${actorId}`)
- // const createActivity = await new Promise((resolve, reject) => {
- // as.create()
- // .id(`${actorId}/status/${args.activityId}`)
- // .actor(`${actorId}`)
- // .object(
- // as
- // .article()
- // .id(`${actorId}/status/${post.id}`)
- // .content(post.content)
- // .to('https://www.w3.org/ns/activitystreams#Public')
- // .publishedNow()
- // .attributedTo(`${actorId}`),
- // )
- // .prettyWrite((err, doc) => {
- // if (err) {
- // reject(err)
- // } else {
- // debug(doc)
- // const parsedDoc = JSON.parse(doc)
- // parsedDoc.send = true
- // resolve(JSON.stringify(parsedDoc))
- // }
- // })
- // })
- // try {
- // await activityPub.sendActivity(createActivity)
- // } catch (e) {
- // debug(`error sending post activity\n${e}`)
- // }
- // return post
- // },
- SignupVerification: async (resolve, root, args, context, info) => {
- const keys = generateRsaKeyPair()
- Object.assign(args, keys)
- args.actorId = `${activityPub.host}/activitypub/users/${args.slug}`
- return resolve(root, args, context, info)
- },
- },
-}
diff --git a/backend/src/middleware/chatMiddleware.ts b/backend/src/middleware/chatMiddleware.ts
new file mode 100644
index 000000000..8ae252e13
--- /dev/null
+++ b/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/backend/src/middleware/excerptMiddleware.js b/backend/src/middleware/excerptMiddleware.ts
similarity index 100%
rename from backend/src/middleware/excerptMiddleware.js
rename to backend/src/middleware/excerptMiddleware.ts
diff --git a/backend/src/middleware/hashtags/extractHashtags.spec.js b/backend/src/middleware/hashtags/extractHashtags.spec.ts
similarity index 100%
rename from backend/src/middleware/hashtags/extractHashtags.spec.js
rename to backend/src/middleware/hashtags/extractHashtags.spec.ts
diff --git a/backend/src/middleware/hashtags/extractHashtags.js b/backend/src/middleware/hashtags/extractHashtags.ts
similarity index 93%
rename from backend/src/middleware/hashtags/extractHashtags.js
rename to backend/src/middleware/hashtags/extractHashtags.ts
index 4c7667557..7570802af 100644
--- a/backend/src/middleware/hashtags/extractHashtags.js
+++ b/backend/src/middleware/hashtags/extractHashtags.ts
@@ -8,7 +8,7 @@ import { exec, build } from 'xregexp/xregexp-all.js'
// 2. If it starts with a digit '0-9' than a unicode letter has to follow.
const regX = build('^((\\pL+[\\pL0-9]*)|([0-9]+\\pL+[\\pL0-9]*))$')
-export default function (content) {
+export default function (content?) {
if (!content) return []
const $ = cheerio.load(content)
// We can not search for class '.hashtag', because the classes are removed at the 'xss' middleware.
@@ -18,7 +18,7 @@ export default function (content) {
return $(el).attr('data-hashtag-id')
})
.get()
- const hashtags = []
+ const hashtags: any = []
ids.forEach((id) => {
const match = exec(id, regX)
if (match != null) {
diff --git a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.ts
similarity index 100%
rename from backend/src/middleware/hashtags/hashtagsMiddleware.spec.js
rename to backend/src/middleware/hashtags/hashtagsMiddleware.spec.ts
diff --git a/backend/src/middleware/hashtags/hashtagsMiddleware.js b/backend/src/middleware/hashtags/hashtagsMiddleware.ts
similarity index 100%
rename from backend/src/middleware/hashtags/hashtagsMiddleware.js
rename to backend/src/middleware/hashtags/hashtagsMiddleware.ts
diff --git a/backend/src/middleware/helpers/cleanHtml.js b/backend/src/middleware/helpers/cleanHtml.ts
similarity index 99%
rename from backend/src/middleware/helpers/cleanHtml.js
rename to backend/src/middleware/helpers/cleanHtml.ts
index ac71f6bdc..84497760d 100644
--- a/backend/src/middleware/helpers/cleanHtml.js
+++ b/backend/src/middleware/helpers/cleanHtml.ts
@@ -30,6 +30,7 @@ const standardSanitizeHtmlOptions = {
'strike',
'span',
'blockquote',
+ 'usertag',
],
allowedAttributes: {
a: ['href', 'class', 'target', 'data-*', 'contenteditable'],
diff --git a/backend/src/middleware/helpers/email/sendMail.js b/backend/src/middleware/helpers/email/sendMail.ts
similarity index 83%
rename from backend/src/middleware/helpers/email/sendMail.js
rename to backend/src/middleware/helpers/email/sendMail.ts
index 59d3b090b..c0e54e7f7 100644
--- a/backend/src/middleware/helpers/email/sendMail.js
+++ b/backend/src/middleware/helpers/email/sendMail.ts
@@ -1,12 +1,14 @@
import CONFIG from '../../../config'
-import { cleanHtml } from '../../../middleware/helpers/cleanHtml.js'
+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
+const hasDKIMData =
+ CONFIG.SMTP_DKIM_DOMAINNAME && CONFIG.SMTP_DKIM_KEYSELECTOR && CONFIG.SMTP_DKIM_PRIVATKEY
-let sendMailCallback = async () => {}
+let sendMailCallback: any = async () => {}
if (!hasEmailConfig) {
if (!CONFIG.TEST) {
// eslint-disable-next-line no-console
@@ -29,7 +31,7 @@ if (!hasEmailConfig) {
cleanHtml(templateArgs.html, 'dummyKey', {
allowedTags: ['a'],
allowedAttributes: { a: ['href'] },
- }).replace(/&/g, '&'),
+ } as any).replace(/&/g, '&'),
)
}
}
@@ -44,6 +46,11 @@ if (!hasEmailConfig) {
user: CONFIG.SMTP_USERNAME,
pass: CONFIG.SMTP_PASSWORD,
},
+ dkim: hasDKIMData && {
+ domainName: CONFIG.SMTP_DKIM_DOMAINNAME,
+ keySelector: CONFIG.SMTP_DKIM_KEYSELECTOR,
+ privateKey: CONFIG.SMTP_DKIM_PRIVATKEY,
+ },
})
transporter.use(
diff --git a/backend/src/middleware/helpers/email/templateBuilder.spec.js b/backend/src/middleware/helpers/email/templateBuilder.spec.ts
similarity index 99%
rename from backend/src/middleware/helpers/email/templateBuilder.spec.js
rename to backend/src/middleware/helpers/email/templateBuilder.spec.ts
index d5b0edf21..cb516c0a9 100644
--- a/backend/src/middleware/helpers/email/templateBuilder.spec.js
+++ b/backend/src/middleware/helpers/email/templateBuilder.spec.ts
@@ -1,5 +1,5 @@
import CONFIG from '../../../config'
-import logosWebapp from '../../../config/logos.js'
+import logosWebapp from '../../../config/logos'
import {
signupTemplate,
emailVerificationTemplate,
diff --git a/backend/src/middleware/helpers/email/templateBuilder.js b/backend/src/middleware/helpers/email/templateBuilder.ts
similarity index 97%
rename from backend/src/middleware/helpers/email/templateBuilder.js
rename to backend/src/middleware/helpers/email/templateBuilder.ts
index bf174ef48..78d7a9bf9 100644
--- a/backend/src/middleware/helpers/email/templateBuilder.js
+++ b/backend/src/middleware/helpers/email/templateBuilder.ts
@@ -1,7 +1,7 @@
import mustache from 'mustache'
import CONFIG from '../../../config'
-import metadata from '../../../config/metadata.js'
-import logosWebapp from '../../../config/logos.js'
+import metadata from '../../../config/metadata'
+import logosWebapp from '../../../config/logos'
import * as templates from './templates'
import * as templatesEN from './templates/en'
diff --git a/backend/src/middleware/helpers/email/templates/de/index.js b/backend/src/middleware/helpers/email/templates/de/index.ts
similarity index 100%
rename from backend/src/middleware/helpers/email/templates/de/index.js
rename to backend/src/middleware/helpers/email/templates/de/index.ts
diff --git a/backend/src/middleware/helpers/email/templates/en/index.js b/backend/src/middleware/helpers/email/templates/en/index.ts
similarity index 100%
rename from backend/src/middleware/helpers/email/templates/en/index.js
rename to backend/src/middleware/helpers/email/templates/en/index.ts
diff --git a/backend/src/middleware/helpers/email/templates/index.js b/backend/src/middleware/helpers/email/templates/index.ts
similarity index 100%
rename from backend/src/middleware/helpers/email/templates/index.js
rename to backend/src/middleware/helpers/email/templates/index.ts
diff --git a/backend/src/middleware/includedFieldsMiddleware.js b/backend/src/middleware/includedFieldsMiddleware.ts
similarity index 100%
rename from backend/src/middleware/includedFieldsMiddleware.js
rename to backend/src/middleware/includedFieldsMiddleware.ts
diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.ts
similarity index 95%
rename from backend/src/middleware/index.js
rename to backend/src/middleware/index.ts
index 22e92e1a3..08c872db7 100644
--- a/backend/src/middleware/index.js
+++ b/backend/src/middleware/index.ts
@@ -1,7 +1,5 @@
import { applyMiddleware } from 'graphql-middleware'
import CONFIG from './../config'
-
-import activityPub from './activityPubMiddleware'
import softDelete from './softDelete/softDeleteMiddleware'
import sluggify from './sluggifyMiddleware'
import excerpt from './excerptMiddleware'
@@ -16,13 +14,13 @@ 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,
- activityPub,
validation,
sluggify,
excerpt,
@@ -34,6 +32,7 @@ export default (schema) => {
orderBy,
languages,
userInteractions,
+ chatMiddleware,
}
let order = [
@@ -52,6 +51,7 @@ export default (schema) => {
'softDelete',
'includedFields',
'orderBy',
+ 'chatMiddleware',
]
// add permisions middleware at the first position (unless we're seeding)
diff --git a/backend/src/middleware/languages/languages.js b/backend/src/middleware/languages/languages.js
deleted file mode 100644
index 087252975..000000000
--- a/backend/src/middleware/languages/languages.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import LanguageDetect from 'languagedetect'
-import { removeHtmlTags } from '../helpers/cleanHtml.js'
-
-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/backend/src/middleware/languages/languages.spec.js b/backend/src/middleware/languages/languages.spec.ts
similarity index 87%
rename from backend/src/middleware/languages/languages.spec.js
rename to backend/src/middleware/languages/languages.spec.ts
index f4f57adc4..8daa311e1 100644
--- a/backend/src/middleware/languages/languages.spec.js
+++ b/backend/src/middleware/languages/languages.spec.ts
@@ -131,4 +131,25 @@ describe('languagesMiddleware', () => {
},
})
})
+
+ describe('detects no language', () => {
+ it('has default language', async () => {
+ variables = {
+ ...variables,
+ content: '',
+ }
+ await expect(
+ mutate({
+ mutation: createPostMutation,
+ variables,
+ }),
+ ).resolves.toMatchObject({
+ data: {
+ CreatePost: {
+ language: 'en',
+ },
+ },
+ })
+ })
+ })
})
diff --git a/backend/src/middleware/languages/languages.ts b/backend/src/middleware/languages/languages.ts
new file mode 100644
index 000000000..3c043ceec
--- /dev/null
+++ b/backend/src/middleware/languages/languages.ts
@@ -0,0 +1,25 @@
+import LanguageDetect from 'languagedetect'
+import { removeHtmlTags } from '../helpers/cleanHtml'
+
+const setPostLanguage = (text, defaultLanguage) => {
+ const lngDetector = new LanguageDetect()
+ lngDetector.setLanguageType('iso2')
+ let languages = lngDetector.detect(removeHtmlTags(text), 1)
+ if (!(Array.isArray(languages) && languages.length > 0)) {
+ languages = [[defaultLanguage, 1.0]]
+ }
+ return languages[0][0]
+}
+
+export default {
+ Mutation: {
+ CreatePost: async (resolve, root, args, context, info) => {
+ args.language = await setPostLanguage(args.content, context.user.locale)
+ return resolve(root, args, context, info)
+ },
+ UpdatePost: async (resolve, root, args, context, info) => {
+ args.language = await setPostLanguage(args.content, context.user.locale)
+ return resolve(root, args, context, info)
+ },
+ },
+}
diff --git a/backend/src/middleware/login/loginMiddleware.js b/backend/src/middleware/login/loginMiddleware.ts
similarity index 100%
rename from backend/src/middleware/login/loginMiddleware.js
rename to backend/src/middleware/login/loginMiddleware.ts
diff --git a/backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.js b/backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.ts
similarity index 100%
rename from backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.js
rename to backend/src/middleware/notifications/mentions/extractMentionedUsers.spec.ts
diff --git a/backend/src/middleware/notifications/mentions/extractMentionedUsers.js b/backend/src/middleware/notifications/mentions/extractMentionedUsers.ts
similarity index 92%
rename from backend/src/middleware/notifications/mentions/extractMentionedUsers.js
rename to backend/src/middleware/notifications/mentions/extractMentionedUsers.ts
index e7e23ace7..ccee18af9 100644
--- a/backend/src/middleware/notifications/mentions/extractMentionedUsers.js
+++ b/backend/src/middleware/notifications/mentions/extractMentionedUsers.ts
@@ -1,6 +1,6 @@
import cheerio from 'cheerio'
-export default (content) => {
+export default (content?) => {
if (!content) return []
const $ = cheerio.load(content)
const userIds = $('a.mention[data-mention-id]')
diff --git a/backend/src/middleware/notifications/notificationsMiddleware.spec.js b/backend/src/middleware/notifications/notificationsMiddleware.spec.ts
similarity index 99%
rename from backend/src/middleware/notifications/notificationsMiddleware.spec.js
rename to backend/src/middleware/notifications/notificationsMiddleware.spec.ts
index a9046b09f..6cec5c940 100644
--- a/backend/src/middleware/notifications/notificationsMiddleware.spec.js
+++ b/backend/src/middleware/notifications/notificationsMiddleware.spec.ts
@@ -50,7 +50,7 @@ beforeAll(async () => {
context: () => {
return {
user: authenticatedUser,
- neode: neode,
+ neode,
driver,
}
},
@@ -576,7 +576,7 @@ describe('notifications', () => {
read: false,
},
}),
- ).resolves.toMatchObject(expected, { errors: undefined })
+ ).resolves.toMatchObject({ ...expected, errors: undefined })
})
})
diff --git a/backend/src/middleware/notifications/notificationsMiddleware.js b/backend/src/middleware/notifications/notificationsMiddleware.ts
similarity index 89%
rename from backend/src/middleware/notifications/notificationsMiddleware.js
rename to backend/src/middleware/notifications/notificationsMiddleware.ts
index 1c97e9591..706e46c51 100644
--- a/backend/src/middleware/notifications/notificationsMiddleware.js
+++ b/backend/src/middleware/notifications/notificationsMiddleware.ts
@@ -15,7 +15,7 @@ const queryNotificationEmails = async (context, notificationUserIds) => {
RETURN emailAddress {.email}
`
const session = context.driver.session()
- const writeTxResultPromise = session.writeTransaction(async (transaction) => {
+ const writeTxResultPromise = session.readTransaction(async (transaction) => {
const emailAddressTransactionResponse = await transaction.run(userEmailCypher, {
notificationUserIds,
})
@@ -140,16 +140,18 @@ const postAuthorOfComment = async (commentId, { context }) => {
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
+ WITH owner, group, user, membership
MERGE (group)-[notification:NOTIFIED {reason: $reason}]->(owner)
- WITH group, owner, notification
+ 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
- RETURN notification {.*, from: group, to: properties(owner)}
+ 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) => {
@@ -173,16 +175,20 @@ const notifyOwnersOfGroup = async (groupId, userId, reason, context) => {
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 })
- WITH user, group
+ OPTIONAL MATCH (user)-[membership:MEMBER_OF]->(group)
+ WITH user, group, owner, membership
MERGE (group)-[notification:NOTIFIED {reason: $reason}]->(user)
- WITH group, user, notification
+ 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
- RETURN notification {.*, from: group, to: properties(user)}
+ 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) => {
@@ -238,11 +244,11 @@ const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => {
[(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: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
+ 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)}
+ RETURN notification {.*, from: finalResource, to: properties(user), relatedUser: properties(user) }
`
const session = context.driver.session()
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
@@ -276,9 +282,14 @@ const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, cont
SET notification.read = FALSE
SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
SET notification.updatedAt = toString(datetime())
- WITH notification, postAuthor, post,
+ 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)}
+ RETURN notification {
+ .*,
+ from: finalResource,
+ to: properties(postAuthor),
+ relatedUser: properties(commenter)
+ }
`,
{ commentId, postAuthorId, reason },
)
diff --git a/backend/src/middleware/orderByMiddleware.spec.js b/backend/src/middleware/orderByMiddleware.spec.ts
similarity index 100%
rename from backend/src/middleware/orderByMiddleware.spec.js
rename to backend/src/middleware/orderByMiddleware.spec.ts
diff --git a/backend/src/middleware/orderByMiddleware.js b/backend/src/middleware/orderByMiddleware.ts
similarity index 100%
rename from backend/src/middleware/orderByMiddleware.js
rename to backend/src/middleware/orderByMiddleware.ts
diff --git a/backend/src/middleware/permissionsMiddleware.spec.js b/backend/src/middleware/permissionsMiddleware.spec.ts
similarity index 100%
rename from backend/src/middleware/permissionsMiddleware.spec.js
rename to backend/src/middleware/permissionsMiddleware.spec.ts
diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.ts
similarity index 98%
rename from backend/src/middleware/permissionsMiddleware.js
rename to backend/src/middleware/permissionsMiddleware.ts
index 6cd8f39d6..f87f4b079 100644
--- a/backend/src/middleware/permissionsMiddleware.js
+++ b/backend/src/middleware/permissionsMiddleware.ts
@@ -406,6 +406,9 @@ export default shield(
queryLocations: isAuthenticated,
availableRoles: isAdmin,
getInviteCode: isAuthenticated, // and inviteRegistration
+ Room: isAuthenticated,
+ Message: isAuthenticated,
+ UnreadRooms: isAuthenticated,
},
Mutation: {
'*': deny,
@@ -459,6 +462,9 @@ export default shield(
switchUserRole: isAdmin,
markTeaserAsViewed: allow,
saveCategorySettings: isAuthenticated,
+ CreateRoom: isAuthenticated,
+ CreateMessage: isAuthenticated,
+ MarkMessagesAsSeen: isAuthenticated,
},
User: {
email: or(isMyOwn, isAdmin),
diff --git a/backend/src/middleware/sentryMiddleware.js b/backend/src/middleware/sentryMiddleware.ts
similarity index 86%
rename from backend/src/middleware/sentryMiddleware.js
rename to backend/src/middleware/sentryMiddleware.ts
index 8891b8677..73f393eef 100644
--- a/backend/src/middleware/sentryMiddleware.js
+++ b/backend/src/middleware/sentryMiddleware.ts
@@ -1,7 +1,7 @@
import { sentry } from 'graphql-middleware-sentry'
import CONFIG from '../config'
-let sentryMiddleware = (resolve, root, args, context, resolveInfo) =>
+let sentryMiddleware: any = (resolve, root, args, context, resolveInfo) =>
resolve(root, args, context, resolveInfo)
if (CONFIG.SENTRY_DSN_BACKEND) {
@@ -12,7 +12,7 @@ if (CONFIG.SENTRY_DSN_BACKEND) {
release: CONFIG.COMMIT,
environment: CONFIG.NODE_ENV,
},
- withScope: (scope, error, context) => {
+ withScope: (scope, error, context: any) => {
scope.setUser({
id: context.user && context.user.id,
})
diff --git a/backend/src/middleware/sluggifyMiddleware.js b/backend/src/middleware/sluggifyMiddleware.ts
similarity index 100%
rename from backend/src/middleware/sluggifyMiddleware.js
rename to backend/src/middleware/sluggifyMiddleware.ts
diff --git a/backend/src/middleware/slugify/uniqueSlug.spec.js b/backend/src/middleware/slugify/uniqueSlug.spec.ts
similarity index 70%
rename from backend/src/middleware/slugify/uniqueSlug.spec.js
rename to backend/src/middleware/slugify/uniqueSlug.spec.ts
index d002eae03..659a439c2 100644
--- a/backend/src/middleware/slugify/uniqueSlug.spec.js
+++ b/backend/src/middleware/slugify/uniqueSlug.spec.ts
@@ -1,22 +1,22 @@
import uniqueSlug from './uniqueSlug'
describe('uniqueSlug', () => {
- it('slugifies given string', () => {
+ it('slugifies given string', async () => {
const string = 'Hello World'
const isUnique = jest.fn().mockResolvedValue(true)
- expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world')
+ await expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world')
})
- it('increments slugified string until unique', () => {
+ it('increments slugified string until unique', async () => {
const string = 'Hello World'
const isUnique = jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true)
- expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world-1')
+ await expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world-1')
})
- it('slugify null string', () => {
+ it('slugify null string', async () => {
const string = null
const isUnique = jest.fn().mockResolvedValue(true)
- expect(uniqueSlug(string, isUnique)).resolves.toEqual('anonymous')
+ await expect(uniqueSlug(string, isUnique)).resolves.toEqual('anonymous')
})
it('Converts umlaut to a two letter equivalent', async () => {
diff --git a/backend/src/middleware/slugify/uniqueSlug.js b/backend/src/middleware/slugify/uniqueSlug.ts
similarity index 100%
rename from backend/src/middleware/slugify/uniqueSlug.js
rename to backend/src/middleware/slugify/uniqueSlug.ts
diff --git a/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.ts
similarity index 100%
rename from backend/src/middleware/slugifyMiddleware.spec.js
rename to backend/src/middleware/slugifyMiddleware.spec.ts
diff --git a/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js b/backend/src/middleware/softDelete/softDeleteMiddleware.spec.ts
similarity index 100%
rename from backend/src/middleware/softDelete/softDeleteMiddleware.spec.js
rename to backend/src/middleware/softDelete/softDeleteMiddleware.spec.ts
diff --git a/backend/src/middleware/softDelete/softDeleteMiddleware.js b/backend/src/middleware/softDelete/softDeleteMiddleware.ts
similarity index 100%
rename from backend/src/middleware/softDelete/softDeleteMiddleware.js
rename to backend/src/middleware/softDelete/softDeleteMiddleware.ts
diff --git a/backend/src/middleware/userInteractions.spec.js b/backend/src/middleware/userInteractions.spec.ts
similarity index 100%
rename from backend/src/middleware/userInteractions.spec.js
rename to backend/src/middleware/userInteractions.spec.ts
diff --git a/backend/src/middleware/userInteractions.js b/backend/src/middleware/userInteractions.ts
similarity index 100%
rename from backend/src/middleware/userInteractions.js
rename to backend/src/middleware/userInteractions.ts
diff --git a/backend/src/middleware/validation/validationMiddleware.spec.js b/backend/src/middleware/validation/validationMiddleware.spec.ts
similarity index 100%
rename from backend/src/middleware/validation/validationMiddleware.spec.js
rename to backend/src/middleware/validation/validationMiddleware.spec.ts
diff --git a/backend/src/middleware/validation/validationMiddleware.js b/backend/src/middleware/validation/validationMiddleware.ts
similarity index 97%
rename from backend/src/middleware/validation/validationMiddleware.js
rename to backend/src/middleware/validation/validationMiddleware.ts
index 20933a777..ff26f5ef1 100644
--- a/backend/src/middleware/validation/validationMiddleware.js
+++ b/backend/src/middleware/validation/validationMiddleware.ts
@@ -64,7 +64,7 @@ const validateReview = async (resolve, root, args, context, info) => {
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 labels(resource)[0] AS label, author, filed
+ RETURN [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'User']][0] AS label, author, filed
`,
{
resourceId,
diff --git a/backend/src/middleware/xssMiddleware.js b/backend/src/middleware/xssMiddleware.ts
similarity index 66%
rename from backend/src/middleware/xssMiddleware.js
rename to backend/src/middleware/xssMiddleware.ts
index 9b15e9712..c10997e8d 100644
--- a/backend/src/middleware/xssMiddleware.js
+++ b/backend/src/middleware/xssMiddleware.ts
@@ -1,13 +1,13 @@
import walkRecursive from '../helpers/walkRecursive'
-import { cleanHtml } from '../middleware/helpers/cleanHtml.js'
+import { cleanHtml } from '../middleware/helpers/cleanHtml'
// exclamation mark separetes field names, that should not be sanitized
const fields = [
- 'content',
- 'contentExcerpt',
- 'reasonDescription',
- 'description!embed',
- 'descriptionExcerpt',
+ { field: 'content', excludes: ['CreateMessage', 'Message'] },
+ { field: 'contentExcerpt' },
+ { field: 'reasonDescription' },
+ { field: 'description', excludes: ['embed'] },
+ { field: 'descriptionExcerpt' },
]
export default {
diff --git a/backend/src/models/Badge.js b/backend/src/models/Badge.ts
similarity index 100%
rename from backend/src/models/Badge.js
rename to backend/src/models/Badge.ts
diff --git a/backend/src/models/Category.js b/backend/src/models/Category.ts
similarity index 100%
rename from backend/src/models/Category.js
rename to backend/src/models/Category.ts
diff --git a/backend/src/models/Comment.js b/backend/src/models/Comment.ts
similarity index 100%
rename from backend/src/models/Comment.js
rename to backend/src/models/Comment.ts
diff --git a/backend/src/models/Donations.js b/backend/src/models/Donations.ts
similarity index 100%
rename from backend/src/models/Donations.js
rename to backend/src/models/Donations.ts
diff --git a/backend/src/models/EmailAddress.js b/backend/src/models/EmailAddress.ts
similarity index 100%
rename from backend/src/models/EmailAddress.js
rename to backend/src/models/EmailAddress.ts
diff --git a/backend/src/models/Group.js b/backend/src/models/Group.ts
similarity index 100%
rename from backend/src/models/Group.js
rename to backend/src/models/Group.ts
diff --git a/backend/src/models/Image.js b/backend/src/models/Image.ts
similarity index 100%
rename from backend/src/models/Image.js
rename to backend/src/models/Image.ts
diff --git a/backend/src/models/InviteCode.js b/backend/src/models/InviteCode.ts
similarity index 100%
rename from backend/src/models/InviteCode.js
rename to backend/src/models/InviteCode.ts
diff --git a/backend/src/models/Location.js b/backend/src/models/Location.ts
similarity index 100%
rename from backend/src/models/Location.js
rename to backend/src/models/Location.ts
diff --git a/backend/src/models/Migration.js b/backend/src/models/Migration.ts
similarity index 100%
rename from backend/src/models/Migration.js
rename to backend/src/models/Migration.ts
diff --git a/backend/src/models/Post.js b/backend/src/models/Post.ts
similarity index 95%
rename from backend/src/models/Post.js
rename to backend/src/models/Post.ts
index 235e7d68d..e206ea1f5 100644
--- a/backend/src/models/Post.js
+++ b/backend/src/models/Post.ts
@@ -57,4 +57,5 @@ export default {
},
},
pinned: { type: 'boolean', default: null, valid: [null, true] },
+ postType: { type: 'string', default: 'Article', valid: ['Article', 'Event'] },
}
diff --git a/backend/src/models/Report.js b/backend/src/models/Report.ts
similarity index 100%
rename from backend/src/models/Report.js
rename to backend/src/models/Report.ts
diff --git a/backend/src/models/SocialMedia.js b/backend/src/models/SocialMedia.ts
similarity index 100%
rename from backend/src/models/SocialMedia.js
rename to backend/src/models/SocialMedia.ts
diff --git a/backend/src/models/Tag.js b/backend/src/models/Tag.ts
similarity index 100%
rename from backend/src/models/Tag.js
rename to backend/src/models/Tag.ts
diff --git a/backend/src/models/UnverifiedEmailAddress.js b/backend/src/models/UnverifiedEmailAddress.ts
similarity index 100%
rename from backend/src/models/UnverifiedEmailAddress.js
rename to backend/src/models/UnverifiedEmailAddress.ts
diff --git a/backend/src/models/User.spec.js b/backend/src/models/User.spec.ts
similarity index 100%
rename from backend/src/models/User.spec.js
rename to backend/src/models/User.spec.ts
diff --git a/backend/src/models/User.js b/backend/src/models/User.ts
similarity index 100%
rename from backend/src/models/User.js
rename to backend/src/models/User.ts
diff --git a/backend/src/models/index.js b/backend/src/models/index.js
deleted file mode 100644
index d476e5f9b..000000000
--- a/backend/src/models/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm
-// module that is not browser-compatible. Node's `fs` module is server-side only
-export default {
- Image: require('./Image.js').default,
- Badge: require('./Badge.js').default,
- User: require('./User.js').default,
- Group: require('./Group.js').default,
- EmailAddress: require('./EmailAddress.js').default,
- UnverifiedEmailAddress: require('./UnverifiedEmailAddress.js').default,
- SocialMedia: require('./SocialMedia.js').default,
- Post: require('./Post.js').default,
- Comment: require('./Comment.js').default,
- Category: require('./Category.js').default,
- Tag: require('./Tag.js').default,
- Location: require('./Location.js').default,
- Donations: require('./Donations.js').default,
- Report: require('./Report.js').default,
- Migration: require('./Migration.js').default,
- InviteCode: require('./InviteCode.js').default,
-}
diff --git a/backend/src/models/index.ts b/backend/src/models/index.ts
new file mode 100644
index 000000000..f7d338684
--- /dev/null
+++ b/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/backend/src/schema/index.js b/backend/src/schema/index.ts
similarity index 100%
rename from backend/src/schema/index.js
rename to backend/src/schema/index.ts
diff --git a/backend/src/schema/resolvers/Upload.js b/backend/src/schema/resolvers/Upload.ts
similarity index 100%
rename from backend/src/schema/resolvers/Upload.js
rename to backend/src/schema/resolvers/Upload.ts
diff --git a/backend/src/schema/resolvers/badges.js b/backend/src/schema/resolvers/badges.ts
similarity index 100%
rename from backend/src/schema/resolvers/badges.js
rename to backend/src/schema/resolvers/badges.ts
diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/comments.spec.js
rename to backend/src/schema/resolvers/comments.spec.ts
diff --git a/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.ts
similarity index 98%
rename from backend/src/schema/resolvers/comments.js
rename to backend/src/schema/resolvers/comments.ts
index a3a0c7290..c6f07245c 100644
--- a/backend/src/schema/resolvers/comments.js
+++ b/backend/src/schema/resolvers/comments.ts
@@ -21,7 +21,7 @@ export default {
MATCH (post:Post {id: $postId})
MATCH (author:User {id: $userId})
WITH post, author
- CREATE (comment:Comment {params})
+ CREATE (comment:Comment $params)
SET comment.createdAt = toString(datetime())
SET comment.updatedAt = toString(datetime())
MERGE (post)<-[:COMMENTS]-(comment)<-[:WROTE]-(author)
diff --git a/backend/src/schema/resolvers/donations.spec.js b/backend/src/schema/resolvers/donations.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/donations.spec.js
rename to backend/src/schema/resolvers/donations.spec.ts
diff --git a/backend/src/schema/resolvers/donations.js b/backend/src/schema/resolvers/donations.ts
similarity index 100%
rename from backend/src/schema/resolvers/donations.js
rename to backend/src/schema/resolvers/donations.ts
diff --git a/backend/src/schema/resolvers/emails.spec.js b/backend/src/schema/resolvers/emails.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/emails.spec.js
rename to backend/src/schema/resolvers/emails.spec.ts
diff --git a/backend/src/schema/resolvers/emails.js b/backend/src/schema/resolvers/emails.ts
similarity index 100%
rename from backend/src/schema/resolvers/emails.js
rename to backend/src/schema/resolvers/emails.ts
diff --git a/backend/src/schema/resolvers/embeds.spec.js b/backend/src/schema/resolvers/embeds.spec.ts
similarity index 93%
rename from backend/src/schema/resolvers/embeds.spec.js
rename to backend/src/schema/resolvers/embeds.spec.ts
index 0f0d41357..8e7a69891 100644
--- a/backend/src/schema/resolvers/embeds.spec.js
+++ b/backend/src/schema/resolvers/embeds.spec.ts
@@ -6,10 +6,11 @@ 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(() => {
- fetch.mockRestore()
+ mockedFetch.mockRestore()
})
let variables = {}
@@ -80,9 +81,9 @@ describe('Query', () => {
describe('given a video link', () => {
beforeEach(() => {
- fetch
+ mockedFetch
.mockReturnValueOnce(Promise.resolve(new Response('')))
- .mockReturnValueOnce(Promise.resolve(JSON.stringify({})))
+ .mockReturnValueOnce(Promise.resolve(new Response(JSON.stringify({}))))
variables = { url: 'https://www.w3schools.com/html/mov_bbb.mp4' }
})
@@ -112,9 +113,9 @@ describe('Query', () => {
describe('given a Facebook link', () => {
beforeEach(() => {
- fetch
+ mockedFetch
.mockReturnValueOnce(Promise.resolve(new Response(HumanConnectionOrg)))
- .mockReturnValueOnce(Promise.resolve('invalid json'))
+ .mockReturnValueOnce(Promise.resolve(new Response('invalid json')))
variables = { url: 'https://www.facebook.com/HumanConnectionOrg/' }
})
@@ -126,7 +127,7 @@ describe('Query', () => {
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),...',
+ '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',
@@ -146,9 +147,9 @@ describe('Query', () => {
describe('given a Github link', () => {
beforeEach(() => {
- fetch
+ mockedFetch
.mockReturnValueOnce(Promise.resolve(new Response(pr3934)))
- .mockReturnValueOnce(Promise.resolve(JSON.stringify({})))
+ .mockReturnValueOnce(Promise.resolve(new Response(JSON.stringify({}))))
variables = { url: 'https://github.com/Human-Connection/Human-Connection/pull/960' }
})
@@ -180,7 +181,7 @@ Have all the information for the brand in separate config files. Set these defau
describe('given a youtube link', () => {
beforeEach(() => {
- fetch
+ mockedFetch
.mockReturnValueOnce(Promise.resolve(new Response(babyLovesCat)))
.mockReturnValueOnce(Promise.resolve(babyLovesCatEmbedResponse))
variables = { url: 'https://www.youtube.com/watch?v=qkdXAtO40Fo&t=18s' }
@@ -196,7 +197,7 @@ Have all the information for the brand in separate config files. Set these defau
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...',
+ '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,
diff --git a/backend/src/schema/resolvers/embeds.js b/backend/src/schema/resolvers/embeds.ts
similarity index 93%
rename from backend/src/schema/resolvers/embeds.js
rename to backend/src/schema/resolvers/embeds.ts
index 016352950..a75365ec7 100644
--- a/backend/src/schema/resolvers/embeds.js
+++ b/backend/src/schema/resolvers/embeds.ts
@@ -1,4 +1,4 @@
-import scrape from './embeds/scraper.js'
+import scrape from './embeds/scraper'
import { undefinedToNullResolver } from './helpers/Resolver'
export default {
diff --git a/backend/src/schema/resolvers/embeds/findProvider.spec.js b/backend/src/schema/resolvers/embeds/findProvider.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/embeds/findProvider.spec.js
rename to backend/src/schema/resolvers/embeds/findProvider.spec.ts
diff --git a/backend/src/schema/resolvers/embeds/findProvider.js b/backend/src/schema/resolvers/embeds/findProvider.ts
similarity index 100%
rename from backend/src/schema/resolvers/embeds/findProvider.js
rename to backend/src/schema/resolvers/embeds/findProvider.ts
diff --git a/backend/src/schema/resolvers/embeds/scraper.js b/backend/src/schema/resolvers/embeds/scraper.ts
similarity index 96%
rename from backend/src/schema/resolvers/embeds/scraper.js
rename to backend/src/schema/resolvers/embeds/scraper.ts
index df37611f3..79dd5a368 100644
--- a/backend/src/schema/resolvers/embeds/scraper.js
+++ b/backend/src/schema/resolvers/embeds/scraper.ts
@@ -17,11 +17,9 @@ const metascraper = Metascraper([
require('metascraper-lang')(),
require('metascraper-lang-detector')(),
require('metascraper-logo')(),
- // require('metascraper-clearbit-logo')(),
require('metascraper-publisher')(),
require('metascraper-title')(),
require('metascraper-url')(),
- require('metascraper-audio')(),
require('metascraper-soundcloud')(),
require('metascraper-video')(),
require('metascraper-youtube')(),
diff --git a/backend/src/schema/resolvers/filter-posts.spec.ts b/backend/src/schema/resolvers/filter-posts.spec.ts
new file mode 100644
index 000000000..41fbd0ea7
--- /dev/null
+++ b/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/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.ts
similarity index 97%
rename from backend/src/schema/resolvers/follow.spec.js
rename to backend/src/schema/resolvers/follow.spec.ts
index 0d9d524ff..c9d8dc1bf 100644
--- a/backend/src/schema/resolvers/follow.spec.js
+++ b/backend/src/schema/resolvers/follow.spec.ts
@@ -147,7 +147,7 @@ describe('follow', () => {
variables,
})
const relation = await neode.cypher(
- 'MATCH (user:User {id: {id}})-[relationship:FOLLOWS]->(followed:User) WHERE relationship.createdAt IS NOT NULL RETURN relationship',
+ 'MATCH (user:User {id: $id})-[relationship:FOLLOWS]->(followed:User) WHERE relationship.createdAt IS NOT NULL RETURN relationship',
{ id: 'u1' },
)
const relationshipProperties = relation.records.map(
diff --git a/backend/src/schema/resolvers/follow.js b/backend/src/schema/resolvers/follow.ts
similarity index 97%
rename from backend/src/schema/resolvers/follow.js
rename to backend/src/schema/resolvers/follow.ts
index 80cce8400..6cf4938c7 100644
--- a/backend/src/schema/resolvers/follow.js
+++ b/backend/src/schema/resolvers/follow.ts
@@ -29,7 +29,7 @@ export default {
* 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.cypher(
+ await neode.writeCypher(
`MATCH (user:User {id: $currentUser.id})-[relation:FOLLOWS]->(followedUser:User {id: $followedUserId})
DELETE relation
RETURN COUNT(relation) > 0 as isFollowed`,
diff --git a/backend/src/schema/resolvers/groups.spec.js b/backend/src/schema/resolvers/groups.spec.ts
similarity index 95%
rename from backend/src/schema/resolvers/groups.spec.js
rename to backend/src/schema/resolvers/groups.spec.ts
index 13291383d..315388490 100644
--- a/backend/src/schema/resolvers/groups.spec.js
+++ b/backend/src/schema/resolvers/groups.spec.ts
@@ -270,7 +270,7 @@ describe('in mode', () => {
describe('unauthenticated', () => {
it('throws authorization error', async () => {
const { errors } = await mutate({ mutation: createGroupMutation(), variables })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -339,7 +339,7 @@ describe('in mode', () => {
'0123456789 ',
},
})
- expect(errors[0]).toHaveProperty('message', 'Description too short!')
+ expect(errors![0]).toHaveProperty('message', 'Description too short!')
})
})
})
@@ -382,7 +382,7 @@ describe('in mode', () => {
mutation: createGroupMutation(),
variables: { ...variables, categoryIds: null },
})
- expect(errors[0]).toHaveProperty('message', 'Too view categories!')
+ expect(errors![0]).toHaveProperty('message', 'Too view categories!')
})
})
@@ -392,7 +392,7 @@ describe('in mode', () => {
mutation: createGroupMutation(),
variables: { ...variables, categoryIds: [] },
})
- expect(errors[0]).toHaveProperty('message', 'Too view categories!')
+ expect(errors![0]).toHaveProperty('message', 'Too view categories!')
})
})
})
@@ -403,7 +403,7 @@ describe('in mode', () => {
mutation: createGroupMutation(),
variables: { ...variables, categoryIds: ['cat9', 'cat4', 'cat15', 'cat27'] },
})
- expect(errors[0]).toHaveProperty('message', 'Too many categories!')
+ expect(errors![0]).toHaveProperty('message', 'Too many categories!')
})
})
})
@@ -424,7 +424,7 @@ describe('in mode', () => {
describe('unauthenticated', () => {
it('throws authorization error', async () => {
const { errors } = await query({ query: groupQuery(), variables: {} })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -577,7 +577,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(3)
+ expect(result.data?.Group.length).toBe(3)
})
describe('categories', () => {
@@ -635,7 +635,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(1)
+ expect(result.data?.Group.length).toBe(1)
})
})
@@ -657,7 +657,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(1)
+ expect(result.data?.Group.length).toBe(1)
})
})
@@ -667,7 +667,7 @@ describe('in mode', () => {
query: groupQuery(),
variables: { id: 'second-hidden-group' },
})
- expect(result.data.Group.length).toBe(0)
+ expect(result.data?.Group.length).toBe(0)
})
})
@@ -677,7 +677,7 @@ describe('in mode', () => {
query: groupQuery(),
variables: { id: 'hidden-group' },
})
- expect(result.data.Group.length).toBe(0)
+ expect(result.data?.Group.length).toBe(0)
})
})
})
@@ -701,7 +701,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(1)
+ expect(result.data?.Group.length).toBe(1)
})
})
@@ -723,7 +723,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(1)
+ expect(result.data?.Group.length).toBe(1)
})
})
@@ -733,7 +733,7 @@ describe('in mode', () => {
query: groupQuery(),
variables: { slug: 'second-investigative-journalism-group' },
})
- expect(result.data.Group.length).toBe(0)
+ expect(result.data?.Group.length).toBe(0)
})
})
@@ -743,7 +743,7 @@ describe('in mode', () => {
query: groupQuery(),
variables: { slug: 'investigative-journalism-group' },
})
- expect(result.data.Group.length).toBe(0)
+ expect(result.data?.Group.length).toBe(0)
})
})
})
@@ -768,7 +768,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(2)
+ expect(result.data?.Group.length).toBe(2)
})
})
@@ -787,7 +787,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.Group.length).toBe(1)
+ expect(result.data?.Group.length).toBe(1)
})
})
})
@@ -813,7 +813,7 @@ describe('in mode', () => {
userId: 'current-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -994,7 +994,7 @@ describe('in mode', () => {
userId: 'owner-of-closed-group',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1040,7 +1040,7 @@ describe('in mode', () => {
id: 'not-existing-group',
}
const { errors } = await query({ query: groupMembersQuery(), variables })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1234,7 +1234,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(3)
+ expect(result.data?.GroupMembers.length).toBe(3)
})
})
@@ -1267,7 +1267,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(3)
+ expect(result.data?.GroupMembers.length).toBe(3)
})
})
@@ -1300,7 +1300,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(3)
+ expect(result.data?.GroupMembers.length).toBe(3)
})
})
})
@@ -1343,7 +1343,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(3)
+ expect(result.data?.GroupMembers.length).toBe(3)
})
})
@@ -1376,7 +1376,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(3)
+ expect(result.data?.GroupMembers.length).toBe(3)
})
})
@@ -1387,7 +1387,7 @@ describe('in mode', () => {
it('throws authorization error', async () => {
const { errors } = await query({ query: groupMembersQuery(), variables })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1398,7 +1398,7 @@ describe('in mode', () => {
it('throws authorization error', async () => {
const { errors } = await query({ query: groupMembersQuery(), variables })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1445,7 +1445,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(4)
+ expect(result.data?.GroupMembers.length).toBe(4)
})
})
@@ -1482,7 +1482,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(4)
+ expect(result.data?.GroupMembers.length).toBe(4)
})
})
@@ -1519,7 +1519,7 @@ describe('in mode', () => {
},
errors: undefined,
})
- expect(result.data.GroupMembers.length).toBe(4)
+ expect(result.data?.GroupMembers.length).toBe(4)
})
})
@@ -1530,7 +1530,7 @@ describe('in mode', () => {
it('throws authorization error', async () => {
const { errors } = await query({ query: groupMembersQuery(), variables })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1541,7 +1541,7 @@ describe('in mode', () => {
it('throws authorization error', async () => {
const { errors } = await query({ query: groupMembersQuery(), variables })
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1568,7 +1568,7 @@ describe('in mode', () => {
roleInGroup: 'pending',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1723,7 +1723,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1749,7 +1749,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1798,7 +1798,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1821,7 +1821,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1844,7 +1844,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1902,7 +1902,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1925,7 +1925,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1942,7 +1942,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -1965,7 +1965,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -1982,7 +1982,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2005,7 +2005,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2022,7 +2022,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2112,7 +2112,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2129,7 +2129,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2152,7 +2152,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2169,7 +2169,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2192,7 +2192,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2209,7 +2209,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2299,7 +2299,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2322,7 +2322,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2345,7 +2345,7 @@ describe('in mode', () => {
mutation: changeGroupMemberRoleMutation(),
variables,
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2409,7 +2409,7 @@ describe('in mode', () => {
userId: 'current-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2526,7 +2526,7 @@ describe('in mode', () => {
userId: 'owner-member-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2540,7 +2540,7 @@ describe('in mode', () => {
userId: 'second-owner-member-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2554,7 +2554,7 @@ describe('in mode', () => {
userId: 'none-member-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2568,7 +2568,7 @@ describe('in mode', () => {
userId: 'usual-member-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2582,7 +2582,7 @@ describe('in mode', () => {
userId: 'admin-member-user',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
@@ -2608,7 +2608,7 @@ describe('in mode', () => {
slug: 'my-best-group',
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2861,7 +2861,7 @@ describe('in mode', () => {
'0123456789 ',
},
})
- expect(errors[0]).toHaveProperty('message', 'Description too short!')
+ expect(errors![0]).toHaveProperty('message', 'Description too short!')
})
})
})
@@ -2908,7 +2908,7 @@ describe('in mode', () => {
categoryIds: [],
},
})
- expect(errors[0]).toHaveProperty('message', 'Too view categories!')
+ expect(errors![0]).toHaveProperty('message', 'Too view categories!')
})
})
})
@@ -2922,7 +2922,7 @@ describe('in mode', () => {
categoryIds: ['cat9', 'cat4', 'cat15', 'cat27'],
},
})
- expect(errors[0]).toHaveProperty('message', 'Too many categories!')
+ expect(errors![0]).toHaveProperty('message', 'Too many categories!')
})
})
})
@@ -2942,7 +2942,7 @@ describe('in mode', () => {
categoryIds: ['cat4', 'cat27'],
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -2960,7 +2960,7 @@ describe('in mode', () => {
categoryIds: ['cat4', 'cat27'],
},
})
- expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(errors![0]).toHaveProperty('message', 'Not Authorized!')
})
})
})
diff --git a/backend/src/schema/resolvers/groups.js b/backend/src/schema/resolvers/groups.ts
similarity index 99%
rename from backend/src/schema/resolvers/groups.js
rename to backend/src/schema/resolvers/groups.ts
index 5ec1700b9..cd1eb8db3 100644
--- a/backend/src/schema/resolvers/groups.js
+++ b/backend/src/schema/resolvers/groups.ts
@@ -3,7 +3,7 @@ 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.js'
+import { removeHtmlTags } from '../../middleware/helpers/cleanHtml'
import Resolver, {
removeUndefinedNullValuesFromObject,
convertObjectToCypherMapLiteral,
diff --git a/backend/src/schema/resolvers/helpers/Resolver.js b/backend/src/schema/resolvers/helpers/Resolver.ts
similarity index 97%
rename from backend/src/schema/resolvers/helpers/Resolver.js
rename to backend/src/schema/resolvers/helpers/Resolver.ts
index 6e8211521..58d1512d7 100644
--- a/backend/src/schema/resolvers/helpers/Resolver.js
+++ b/backend/src/schema/resolvers/helpers/Resolver.ts
@@ -10,7 +10,7 @@ export const undefinedToNullResolver = (list) => {
return resolvers
}
-export default function Resolver(type, options = {}) {
+export default function Resolver(type, options: any = {}) {
const {
idAttribute = 'id',
undefinedToNull = [],
@@ -44,7 +44,7 @@ export default function Resolver(type, options = {}) {
}
}
- const booleanResolver = (obj) => {
+ const booleanResolver = (obj: any[]) => {
const resolvers = {}
for (const [key, condition] of Object.entries(obj)) {
resolvers[key] = async (parent, params, { cypherParams, driver }, resolveInfo) => {
diff --git a/backend/src/schema/resolvers/helpers/createPasswordReset.js b/backend/src/schema/resolvers/helpers/createPasswordReset.ts
similarity index 100%
rename from backend/src/schema/resolvers/helpers/createPasswordReset.js
rename to backend/src/schema/resolvers/helpers/createPasswordReset.ts
diff --git a/backend/src/schema/resolvers/helpers/databaseLogger.js b/backend/src/schema/resolvers/helpers/databaseLogger.ts
similarity index 100%
rename from backend/src/schema/resolvers/helpers/databaseLogger.js
rename to backend/src/schema/resolvers/helpers/databaseLogger.ts
diff --git a/backend/src/schema/resolvers/helpers/events.ts b/backend/src/schema/resolvers/helpers/events.ts
new file mode 100644
index 000000000..835088d8c
--- /dev/null
+++ b/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/backend/src/schema/resolvers/helpers/existingEmailAddress.js b/backend/src/schema/resolvers/helpers/existingEmailAddress.ts
similarity index 100%
rename from backend/src/schema/resolvers/helpers/existingEmailAddress.js
rename to backend/src/schema/resolvers/helpers/existingEmailAddress.ts
diff --git a/backend/src/schema/resolvers/helpers/filterForMutedUsers.js b/backend/src/schema/resolvers/helpers/filterForMutedUsers.ts
similarity index 92%
rename from backend/src/schema/resolvers/helpers/filterForMutedUsers.js
rename to backend/src/schema/resolvers/helpers/filterForMutedUsers.ts
index 5094039ee..1d1369e0d 100644
--- a/backend/src/schema/resolvers/helpers/filterForMutedUsers.js
+++ b/backend/src/schema/resolvers/helpers/filterForMutedUsers.ts
@@ -1,4 +1,4 @@
-import { getMutedUsers } from '../users.js'
+import { getMutedUsers } from '../users'
import { mergeWith, isArray } from 'lodash'
export const filterForMutedUsers = async (params, context) => {
diff --git a/backend/src/schema/resolvers/helpers/filterInvisiblePosts.js b/backend/src/schema/resolvers/helpers/filterInvisiblePosts.ts
similarity index 100%
rename from backend/src/schema/resolvers/helpers/filterInvisiblePosts.js
rename to backend/src/schema/resolvers/helpers/filterInvisiblePosts.ts
diff --git a/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.js b/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.ts
similarity index 100%
rename from backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.js
rename to backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.ts
diff --git a/backend/src/schema/resolvers/helpers/generateInviteCode.js b/backend/src/schema/resolvers/helpers/generateInviteCode.ts
similarity index 89%
rename from backend/src/schema/resolvers/helpers/generateInviteCode.js
rename to backend/src/schema/resolvers/helpers/generateInviteCode.ts
index 99c752eb0..5a123ff88 100644
--- a/backend/src/schema/resolvers/helpers/generateInviteCode.js
+++ b/backend/src/schema/resolvers/helpers/generateInviteCode.ts
@@ -4,7 +4,7 @@ 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 = Math.floor(Math.random() * 36)) => {
+ (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)
diff --git a/backend/src/schema/resolvers/helpers/generateNonce.js b/backend/src/schema/resolvers/helpers/generateNonce.ts
similarity index 85%
rename from backend/src/schema/resolvers/helpers/generateNonce.js
rename to backend/src/schema/resolvers/helpers/generateNonce.ts
index 50aa8489e..f08b3ccd6 100644
--- a/backend/src/schema/resolvers/helpers/generateNonce.js
+++ b/backend/src/schema/resolvers/helpers/generateNonce.ts
@@ -4,7 +4,7 @@ import CONSTANTS_REGISTRATION from './../../../constants/registration'
export default function generateNonce() {
return Array.from(
{ length: CONSTANTS_REGISTRATION.NONCE_LENGTH },
- (n = Math.floor(Math.random() * 10)) => {
+ (n: number = Math.floor(Math.random() * 10)) => {
return String.fromCharCode(n + 48)
},
).join('')
diff --git a/backend/src/schema/resolvers/helpers/normalizeEmail.js b/backend/src/schema/resolvers/helpers/normalizeEmail.ts
similarity index 100%
rename from backend/src/schema/resolvers/helpers/normalizeEmail.js
rename to backend/src/schema/resolvers/helpers/normalizeEmail.ts
diff --git a/backend/src/schema/resolvers/images.js b/backend/src/schema/resolvers/images.ts
similarity index 100%
rename from backend/src/schema/resolvers/images.js
rename to backend/src/schema/resolvers/images.ts
diff --git a/backend/src/schema/resolvers/images/images.spec.js b/backend/src/schema/resolvers/images/images.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/images/images.spec.js
rename to backend/src/schema/resolvers/images/images.spec.ts
index b14c59f28..d46972ce0 100644
--- a/backend/src/schema/resolvers/images/images.spec.js
+++ b/backend/src/schema/resolvers/images/images.spec.ts
@@ -170,6 +170,7 @@ describe('mergeImage', () => {
})
})
+ // 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 }),
diff --git a/backend/src/schema/resolvers/images/images.js b/backend/src/schema/resolvers/images/images.ts
similarity index 99%
rename from backend/src/schema/resolvers/images/images.js
rename to backend/src/schema/resolvers/images/images.ts
index 180c6d090..b99b13a10 100644
--- a/backend/src/schema/resolvers/images/images.js
+++ b/backend/src/schema/resolvers/images/images.ts
@@ -10,7 +10,7 @@ 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 = {}) {
+export async function deleteImage(resource, relationshipType, opts: any = {}) {
sanitizeRelationshipType(relationshipType)
const { transaction, deleteCallback } = opts
if (!transaction) return wrapTransaction(deleteImage, [resource, relationshipType], opts)
@@ -32,7 +32,7 @@ export async function deleteImage(resource, relationshipType, opts = {}) {
return image
}
-export async function mergeImage(resource, relationshipType, imageInput, opts = {}) {
+export async function mergeImage(resource, relationshipType, imageInput, opts: any = {}) {
if (typeof imageInput === 'undefined') return
if (imageInput === null) return deleteImage(resource, relationshipType, opts)
sanitizeRelationshipType(relationshipType)
diff --git a/backend/src/schema/resolvers/index.js b/backend/src/schema/resolvers/index.ts
similarity index 63%
rename from backend/src/schema/resolvers/index.js
rename to backend/src/schema/resolvers/index.ts
index 3d3a91d68..1aeadbea2 100644
--- a/backend/src/schema/resolvers/index.js
+++ b/backend/src/schema/resolvers/index.ts
@@ -1,5 +1,6 @@
import path from 'path'
import { fileLoader, mergeResolvers } from 'merge-graphql-schemas'
-const resolversArray = fileLoader(path.join(__dirname, './!(*.spec).js'))
+// 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/backend/src/schema/resolvers/inviteCodes.spec.js b/backend/src/schema/resolvers/inviteCodes.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/inviteCodes.spec.js
rename to backend/src/schema/resolvers/inviteCodes.spec.ts
diff --git a/backend/src/schema/resolvers/inviteCodes.js b/backend/src/schema/resolvers/inviteCodes.ts
similarity index 100%
rename from backend/src/schema/resolvers/inviteCodes.js
rename to backend/src/schema/resolvers/inviteCodes.ts
diff --git a/backend/src/schema/resolvers/locations.spec.js b/backend/src/schema/resolvers/locations.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/locations.spec.js
rename to backend/src/schema/resolvers/locations.spec.ts
diff --git a/backend/src/schema/resolvers/locations.js b/backend/src/schema/resolvers/locations.ts
similarity index 100%
rename from backend/src/schema/resolvers/locations.js
rename to backend/src/schema/resolvers/locations.ts
diff --git a/backend/src/schema/resolvers/messages.spec.ts b/backend/src/schema/resolvers/messages.spec.ts
new file mode 100644
index 000000000..83d9fdc6b
--- /dev/null
+++ b/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/backend/src/schema/resolvers/messages.ts b/backend/src/schema/resolvers/messages.ts
new file mode 100644
index 000000000..c1381045f
--- /dev/null
+++ b/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/backend/src/schema/resolvers/moderation.spec.js b/backend/src/schema/resolvers/moderation.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/moderation.spec.js
rename to backend/src/schema/resolvers/moderation.spec.ts
diff --git a/backend/src/schema/resolvers/moderation.js b/backend/src/schema/resolvers/moderation.ts
similarity index 90%
rename from backend/src/schema/resolvers/moderation.js
rename to backend/src/schema/resolvers/moderation.ts
index c261d187e..a29a411aa 100644
--- a/backend/src/schema/resolvers/moderation.js
+++ b/backend/src/schema/resolvers/moderation.ts
@@ -12,13 +12,13 @@ export default {
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 = review.createdAt
+ 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: labels(resource)[0]} AS finalResource
+ 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) => {
diff --git a/backend/src/schema/resolvers/notifications.spec.js b/backend/src/schema/resolvers/notifications.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/notifications.spec.js
rename to backend/src/schema/resolvers/notifications.spec.ts
index 9deaea457..60539d77f 100644
--- a/backend/src/schema/resolvers/notifications.spec.js
+++ b/backend/src/schema/resolvers/notifications.spec.ts
@@ -238,7 +238,7 @@ describe('given some notifications', () => {
variables: { ...variables, read: false },
})
await expect(response).toMatchObject(expected)
- await expect(response.data.notifications.length).toEqual(2) // double-check
+ await expect(response.data.notifications).toHaveLength(2) // double-check
})
describe('if a resource gets deleted', () => {
diff --git a/backend/src/schema/resolvers/notifications.js b/backend/src/schema/resolvers/notifications.ts
similarity index 86%
rename from backend/src/schema/resolvers/notifications.js
rename to backend/src/schema/resolvers/notifications.ts
index 117b9b530..6a3e232cc 100644
--- a/backend/src/schema/resolvers/notifications.js
+++ b/backend/src/schema/resolvers/notifications.ts
@@ -7,8 +7,8 @@ export default {
notificationAdded: {
subscribe: withFilter(
() => pubsub.asyncIterator(NOTIFICATION_ADDED),
- (payload, variables) => {
- return payload.notificationAdded.to.id === variables.userId
+ (payload, variables, context) => {
+ return payload.notificationAdded.to.id === context.user?.id
},
),
},
@@ -51,10 +51,10 @@ export default {
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)} ] AS posts
+ [(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: labels(resource)[0],
+ __typename: [l IN labels(resource) WHERE l IN ['Post', 'Comment', 'Group']][0],
author: authors[0],
post: posts[0],
myRole: membership.role } AS finalResource
@@ -90,10 +90,10 @@ export default {
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)} ] AS posts
+ [(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: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role } AS finalResource
+ 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 },
@@ -120,10 +120,10 @@ export default {
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)} ] AS posts
+ [(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: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role} AS finalResource
+ 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 },
diff --git a/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/passwordReset.spec.js
rename to backend/src/schema/resolvers/passwordReset.spec.ts
index fa5f26e58..3d17ff481 100644
--- a/backend/src/schema/resolvers/passwordReset.spec.js
+++ b/backend/src/schema/resolvers/passwordReset.spec.ts
@@ -119,7 +119,7 @@ describe('passwordReset', () => {
})
describe('resetPassword', () => {
- const setup = async (options = {}) => {
+ const setup = async (options: any = {}) => {
const { email = 'user@example.org', issuedAt = new Date(), nonce = '12345' } = options
await createPasswordReset({ driver, email, issuedAt, nonce })
}
diff --git a/backend/src/schema/resolvers/passwordReset.js b/backend/src/schema/resolvers/passwordReset.ts
similarity index 100%
rename from backend/src/schema/resolvers/passwordReset.js
rename to backend/src/schema/resolvers/passwordReset.ts
diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.ts
similarity index 70%
rename from backend/src/schema/resolvers/posts.spec.js
rename to backend/src/schema/resolvers/posts.spec.ts
index 9335c1313..7a549449f 100644
--- a/backend/src/schema/resolvers/posts.spec.js
+++ b/backend/src/schema/resolvers/posts.spec.ts
@@ -3,6 +3,10 @@ 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()
@@ -15,29 +19,6 @@ let user
const categoryIds = ['cat9', 'cat4', 'cat15']
let variables
-const createPostMutation = gql`
- mutation ($id: ID, $title: String!, $content: String!, $language: String, $categoryIds: [ID]) {
- CreatePost(
- id: $id
- title: $title
- content: $content
- language: $language
- categoryIds: $categoryIds
- ) {
- id
- title
- content
- slug
- disabled
- deleted
- language
- author {
- name
- }
- }
- }
-`
-
beforeAll(async () => {
await cleanDatabase()
@@ -281,7 +262,7 @@ describe('CreatePost', () => {
describe('unauthenticated', () => {
it('throws authorization error', async () => {
- const { errors } = await mutate({ mutation: createPostMutation, variables })
+ const { errors } = await mutate({ mutation: createPostMutation(), variables })
expect(errors[0]).toHaveProperty('message', 'Not Authorized!')
})
})
@@ -296,7 +277,7 @@ describe('CreatePost', () => {
data: { CreatePost: { title: 'I am a title', content: 'Some content' } },
errors: undefined,
}
- await expect(mutate({ mutation: createPostMutation, variables })).resolves.toMatchObject(
+ await expect(mutate({ mutation: createPostMutation(), variables })).resolves.toMatchObject(
expected,
)
})
@@ -313,25 +294,327 @@ describe('CreatePost', () => {
},
errors: undefined,
}
- await expect(mutate({ mutation: createPostMutation, variables })).resolves.toMatchObject(
+ 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(
+ 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) {
- UpdatePost(id: $id, title: $title, content: $content, image: $image) {
+ 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
@@ -341,26 +624,34 @@ describe('UpdatePost', () => {
}
createdAt
updatedAt
+ categories {
+ id
+ }
+ postType
+ eventStart
+ eventLocationName
+ eventVenue
+ eventLocation {
+ lng
+ lat
+ }
}
}
`
beforeEach(async () => {
author = await Factory.build('user', { slug: 'the-author' })
- newlyCreatedPost = await Factory.build(
- 'post',
- {
- id: 'p9876',
+ authenticatedUser = await author.toJson()
+ const { data } = await mutate({
+ mutation: createPostMutation(),
+ variables: {
title: 'Old title',
content: 'Old content',
- },
- {
- author,
categoryIds,
},
- )
-
+ })
+ newlyCreatedPost = data.CreatePost
variables = {
- id: 'p9876',
+ id: newlyCreatedPost.id,
title: 'New title',
content: 'New content',
}
@@ -394,7 +685,7 @@ describe('UpdatePost', () => {
it('updates a post', async () => {
const expected = {
- data: { UpdatePost: { id: 'p9876', content: 'New content' } },
+ data: { UpdatePost: { id: newlyCreatedPost.id, content: 'New content' } },
errors: undefined,
}
await expect(mutate({ mutation: updatePostMutation, variables })).resolves.toMatchObject(
@@ -405,7 +696,11 @@ describe('UpdatePost', () => {
it('updates a post, but maintains non-updated attributes', async () => {
const expected = {
data: {
- UpdatePost: { id: 'p9876', content: 'New content', createdAt: expect.any(String) },
+ UpdatePost: {
+ id: newlyCreatedPost.id,
+ content: 'New content',
+ createdAt: expect.any(String),
+ },
},
errors: undefined,
}
@@ -415,23 +710,20 @@ describe('UpdatePost', () => {
})
it('updates the updatedAt attribute', async () => {
- newlyCreatedPost = await newlyCreatedPost.toJson()
const {
data: { UpdatePost },
} = await mutate({ mutation: updatePostMutation, variables })
- expect(newlyCreatedPost.updatedAt).toBeTruthy()
- expect(Date.parse(newlyCreatedPost.updatedAt)).toEqual(expect.any(Number))
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', () => {
+ describe('no new category ids provided for update', () => {
it('resolves and keeps current categories', async () => {
const expected = {
data: {
UpdatePost: {
- id: 'p9876',
+ id: newlyCreatedPost.id,
categories: expect.arrayContaining([{ id: 'cat9' }, { id: 'cat4' }, { id: 'cat15' }]),
},
},
@@ -441,9 +733,9 @@ describe('UpdatePost', () => {
expected,
)
})
- }) */
+ })
- /* describe('given category ids', () => {
+ describe('given category ids', () => {
beforeEach(() => {
variables = { ...variables, categoryIds: ['cat27'] }
})
@@ -452,7 +744,7 @@ describe('UpdatePost', () => {
const expected = {
data: {
UpdatePost: {
- id: 'p9876',
+ id: newlyCreatedPost.id,
categories: expect.arrayContaining([{ id: 'cat27' }]),
},
},
@@ -462,9 +754,161 @@ describe('UpdatePost', () => {
expected,
)
})
- }) */
+ })
- describe('params.image', () => {
+ 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 } }
diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.ts
similarity index 90%
rename from backend/src/schema/resolvers/posts.js
rename to backend/src/schema/resolvers/posts.ts
index d806f3803..0bd4507b5 100644
--- a/backend/src/schema/resolvers/posts.js
+++ b/backend/src/schema/resolvers/posts.ts
@@ -7,6 +7,8 @@ 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) => {
@@ -19,12 +21,22 @@ const maintainPinnedPosts = (params) => {
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)
},
@@ -81,6 +93,9 @@ export default {
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
@@ -125,12 +140,13 @@ export default {
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 {.*}
+ RETURN post {.*, postType: [l IN labels(post) WHERE NOT l = 'Post'] }
`,
{ userId: context.user.id, categoryIds, groupId, params },
)
@@ -142,6 +158,9 @@ export default {
})
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')
@@ -154,6 +173,9 @@ export default {
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()
@@ -183,7 +205,16 @@ export default {
`
}
- updatePostCypher += `RETURN 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) => {
@@ -196,6 +227,9 @@ export default {
return post
})
const post = await writeTxResultPromise
+ if (locationName) {
+ await createOrUpdateLocations('Post', post.id, locationName, session)
+ }
return post
} finally {
session.close()
@@ -310,6 +344,7 @@ export default {
`
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
@@ -322,10 +357,12 @@ export default {
}))
})
const [transactionResult] = await writeTxResultPromise
- const { pinnedPost, pinnedAt } = transactionResult
- pinnedPostWithNestedAttributes = {
- ...pinnedPost,
- pinnedAt,
+ if (transactionResult) {
+ const { pinnedPost, pinnedAt } = transactionResult
+ pinnedPostWithNestedAttributes = {
+ ...pinnedPost,
+ pinnedAt,
+ }
}
} finally {
session.close()
@@ -382,7 +419,19 @@ export default {
},
Post: {
...Resolver('Post', {
- undefinedToNull: ['activityId', 'objectId', 'language', 'pinnedAt', 'pinned'],
+ undefinedToNull: [
+ 'activityId',
+ 'objectId',
+ 'language',
+ 'pinnedAt',
+ 'pinned',
+ 'eventVenue',
+ 'eventLocation',
+ 'eventLocationName',
+ 'eventStart',
+ 'eventEnd',
+ 'eventIsOnline',
+ ],
hasMany: {
tags: '-[:TAGGED]->(related:Tag)',
categories: '-[:CATEGORIZED]->(related:Category)',
@@ -395,6 +444,7 @@ export default {
pinnedBy: '<-[:PINNED]-(related:User)',
image: '-[:HERO_IMAGE]->(related:Image)',
group: '-[:IN]->(related:Group)',
+ eventLocation: '-[:IS_IN]->(related:Location)',
},
count: {
commentsCount:
diff --git a/backend/src/schema/resolvers/postsInGroups.spec.js b/backend/src/schema/resolvers/postsInGroups.spec.ts
similarity index 97%
rename from backend/src/schema/resolvers/postsInGroups.spec.js
rename to backend/src/schema/resolvers/postsInGroups.spec.ts
index 86a278207..ba9041090 100644
--- a/backend/src/schema/resolvers/postsInGroups.spec.js
+++ b/backend/src/schema/resolvers/postsInGroups.spec.ts
@@ -818,11 +818,13 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -846,11 +848,13 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -874,11 +878,13 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -902,11 +908,13 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -930,21 +938,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1319,16 +1331,19 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1361,21 +1376,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1410,16 +1429,19 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1452,11 +1474,13 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1489,21 +1513,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1534,21 +1562,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1579,21 +1611,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1628,21 +1664,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1675,21 +1715,25 @@ describe('Posts in Groups', () => {
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,
},
]),
},
@@ -1739,11 +1783,13 @@ describe('Posts in Groups', () => {
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,
},
]),
},
diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/registration.spec.js
rename to backend/src/schema/resolvers/registration.spec.ts
index bfc6a5fa6..54e7f1ba7 100644
--- a/backend/src/schema/resolvers/registration.spec.js
+++ b/backend/src/schema/resolvers/registration.spec.ts
@@ -251,7 +251,7 @@ describe('SignupVerification', () => {
it('connects User with EmailAddress', async () => {
const cypher = `
- MATCH(email:EmailAddress)-[:BELONGS_TO]->(u:User {name: {name}})
+ MATCH(email:EmailAddress)-[:BELONGS_TO]->(u:User {name: $name})
RETURN email
`
await mutate({ mutation, variables })
@@ -281,7 +281,7 @@ describe('SignupVerification', () => {
it('marks the EmailAddress as primary', async () => {
const cypher = `
- MATCH(email:EmailAddress)<-[:PRIMARY_EMAIL]-(u:User {name: {name}})
+ MATCH(email:EmailAddress)<-[:PRIMARY_EMAIL]-(u:User {name: $name})
RETURN email
`
await mutate({ mutation, variables })
diff --git a/backend/src/schema/resolvers/registration.js b/backend/src/schema/resolvers/registration.ts
similarity index 98%
rename from backend/src/schema/resolvers/registration.js
rename to backend/src/schema/resolvers/registration.ts
index c988acfb2..8d5aac346 100644
--- a/backend/src/schema/resolvers/registration.js
+++ b/backend/src/schema/resolvers/registration.ts
@@ -28,7 +28,7 @@ export default {
},
SignupVerification: async (_parent, args, context) => {
const { termsAndConditionsAgreedVersion } = args
- const regEx = new RegExp(/^[0-9]+\.[0-9]+\.[0-9]+$/g)
+ const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g
if (!regEx.test(termsAndConditionsAgreedVersion)) {
throw new UserInputError('Invalid version format!')
}
diff --git a/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/reports.spec.js
rename to backend/src/schema/resolvers/reports.spec.ts
index 96ef07d03..bc47778c1 100644
--- a/backend/src/schema/resolvers/reports.spec.js
+++ b/backend/src/schema/resolvers/reports.spec.ts
@@ -728,7 +728,7 @@ describe('file a report on a resource', () => {
describe('unauthenticated', () => {
it('throws authorization error', async () => {
authenticatedUser = null
- expect(query({ query: reportsQuery })).resolves.toMatchObject({
+ await expect(query({ query: reportsQuery })).resolves.toMatchObject({
data: { reports: null },
errors: [{ message: 'Not Authorized!' }],
})
@@ -738,7 +738,7 @@ describe('file a report on a resource', () => {
describe('authenticated', () => {
it('role "user" gets no reports', async () => {
authenticatedUser = await currentUser.toJson()
- expect(query({ query: reportsQuery })).resolves.toMatchObject({
+ await expect(query({ query: reportsQuery })).resolves.toMatchObject({
data: { reports: null },
errors: [{ message: 'Not Authorized!' }],
})
diff --git a/backend/src/schema/resolvers/reports.js b/backend/src/schema/resolvers/reports.ts
similarity index 91%
rename from backend/src/schema/resolvers/reports.js
rename to backend/src/schema/resolvers/reports.ts
index da8d794c5..f7945e060 100644
--- a/backend/src/schema/resolvers/reports.js
+++ b/backend/src/schema/resolvers/reports.ts
@@ -13,11 +13,11 @@ export default {
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 = report.createdAt, report.rule = 'latestReviewUpdatedAtRules', report.disable = resource.disabled, 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: labels(resource)[0]} AS finalResource
+ 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
`,
{
@@ -92,8 +92,8 @@ export default {
[(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) | post {.*} ] as optionalCommentedPosts,
- resource {.*, __typename: labels(resource)[0] } as resourceWithType
+ [(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 }
@@ -106,7 +106,7 @@ export default {
})
try {
const reports = await reportsReadTxPromise
- return reports
+ return reports || []
} finally {
session.close()
}
diff --git a/backend/src/schema/resolvers/rewards.spec.js b/backend/src/schema/resolvers/rewards.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/rewards.spec.js
rename to backend/src/schema/resolvers/rewards.spec.ts
diff --git a/backend/src/schema/resolvers/rewards.js b/backend/src/schema/resolvers/rewards.ts
similarity index 100%
rename from backend/src/schema/resolvers/rewards.js
rename to backend/src/schema/resolvers/rewards.ts
diff --git a/backend/src/schema/resolvers/roles.js b/backend/src/schema/resolvers/roles.ts
similarity index 100%
rename from backend/src/schema/resolvers/roles.js
rename to backend/src/schema/resolvers/roles.ts
diff --git a/backend/src/schema/resolvers/rooms.spec.ts b/backend/src/schema/resolvers/rooms.spec.ts
new file mode 100644
index 000000000..2e26dc1e3
--- /dev/null
+++ b/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/backend/src/schema/resolvers/rooms.ts b/backend/src/schema/resolvers/rooms.ts
new file mode 100644
index 000000000..5382c5ee7
--- /dev/null
+++ b/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/backend/src/schema/resolvers/searches.spec.js b/backend/src/schema/resolvers/searches.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/searches.spec.js
rename to backend/src/schema/resolvers/searches.spec.ts
diff --git a/backend/src/schema/resolvers/searches.js b/backend/src/schema/resolvers/searches.ts
similarity index 90%
rename from backend/src/schema/resolvers/searches.js
rename to backend/src/schema/resolvers/searches.ts
index 3fdf22da3..5f4097c17 100644
--- a/backend/src/schema/resolvers/searches.js
+++ b/backend/src/schema/resolvers/searches.ts
@@ -12,7 +12,7 @@ const cypherTemplate = (setup) => `
RETURN
${setup.returnClause}
AS result
- SKIP $skip
+ SKIP toInteger($skip)
${setup.limit}
`
@@ -38,14 +38,14 @@ const searchPostsSetup = {
[(resource)<-[:SHOUTED]-(user:User) | user] AS shouter`,
returnClause: `resource {
.*,
- __typename: labels(resource)[0],
+ __typename: 'Post',
author: properties(author),
commentsCount: toString(size(comments)),
shoutedCount: toString(size(shouter)),
clickedCount: toString(resource.clickedCount),
viewedTeaserCount: toString(resource.viewedTeaserCount)
}`,
- limit: 'LIMIT $limit',
+ limit: 'LIMIT toInteger($limit)',
}
const searchUsersSetup = {
@@ -53,8 +53,8 @@ const searchUsersSetup = {
match: 'MATCH (resource:User)',
whereClause: simpleWhereClause,
withClause: '',
- returnClause: 'resource {.*, __typename: labels(resource)[0]}',
- limit: 'LIMIT $limit',
+ returnClause: `resource {.*, __typename: 'User'}`,
+ limit: 'LIMIT toInteger($limit)',
}
const searchHashtagsSetup = {
@@ -62,8 +62,8 @@ const searchHashtagsSetup = {
match: 'MATCH (resource:Tag)',
whereClause: simpleWhereClause,
withClause: '',
- returnClause: 'resource {.*, __typename: labels(resource)[0]}',
- limit: 'LIMIT $limit',
+ returnClause: `resource {.*, __typename: 'Tag'}`,
+ limit: 'LIMIT toInteger($limit)',
}
const searchGroupsSetup = {
@@ -77,8 +77,8 @@ const searchGroupsSetup = {
AND (resource.groupType IN ['public', 'closed']
OR membership.role IN ['usual', 'admin', 'owner'])`,
withClause: 'WITH resource, membership',
- returnClause: 'resource { .*, myRole: membership.role, __typename: labels(resource)[0] }',
- limit: 'LIMIT $limit',
+ returnClause: `resource { .*, myRole: membership.role, __typename: 'Group' }`,
+ limit: 'LIMIT toInteger($limit)',
}
const countSetup = {
@@ -110,7 +110,13 @@ const searchResultPromise = async (session, setup, params) => {
}
const searchResultCallback = (result) => {
- return result.records.map((r) => r.get('result'))
+ const response = result.records.map((r) => r.get('result'))
+ if (Array.isArray(response) && response.length && response[0].__typename === 'Post') {
+ response.forEach((post) => {
+ post.postType = [post.postType]
+ })
+ }
+ return response
}
const countResultCallback = (result) => {
@@ -223,8 +229,7 @@ export default {
},
searchResults: async (_parent, args, context, _resolveInfo) => {
const { query, limit } = args
- let userId = null
- if (context.user) userId = context.user.id
+ const userId = context.user?.id || null
const searchType = query.replace(/^([!@#&]?).*$/, '$1')
const searchString = query.replace(/^([!@#&])/, '')
@@ -245,7 +250,7 @@ export default {
]
params.limit = 15
- const type = multiSearchMap.find((obj) => obj.symbol === searchType)
+ const type: any = multiSearchMap.find((obj) => obj.symbol === searchType)
return getSearchResults(context, type.setup, params)
},
},
diff --git a/backend/src/schema/resolvers/searches/queryString.spec.js b/backend/src/schema/resolvers/searches/queryString.spec.ts
similarity index 98%
rename from backend/src/schema/resolvers/searches/queryString.spec.js
rename to backend/src/schema/resolvers/searches/queryString.spec.ts
index 23a746be1..fe3c91d3c 100644
--- a/backend/src/schema/resolvers/searches/queryString.spec.js
+++ b/backend/src/schema/resolvers/searches/queryString.spec.ts
@@ -37,7 +37,7 @@ describe('queryString', () => {
describe('globbing for longer words', () => {
it('globs words with more than three characters', () => {
- expect(queryString('a couple of words')).toContain('couple* words*')
+ expect(queryString('a couple of words')).toContain('couple* of* words*')
})
})
})
diff --git a/backend/src/schema/resolvers/searches/queryString.js b/backend/src/schema/resolvers/searches/queryString.ts
similarity index 97%
rename from backend/src/schema/resolvers/searches/queryString.js
rename to backend/src/schema/resolvers/searches/queryString.ts
index 5ef84cdce..8f415c5e6 100644
--- a/backend/src/schema/resolvers/searches/queryString.js
+++ b/backend/src/schema/resolvers/searches/queryString.ts
@@ -33,7 +33,7 @@ const matchSomeWordsExactly = (str, boost = 2) => {
const matchBeginningOfWords = (str) => {
return str
.split(' ')
- .filter((s) => s.length > 3)
+ .filter((s) => s.length >= 2)
.map((s) => s + '*')
.join(' ')
}
diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/shout.spec.js
rename to backend/src/schema/resolvers/shout.spec.ts
diff --git a/backend/src/schema/resolvers/shout.js b/backend/src/schema/resolvers/shout.ts
similarity index 100%
rename from backend/src/schema/resolvers/shout.js
rename to backend/src/schema/resolvers/shout.ts
diff --git a/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/socialMedia.spec.js
rename to backend/src/schema/resolvers/socialMedia.spec.ts
diff --git a/backend/src/schema/resolvers/socialMedia.js b/backend/src/schema/resolvers/socialMedia.ts
similarity index 100%
rename from backend/src/schema/resolvers/socialMedia.js
rename to backend/src/schema/resolvers/socialMedia.ts
diff --git a/backend/src/schema/resolvers/statistics.spec.js b/backend/src/schema/resolvers/statistics.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/statistics.spec.js
rename to backend/src/schema/resolvers/statistics.spec.ts
diff --git a/backend/src/schema/resolvers/statistics.js b/backend/src/schema/resolvers/statistics.ts
similarity index 97%
rename from backend/src/schema/resolvers/statistics.js
rename to backend/src/schema/resolvers/statistics.ts
index d9b7c153e..b454ce8f4 100644
--- a/backend/src/schema/resolvers/statistics.js
+++ b/backend/src/schema/resolvers/statistics.ts
@@ -4,7 +4,7 @@ export default {
Query: {
statistics: async (_parent, _args, { driver }) => {
const session = driver.session()
- const counts = {}
+ const counts: any = {}
try {
const mapping = {
countUsers: 'User',
diff --git a/backend/src/schema/resolvers/transactions/inviteCodes.js b/backend/src/schema/resolvers/transactions/inviteCodes.ts
similarity index 100%
rename from backend/src/schema/resolvers/transactions/inviteCodes.js
rename to backend/src/schema/resolvers/transactions/inviteCodes.ts
diff --git a/backend/src/schema/resolvers/userData.spec.js b/backend/src/schema/resolvers/userData.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/userData.spec.js
rename to backend/src/schema/resolvers/userData.spec.ts
diff --git a/backend/src/schema/resolvers/userData.js b/backend/src/schema/resolvers/userData.ts
similarity index 100%
rename from backend/src/schema/resolvers/userData.js
rename to backend/src/schema/resolvers/userData.ts
diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/user_management.spec.js
rename to backend/src/schema/resolvers/user_management.spec.ts
diff --git a/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.ts
similarity index 100%
rename from backend/src/schema/resolvers/user_management.js
rename to backend/src/schema/resolvers/user_management.ts
diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/users.spec.js
rename to backend/src/schema/resolvers/users.spec.ts
index f256c6363..bc976fb24 100644
--- a/backend/src/schema/resolvers/users.spec.js
+++ b/backend/src/schema/resolvers/users.spec.ts
@@ -590,7 +590,7 @@ describe('save category settings', () => {
beforeEach(async () => {
await Promise.all(
categories.map(({ icon, name }, index) => {
- Factory.build('category', {
+ return Factory.build('category', {
id: `cat${index + 1}`,
slug: name,
name,
diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.ts
similarity index 98%
rename from backend/src/schema/resolvers/users.js
rename to backend/src/schema/resolvers/users.ts
index 1ce3b986f..6f79a4ea9 100644
--- a/backend/src/schema/resolvers/users.js
+++ b/backend/src/schema/resolvers/users.ts
@@ -81,7 +81,7 @@ export default {
muteUser: async (_parent, params, context, _resolveInfo) => {
const { user: currentUser } = context
if (currentUser.id === params.id) return null
- await neode.cypher(
+ await neode.writeCypher(
`
MATCH(u:User {id: $currentUser.id})-[previousRelationship:FOLLOWS]->(b:User {id: $params.id})
DELETE previousRelationship
@@ -98,7 +98,7 @@ export default {
unmuteUser: async (_parent, params, context, _resolveInfo) => {
const { user: currentUser } = context
if (currentUser.id === params.id) return null
- await neode.cypher(
+ await neode.writeCypher(
`
MATCH(u:User {id: $currentUser.id})-[previousRelationship:MUTED]->(b:User {id: $params.id})
DELETE previousRelationship
@@ -144,7 +144,7 @@ export default {
params.locationName = params.locationName === '' ? null : params.locationName
const { termsAndConditionsAgreedVersion } = params
if (termsAndConditionsAgreedVersion) {
- const regEx = new RegExp(/^[0-9]+\.[0-9]+\.[0-9]+$/g)
+ const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g
if (!regEx.test(termsAndConditionsAgreedVersion)) {
throw new ForbiddenError('Invalid version format!')
}
@@ -319,7 +319,7 @@ export default {
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 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
diff --git a/backend/src/schema/resolvers/users/location.spec.js b/backend/src/schema/resolvers/users/location.spec.ts
similarity index 97%
rename from backend/src/schema/resolvers/users/location.spec.js
rename to backend/src/schema/resolvers/users/location.spec.ts
index 7097002da..de132c2c7 100644
--- a/backend/src/schema/resolvers/users/location.spec.js
+++ b/backend/src/schema/resolvers/users/location.spec.ts
@@ -208,7 +208,7 @@ describe('userMiddleware', () => {
}
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 {.*}`,
+ `MATCH (city:Location)-[:IS_IN]->(district:Location)-[:IS_IN]->(state:Location)-[:IS_IN]->(country:Location) return city {.*}, state {.*}, country {.*}`,
)
expect(
locations.records.map((record) => {
diff --git a/backend/src/schema/resolvers/users/location.js b/backend/src/schema/resolvers/users/location.ts
similarity index 91%
rename from backend/src/schema/resolvers/users/location.js
rename to backend/src/schema/resolvers/users/location.ts
index 9d8a11f89..0c3f55595 100644
--- a/backend/src/schema/resolvers/users/location.js
+++ b/backend/src/schema/resolvers/users/location.ts
@@ -22,7 +22,7 @@ const locales = ['en', 'de', 'fr', 'nl', 'it', 'es', 'pt', 'pl', 'ru']
const createLocation = async (session, mapboxData) => {
const data = {
- id: mapboxData.id,
+ id: mapboxData.id + (mapboxData.address ? `-${mapboxData.address}` : ''),
nameEN: mapboxData.text_en,
nameDE: mapboxData.text_de,
nameFR: mapboxData.text_fr,
@@ -33,6 +33,7 @@ const createLocation = async (session, mapboxData) => {
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,
}
@@ -54,6 +55,10 @@ const createLocation = async (session, mapboxData) => {
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) => {
@@ -67,12 +72,12 @@ export const createOrUpdateLocations = async (nodeLabel, nodeId, locationName, s
let locationId
if (locationName !== null) {
- const res = await fetch(
+ 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&language=${locales.join(',')}`,
+ }&types=region,place,country,address&language=${locales.join(',')}`,
)
debug(res)
@@ -103,6 +108,10 @@ export const createOrUpdateLocations = async (nodeLabel, nodeId, locationName, s
let parent = data
+ if (parent.address) {
+ parent.id += `-${parent.address}`
+ }
+
if (data.context) {
await asyncForEach(data.context, async (ctx) => {
await createLocation(session, ctx)
@@ -146,7 +155,7 @@ export const createOrUpdateLocations = async (nodeLabel, nodeId, locationName, s
}
export const queryLocations = async ({ place, lang }) => {
- const res = await fetch(
+ 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
diff --git a/backend/src/schema/resolvers/users/mutedUsers.spec.js b/backend/src/schema/resolvers/users/mutedUsers.spec.ts
similarity index 99%
rename from backend/src/schema/resolvers/users/mutedUsers.spec.js
rename to backend/src/schema/resolvers/users/mutedUsers.spec.ts
index 20e37f627..762893af0 100644
--- a/backend/src/schema/resolvers/users/mutedUsers.spec.js
+++ b/backend/src/schema/resolvers/users/mutedUsers.spec.ts
@@ -59,7 +59,7 @@ describe('mutedUsers', () => {
it('throws permission error', async () => {
const { query } = createTestClient(server)
const result = await query({ query: mutedUserQuery })
- expect(result.errors[0]).toHaveProperty('message', 'Not Authorized!')
+ expect(result.errors![0]).toHaveProperty('message', 'Not Authorized!')
})
describe('authenticated and given a muted user', () => {
diff --git a/backend/src/schema/resolvers/viewedTeaserCount.spec.js b/backend/src/schema/resolvers/viewedTeaserCount.spec.ts
similarity index 100%
rename from backend/src/schema/resolvers/viewedTeaserCount.spec.js
rename to backend/src/schema/resolvers/viewedTeaserCount.spec.ts
diff --git a/backend/src/schema/types/enum/PostType.gql b/backend/src/schema/types/enum/PostType.gql
new file mode 100644
index 000000000..eef80d6ba
--- /dev/null
+++ b/backend/src/schema/types/enum/PostType.gql
@@ -0,0 +1,4 @@
+enum PostType {
+ Article
+ Event
+}
diff --git a/backend/src/schema/types/index.js b/backend/src/schema/types/index.ts
similarity index 100%
rename from backend/src/schema/types/index.js
rename to backend/src/schema/types/index.ts
diff --git a/backend/src/schema/types/schema.gql b/backend/src/schema/types/schema.gql
index b15179443..9e2d00bca 100644
--- a/backend/src/schema/types/schema.gql
+++ b/backend/src/schema/types/schema.gql
@@ -1,17 +1,3 @@
-type Mutation {
- # Get a JWT Token for the given Email and password
- login(email: String!, password: String!): String!
- changePassword(oldPassword: String!, newPassword: String!): String!
- requestPasswordReset(email: String!): Boolean!
- resetPassword(email: String!, nonce: String!, newPassword: String!): Boolean!
- # Shout the given Type and ID
- shout(id: ID!, type: ShoutTypeEnum): Boolean!
- # Unshout the given Type and ID
- unshout(id: ID!, type: ShoutTypeEnum): Boolean!
- followUser(id: ID!): User
- unfollowUser(id: ID!): User
-}
-
enum ShoutTypeEnum {
Post
}
@@ -27,4 +13,4 @@ type Reward {
type SharedInboxEndpoint {
id: ID!
uri: String
-}
+}
\ No newline at end of file
diff --git a/backend/src/schema/types/type/Location.gql b/backend/src/schema/types/type/Location.gql
index fad24cc26..9cb5c970a 100644
--- a/backend/src/schema/types/type/Location.gql
+++ b/backend/src/schema/types/type/Location.gql
@@ -25,4 +25,3 @@ type LocationMapBox {
type Query {
queryLocations(place: String!, lang: String!): [LocationMapBox]!
}
-
diff --git a/backend/src/schema/types/type/Message.gql b/backend/src/schema/types/type/Message.gql
new file mode 100644
index 000000000..16e458151
--- /dev/null
+++ b/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/backend/src/schema/types/type/NOTIFIED.gql b/backend/src/schema/types/type/NOTIFIED.gql
index 62a1f3696..1f825decc 100644
--- a/backend/src/schema/types/type/NOTIFIED.gql
+++ b/backend/src/schema/types/type/NOTIFIED.gql
@@ -38,5 +38,5 @@ type Mutation {
}
type Subscription {
- notificationAdded(userId: ID!): NOTIFIED
+ notificationAdded: NOTIFIED
}
diff --git a/backend/src/schema/types/type/Post.gql b/backend/src/schema/types/type/Post.gql
index 6fc7a3215..7e6d1d0e7 100644
--- a/backend/src/schema/types/type/Post.gql
+++ b/backend/src/schema/types/type/Post.gql
@@ -83,6 +83,9 @@ input _PostFilter {
emotions_every: _PostEMOTEDFilter
group: _GroupFilter
postsInMyGroups: Boolean
+ postType_in: [PostType]
+ eventStart_gte: String
+ eventEnd_gte: String
}
enum _PostOrdering {
@@ -104,6 +107,8 @@ enum _PostOrdering {
language_desc
pinned_asc
pinned_desc
+ eventStart_asc
+ eventStart_desc
}
@@ -171,12 +176,30 @@ type Post {
@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
@@ -189,6 +212,8 @@ type Mutation {
categoryIds: [ID]
contentExcerpt: String
groupId: ID
+ postType: PostType = Article
+ eventInput: _EventInput
): Post
UpdatePost(
id: ID!
@@ -200,6 +225,8 @@ type Mutation {
visibility: Visibility
language: String
categoryIds: [ID]
+ postType: PostType
+ eventInput: _EventInput
): Post
DeletePost(id: ID!): Post
AddPostEmotions(to: _PostInput!, data: _EMOTEDInput!): EMOTED
@@ -207,6 +234,11 @@ type Mutation {
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 {
diff --git a/backend/src/schema/types/type/Room.gql b/backend/src/schema/types/type/Room.gql
new file mode 100644
index 000000000..60d54192c
--- /dev/null
+++ b/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/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql
index fe1ff43f0..f406e4e45 100644
--- a/backend/src/schema/types/type/User.gql
+++ b/backend/src/schema/types/type/User.gql
@@ -214,10 +214,21 @@ type Mutation {
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/backend/src/server.spec.js b/backend/src/server.spec.ts
similarity index 100%
rename from backend/src/server.spec.js
rename to backend/src/server.spec.ts
diff --git a/backend/src/server.js b/backend/src/server.ts
similarity index 82%
rename from backend/src/server.js
rename to backend/src/server.ts
index bcbd84617..0522f5fc8 100644
--- a/backend/src/server.js
+++ b/backend/src/server.ts
@@ -7,7 +7,6 @@ import middleware from './middleware'
import { getNeode, getDriver } from './db/neo4j'
import decode from './jwt/decode'
import schema from './schema'
-import webfinger from './activitypub/routes/webfinger'
import { RedisPubSub } from 'graphql-redis-subscriptions'
import { PubSub } from 'graphql-subscriptions'
import Redis from 'ioredis'
@@ -15,6 +14,8 @@ 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 = {
@@ -58,7 +59,7 @@ export const context = async (options) => {
}
}
-const createServer = (options) => {
+const createServer = (options?) => {
const defaults = {
context,
schema: middleware(schema),
@@ -82,11 +83,16 @@ const createServer = (options) => {
const app = express()
app.set('driver', driver)
- app.use(helmet())
- app.use('/.well-known/', webfinger())
+ // 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' }))
- app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }))
+ 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)
diff --git a/backend/test/features/activity-delete.feature b/backend/test/features/activity-delete.feature
deleted file mode 100644
index 76c734952..000000000
--- a/backend/test/features/activity-delete.feature
+++ /dev/null
@@ -1,55 +0,0 @@
-Feature: Delete an object
- I want to delete objects
-
- Background:
- Given our own server runs at "http://localhost:4123"
- And we have the following users in our database:
- | Slug |
- | bernd-das-brot|
- And I send a POST request with the following activity to "/activitypub/users/bernd-das-brot/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "https://aronda.org/users/bernd-das-brot/status/lka7dfzkjn2398hsfd",
- "type": "Create",
- "actor": "https://aronda.org/users/bernd-das-brot",
- "object": {
- "id": "https://aronda.org/users/bernd-das-brot/status/kljsdfg9843jknsdf234",
- "type": "Article",
- "published": "2019-02-07T19:37:55.002Z",
- "attributedTo": "https://aronda.org/users/bernd-das-brot",
- "content": "Hi Max, how are you?",
- "to": "https://www.w3.org/ns/activitystreams#Public"
- }
- }
- """
-
- Scenario: Deleting a post (Article Object)
- When I send a POST request with the following activity to "/activitypub/users/bernd-das-brot/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/karl-heinz/status/a4DJ2afdg323v32641vna42lkj685kasd2",
- "type": "Delete",
- "object": {
- "id": "https://aronda.org/activitypub/users/bernd-das-brot/status/kljsdfg9843jknsdf234",
- "type": "Article",
- "published": "2019-02-07T19:37:55.002Z",
- "attributedTo": "https://aronda.org/activitypub/users/bernd-das-brot",
- "content": "Hi Max, how are you?",
- "to": "https://www.w3.org/ns/activitystreams#Public"
- }
- }
- """
- Then I expect the status code to be 200
- And the object is removed from the outbox collection of "bernd-das-brot"
- """
- {
- "id": "https://aronda.org/activitypub/users/bernd-das-brot/status/kljsdfg9843jknsdf234",
- "type": "Article",
- "published": "2019-02-07T19:37:55.002Z",
- "attributedTo": "https://aronda.org/activitypub/users/bernd-das-brot",
- "content": "Hi Max, how are you?",
- "to": "https://www.w3.org/ns/activitystreams#Public"
- }
- """
diff --git a/backend/test/features/activity-follow.feature b/backend/test/features/activity-follow.feature
deleted file mode 100644
index 7aa0c447d..000000000
--- a/backend/test/features/activity-follow.feature
+++ /dev/null
@@ -1,51 +0,0 @@
-Feature: Follow a user
- I want to be able to follow a user on another instance.
- Also if I do not want to follow a previous followed user anymore,
- I want to undo the follow.
-
- Background:
- Given our own server runs at "http://localhost:4123"
- And we have the following users in our database:
- | Slug |
- | stuart-little |
- | tero-vota |
-
- @wip
- Scenario: Send a follow to a user inbox and make sure it's added to the right followers collection
- When I send a POST request with the following activity to "/activitypub/users/tero-vota/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/stuart-little/status/83J23549sda1k72fsa4567na42312455kad83",
- "type": "Follow",
- "actor": "http://localhost:4123/activitypub/users/stuart-little",
- "object": "http://localhost:4123/activitypub/users/tero-vota"
- }
- """
- Then I expect the status code to be 200
- And the follower is added to the followers collection of "tero-vota"
- """
- http://localhost:4123/activitypub/users/stuart-little
- """
-
- Scenario: Send an undo activity to revert the previous follow activity
- When I send a POST request with the following activity to "/activitypub/users/stuart-little/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/tero-vota/status/a4DJ2afdg323v32641vna42lkj685kasd2",
- "type": "Undo",
- "actor": "http://localhost:4123/activitypub/users/tero-vota",
- "object": {
- "id": "http://localhost:4123/activitypub/users/stuart-little/status/83J23549sda1k72fsa4567na42312455kad83",
- "type": "Follow",
- "actor": "http://localhost:4123/activitypub/users/stuart-little",
- "object": "http://localhost:4123/activitypub/users/tero-vota"
- }
- }
- """
- Then I expect the status code to be 200
- And the follower is removed from the followers collection of "tero-vota"
- """
- http://localhost:4123/activitypub/users/stuart-little
- """
diff --git a/backend/test/features/activity-like.feature b/backend/test/features/activity-like.feature
deleted file mode 100644
index 26ef9c857..000000000
--- a/backend/test/features/activity-like.feature
+++ /dev/null
@@ -1,43 +0,0 @@
-Feature: Like an object like an article or note
- As a user I want to like others posts
- Also if I do not want to follow a previous followed user anymore,
- I want to undo the follow.
-
- Background:
- Given our own server runs at "http://localhost:4123"
- And we have the following users in our database:
- | Slug |
- | karl-heinz |
- | peter-lustiger |
- And I send a POST request with the following activity to "/activitypub/users/bernd-das-brot/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/karl-heinz/status/faslkasa7dasfzkjn2398hsfd",
- "type": "Create",
- "actor": "http://localhost:4123/activitypub/users/karl-heinz",
- "object": {
- "id": "http://localhost:4123/activitypub/users/karl-heinz/status/dkasfljsdfaafg9843jknsdf",
- "type": "Article",
- "published": "2019-02-07T19:37:55.002Z",
- "attributedTo": "http://localhost:4123/activitypub/users/karl-heinz",
- "content": "Hi Max, how are you?",
- "to": "https://www.w3.org/ns/activitystreams#Public"
- }
- }
- """
-
- @wip
- Scenario: Send a like of a person to an users inbox and make sure it's added to the likes collection
- When I send a POST request with the following activity to "/activitypub/users/karl-heinz/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/peter-lustiger/status/83J23549sda1k72fsa4567na42312455kad83",
- "type": "Like",
- "actor": "http://localhost:4123/activitypub/users/peter-lustiger",
- "object": "http://localhost:4123/activitypub/users/karl-heinz/status/dkasfljsdfaafg9843jknsdf"
- }
- """
- Then I expect the status code to be 200
- And the post with id "dkasfljsdfaafg9843jknsdf" has been liked by "peter-lustiger"
diff --git a/backend/test/features/collection.feature b/backend/test/features/collection.feature
deleted file mode 100644
index 1bb4737e0..000000000
--- a/backend/test/features/collection.feature
+++ /dev/null
@@ -1,101 +0,0 @@
-Feature: Receiving collections
- As a member of the Fediverse I want to be able of fetching collections
-
- Background:
- Given our own server runs at "http://localhost:4123"
- And we have the following users in our database:
- | Slug |
- | renate-oberdorfer |
-
- Scenario: Send a request to the outbox URI of peter-lustig and expect a ordered collection
- When I send a GET request to "/activitypub/users/renate-oberdorfer/outbox"
- Then I expect the status code to be 200
- And I receive the following json:
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/renate-oberdorfer/outbox",
- "summary": "renate-oberdorfers outbox collection",
- "type": "OrderedCollection",
- "first": "http://localhost:4123/activitypub/users/renate-oberdorfer/outbox?page=true",
- "totalItems": 0
- }
- """
-
- Scenario: Send a request to the following URI of peter-lustig and expect a ordered collection
- When I send a GET request to "/activitypub/users/renate-oberdorfer/following"
- Then I expect the status code to be 200
- And I receive the following json:
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/renate-oberdorfer/following",
- "summary": "renate-oberdorfers following collection",
- "type": "OrderedCollection",
- "first": "http://localhost:4123/activitypub/users/renate-oberdorfer/following?page=true",
- "totalItems": 0
- }
- """
-
- Scenario: Send a request to the followers URI of peter-lustig and expect a ordered collection
- When I send a GET request to "/activitypub/users/renate-oberdorfer/followers"
- Then I expect the status code to be 200
- And I receive the following json:
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/renate-oberdorfer/followers",
- "summary": "renate-oberdorfers followers collection",
- "type": "OrderedCollection",
- "first": "http://localhost:4123/activitypub/users/renate-oberdorfer/followers?page=true",
- "totalItems": 0
- }
- """
-
- Scenario: Send a request to the outbox URI of peter-lustig and expect a paginated outbox collection
- When I send a GET request to "/activitypub/users/renate-oberdorfer/outbox?page=true"
- Then I expect the status code to be 200
- And I receive the following json:
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/renate-oberdorfer/outbox?page=true",
- "summary": "renate-oberdorfers outbox collection",
- "type": "OrderedCollectionPage",
- "totalItems": 0,
- "partOf": "http://localhost:4123/activitypub/users/renate-oberdorfer/outbox",
- "orderedItems": []
- }
- """
-
- Scenario: Send a request to the following URI of peter-lustig and expect a paginated following collection
- When I send a GET request to "/activitypub/users/renate-oberdorfer/following?page=true"
- Then I expect the status code to be 200
- And I receive the following json:
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/renate-oberdorfer/following?page=true",
- "summary": "renate-oberdorfers following collection",
- "type": "OrderedCollectionPage",
- "totalItems": 0,
- "partOf": "http://localhost:4123/activitypub/users/renate-oberdorfer/following",
- "orderedItems": []
- }
- """
-
- Scenario: Send a request to the followers URI of peter-lustig and expect a paginated followers collection
- When I send a GET request to "/activitypub/users/renate-oberdorfer/followers?page=true"
- Then I expect the status code to be 200
- And I receive the following json:
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "http://localhost:4123/activitypub/users/renate-oberdorfer/followers?page=true",
- "summary": "renate-oberdorfers followers collection",
- "type": "OrderedCollectionPage",
- "totalItems": 0,
- "partOf": "http://localhost:4123/activitypub/users/renate-oberdorfer/followers",
- "orderedItems": []
- }
- """
diff --git a/backend/test/features/object-article.feature b/backend/test/features/object-article.feature
deleted file mode 100644
index 030e408e9..000000000
--- a/backend/test/features/object-article.feature
+++ /dev/null
@@ -1,30 +0,0 @@
-Feature: Send and receive Articles
- I want to send and receive article's via ActivityPub
-
- Background:
- Given our own server runs at "http://localhost:4123"
- And we have the following users in our database:
- | Slug |
- | marvin |
- | max |
-
- Scenario: Send an article to a user inbox and make sure it's added to the inbox
- When I send a POST request with the following activity to "/activitypub/users/max/inbox":
- """
- {
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "https://aronda.org/users/marvin/status/lka7dfzkjn2398hsfd",
- "type": "Create",
- "actor": "https://aronda.org/users/marvin",
- "object": {
- "id": "https://aronda.org/users/marvin/status/kljsdfg9843jknsdf",
- "type": "Article",
- "published": "2019-02-07T19:37:55.002Z",
- "attributedTo": "https://aronda.org/users/marvin",
- "content": "Hi Max, how are you?",
- "to": "as:Public"
- }
- }
- """
- Then I expect the status code to be 200
- And the post with id "kljsdfg9843jknsdf" to be created
diff --git a/backend/test/features/support/steps.js b/backend/test/features/support/steps.js
deleted file mode 100644
index e15801f83..000000000
--- a/backend/test/features/support/steps.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// features/support/steps.js
-import { Given, When, Then, AfterAll } from 'cucumber'
-import { expect } from 'chai'
-// import { client } from '../../../src/activitypub/apollo-client'
-import { GraphQLClient } from 'graphql-request'
-import Factory from '../../../src/db/factories'
-const debug = require('debug')('ea:test:steps')
-
-const client = new GraphQLClient(host)
-
-function createUser (slug) {
- debug(`creating user ${slug}`)
- return Factory.build('user', {
- name: slug,
- }, {
- password: '1234',
- email: 'example@test.org',
- })
- // await login({ email: 'example@test.org', password: '1234' })
-}
-
-Given('our own server runs at {string}', function (string) {
- // just documenation
-})
-
-Given('we have the following users in our database:', function (dataTable) {
- return Promise.all(dataTable.hashes().map((user) => {
- return createUser(user.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
-})
-
-When('I send a POST request with the following activity to {string}:', async function (inboxUrl, activity) {
- debug(`inboxUrl = ${inboxUrl}`)
- debug(`activity = ${activity}`)
- const splitted = inboxUrl.split('/')
- const slug = splitted[splitted.indexOf('users') + 1]
- let result
- do {
- result = await client.request(`
- query {
- User(slug: "${slug}") {
- id
- slug
- actorId
- }
- }
- `)
- } while (result.User.length === 0)
- this.lastInboxUrl = inboxUrl
- this.lastActivity = activity
- const response = await this.post(inboxUrl, activity)
-
- this.lastResponses.push(response.lastResponse)
- this.lastResponse = response.lastResponse
- this.statusCode = response.statusCode
-})
-
-Then('I receive the following json:', function (docString) {
- const parsedDocString = JSON.parse(docString)
- const parsedLastResponse = JSON.parse(this.lastResponses.shift())
- if (Array.isArray(parsedDocString.orderedItems)) {
- parsedDocString.orderedItems.forEach((el) => {
- delete el.id
- if (el.object) delete el.object.published
- })
- parsedLastResponse.orderedItems.forEach((el) => {
- delete el.id
- if (el.object) delete el.object.published
- })
- }
- if (parsedDocString.publicKey && parsedDocString.publicKey.publicKeyPem) {
- delete parsedDocString.publicKey.publicKeyPem
- delete parsedLastResponse.publicKey.publicKeyPem
- }
- expect(parsedDocString).to.eql(parsedLastResponse)
-})
-
-Then('I expect the Content-Type to be {string}', function (contentType) {
- expect(this.lastContentType).to.equal(contentType)
-})
-
-Then('I expect the status code to be {int}', function (statusCode) {
- expect(this.statusCode).to.equal(statusCode)
-})
-
-Then('the activity is added to the {string} collection', async function (collectionName) {
- const response = await this.get(this.lastInboxUrl.replace('inbox', collectionName) + '?page=true')
- debug(`orderedItems = ${JSON.parse(response.lastResponse).orderedItems}`)
- expect(JSON.parse(response.lastResponse).orderedItems).to.include(JSON.parse(this.lastActivity).object)
-})
-
-Then('the follower is added to the followers collection of {string}', async function (userName, follower) {
- const response = await this.get(`/activitypub/users/${userName}/followers?page=true`)
- const responseObject = JSON.parse(response.lastResponse)
- expect(responseObject.orderedItems).to.include(follower)
-})
-
-Then('the follower is removed from the followers collection of {string}', async function (userName, follower) {
- const response = await this.get(`/activitypub/users/${userName}/followers?page=true`)
- const responseObject = JSON.parse(response.lastResponse)
- expect(responseObject.orderedItems).to.not.include(follower)
-})
-
-Then('the post with id {string} to be created', async function (id) {
- let result
- do {
- result = await client.request(`
- query {
- Post(id: "${id}") {
- title
- }
- }
- `)
- } while (result.Post.length === 0)
-
- expect(result.Post).to.be.an('array').that.is.not.empty // eslint-disable-line
-})
-
-Then('the object is removed from the outbox collection of {string}', async function (name, object) {
- const response = await this.get(`/activitypub/users/${name}/outbox?page=true`)
- const parsedResponse = JSON.parse(response.lastResponse)
- expect(parsedResponse.orderedItems).to.not.include(object)
-})
-
-Then('I send a GET request to {string} and expect a ordered collection', () => {
-
-})
-
-Then('the activity is added to the users inbox collection', async function () {
-
-})
-
-Then('the post with id {string} has been liked by {string}', async function (id, slug) {
- let result
- do {
- result = await client.request(`
- query {
- Post(id: "${id}") {
- shoutedBy {
- slug
- }
- }
- }
- `)
- } while (result.Post.length === 0)
-
- expect(result.Post[0].shoutedBy).to.be.an('array').that.is.not.empty // eslint-disable-line
- expect(result.Post[0].shoutedBy[0].slug).to.equal(slug)
-})
diff --git a/backend/test/features/webfinger.feature b/backend/test/features/webfinger.feature
deleted file mode 100644
index cbca5ac10..000000000
--- a/backend/test/features/webfinger.feature
+++ /dev/null
@@ -1,39 +0,0 @@
-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 own server runs at "http://localhost:4123"
- And we have the following users in our database:
- | Slug |
- | peter-lustiger |
-
- Scenario: Receiving an actor object
- When I send a GET request to "/activitypub/users/peter-lustiger"
- Then I receive the following json:
- """
- {
- "@context": [
- "https://www.w3.org/ns/activitystreams",
- "https://w3id.org/security/v1"
- ],
- "id": "http://localhost:4123/activitypub/users/peter-lustiger",
- "type": "Person",
- "preferredUsername": "peter-lustiger",
- "name": "peter-lustiger",
- "following": "http://localhost:4123/activitypub/users/peter-lustiger/following",
- "followers": "http://localhost:4123/activitypub/users/peter-lustiger/followers",
- "inbox": "http://localhost:4123/activitypub/users/peter-lustiger/inbox",
- "outbox": "http://localhost:4123/activitypub/users/peter-lustiger/outbox",
- "url": "http://localhost:4123/activitypub/@peter-lustiger",
- "endpoints": {
- "sharedInbox": "http://localhost:4123/activitypub/inbox"
- },
- "publicKey": {
- "id": "http://localhost:4123/activitypub/users/peter-lustiger#main-key",
- "owner": "http://localhost:4123/activitypub/users/peter-lustiger",
- "publicKeyPem": "adglkjlk89235kjn8obn2384f89z5bv9..."
- }
- }
- """
diff --git a/backend/test/features/world.js b/backend/test/features/world.js
deleted file mode 100644
index be436b536..000000000
--- a/backend/test/features/world.js
+++ /dev/null
@@ -1,58 +0,0 @@
-// features/support/world.js
-import { setWorldConstructor } from 'cucumber'
-import request from 'request'
-const debug = require('debug')('ea:test:world')
-
-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:4123/${this.replaceSlashes(pathname)}`, {
- headers: {
- 'Accept': 'application/activity+json'
- }}, function (error, response, body) {
- if (!error) {
- debug(`get content-type = ${response.headers['content-type']}`)
- debug(`get body = ${JSON.stringify(typeof body === 'string' ? JSON.parse(body) : body, null, 2)}`)
- resolve({ lastResponse: body, lastContentType: response.headers['content-type'], statusCode: response.statusCode })
- } else {
- reject(error)
- }
- })
- })
- }
-
- replaceSlashes (pathname) {
- return pathname.replace(/^\/+/, '')
- }
-
- post (pathname, activity) {
- return new Promise((resolve, reject) => {
- request({
- url: `http://localhost:4123/${this.replaceSlashes(pathname)}`,
- method: 'POST',
- headers: {
- 'Content-Type': 'application/activity+json'
- },
- body: activity
- }, function (error, response, body) {
- if (!error) {
- debug(`post response = ${response.headers['content-type']}`)
- resolve({ lastResponse: body, lastContentType: response.headers['content-type'], statusCode: response.statusCode })
- } else {
- reject(error)
- }
- })
- })
- }
-}
-
-setWorldConstructor(CustomWorld)
diff --git a/backend/test/setup.js b/backend/test/setup.ts
similarity index 87%
rename from backend/test/setup.js
rename to backend/test/setup.ts
index 4501da899..d2f24bd40 100644
--- a/backend/test/setup.js
+++ b/backend/test/setup.ts
@@ -2,7 +2,7 @@
// 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
+global.TextDecoder = TextDecoder as any
// Metascraper takes longer nowadays, double time
jest.setTimeout(10000)
\ No newline at end of file
diff --git a/backend/tsconfig.json b/backend/tsconfig.json
new file mode 100644
index 000000000..b6f3526a3
--- /dev/null
+++ b/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/backend/yarn.lock b/backend/yarn.lock
index c2fb0d28c..a439aa804 100644
--- a/backend/yarn.lock
+++ b/backend/yarn.lock
@@ -10,6 +10,14 @@
"@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"
@@ -71,21 +79,27 @@
dependencies:
"@babel/highlight" "^7.18.6"
-"@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.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==
+"@babel/code-frame@^7.22.13":
+ version "7.22.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
+ integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
dependencies:
- browserslist "^4.9.1"
- invariant "^2.2.4"
- semver "^5.5.0"
+ "@babel/highlight" "^7.22.13"
+ chalk "^2.4.2"
-"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3":
+"@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.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0"
+ integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==
+
+"@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==
@@ -106,6 +120,27 @@
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"
@@ -137,81 +172,105 @@
"@jridgewell/gen-mapping" "^0.3.2"
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==
+"@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.8.3"
+ "@babel/types" "^7.22.5"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
-"@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==
+"@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/helper-explode-assignable-expression" "^7.8.3"
- "@babel/types" "^7.8.3"
+ "@babel/types" "^7.22.5"
-"@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==
+"@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/compat-data" "^7.20.5"
- "@babel/helper-validator-option" "^7.18.6"
- browserslist "^4.21.3"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52"
+ integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==
+ dependencies:
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-validator-option" "^7.22.15"
+ browserslist "^4.21.9"
lru-cache "^5.1.1"
- semver "^6.3.0"
+ semver "^6.3.1"
-"@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==
+"@babel/helper-create-class-features-plugin@^7.22.11":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4"
+ integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==
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-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.15"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
-"@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==
+"@babel/helper-create-class-features-plugin@^7.22.5":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236"
+ integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==
dependencies:
- "@babel/helper-regex" "^7.8.3"
- regexpu-core "^4.6.0"
+ "@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.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
-"@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==
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6"
+ integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-regex" "^7.8.3"
- regexpu-core "^4.7.0"
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ regexpu-core "^5.3.1"
+ semver "^6.3.1"
-"@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==
+"@babel/helper-define-polyfill-provider@^0.4.2":
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7"
+ integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==
dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/types" "^7.8.3"
- lodash "^4.17.13"
+ "@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.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-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-environment-visitor@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@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.19.0", "@babel/helper-function-name@^7.8.3":
version "7.19.0"
@@ -221,21 +280,13 @@
"@babel/template" "^7.18.10"
"@babel/types" "^7.19.0"
-"@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==
+"@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/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/template" "^7.22.5"
+ "@babel/types" "^7.22.5"
"@babel/helper-hoist-variables@^7.18.6":
version "7.18.6"
@@ -244,27 +295,48 @@
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==
+"@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.8.3"
+ "@babel/types" "^7.22.5"
-"@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==
+"@babel/helper-member-expression-to-functions@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621"
+ integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==
dependencies:
- "@babel/types" "^7.20.7"
+ "@babel/types" "^7.22.15"
-"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.8.3":
+"@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.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.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
+ integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
+"@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"
@@ -279,65 +351,91 @@
"@babel/traverse" "^7.20.10"
"@babel/types" "^7.20.7"
-"@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==
+"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.9":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e"
+ integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==
dependencies:
- "@babel/types" "^7.18.6"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/helper-validator-identifier" "^7.22.20"
-"@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.18.6", "@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==
+"@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:
- lodash "^4.17.13"
+ "@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-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==
+"@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/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/types" "^7.22.5"
-"@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==
+"@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.19.0", "@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.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82"
+ integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==
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-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-wrap-function" "^7.22.9"
-"@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==
+"@babel/helper-remap-async-to-generator@^7.22.9":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
+ integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==
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-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-wrap-function" "^7.22.20"
-"@babel/helper-simple-access@^7.20.2", "@babel/helper-simple-access@^7.8.3":
+"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779"
+ integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==
+ 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/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.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.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"
@@ -345,30 +443,62 @@
dependencies:
"@babel/types" "^7.18.6"
-"@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-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-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.9.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.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.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-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
-"@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==
+"@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.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040"
+ integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==
+
+"@babel/helper-wrap-function@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
+ integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==
dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/traverse" "^7.8.3"
- "@babel/types" "^7.8.3"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.22.19"
+
+"@babel/helper-wrap-function@^7.22.9":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9"
+ integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==
+ dependencies:
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/types" "^7.22.5"
"@babel/helpers@^7.20.7", "@babel/helpers@^7.9.0":
version "7.20.13"
@@ -379,6 +509,15 @@
"@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"
@@ -388,6 +527,24 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@babel/highlight@^7.22.13":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
+ integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ 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"
@@ -407,99 +564,49 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89"
integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==
+"@babel/parser@^7.22.15":
+ version "7.22.16"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95"
+ integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==
+
+"@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==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15":
+ version "7.22.15"
+ 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.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962"
+ integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==
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/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f"
+ integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/plugin-transform-optional-chaining" "^7.22.15"
-"@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-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-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==
+"@babel/plugin-proposal-throw-expressions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.22.5.tgz#2c0613f208214051bed7bff6302216aa9697e1c0"
+ integrity sha512-34kY5YjNKDhjXbj2oNDkxl0xNl2+yQTEsWu8Ia6kCTb6wz76bBCd4DzmeZokfr6g68yneu3eg8qAyYgKbyesFg==
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/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-throw-expressions" "^7.22.5"
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -515,34 +622,55 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-class-properties@^7.8.3":
+"@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-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==
+"@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-import-meta@^7.8.3":
+"@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", "@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"
@@ -550,27 +678,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.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.8.3":
+"@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"
@@ -578,41 +692,20 @@
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":
+"@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-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":
+"@babel/plugin-syntax-object-rest-spread@^7.0.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"
@@ -620,13 +713,6 @@
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"
@@ -634,19 +720,26 @@
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==
+"@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.8.3"
+ "@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==
+"@babel/plugin-syntax-throw-expressions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.22.5.tgz#9ab803c17e25bbfedf8375acbbb0aa9f51c55496"
+ integrity sha512-oCyfA7rDVcQIydA7ZOmnHCQTzz5JvG9arY++Z+ASL/q5q+mJLblaRNHoK6ggV54X2c14wCK/lQi7z1DujmEmZA==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+ 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-typescript@^7.7.2":
version "7.20.0"
@@ -655,324 +748,494 @@
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==
+"@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-plugin-utils" "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@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==
+"@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-module-imports" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-remap-async-to-generator" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-async-generator-functions@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3"
+ integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-remap-async-to-generator" "^7.22.9"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
-"@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==
+"@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-plugin-utils" "^7.8.3"
- lodash "^4.17.13"
+ "@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-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==
+"@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-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"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-block-scoping@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841"
+ integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==
+ 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.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974"
+ integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b"
+ integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@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.9"
+ "@babel/helper-split-export-declaration" "^7.22.6"
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==
+"@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.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/template" "^7.22.5"
-"@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==
+"@babel/plugin-transform-destructuring@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694"
+ integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-dotall-regex@^7.22.5":
+ 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.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@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.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-dynamic-import@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa"
+ integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-dynamic-import" "^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==
+"@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-plugin-utils" "^7.8.3"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-export-namespace-from@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c"
+ integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==
dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-export-namespace-from" "^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==
+"@babel/plugin-transform-for-of@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29"
+ integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@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-plugin-utils" "^7.8.3"
+ "@babel/helper-compilation-targets" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-json-strings@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835"
+ integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==
dependencies:
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
-"@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==
+"@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-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/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-logical-assignment-operators@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c"
+ integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==
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/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@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==
+"@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-module-transforms" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.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==
+"@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-create-regexp-features-plugin" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.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==
+"@babel/plugin-transform-modules-commonjs@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f"
+ integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-simple-access" "^7.22.5"
-"@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==
+"@babel/plugin-transform-modules-systemjs@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1"
+ integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.3"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-module-transforms" "^7.22.9"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
-"@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==
+"@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-get-function-arity" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@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-plugin-utils" "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@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:
- regenerator-transform "^0.14.2"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc"
+ integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^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==
+"@babel/plugin-transform-numeric-separator@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd"
+ integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@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==
+"@babel/plugin-transform-object-rest-spread@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f"
+ integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.22.15"
-"@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==
+"@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.8.3"
- "@babel/helper-regex" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.5"
-"@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==
+"@babel/plugin-transform-optional-catch-binding@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0"
+ integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-optional-catch-binding" "^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==
+"@babel/plugin-transform-optional-chaining@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba"
+ integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@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-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==
+"@babel/plugin-transform-parameters@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114"
+ integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@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==
+"@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/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/helper-create-class-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.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==
+"@babel/plugin-transform-private-property-in-object@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1"
+ integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@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-regenerator@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca"
+ integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ regenerator-transform "^0.15.2"
+
+"@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-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.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9"
+ integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==
+ 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.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb"
+ integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==
+ dependencies:
+ "@babel/compat-data" "^7.22.20"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-validator-option" "^7.22.15"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15"
+ "@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.15"
+ "@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.15"
+ "@babel/plugin-transform-class-properties" "^7.22.5"
+ "@babel/plugin-transform-class-static-block" "^7.22.11"
+ "@babel/plugin-transform-classes" "^7.22.15"
+ "@babel/plugin-transform-computed-properties" "^7.22.5"
+ "@babel/plugin-transform-destructuring" "^7.22.15"
+ "@babel/plugin-transform-dotall-regex" "^7.22.5"
+ "@babel/plugin-transform-duplicate-keys" "^7.22.5"
+ "@babel/plugin-transform-dynamic-import" "^7.22.11"
+ "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
+ "@babel/plugin-transform-export-namespace-from" "^7.22.11"
+ "@babel/plugin-transform-for-of" "^7.22.15"
+ "@babel/plugin-transform-function-name" "^7.22.5"
+ "@babel/plugin-transform-json-strings" "^7.22.11"
+ "@babel/plugin-transform-literals" "^7.22.5"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.22.11"
+ "@babel/plugin-transform-member-expression-literals" "^7.22.5"
+ "@babel/plugin-transform-modules-amd" "^7.22.5"
+ "@babel/plugin-transform-modules-commonjs" "^7.22.15"
+ "@babel/plugin-transform-modules-systemjs" "^7.22.11"
+ "@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.11"
+ "@babel/plugin-transform-numeric-separator" "^7.22.11"
+ "@babel/plugin-transform-object-rest-spread" "^7.22.15"
+ "@babel/plugin-transform-object-super" "^7.22.5"
+ "@babel/plugin-transform-optional-catch-binding" "^7.22.11"
+ "@babel/plugin-transform-optional-chaining" "^7.22.15"
+ "@babel/plugin-transform-parameters" "^7.22.15"
+ "@babel/plugin-transform-private-methods" "^7.22.5"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.11"
+ "@babel/plugin-transform-property-literals" "^7.22.5"
+ "@babel/plugin-transform-regenerator" "^7.22.10"
+ "@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.10"
+ "@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.6-no-external-plugins"
+ "@babel/types" "^7.22.19"
+ babel-plugin-polyfill-corejs2 "^0.4.5"
+ babel-plugin-polyfill-corejs3 "^0.8.3"
+ babel-plugin-polyfill-regenerator "^0.5.2"
+ core-js-compat "^3.31.0"
+ semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ version "0.1.6-no-external-plugins"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+ integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
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"
@@ -987,6 +1250,11 @@
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-corejs2@^7.5.5":
version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz#c3214c08ef20341af4187f1c9fbdc357fbec96b2"
@@ -1017,7 +1285,7 @@
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":
+"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.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==
@@ -1026,7 +1294,25 @@
"@babel/parser" "^7.20.7"
"@babel/types" "^7.20.7"
-"@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":
+"@babel/template@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
+ integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/parser" "^7.22.15"
+ "@babel/types" "^7.22.15"
+
+"@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.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==
@@ -1042,7 +1328,23 @@
debug "^4.1.0"
globals "^11.1.0"
-"@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3":
+"@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":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892"
integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==
@@ -1057,22 +1359,13 @@
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==
+"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0":
+ version "7.22.19"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684"
+ integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==
dependencies:
- "@babel/helper-string-parser" "^7.19.4"
- "@babel/helper-validator-identifier" "^7.19.1"
- 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"
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.19"
to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3":
@@ -1088,10 +1381,49 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
-"@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==
+"@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"
@@ -1131,33 +1463,16 @@
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
-"@hapi/address@^4.0.1":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.0.1.tgz#267301ddf7bc453718377a6fb3832a2f04a721dd"
- integrity sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==
- dependencies:
- "@hapi/hoek" "^9.0.0"
-
"@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/formula@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128"
- integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==
-
"@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.0.0"
- resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.0.0.tgz#ba83436edfac1d1ffd0e94797d43419c20ad49b8"
- integrity sha512-XxD4A5YMIH70ddjG7BJBUz7RWVQAwIP/36Eoyh0DsaWp92OAeXkrbtSEaYkynBPTsN9Uv2mZq9QWZYILl2Svrw==
-
"@hapi/joi@^15.1.1":
version "15.1.1"
resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7"
@@ -1168,22 +1483,6 @@
"@hapi/hoek" "8.x.x"
"@hapi/topo" "3.x.x"
-"@hapi/joi@^17.1.0", "@hapi/joi@^17.1.1":
- version "17.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-17.1.1.tgz#9cc8d7e2c2213d1e46708c6260184b447c661350"
- integrity sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==
- dependencies:
- "@hapi/address" "^4.0.1"
- "@hapi/formula" "^2.0.0"
- "@hapi/hoek" "^9.0.0"
- "@hapi/pinpoint" "^2.0.0"
- "@hapi/topo" "^5.0.0"
-
-"@hapi/pinpoint@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.0.tgz#805b40d4dbec04fc116a73089494e00f073de8df"
- integrity sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==
-
"@hapi/topo@3.x.x":
version "3.1.6"
resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
@@ -1191,12 +1490,24 @@
dependencies:
"@hapi/hoek" "^8.3.0"
-"@hapi/topo@^5.0.0":
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7"
- integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==
+"@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:
- "@hapi/hoek" "^9.0.0"
+ "@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"
@@ -1214,164 +1525,142 @@
resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
-"@jest/console@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.2.tgz#f78374905c2454764152904a344a2d5226b0ef09"
- integrity sha512-0I/rEJwMpV9iwi9cDEnT71a5nNGK9lj8Z4+1pRAU2x/thVXCDnaTGrvxyK+cAqZTFVFCiR+hfVrP4l2m+dCmQg==
+"@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" "^29.4.2"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
- jest-message-util "^29.4.2"
- jest-util "^29.4.2"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
slash "^3.0.0"
-"@jest/core@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.2.tgz#6e999b67bdc2df9d96ba9b142465bda71ee472c2"
- integrity sha512-KGuoQah0P3vGNlaS/l9/wQENZGNKGoWb+OPxh3gz+YzG7/XExvYu34MzikRndQCdM2S0tzExN4+FL37i6gZmCQ==
+"@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" "^29.4.2"
- "@jest/reporters" "^29.4.2"
- "@jest/test-result" "^29.4.2"
- "@jest/transform" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@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"
- ci-info "^3.2.0"
+ emittery "^0.8.1"
exit "^0.1.2"
graceful-fs "^4.2.9"
- jest-changed-files "^29.4.2"
- jest-config "^29.4.2"
- jest-haste-map "^29.4.2"
- jest-message-util "^29.4.2"
- jest-regex-util "^29.4.2"
- jest-resolve "^29.4.2"
- jest-resolve-dependencies "^29.4.2"
- jest-runner "^29.4.2"
- jest-runtime "^29.4.2"
- jest-snapshot "^29.4.2"
- jest-util "^29.4.2"
- jest-validate "^29.4.2"
- jest-watcher "^29.4.2"
+ 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"
- pretty-format "^29.4.2"
+ rimraf "^3.0.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==
+"@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" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
- jest-mock "^29.4.2"
+ jest-mock "^27.5.1"
-"@jest/expect-utils@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.2.tgz#cd0065dfdd8e8a182aa350cc121db97b5eed7b3f"
- integrity sha512-Dd3ilDJpBnqa0GiPN7QrudVs0cczMMHtehSo2CSTjm3zdHx0RcpmhFNVEltuEFeqfLIyWKFI224FsMSQ/nsJQA==
+"@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-get-type "^29.4.2"
-
-"@jest/expect@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.2.tgz#2d4a6a41b29380957c5094de19259f87f194578b"
- integrity sha512-NUAeZVApzyaeLjfWIV/64zXjA2SS+NuUPHpAlO7IwVMGd5Vf9szTl9KEDlxY3B4liwLO31os88tYNHl6cpjtKQ==
- dependencies:
- expect "^29.4.2"
- jest-snapshot "^29.4.2"
-
-"@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"
+ "@jest/types" "^27.5.1"
+ "@sinonjs/fake-timers" "^8.0.1"
"@types/node" "*"
- jest-message-util "^29.4.2"
- jest-mock "^29.4.2"
- jest-util "^29.4.2"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
-"@jest/globals@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.2.tgz#73f85f5db0e17642258b25fd0b9fc89ddedb50eb"
- integrity sha512-zCk70YGPzKnz/I9BNFDPlK+EuJLk21ur/NozVh6JVM86/YYZtZHqxFFQ62O9MWq7uf3vIZnvNA0BzzrtxD9iyg==
+"@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" "^29.4.2"
- "@jest/expect" "^29.4.2"
- "@jest/types" "^29.4.2"
- jest-mock "^29.4.2"
+ "@jest/environment" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ expect "^27.5.1"
-"@jest/reporters@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.2.tgz#6abfa923941daae0acc76a18830ee9e79a22042d"
- integrity sha512-10yw6YQe75zCgYcXgEND9kw3UZZH5tJeLzWv4vTk/2mrS1aY50A37F+XT2hPO5OqQFFnUWizXD8k1BMiATNfUw==
+"@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" "^29.4.2"
- "@jest/test-result" "^29.4.2"
- "@jest/transform" "^29.4.2"
- "@jest/types" "^29.4.2"
- "@jridgewell/trace-mapping" "^0.3.15"
+ "@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.3"
+ 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-message-util "^29.4.2"
- jest-util "^29.4.2"
- jest-worker "^29.4.2"
+ 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"
- strip-ansi "^6.0.0"
- v8-to-istanbul "^9.0.1"
+ terminal-link "^2.0.0"
+ v8-to-istanbul "^8.1.0"
-"@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==
+"@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:
- "@sinclair/typebox" "^0.25.16"
-
-"@jest/source-map@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.2.tgz#f9815d59e25cd3d6828e41489cd239271018d153"
- integrity sha512-tIoqV5ZNgYI9XCKXMqbYe5JbumcvyTgNN+V5QW4My033lanijvCD0D4PI9tBw4pRTqWOc00/7X3KVvUh+qnF4Q==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.15"
callsites "^3.0.0"
graceful-fs "^4.2.9"
+ source-map "^0.6.0"
-"@jest/test-result@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.2.tgz#34b0ba069f2e3072261e4884c8fb6bd15ed6fb8d"
- integrity sha512-HZsC3shhiHVvMtP+i55MGR5bPcc3obCFbA5bzIOb8pCjwBZf11cZliJncCgaVUbC5yoQNuGqCkC0Q3t6EItxZA==
+"@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" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@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@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.2.tgz#8b48e5bc4af80b42edacaf2a733d4f295edf28fb"
- integrity sha512-9Z2cVsD6CcObIVrWigHp2McRJhvCxL27xHtrZFgNC1RwnoSpDx6fZo8QYjJmziFlW9/hr78/3sxF54S8B6v8rg==
+"@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" "^29.4.2"
+ "@jest/test-result" "^27.5.1"
graceful-fs "^4.2.9"
- jest-haste-map "^29.4.2"
- slash "^3.0.0"
+ jest-haste-map "^27.5.1"
+ jest-runtime "^27.5.1"
"@jest/transform@^25.2.6":
version "25.2.6"
@@ -1395,26 +1684,26 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
-"@jest/transform@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.2.tgz#b24b72dbab4c8675433a80e222d6a8ef4656fb81"
- integrity sha512-kf1v5iTJHn7p9RbOsBuc/lcwyPtJaZJt5885C98omWz79NIeD3PfoiiaPSu7JyCyFzNOIzKhmMhQLUhlTL9BvQ==
+"@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.11.6"
- "@jest/types" "^29.4.2"
- "@jridgewell/trace-mapping" "^0.3.15"
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^27.5.1"
babel-plugin-istanbul "^6.1.1"
chalk "^4.0.0"
- convert-source-map "^2.0.0"
- fast-json-stable-stringify "^2.1.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
graceful-fs "^4.2.9"
- jest-haste-map "^29.4.2"
- jest-regex-util "^29.4.2"
- jest-util "^29.4.2"
+ 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"
- write-file-atomic "^4.0.2"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
"@jest/types@^25.2.6":
version "25.2.6"
@@ -1426,16 +1715,15 @@
"@types/yargs" "^15.0.0"
chalk "^3.0.0"
-"@jest/types@^29.4.2":
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.2.tgz#8f724a414b1246b2bfd56ca5225d9e1f39540d82"
- integrity sha512-CKlngyGP0fwlgC1BRUtPZSiWLBhyS9dKwKmyGxk8Z6M82LBEGB2aLQSg+U1MyLsU+M7UjnlLllBM2BLWKVm/Uw==
+"@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:
- "@jest/schemas" "^29.4.2"
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^3.0.0"
"@types/node" "*"
- "@types/yargs" "^17.0.8"
+ "@types/yargs" "^16.0.0"
chalk "^4.0.0"
"@jridgewell/gen-mapping@^0.1.0":
@@ -1446,6 +1734,15 @@
"@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"
@@ -1460,6 +1757,11 @@
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"
@@ -1470,7 +1772,23 @@
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":
+"@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==
@@ -1516,15 +1834,15 @@
url-regex "~4.1.1"
video-extensions "~1.1.0"
-"@metascraper/helpers@^5.33.5":
- version "5.33.5"
- resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.33.5.tgz#f980b41b3b7d7e67e11f849664727ef9d4802740"
- integrity sha512-gcULKpM00CNxlf7iWRTi4hQQIXWQUjeFal0V5U60C4P4YyfLXfjuQVBk6mmKSYENSRh7oBQhAR+YVnMalVWBcw==
+"@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.5.0"
+ chrono-node "~2.6.2"
condense-whitespace "~2.0.0"
- entities "~4.4.0"
+ entities "~4.5.0"
file-extension "~4.0.5"
has-values "~2.0.1"
image-extensions "~1.1.0"
@@ -1532,15 +1850,15 @@
is-uri "~1.2.4"
iso-639-3 "~2.2.0"
isostring "0.0.1"
- jsdom "~21.1.0"
+ 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.0"
+ re2 "~1.18.3"
smartquotes "~2.3.2"
- tldts "~5.7.103"
+ tldts "~6.0.1"
url-regex-safe "~3.0.0"
video-extensions "~1.2.0"
@@ -1552,11 +1870,24 @@
"@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"
@@ -1565,6 +1896,14 @@
"@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"
@@ -1581,6 +1920,18 @@
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"
@@ -1713,41 +2064,24 @@
"@sentry/types" "5.15.4"
tslib "^1.9.3"
-"@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@^0.14.0":
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
- integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
-
"@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@^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==
+"@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@^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==
+"@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" "^2.0.0"
-
-"@szmarczak/http-timer@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
- integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
- dependencies:
- defer-to-connect "^1.0.1"
+ "@sinonjs/commons" "^1.7.0"
"@szmarczak/http-timer@^4.0.5":
version "4.0.6"
@@ -1756,11 +2090,36 @@
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"
@@ -1768,6 +2127,17 @@
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"
@@ -1812,6 +2182,13 @@
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"
@@ -1895,7 +2272,7 @@
dependencies:
"@types/node" "*"
-"@types/graceful-fs@^4.1.3":
+"@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==
@@ -1949,10 +2326,23 @@
dependencies:
"@types/istanbul-lib-report" "*"
-"@types/json-schema@^7.0.3":
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
- integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
+"@types/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"
@@ -2019,6 +2409,11 @@
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"
@@ -2041,6 +2436,11 @@
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"
@@ -2073,10 +2473,10 @@
dependencies:
"@types/yargs-parser" "*"
-"@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==
+"@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" "*"
@@ -2090,25 +2490,89 @@
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
-"@typescript-eslint/experimental-utils@^2.5.0":
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.0.tgz#ed70bef72822bff54031ff0615fc888b9e2b6e8a"
- integrity sha512-34BAFpNOwHXeqT+AvdalLxOvcPYnCxA5JGmBAFL64RGMdP0u65rXjii7l/nwpgk5aLEE1LaqF+SsCU0/Cb64xA==
+"@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:
- "@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "2.6.0"
- eslint-scope "^5.0.0"
+ "@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/typescript-estree@2.6.0":
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.0.tgz#d3e9d8e001492e2b9124c4d4bd4e7f03c0fd7254"
- integrity sha512-A3lSBVIdj2Gp0lFEL6in2eSPqJ33uAc3Ko+Y4brhjkxzjbzLnwBH22CwsW2sCo+iwogfIyvb56/AJri15H0u5Q==
+"@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:
- debug "^4.1.1"
- glob "^7.1.4"
- is-glob "^4.0.1"
- lodash.unescape "4.0.1"
- semver "^6.3.0"
+ "@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"
@@ -2125,7 +2589,7 @@
dependencies:
tslib "^1.9.3"
-abab@^2.0.6:
+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==
@@ -2143,30 +2607,40 @@ accepts@^1.3.5, accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
-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==
+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 "^8.1.0"
- acorn-walk "^8.0.2"
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
-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-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@^8.0.2:
+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.0:
+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.1.0, acorn@^8.8.1:
+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==
@@ -2208,7 +2682,7 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^3.2.0"
-ajv@^6.10.0, ajv@^6.10.2:
+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==
@@ -2218,7 +2692,7 @@ ajv@^6.10.0, ajv@^6.10.2:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^6.12.3:
+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==
@@ -2252,17 +2726,12 @@ ansi-regex@^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.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
- integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
-
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.0, ansi-styles@^3.2.1:
+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==
@@ -2641,6 +3110,11 @@ arg@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"
@@ -2648,6 +3122,11 @@ argparse@^1.0.7:
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"
@@ -2663,18 +3142,29 @@ arr-union@^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.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
- integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=
+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:
- define-properties "^1.1.2"
- es-abstract "^1.7.0"
+ 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"
@@ -2686,14 +3176,25 @@ array-unique@^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.2"
- resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723"
- integrity sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ==
+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:
- define-properties "^1.1.3"
- es-abstract "^1.15.0"
- function-bind "^1.1.1"
+ 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"
@@ -2744,11 +3245,6 @@ assignment@2.2.0:
resolved "https://registry.yarnpkg.com/assignment/-/assignment-2.2.0.tgz#f5b5bc2d160d69986e8700cd38f567c0aabe101e"
integrity sha1-9bW8LRYNaZhuhwDNOPVnwKq+EB4=
-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"
@@ -2781,20 +3277,26 @@ audio-extensions@0.0.0:
resolved "https://registry.yarnpkg.com/audio-extensions/-/audio-extensions-0.0.0.tgz#d0eefe077fb9eb625898eed9985890548cf1f8d2"
integrity sha1-0O7+B3+562JYmO7ZmFiQVIzx+NI=
-aws-sdk@^2.652.0:
- version "2.652.0"
- resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.652.0.tgz#00a4dd3a4ce588448895c42d25e967f2a23b487c"
- integrity sha512-THMlf3CX/IKMh+jizDQ+XCf5LSp1x+rIl+4uIRJjMj+zHNes7zJy3DSkuu5gux5aG5x4God996vPdCus+F22JA==
+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.1425.0:
+ version "2.1425.0"
+ resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1425.0.tgz#2c6d9f295720e16fae9de6131b4d495219944ba5"
+ integrity sha512-DbY5z7E8RsrX8/0pMBKMuh/rWFic3AghtU2AWkUdzxDi0cUSK7rOSPS/OIURU9Rh0jaNXoA0ujBDdx/CC5CvRA==
dependencies:
- buffer "4.9.1"
+ buffer "4.9.2"
events "1.1.1"
ieee754 "1.1.13"
- jmespath "0.15.0"
+ jmespath "0.16.0"
querystring "0.2.0"
sax "1.2.1"
url "0.10.3"
- uuid "3.3.2"
- xml2js "0.4.19"
+ util "^0.12.4"
+ uuid "8.0.0"
+ xml2js "0.5.0"
aws-sign2@~0.7.0:
version "0.7.0"
@@ -2823,15 +3325,16 @@ babel-eslint@~10.1.0:
eslint-visitor-keys "^1.0.0"
resolve "^1.12.0"
-babel-jest@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.2.tgz#b17b9f64be288040877cbe2649f91ac3b63b2ba6"
- integrity sha512-vcghSqhtowXPG84posYkkkzcZsdayFkubUgbE3/1tuGbX7AQtwCkkNA/wIbB0BMjuCPoqTkiDyKN7Ty7d3uwNQ==
+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" "^29.4.2"
+ "@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 "^29.4.2"
+ babel-preset-jest "^27.5.1"
chalk "^4.0.0"
graceful-fs "^4.2.9"
slash "^3.0.0"
@@ -2849,13 +3352,6 @@ babel-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"
@@ -2876,16 +3372,40 @@ babel-plugin-jest-hoist@^25.2.6:
"@babel/types" "^7.3.3"
"@types/babel__traverse" "^7.0.6"
-babel-plugin-jest-hoist@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.2.tgz#22aa43e255230f02371ffef1cac7eedef58f60bc"
- integrity sha512-5HZRCfMeWypFEonRbEkwWXtNS1sQK159LhRVyRuLzyfVBxDy/34Tr/rg4YVi0SScSJ4fqeaR/OIeceJ/LaQ0pQ==
+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.1.14"
+ "@types/babel__core" "^7.0.0"
"@types/babel__traverse" "^7.0.6"
+babel-plugin-polyfill-corejs2@^0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c"
+ integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
+ semver "^6.3.1"
+
+babel-plugin-polyfill-corejs3@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52"
+ integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
+ core-js-compat "^3.31.0"
+
+babel-plugin-polyfill-regenerator@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326"
+ integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
+
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"
@@ -2920,12 +3440,12 @@ babel-preset-jest@^25.2.6:
"@babel/plugin-syntax-object-rest-spread" "^7.0.0"
babel-plugin-jest-hoist "^25.2.6"
-babel-preset-jest@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.2.tgz#f0b20c6a79a9f155515e72a2d4f537fe002a4e38"
- integrity sha512-ecWdaLY/8JyfUDr0oELBMpj3R5I1L6ZqG+kRJmwqfHtLWuPrJStR0LUkvUhfykJWTsXXMnohsayN/twltBbDrQ==
+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 "^29.4.2"
+ babel-plugin-jest-hoist "^27.5.1"
babel-preset-current-node-syntax "^1.0.0"
babel-runtime@^6.22.0:
@@ -2986,6 +3506,11 @@ becke-ch--regex--s0-0-v1--base--pl--lib@^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"
@@ -3022,11 +3547,6 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-bowser@2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.9.0.tgz#3bed854233b419b9a7422d9ee3e85504373821c9"
- integrity sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==
-
boxen@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
@@ -3040,6 +3560,13 @@ boxen@^1.2.1:
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"
@@ -3078,26 +3605,27 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-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"
+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.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==
+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.30001219"
- colorette "^1.2.2"
- electron-to-chromium "^1.3.723"
- escalade "^3.1.1"
- node-releases "^1.1.71"
+ caniuse-lite "^1.0.30001503"
+ electron-to-chromium "^1.4.431"
+ node-releases "^2.0.12"
+ update-browserslist-db "^1.0.11"
+
+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"
@@ -3116,10 +3644,10 @@ buffer-from@^1.0.0:
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=
+buffer@4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+ integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
@@ -3133,6 +3661,20 @@ buffer@^6.0.3:
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"
@@ -3189,19 +3731,6 @@ cacheable-lookup@^5.0.3:
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
-cacheable-request@^6.0.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
- integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^3.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^4.1.0"
- responselike "^1.0.2"
-
cacheable-request@^7.0.2:
version "7.0.2"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
@@ -3215,6 +3744,14 @@ cacheable-request@^7.0.2:
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"
@@ -3243,20 +3780,10 @@ camelcase@^6.2.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-camelize@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
- integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=
-
-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==
+caniuse-lite@^1.0.30001503:
+ version "1.0.30001515"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b"
+ integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==
capture-exit@^2.0.0:
version "2.0.0"
@@ -3275,16 +3802,17 @@ caseless@~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==
+chai@~4.3.8:
+ version "4.3.8"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c"
+ integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==
dependencies:
assertion-error "^1.1.0"
check-error "^1.0.2"
- deep-eql "^3.0.1"
+ deep-eql "^4.1.2"
get-func-name "^2.0.0"
- pathval "^1.1.0"
+ loupe "^2.3.1"
+ pathval "^1.1.1"
type-detect "^4.0.5"
chalk@2.3.0:
@@ -3296,7 +3824,7 @@ chalk@2.3.0:
escape-string-regexp "^1.0.5"
supports-color "^4.0.0"
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
+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==
@@ -3313,7 +3841,7 @@ chalk@^3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@^4.0.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==
@@ -3326,11 +3854,6 @@ char-regex@^1.0.2:
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
-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-error@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
@@ -3424,10 +3947,10 @@ chrono-node@~1.3.11:
dependencies:
moment "2.21.0"
-chrono-node@~2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.5.0.tgz#c4d5f4f4db9d72604a5beb79fdc5fd57be4b212f"
- integrity sha512-GasdFCw4tsb8UKlwyJW1S+3bdN06vsyGR2cEDMlhEGI7ic4SQRnLyl/hbItwSum6pPkkUTrzFcaR3C2tZnnO5Q==
+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"
@@ -3478,13 +4001,6 @@ cli-boxes@^1.0.0:
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
-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"
@@ -3495,11 +4011,6 @@ cli-table3@^0.5.1:
optionalDependencies:
colors "^1.1.2"
-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=
-
clipboardy@1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2"
@@ -3508,13 +4019,13 @@ clipboardy@1.2.2:
arch "^2.1.0"
execa "^0.8.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==
+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.1"
+ strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
clone-response@^1.0.2:
@@ -3586,11 +4097,6 @@ color-support@^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"
@@ -3603,7 +4109,7 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
-commander@^2.19.0, commander@^2.20.3:
+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==
@@ -3623,7 +4129,7 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
-component-emitter@^1.2.0, component-emitter@^1.2.1:
+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==
@@ -3660,11 +4166,6 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
-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"
@@ -3672,11 +4173,6 @@ content-disposition@0.5.3:
dependencies:
safe-buffer "5.1.2"
-content-security-policy-builder@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz#0a2364d769a3d7014eec79ff7699804deb8cfcbb"
- integrity sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==
-
content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
@@ -3694,11 +4190,6 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.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"
@@ -3714,23 +4205,17 @@ cookie@^0.3.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
-cookiejar@^2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
- integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
-
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==
+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.8.3"
- semver "7.0.0"
+ browserslist "^4.21.9"
core-js-pure@^3.0.0:
version "3.6.4"
@@ -3772,6 +4257,11 @@ create-error-class@^3.0.0:
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"
@@ -3788,7 +4278,7 @@ cross-spawn@^5.0.1:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+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==
@@ -3808,7 +4298,7 @@ cross-spawn@^7.0.1:
shebang-command "^2.0.0"
which "^2.0.1"
-cross-spawn@^7.0.3:
+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==
@@ -3858,10 +4348,10 @@ cssfilter@0.0.10:
resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae"
integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=
-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.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"
@@ -3875,6 +4365,13 @@ cssstyle@^2.3.0:
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"
@@ -3936,64 +4433,70 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
-dasherize@2.0.0:
+data-urls@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308"
- integrity sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=
+ 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@^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==
+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 "^11.0.0"
+ whatwg-url "^12.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==
-
-dateformat@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
- integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
+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, debug@^2.6.9:
+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, debug@^4.0.1, debug@~4.1.1:
+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.1.0, debug@^3.2.6:
+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@^4.1.0, debug@^4.1.1, debug@^4.3.3:
+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.4.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==
@@ -4003,13 +4506,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
-decompress-response@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
- integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
- dependencies:
- mimic-response "^1.0.0"
-
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@@ -4022,10 +4518,10 @@ dedent@^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==
+deep-eql@^4.1.2:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
+ integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==
dependencies:
type-detect "^4.0.0"
@@ -4034,7 +4530,7 @@ deep-extend@^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, 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==
@@ -4049,16 +4545,34 @@ deepmerge@^4.2.2:
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b"
integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==
-defer-to-connect@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e"
- integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==
+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"
@@ -4066,6 +4580,14 @@ define-properties@^1.1.2, define-properties@^1.1.3:
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"
@@ -4103,11 +4625,6 @@ denque@^1.1.0:
resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf"
integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==
-depd@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
- integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-
depd@^1.1.2, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@@ -4140,10 +4657,10 @@ dicer@0.3.0:
dependencies:
streamsearch "0.1.2"
-diff-sequences@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.2.tgz#711fe6bd8a5869fe2539cee4a5152425ff671fda"
- integrity sha512-R6P0Y6PrsH3n4hUXxL3nns0rbRk6Q33js3ygJBeEpbzLzgcNuJ61+u0RXasFpTKISw99TxUzFnumSnRLsjhLaw==
+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"
@@ -4157,18 +4674,12 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
-dns-prefetch-control@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz#73988161841f3dcc81f47686d539a2c702c88624"
- integrity sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==
-
-doctrine@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+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"
- isarray "^1.0.0"
doctrine@^3.0.0:
version "3.0.0"
@@ -4239,6 +4750,13 @@ domelementtype@^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"
@@ -4317,11 +4835,6 @@ domutils@^3.0.1:
domelementtype "^2.3.0"
domhandler "^5.0.1"
-dont-sniff-mimetype@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz#c7d0427f8bcb095762751252af59d148b0a623b2"
- integrity sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==
-
dot-prop@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
@@ -4329,16 +4842,16 @@ dot-prop@^4.1.0:
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@^6.1.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064"
- integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==
-
dotenv@~8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
@@ -4377,25 +4890,15 @@ ee-first@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.431:
+ version "1.4.461"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz#6b14af66042732bf883ab63a4d82cac8f35eb252"
+ integrity sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==
-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.13.1:
- version "0.13.1"
- resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
- integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
-
-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==
+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"
@@ -4421,6 +4924,14 @@ end-of-stream@^1.1.0:
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"
@@ -4431,11 +4942,16 @@ entities@^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, entities@~4.4.0:
+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"
@@ -4446,7 +4962,7 @@ err-code@^2.0.2:
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.2.0, error-ex@^1.3.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==
@@ -4460,34 +4976,6 @@ error-stack-parser@^2.0.1:
dependencies:
stackframe "^1.0.4"
-es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.7.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
- integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
- 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.15.0:
- version "1.16.3"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161"
- integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==
- 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.4"
- is-regex "^1.0.4"
- object-inspect "^1.7.0"
- object-keys "^1.1.1"
- string.prototype.trimleft "^2.1.0"
- string.prototype.trimright "^2.1.0"
-
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"
@@ -4505,6 +4993,74 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
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"
@@ -4559,7 +5115,7 @@ escape-html@~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, 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==
@@ -4586,110 +5142,130 @@ escodegen@^2.0.0:
optionalDependencies:
source-map "~0.6.1"
-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==
+eslint-config-prettier@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f"
+ integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==
+
+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:
- get-stdin "^6.0.0"
+ debug "^3.2.7"
+ is-core-module "^2.11.0"
+ resolve "^1.22.1"
-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==
+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 "^2.6.9"
- resolve "^1.5.0"
+ 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.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==
+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 "^2.6.9"
- pkg-dir "^2.0.0"
+ debug "^3.2.7"
-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==
+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.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==
+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.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"
+ 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"
- minimatch "^3.0.4"
- object.values "^1.1.0"
- read-pkg-up "^2.0.0"
- resolve "^1.12.0"
+ 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@~23.8.2:
- version "23.8.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4"
- integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==
+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/experimental-utils" "^2.5.0"
+ "@typescript-eslint/utils" "^5.10.0"
-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==
+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:
- eslint-plugin-es "^3.0.0"
- eslint-utils "^2.0.0"
+ builtins "^5.0.1"
+ eslint-plugin-es "^4.1.0"
+ eslint-utils "^3.0.0"
ignore "^5.1.1"
- minimatch "^3.0.4"
- resolve "^1.10.1"
- semver "^6.1.0"
+ is-core-module "^2.11.0"
+ minimatch "^3.1.2"
+ resolve "^1.22.1"
+ semver "^7.3.8"
-eslint-plugin-prettier@~3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5"
- integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==
+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@~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-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-standard@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
- integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
-
-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==
+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:
- esrecurse "^4.1.0"
+ 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-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==
+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:
- eslint-visitor-keys "^1.1.0"
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
eslint-utils@^2.0.0:
version "2.0.0"
@@ -4698,91 +5274,110 @@ eslint-utils@^2.0.0:
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@~6.8.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
- integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+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:
- "@babel/code-frame" "^7.0.0"
+ "@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 "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
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"
+ 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"
- 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"
+ 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"
- inquirer "^7.0.0"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
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"
+ optionator "^0.9.1"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-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==
+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 "^7.1.0"
- acorn-jsx "^5.1.0"
- eslint-visitor-keys "^1.1.0"
+ 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.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
- integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
+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 "^4.0.0"
+ estraverse "^5.1.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==
+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 "^4.1.0"
+ estraverse "^5.2.0"
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
+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.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
- integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+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"
@@ -4863,6 +5458,21 @@ execa@^5.0.0:
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"
@@ -4881,21 +5491,15 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-expect-ct@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.2.0.tgz#3a54741b6ed34cc7a93305c605f63cd268a54a62"
- integrity sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==
-
-expect@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.2.tgz#2ae34eb88de797c64a1541ad0f1e2ea8a7a7b492"
- integrity sha512-+JHYg9O3hd3RlICG90OPVjRkPBoiUH7PxvDVMnRiaq1g6JUgZStX514erMl0v2Dc5SkfVbm7ztqbd6qHHPn+mQ==
+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/expect-utils" "^29.4.2"
- jest-get-type "^29.4.2"
- jest-matcher-utils "^29.4.2"
- jest-message-util "^29.4.2"
- jest-util "^29.4.2"
+ "@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"
@@ -4948,7 +5552,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
-extend@^3.0.0, extend@~3.0.2:
+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==
@@ -4958,15 +5562,6 @@ extendable-error@^0.1.5:
resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.5.tgz#122308a7097bc89a263b2c4fbf089c78140e3b6d"
integrity sha1-EiMIpwl7yJomOyxPvwiceBQOO20=
-external-editor@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
- integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
- 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"
@@ -5001,7 +5596,7 @@ fast-deep-equal@^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.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==
@@ -5022,12 +5617,23 @@ fast-glob@^3.1.1:
merge2 "^1.3.0"
micromatch "^4.0.2"
-fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
+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, 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==
@@ -5046,11 +5652,6 @@ fb-watchman@^2.0.0:
dependencies:
bser "2.1.1"
-feature-policy@0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/feature-policy/-/feature-policy-0.3.0.tgz#7430e8e54a40da01156ca30aaec1a381ce536069"
- integrity sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==
-
figures@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9"
@@ -5058,12 +5659,12 @@ figures@^3.0.0:
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==
+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 "^2.0.1"
+ flat-cache "^3.0.4"
file-extension@~4.0.5:
version "4.0.5"
@@ -5109,13 +5710,6 @@ find-cache-dir@^2.0.0:
make-dir "^2.0.0"
pkg-dir "^3.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"
@@ -5131,25 +5725,39 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.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==
+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:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
-flatted@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
- integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
+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"
@@ -5160,15 +5768,6 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
-form-data@^2.3.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.0.tgz#094ec359dc4b55e7d62e0db4acd76e89fe874d37"
- integrity sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.6"
- mime-types "^2.1.12"
-
form-data@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682"
@@ -5196,11 +5795,6 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
-formidable@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659"
- integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==
-
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -5213,11 +5807,6 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
-frameguard@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.1.0.tgz#bd1442cca1d67dc346a6751559b6d04502103a22"
- integrity sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==
-
franc@~4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/franc/-/franc-4.0.0.tgz#365951bc787b92ffbb1c63c1c492d6b76cbd3a56"
@@ -5277,15 +5866,25 @@ fsevents@~2.1.1:
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:
+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==
-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=
+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"
@@ -5330,22 +5929,27 @@ get-func-name@^2.0.0:
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+get-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-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, get-stream@^4.1.0:
+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==
@@ -5359,11 +5963,26 @@ get-stream@^5.1.0:
dependencies:
pump "^3.0.0"
-get-stream@^6.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"
@@ -5394,13 +6013,27 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.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"
@@ -5413,7 +6046,7 @@ glob@^7.0.0:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.3, glob@^7.1.4:
+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==
@@ -5448,12 +6081,19 @@ globals@^11.1.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==
+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.8.1"
+ 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"
@@ -5467,6 +6107,36 @@ globby@11.0.0:
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"
@@ -5501,23 +6171,6 @@ got@~11.8.0, got@~11.8.5:
p-cancelable "^2.0.0"
responselike "^2.0.0"
-got@~9.6.0:
- version "9.6.0"
- resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
- integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
- dependencies:
- "@sindresorhus/is" "^0.14.0"
- "@szmarczak/http-timer" "^1.1.2"
- cacheable-request "^6.0.0"
- decompress-response "^3.3.0"
- duplexer3 "^0.1.4"
- get-stream "^4.1.0"
- lowercase-keys "^1.0.1"
- mimic-response "^1.0.1"
- p-cancelable "^1.0.0"
- to-readable-stream "^1.0.0"
- url-parse-lax "^3.0.0"
-
graceful-fs@^4.1.11, graceful-fs@^4.1.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
@@ -5533,6 +6186,16 @@ graceful-fs@^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"
@@ -5542,16 +6205,6 @@ graphql-auth-directives@^2.1.0:
graphql-tools "^4.0.4"
jsonwebtoken "^8.3.0"
-graphql-custom-directives@~0.2.14:
- version "0.2.14"
- resolved "https://registry.yarnpkg.com/graphql-custom-directives/-/graphql-custom-directives-0.2.14.tgz#88611b8cb074477020ad85af47bfe168c4c23992"
- integrity sha512-c3+r+st7dbBNGOLumkWrnv4nwAHJr1sZnkYc72AIMtzjuQ4+Slk1ZsFVYt1kwXJpfxXgf6g2g0jYc9+Lmz4ENg==
- dependencies:
- libphonenumber-js "^1.6.4"
- lodash "^4.17.5"
- moment "^2.22.2"
- numeral "^2.0.6"
-
graphql-extensions@^0.12.6:
version "0.12.6"
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.6.tgz#c66be43035662a8cfb0b8efe9df96595338bd13c"
@@ -5561,11 +6214,6 @@ graphql-extensions@^0.12.6:
apollo-server-env "^2.4.5"
apollo-server-types "^0.6.1"
-graphql-iso-date@~3.6.1:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/graphql-iso-date/-/graphql-iso-date-3.6.1.tgz#bd2d0dc886e0f954cbbbc496bbf1d480b57ffa96"
- integrity sha512-AwFGIuYMJQXOEAgRlJlFL4H1ncFM8n8XmoVDTNypNOZyQ8LFDG2ppMFlsS862BSTCDcSUfHp8PD3/uJhv7t59Q==
-
graphql-middleware-sentry@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/graphql-middleware-sentry/-/graphql-middleware-sentry-3.2.1.tgz#b5653d78903d655cf4212a602cfa6e26689cda07"
@@ -5664,6 +6312,11 @@ har-validator@~5.1.3:
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"
@@ -5679,11 +6332,35 @@ has-flag@^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"
@@ -5744,46 +6421,10 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-helmet-crossdomain@0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz#5f1fe5a836d0325f1da0a78eaa5fd8429078894e"
- integrity sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==
-
-helmet-csp@2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.10.0.tgz#685dde1747bc16c5e28ad9d91e229a69f0a85e84"
- integrity sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==
- dependencies:
- bowser "2.9.0"
- camelize "1.0.0"
- content-security-policy-builder "2.1.0"
- dasherize "2.0.0"
-
-helmet@~3.22.0:
- version "3.22.0"
- resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.22.0.tgz#3a6f11d931799145f0aff15dbc563cff9e13131f"
- integrity sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA==
- dependencies:
- depd "2.0.0"
- dns-prefetch-control "0.2.0"
- dont-sniff-mimetype "1.1.0"
- expect-ct "0.2.0"
- feature-policy "0.3.0"
- frameguard "3.1.0"
- helmet-crossdomain "0.4.0"
- helmet-csp "2.10.0"
- hide-powered-by "1.1.0"
- hpkp "2.0.0"
- hsts "2.2.0"
- ienoopen "1.1.0"
- nocache "2.1.0"
- referrer-policy "1.2.0"
- x-xss-protection "1.3.0"
-
-hide-powered-by@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.1.0.tgz#be3ea9cab4bdb16f8744be873755ca663383fa7a"
- integrity sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==
+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"
@@ -5792,22 +6433,12 @@ homedir-polyfill@^1.0.1:
dependencies:
parse-passwd "^1.0.0"
-hosted-git-info@^2.1.4:
- version "2.8.4"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546"
- integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
-
-hpkp@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672"
- integrity sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=
-
-hsts@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.2.0.tgz#09119d42f7a8587035d027dda4522366fe75d964"
- integrity sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==
+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:
- depd "2.0.0"
+ whatwg-encoding "^1.0.5"
html-encoding-sniffer@^3.0.0:
version "3.0.0"
@@ -5905,6 +6536,15 @@ http-errors@^1.7.3, http-errors@~1.7.2:
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"
@@ -5960,6 +6600,11 @@ human-signals@^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"
@@ -5967,7 +6612,7 @@ humanize-ms@^1.2.1:
dependencies:
ms "^2.0.0"
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
+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==
@@ -5981,21 +6626,16 @@ iconv-lite@0.6.3, iconv-lite@^0.6.2:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
-ieee754@1.1.13, ieee754@^1.1.4:
+ieee754@1.1.13:
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:
+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==
-ienoopen@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974"
- integrity sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==
-
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"
@@ -6008,16 +6648,16 @@ ignore-walk@^3.0.1:
dependencies:
minimatch "^3.0.4"
-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==
+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"
@@ -6031,6 +6671,14 @@ import-fresh@^3.0.0:
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"
@@ -6092,25 +6740,6 @@ ini@^1.3.4, ini@~1.3.0:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-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"
@@ -6119,17 +6748,19 @@ insane@2.6.1:
assignment "2.0.0"
he "0.5.0"
-install-artifact-from-github@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.2.tgz#1a16d9508e40330523a3017ae0d4713ccc64de82"
- integrity sha512-yCFcLvqk0yQdxx0uJz4t9Z3adDMLAYrcGYv546uRXCSvxE+GqNYhhz/KmrGcUKGI/gVLR9n/e/zM9jX/+ASMJQ==
+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==
-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==
+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:
- loose-envify "^1.0.0"
+ get-intrinsic "^1.2.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
ioredis@^4.16.1, ioredis@^4.6.3:
version "4.16.1"
@@ -6190,11 +6821,35 @@ is-accessor-descriptor@^1.0.0:
dependencies:
kind-of "^6.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-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"
@@ -6209,11 +6864,24 @@ is-binary-path@~2.1.0:
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"
@@ -6233,6 +6901,13 @@ is-ci@^2.0.0:
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"
@@ -6277,6 +6952,16 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
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"
@@ -6316,6 +7001,13 @@ is-generator-fn@^2.0.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.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"
@@ -6335,6 +7027,20 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
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"
@@ -6348,11 +7054,23 @@ is-lambda@^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"
@@ -6377,6 +7095,11 @@ is-path-inside@^1.0.0:
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"
@@ -6389,11 +7112,6 @@ is-potential-custom-element-name@^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.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"
@@ -6413,6 +7131,14 @@ is-regex@^1.1.0:
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"
@@ -6432,6 +7158,13 @@ is-retry-allowed@^1.0.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"
@@ -6442,6 +7175,18 @@ is-stream@^2.0.0:
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"
@@ -6449,6 +7194,31 @@ is-symbol@^1.0.2:
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-typed-array@^1.1.3:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
+ integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+ dependencies:
+ which-typed-array "^1.1.11"
+
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"
@@ -6470,11 +7240,25 @@ is-uri@~1.2.4:
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"
@@ -6569,129 +7353,145 @@ iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0:
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
-jest-changed-files@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.2.tgz#bee1fafc8b620d6251423d1978a0080546bc4376"
- integrity sha512-Qdd+AXdqD16PQa+VsWJpxR3kN0JyOCX1iugQfx5nUgAsI4gwsKviXkpclxOK9ZnwaY2IQVHz+771eAvqeOlfuw==
+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"
- p-limit "^3.1.0"
+ throat "^6.0.1"
-jest-circus@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.2.tgz#2d00c04baefd0ee2a277014cd494d4b5970663ed"
- integrity sha512-wW3ztp6a2P5c1yOc1Cfrt5ozJ7neWmqeXm/4SYiqcSriyisgq63bwFj1NuRdSR5iqS0CMEYwSZd89ZA47W9zUg==
+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" "^29.4.2"
- "@jest/expect" "^29.4.2"
- "@jest/test-result" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@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 "^29.4.2"
- jest-matcher-utils "^29.4.2"
- jest-message-util "^29.4.2"
- jest-runtime "^29.4.2"
- jest-snapshot "^29.4.2"
- jest-util "^29.4.2"
- p-limit "^3.1.0"
- pretty-format "^29.4.2"
+ 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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.2.tgz#94a2f913a0a7a49d11bee98ad88bf48baae941f4"
- integrity sha512-b+eGUtXq/K2v7SH3QcJvFvaUaCDS1/YAZBYz0m28Q/Ppyr+1qNaHmVYikOrbHVbZqYQs2IeI3p76uy6BWbXq8Q==
+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" "^29.4.2"
- "@jest/test-result" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@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 "^29.4.2"
- jest-util "^29.4.2"
- jest-validate "^29.4.2"
+ jest-config "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
prompts "^2.0.1"
- yargs "^17.3.1"
+ yargs "^16.2.0"
-jest-config@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.2.tgz#15386dd9ed2f7059516915515f786b8836a98f07"
- integrity sha512-919CtnXic52YM0zW4C1QxjG6aNueX1kBGthuMtvFtRTAxhKfJmiXC9qwHmi6o2josjbDz8QlWyY55F1SIVmCWA==
+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.11.6"
- "@jest/test-sequencer" "^29.4.2"
- "@jest/types" "^29.4.2"
- babel-jest "^29.4.2"
+ "@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.3"
+ glob "^7.1.1"
graceful-fs "^4.2.9"
- jest-circus "^29.4.2"
- jest-environment-node "^29.4.2"
- jest-get-type "^29.4.2"
- jest-regex-util "^29.4.2"
- jest-resolve "^29.4.2"
- jest-runner "^29.4.2"
- jest-util "^29.4.2"
- jest-validate "^29.4.2"
+ 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 "^29.4.2"
+ pretty-format "^27.5.1"
slash "^3.0.0"
strip-json-comments "^3.1.1"
-jest-diff@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.2.tgz#b88502d5dc02d97f6512d73c37da8b36f49b4871"
- integrity sha512-EK8DSajVtnjx9sa1BkjZq3mqChm2Cd8rIzdXkQMA8e0wuXq53ypz6s5o5V8HRZkoEt2ywJ3eeNWFKWeYr8HK4g==
+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 "^29.4.2"
- jest-get-type "^29.4.2"
- pretty-format "^29.4.2"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
-jest-docblock@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.2.tgz#c78a95eedf9a24c0a6cc16cf2abdc4b8b0f2531b"
- integrity sha512-dV2JdahgClL34Y5vLrAHde3nF3yo2jKRH+GIYJuCpfqwEJZcikzeafVTGAjbOfKPG17ez9iWXwUYp7yefeCRag==
+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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.2.tgz#e1347aff1303f4c35470827a62c029d389c5d44a"
- integrity sha512-trvKZb0JYiCndc55V1Yh0Luqi7AsAdDWpV+mKT/5vkpnnFQfuQACV72IoRV161aAr6kAVIBpmYzwhBzm34vQkA==
+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" "^29.4.2"
+ "@jest/types" "^27.5.1"
chalk "^4.0.0"
- jest-get-type "^29.4.2"
- jest-util "^29.4.2"
- pretty-format "^29.4.2"
+ jest-get-type "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
-jest-environment-node@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.2.tgz#0eab835b41e25fd0c1a72f62665fc8db08762ad2"
- integrity sha512-MLPrqUcOnNBc8zTOfqBbxtoa8/Ee8tZ7UFW7hRDQSUT+NGsvS96wlbHGTf+EFAT9KC3VNb7fWEM6oyvmxtE/9w==
+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" "^29.4.2"
- "@jest/fake-timers" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
- jest-mock "^29.4.2"
- jest-util "^29.4.2"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+ jsdom "^16.6.0"
-jest-get-type@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.2.tgz#7cb63f154bca8d8f57364d01614477d466fa43fe"
- integrity sha512-vERN30V5i2N6lqlFu4ljdTqQAgrkTFMC9xaIIfOPYBw04pufjXRty5RuXBiB1d72tGbURa/UgoiHB90ruOSivg==
+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"
@@ -6712,66 +7512,89 @@ jest-haste-map@^25.2.6:
optionalDependencies:
fsevents "^2.1.2"
-jest-haste-map@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.2.tgz#9112df3f5121e643f1b2dcbaa86ab11b0b90b49a"
- integrity sha512-WkUgo26LN5UHPknkezrBzr7lUtV1OpGsp+NfXbBwHztsFruS3gz+AMTTBcEklvi8uPzpISzYjdKXYZQJXBnfvw==
+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" "^29.4.2"
- "@types/graceful-fs" "^4.1.3"
+ "@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 "^29.4.2"
- jest-util "^29.4.2"
- jest-worker "^29.4.2"
+ 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.8"
+ walker "^1.0.7"
optionalDependencies:
fsevents "^2.3.2"
-jest-leak-detector@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.2.tgz#8f05c6680e0cb46a1d577c0d3da9793bed3ea97b"
- integrity sha512-Wa62HuRJmWXtX9F00nUpWlrbaH5axeYCdyRsOs/+Rb1Vb6+qWTlB5rKwCCRKtorM7owNwKsyJ8NRDUcZ8ghYUA==
+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-get-type "^29.4.2"
- pretty-format "^29.4.2"
+ "@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-matcher-utils@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.2.tgz#08d0bf5abf242e3834bec92c7ef5071732839e85"
- integrity sha512-EZaAQy2je6Uqkrm6frnxBIdaWtSYFoR8SVb2sNLAtldswlR/29JAgx+hy67llT3+hXBaLB0zAm5UfeqerioZyg==
+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 "^29.4.2"
- jest-get-type "^29.4.2"
- pretty-format "^29.4.2"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
-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==
+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" "^29.4.2"
+ "@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 "^29.4.2"
+ pretty-format "^27.5.1"
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==
+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" "^29.4.2"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
- jest-util "^29.4.2"
jest-pnp-resolver@^1.2.2:
version "1.2.3"
@@ -6783,87 +7606,88 @@ jest-regex-util@^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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.2.tgz#19187cca35d301f8126cf7a021dd4dcb7b58a1ca"
- integrity sha512-XYZXOqUl1y31H6VLMrrUL1ZhXuiymLKPz0BO1kEeR5xER9Tv86RZrjTm74g5l9bPJQXA/hyLdaVPN/sdqfteig==
+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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.2.tgz#6359db606f5967b68ca8bbe9dbc07a4306c12bf7"
- integrity sha512-6pL4ptFw62rjdrPk7rRpzJYgcRqRZNsZTF1VxVTZMishbO6ObyWvX57yHOaNGgKoADtAHRFYdHQUEvYMJATbDg==
+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-regex-util "^29.4.2"
- jest-snapshot "^29.4.2"
+ "@jest/types" "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-snapshot "^27.5.1"
-jest-resolve@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.2.tgz#8831f449671d08d161fe493003f61dc9b55b808e"
- integrity sha512-RtKWW0mbR3I4UdkOrW7552IFGLYQ5AF9YrzD0FnIOkDu0rAMlA5/Y1+r7lhCAP4nXSBTaE7ueeqj6IOwZpgoqw==
+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 "^29.4.2"
+ jest-haste-map "^27.5.1"
jest-pnp-resolver "^1.2.2"
- jest-util "^29.4.2"
- jest-validate "^29.4.2"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
resolve "^1.20.0"
- resolve.exports "^2.0.0"
+ resolve.exports "^1.1.0"
slash "^3.0.0"
-jest-runner@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.2.tgz#2bcecf72303369df4ef1e6e983c22a89870d5125"
- integrity sha512-wqwt0drm7JGjwdH+x1XgAl+TFPH7poowMguPQINYxaukCqlczAcNLJiK+OLxUxQAEWMdy+e6nHZlFHO5s7EuRg==
+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" "^29.4.2"
- "@jest/environment" "^29.4.2"
- "@jest/test-result" "^29.4.2"
- "@jest/transform" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@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.13.1"
+ emittery "^0.8.1"
graceful-fs "^4.2.9"
- jest-docblock "^29.4.2"
- jest-environment-node "^29.4.2"
- jest-haste-map "^29.4.2"
- jest-leak-detector "^29.4.2"
- jest-message-util "^29.4.2"
- jest-resolve "^29.4.2"
- jest-runtime "^29.4.2"
- jest-util "^29.4.2"
- jest-watcher "^29.4.2"
- jest-worker "^29.4.2"
- p-limit "^3.1.0"
- source-map-support "0.5.13"
+ 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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.2.tgz#d86b764c5b95d76cb26ed1f32644e99de5d5c134"
- integrity sha512-3fque9vtpLzGuxT9eZqhxi+9EylKK/ESfhClv4P7Y9sqJPs58LjVhTt8jaMp/pRO38agll1CkSu9z9ieTQeRrw==
+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" "^29.4.2"
- "@jest/fake-timers" "^29.4.2"
- "@jest/globals" "^29.4.2"
- "@jest/source-map" "^29.4.2"
- "@jest/test-result" "^29.4.2"
- "@jest/transform" "^29.4.2"
- "@jest/types" "^29.4.2"
- "@types/node" "*"
+ "@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 "^29.4.2"
- jest-message-util "^29.4.2"
- jest-mock "^29.4.2"
- jest-regex-util "^29.4.2"
- jest-resolve "^29.4.2"
- jest-snapshot "^29.4.2"
- jest-util "^29.4.2"
- semver "^7.3.5"
+ 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"
@@ -6874,35 +7698,41 @@ jest-serializer@^25.2.6:
dependencies:
graceful-fs "^4.2.4"
-jest-snapshot@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.2.tgz#ba1fb9abb279fd2c85109ff1757bc56b503bbb3a"
- integrity sha512-PdfubrSNN5KwroyMH158R23tWcAXJyx4pvSvWls1dHoLCaUhGul9rsL3uVjtqzRpkxlkMavQjGuWG1newPgmkw==
+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:
- "@babel/core" "^7.11.6"
+ "@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-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.4.2"
- "@jest/transform" "^29.4.2"
- "@jest/types" "^29.4.2"
- "@types/babel__traverse" "^7.0.6"
+ "@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 "^29.4.2"
+ expect "^27.5.1"
graceful-fs "^4.2.9"
- jest-diff "^29.4.2"
- jest-get-type "^29.4.2"
- jest-haste-map "^29.4.2"
- jest-matcher-utils "^29.4.2"
- jest-message-util "^29.4.2"
- jest-util "^29.4.2"
+ 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 "^29.4.2"
- semver "^7.3.5"
+ pretty-format "^27.5.1"
+ semver "^7.3.2"
jest-util@^25.2.6:
version "25.2.6"
@@ -6914,42 +7744,41 @@ jest-util@^25.2.6:
is-ci "^2.0.0"
make-dir "^3.0.0"
-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==
+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" "^29.4.2"
+ "@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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.2.tgz#3b3f8c4910ab9a3442d2512e2175df6b3f77b915"
- integrity sha512-tto7YKGPJyFbhcKhIDFq8B5od+eVWD/ySZ9Tvcp/NGCvYA4RQbuzhbwYWtIjMT5W5zA2W0eBJwu4HVw34d5G6Q==
+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" "^29.4.2"
+ "@jest/types" "^27.5.1"
camelcase "^6.2.0"
chalk "^4.0.0"
- jest-get-type "^29.4.2"
+ jest-get-type "^27.5.1"
leven "^3.1.0"
- pretty-format "^29.4.2"
+ pretty-format "^27.5.1"
-jest-watcher@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.2.tgz#09c0f4c9a9c7c0807fcefb1445b821c6f7953b7c"
- integrity sha512-onddLujSoGiMJt+tKutehIidABa175i/Ays+QvKxCqBwp7fvxP3ZhKsrIdOodt71dKxqk4sc0LN41mWLGIK44w==
+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" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
ansi-escapes "^4.2.1"
chalk "^4.0.0"
- emittery "^0.13.1"
- jest-util "^29.4.2"
+ jest-util "^27.5.1"
string-length "^4.0.1"
jest-worker@^25.2.6:
@@ -6960,30 +7789,28 @@ jest-worker@^25.2.6:
merge-stream "^2.0.0"
supports-color "^7.0.0"
-jest-worker@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.2.tgz#d9b2c3bafc69311d84d94e7fb45677fc8976296f"
- integrity sha512-VIuZA2hZmFyRbchsUCHEehoSf2HEl0YVF8SDJqtPnKorAaBuh42V8QsLnde0XP5F6TyCynGPEGgBOn3Fc+wZGw==
+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" "*"
- jest-util "^29.4.2"
merge-stream "^2.0.0"
supports-color "^8.0.0"
-jest@29.4:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.2.tgz#4c2127d03a71dc187f386156ef155dbf323fb7be"
- integrity sha512-+5hLd260vNIHu+7ZgMIooSpKl7Jp5pHKb51e73AJU3owd5dEo/RfVwHbA/na3C/eozrt3hJOLGf96c7EWwIAzg==
+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" "^29.4.2"
- "@jest/types" "^29.4.2"
+ "@jest/core" "^27.5.1"
import-local "^3.0.2"
- jest-cli "^29.4.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=
+jmespath@0.16.0:
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076"
+ integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==
jquery@^3.3.1:
version "3.5.1"
@@ -7003,32 +7830,69 @@ js-yaml@^3.13.1:
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@~21.1.0:
- version "21.1.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.0.tgz#d56ba4a84ed478260d83bd53dc181775f2d8e6ef"
- integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==
+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"
- 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"
+ cssstyle "^3.0.0"
+ data-urls "^4.0.0"
+ decimal.js "^10.4.3"
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"
+ 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"
@@ -7036,8 +7900,8 @@ jsdom@~21.1.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"
+ whatwg-url "^12.0.1"
+ ws "^8.13.0"
xml-name-validator "^4.0.0"
jsesc@^2.5.1:
@@ -7050,21 +7914,11 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-json-buffer@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
- integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-
json-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-better-errors@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
json-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"
@@ -7090,11 +7944,18 @@ json-stringify-safe@~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.1.2, json5@^2.2.2:
+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"
@@ -7138,13 +7999,6 @@ jws@^3.2.2:
jwa "^1.4.1"
safe-buffer "^5.0.1"
-keyv@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
- integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
- dependencies:
- json-buffer "3.0.0"
-
keyv@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254"
@@ -7205,14 +8059,15 @@ leven@^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==
+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:
- leven "^3.1.0"
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
-levn@^0.3.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 sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
@@ -7220,14 +8075,6 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
-libphonenumber-js@^1.6.4:
- version "1.7.22"
- resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.7.22.tgz#e206e3c227ec47ff306f7405ac52c331911e1b35"
- integrity sha512-KCK4874gp640B+d1zjNi2ZiZ3ubEUPH/0B9AwcuhHDVAL6NdthxC8obbdhGlo7FcEpjFVwEMDoHRfi+lI8NM/g==
- dependencies:
- minimist "^1.2.0"
- xml2js "^0.4.17"
-
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"
@@ -7242,34 +8089,6 @@ linkifyjs@~2.1.8:
react "^16.4.2"
react-dom "^16.4.2"
-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@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
- integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^4.0.0"
- pify "^3.0.0"
- strip-bom "^3.0.0"
-
-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"
@@ -7285,6 +8104,13 @@ locate-path@^5.0.0:
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"
@@ -7295,6 +8121,11 @@ lodash.clonedeep@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@@ -7340,6 +8171,16 @@ lodash.isstring@^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"
@@ -7355,22 +8196,17 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==
-lodash.unescape@4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
- integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
-
lodash@4.17.15:
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.5, lodash@~4.17.11, lodash@~4.17.14:
+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.17.21:
+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==
@@ -7385,13 +8221,20 @@ long@^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:
+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"
+loupe@^2.3.1:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53"
+ integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==
+ dependencies:
+ get-func-name "^2.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"
@@ -7404,7 +8247,7 @@ lower-case@^2.0.1:
dependencies:
tslib "^1.10.0"
-lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+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==
@@ -7468,6 +8311,11 @@ make-dir@^3.0.0:
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"
@@ -7519,11 +8367,6 @@ memoize-one@~6.0.0:
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
-memorystream@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
- integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
-
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -7548,15 +8391,10 @@ merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
-metascraper-audio@^5.33.5:
- version "5.33.5"
- resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.33.5.tgz#5400fab5154636f166aff10e205a429c9e75d9a2"
- integrity sha512-zO2PyRIVH10RTZlphYXVOAn8U17ZaH/JkY95h1BJ9eMBWfnziuWCtN0tIUUysQ+Ci8vcci65tasYqdG7jfcHKQ==
- dependencies:
- "@keyvhq/memoize" "~1.6.14"
- "@metascraper/helpers" "^5.33.5"
- got "~11.8.5"
- p-reflect "~2.1.0"
+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-author@^5.33.5:
version "5.33.5"
@@ -7565,13 +8403,6 @@ metascraper-author@^5.33.5:
dependencies:
"@metascraper/helpers" "^5.33.5"
-metascraper-clearbit-logo@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/metascraper-clearbit-logo/-/metascraper-clearbit-logo-5.3.0.tgz#e4596dbaf35503635d585a705f4119c7eddc6773"
- integrity sha512-Vg9m8cj2yEIUDrRjvCORvf8vgq2HLsWLVqNnIactNUPJ+Lcly5Xcxh5TcmHYp5Qx5DtNUCoKlakomYHn8mOjqg==
- dependencies:
- got "~9.6.0"
-
metascraper-date@^5.33.5:
version "5.33.5"
resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.33.5.tgz#fccd8f7b685e0f3bb152c86aa93ed03a96c3c834"
@@ -7624,26 +8455,26 @@ metascraper-publisher@^5.33.5:
dependencies:
"@metascraper/helpers" "^5.33.5"
-metascraper-soundcloud@^5.33.5:
- version "5.33.5"
- resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.33.5.tgz#9cd39e7ff432e715f8ecdca5256e7ea67f485557"
- integrity sha512-hkDhRfTKEUugIN9Gxh/l9HuWlkNAOKEBXov/9fYKbIMgaj7e2UU7bkNYjaDOXzMikCRWEIrrGP3UzwwIcs6Gjg==
+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.33.5"
+ "@metascraper/helpers" "^5.34.4"
-metascraper-title@^5.33.5:
- version "5.33.5"
- resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.33.5.tgz#2efd6aae03211175fa2e27b4d827cade4c3e35f4"
- integrity sha512-Vavt/2Yt4BZP+++xsV2ZnUqqQ4WHxRImZq6fZD6Eh8R8nt43kuQdgKrBKTD3Ybk6/qvlCTQ9XY57m/KTIiAMnA==
+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.33.5"
+ "@metascraper/helpers" "^5.34.7"
-metascraper-url@^5.33.5:
- version "5.33.5"
- resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.33.5.tgz#eb0ba736f47aef7c9a511ca04e509d11ee51c95d"
- integrity sha512-bXKfsfxCfy6uhhnb9lMlIu1Uwqkn9eXa4QVcHdq/+1UWTOE8b2u4NTH4YgJMjcPmdth7s3cKXBxG1yBnsAoN0w==
+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.33.5"
+ "@metascraper/helpers" "^5.34.2"
metascraper-video@^5.33.5:
version "5.33.5"
@@ -7676,7 +8507,7 @@ metascraper@^5.33.5:
lodash "~4.17.21"
whoops "~4.1.2"
-methods@^1.1.1, methods@^1.1.2, methods@~1.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=
@@ -7713,19 +8544,19 @@ microsoft-capitalize@~1.0.5:
resolved "https://registry.yarnpkg.com/microsoft-capitalize/-/microsoft-capitalize-1.0.5.tgz#bcaf915039f14224c8cfd74c31cea42fecacbb31"
integrity sha512-iqDMU9J643BHg8Zp7EMZNLTp6Pgs2f1S2SMnCW2VlUqMs17xCZ5vwVjalBJEGVcUfG+/1ePqeEGcMW3VfzHK5A==
-migrate@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/migrate/-/migrate-1.7.0.tgz#23fb97aa33145788030a1a91187a0ee32a49acbf"
- integrity sha512-I63YykITgWyI+ET4KO8xGePYkR9U7CtSe/RrR13vLbZSpUcAh4/ry2GswNv7Lywcsp3BaDHj7YdjC7ihVYCFmw==
+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 "^2.4.1"
- commander "^2.19.0"
- dateformat "^3.0.3"
- dotenv "^6.1.0"
+ chalk "^4.1.2"
+ commander "^2.20.3"
+ dateformat "^4.6.3"
+ dotenv "^16.0.0"
inherits "^2.0.3"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- slug "^0.9.2"
+ minimatch "^9.0.1"
+ mkdirp "^3.0.1"
+ slug "^8.2.2"
mime-db@1.43.0:
version "1.43.0"
@@ -7751,7 +8582,7 @@ mime-types@^2.1.26, mime-types@~2.1.22, mime-types@~2.1.24:
dependencies:
mime-db "1.43.0"
-mime@1.6.0, mime@^1.4.1:
+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==
@@ -7766,6 +8597,11 @@ mimic-fn@^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"
@@ -7776,7 +8612,7 @@ mimic-fn@~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, mimic-response@^1.0.1:
+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==
@@ -7793,7 +8629,7 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^3.1.1:
+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==
@@ -7807,12 +8643,19 @@ minimatch@^5.0.1:
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.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==
@@ -7920,16 +8763,16 @@ mkdirp@^1.0.3, mkdirp@^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==
-moment@^2.22.2:
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
- integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -7955,11 +8798,6 @@ mustache@^4.2.0:
resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64"
integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==
-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==
-
mz@^2.4.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -7996,6 +8834,11 @@ nanomatch@^1.2.9:
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"
@@ -8034,17 +8877,7 @@ neo4j-driver-core@^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:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-4.0.2.tgz#78de3b91e91572bcbd9d2e02554322fe1ab399ea"
- integrity sha512-xQN4BZZsweaNNac7FDYAV6f/JybghwY3lk4fwblS8V5KQ+DBMPe4Pthh672mp+wEYZGyzPalq5CfpcBrWaZ4Gw==
- dependencies:
- "@babel/runtime" "^7.5.5"
- rxjs "^6.5.2"
- text-encoding-utf-8 "^1.0.2"
- uri-js "^4.2.2"
-
-neo4j-driver@^4.2.2:
+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==
@@ -8067,10 +8900,10 @@ neo4j-graphql-js@^2.11.5:
lodash "^4.17.15"
neo4j-driver "^4.0.1"
-neode@^0.4.8:
- version "0.4.8"
- resolved "https://registry.yarnpkg.com/neode/-/neode-0.4.8.tgz#0889b4fc7f1bf0b470b01fa5b8870373b5d47ad6"
- integrity sha512-pb91NfCOg4Fj5o+98H+S2XYC+ByQfbdhwcc1UVuzuUQ0Ezzj+jWz8NmKWU8ZfCH6l4plk71yDAPd2eTwpt+Xvg==
+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"
@@ -8102,11 +8935,6 @@ no-case@^3.0.3:
lower-case "^2.0.1"
tslib "^1.10.0"
-nocache@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f"
- integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==
-
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"
@@ -8120,7 +8948,7 @@ node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@~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.0:
+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==
@@ -8162,15 +8990,10 @@ node-pre-gyp@^0.12.0:
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==
+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==
nodemailer-html-to-text@^3.2.0:
version "3.2.0"
@@ -8222,16 +9045,6 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
-normalize-package-data@^2.3.2:
- 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"
@@ -8244,11 +9057,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-normalize-url@^4.1.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee"
- integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==
-
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"
@@ -8272,21 +9080,6 @@ npm-packlist@^1.1.6:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
-npm-run-all@~4.1.5:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
- integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
- dependencies:
- ansi-styles "^3.2.1"
- chalk "^2.4.1"
- cross-spawn "^6.0.5"
- memorystream "^0.3.1"
- minimatch "^3.0.4"
- pidtree "^0.3.0"
- read-pkg "^3.0.0"
- shell-quote "^1.6.1"
- string.prototype.padend "^3.0.0"
-
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"
@@ -8301,6 +9094,13 @@ npm-run-path@^4.0.1:
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"
@@ -8340,15 +9140,15 @@ number-is-nan@^1.0.0:
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-numeral@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506"
- integrity sha1-StCAk21EPCVhrtnyGX7//iX05QY=
+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.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0"
- integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==
+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"
@@ -8374,6 +9174,11 @@ object-hash@^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"
@@ -8406,6 +9211,16 @@ object.assign@^4.1.0:
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"
@@ -8429,15 +9244,14 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
-object.values@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9"
- integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==
+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:
- define-properties "^1.1.3"
- es-abstract "^1.12.0"
- function-bind "^1.1.1"
- has "^1.0.3"
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
on-finished@~2.3.0:
version "2.3.0"
@@ -8453,13 +9267,30 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
-onetime@^5.1.0, onetime@^5.1.2:
+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"
@@ -8467,7 +9298,7 @@ optimism@^0.10.0:
dependencies:
"@wry/context" "^0.4.0"
-optionator@^0.8.1, optionator@^0.8.3:
+optionator@^0.8.1:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -8479,12 +9310,24 @@ optionator@^0.8.1, optionator@^0.8.3:
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, os-tmpdir@~1.0.2:
+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=
@@ -8497,11 +9340,6 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
-p-cancelable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
- integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
-
p-cancelable@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e"
@@ -8512,13 +9350,6 @@ p-finally@^1.0.0:
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
-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.1"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
@@ -8533,20 +9364,13 @@ p-limit@^2.2.0:
dependencies:
p-try "^2.0.0"
-p-limit@^3.0.2, p-limit@^3.1.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@^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"
@@ -8561,7 +9385,7 @@ p-locate@^4.1.0:
dependencies:
p-limit "^2.2.0"
-p-locate@~5.0.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==
@@ -8580,11 +9404,6 @@ p-reflect@~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@^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"
@@ -8614,21 +9433,6 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.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.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@@ -8662,6 +9466,11 @@ parse5-htmlparser2-tree-adapter@^7.0.0:
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"
@@ -8669,7 +9478,7 @@ parse5@^3.0.1:
dependencies:
"@types/node" "*"
-parse5@^7.0.0, parse5@^7.1.1:
+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==
@@ -8729,6 +9538,11 @@ path-key@^3.0.0, path-key@^3.1.0:
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"
@@ -8739,29 +9553,15 @@ path-to-regexp@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@^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==
-pathval@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
- integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
performance-now@^2.1.0:
version "2.1.0"
@@ -8778,16 +9578,6 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-pidtree@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b"
- integrity sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==
-
-pify@^2.0.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"
@@ -8810,13 +9600,6 @@ pirates@^4.0.1, pirates@^4.0.4:
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
-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"
@@ -8845,6 +9628,11 @@ postcss@^7.0.27:
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"
@@ -8855,11 +9643,6 @@ prepend-http@^1.0.1:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
-prepend-http@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
- integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-
prettier-linter-helpers@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
@@ -8867,24 +9650,19 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@~2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d"
- integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==
+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@^29.4.2:
- version "29.4.2"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.2.tgz#64bf5ccc0d718c03027d94ac957bdd32b3fb2401"
- integrity sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg==
+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:
- "@jest/schemas" "^29.4.2"
+ ansi-regex "^5.0.1"
ansi-styles "^5.0.0"
- react-is "^18.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==
+ react-is "^17.0.1"
process-nextick-args@~2.0.0:
version "2.0.1"
@@ -8977,7 +9755,7 @@ punycode@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.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==
@@ -8987,11 +9765,6 @@ qs@6.7.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
-qs@^6.5.1:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.8.0.tgz#87b763f0d37ca54200334cd57bb2ef8f68a1d081"
- integrity sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==
-
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
@@ -9037,14 +9810,14 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-re2@~1.18.0:
- version "1.18.0"
- resolved "https://registry.yarnpkg.com/re2/-/re2-1.18.0.tgz#6d6f47c5aaa436eb7a7d68b260f8cf25d7948619"
- integrity sha512-MoCYZlJ9YUgksND9asyNF2/x532daXU/ARp1UeJbQ5flMY6ryKNEhrWt85aw3YluzOJlC3vXpGgK2a1jb0b4GA==
+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.1"
+ install-artifact-from-github "^1.3.3"
nan "^2.17.0"
- node-gyp "^9.3.0"
+ node-gyp "^9.3.1"
reachable-url@~1.7.1:
version "1.7.1"
@@ -9069,10 +9842,10 @@ react-is@^16.8.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb"
integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==
-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-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"
@@ -9083,33 +9856,7 @@ react@^16.4.2:
object-assign "^4.1.1"
prop-types "^15.6.2"
-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@^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@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
- integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
- dependencies:
- load-json-file "^4.0.0"
- normalize-package-data "^2.3.2"
- path-type "^3.0.0"
-
-readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.5:
+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==
@@ -9178,29 +9925,17 @@ redis-parser@^3.0.0:
dependencies:
redis-errors "^1.0.0"
-referrer-policy@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.2.0.tgz#b99cfb8b57090dc454895ef897a4cc35ef67a98e"
- integrity sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==
-
-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==
+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.0"
+ regenerate "^1.4.2"
-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.11.0:
version "0.11.1"
@@ -9212,13 +9947,12 @@ regenerator-runtime@^0.13.2, regenerator-runtime@^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==
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
dependencies:
"@babel/runtime" "^7.8.4"
- private "^0.1.8"
regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2"
@@ -9228,39 +9962,36 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-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==
+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==
+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:
- 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"
+ "@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"
@@ -9277,27 +10008,10 @@ registry-url@^3.0.3:
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==
+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"
@@ -9316,23 +10030,7 @@ repeat-string@^1.5.2, repeat-string@^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.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.88.0, request@~2.88.2:
+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==
@@ -9390,23 +10088,37 @@ resolve-from@^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@^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.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.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.3, resolve@^1.5.0:
+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.14.2, 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"
+
resolve@^1.20.0, resolve@^1.3.2:
version "1.22.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
@@ -9416,13 +10128,6 @@ resolve@^1.20.0, resolve@^1.3.2:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-responselike@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
- integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
- dependencies:
- lowercase-keys "^1.0.0"
-
responselike@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
@@ -9430,14 +10135,6 @@ responselike@^2.0.0:
dependencies:
lowercase-keys "^2.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"
-
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -9453,13 +10150,6 @@ reusify@^1.0.0:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rimraf@2.6.3:
- 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.6.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -9467,7 +10157,7 @@ rimraf@^2.6.1:
dependencies:
glob "^7.1.3"
-rimraf@^3.0.2:
+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==
@@ -9479,30 +10169,28 @@ rosie@^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-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=
+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:
- is-promise "^2.1.0"
+ 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.4.0, rxjs@^6.5.2, rxjs@^6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
- integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
- dependencies:
- tslib "^1.9.0"
-
rxjs@^6.6.3:
version "6.6.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
@@ -9525,6 +10213,15 @@ safe-buffer@~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"
@@ -9532,6 +10229,13 @@ safe-regex@^1.1.0:
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"
@@ -9578,6 +10282,13 @@ sax@>=0.6.0, sax@^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"
@@ -9605,27 +10316,22 @@ semver-diff@^2.0.0:
dependencies:
semver "^5.0.3"
-"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
+semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, 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@^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@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.2, 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.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"
+semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
send@0.17.1:
version "0.17.1"
@@ -9715,10 +10421,14 @@ shebang-regex@^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.6.1:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.1.tgz#3161d969886fb14f9140c65245a5dd19b6f0b06b"
- integrity sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg==
+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"
@@ -9740,21 +10450,15 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-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"
+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@^0.9.2:
- version "0.9.4"
- resolved "https://registry.yarnpkg.com/slug/-/slug-0.9.4.tgz#fad5f1ef33150830c7688cd8500514576eccabd8"
- integrity sha512-3YHq0TeJ4+AIFbJm+4UWSQs5A1mmeWOTQqydW3OoPmQfNKxlO96NDRTIrp+TBkmvEsEFrd+Z/LXw8OD/6OlZ5g==
- dependencies:
- unicode ">= 0.3.1"
+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"
@@ -9834,14 +10538,6 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@0.5.13:
- 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:
version "0.5.16"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
@@ -9850,6 +10546,14 @@ source-map-support@^0.5.16:
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"
@@ -9870,31 +10574,10 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-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.5"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
- integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
+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"
@@ -9994,11 +10677,6 @@ static-extend@^0.1.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-stealthy-require@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
- integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==
-
streamsearch@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
@@ -10043,23 +10721,14 @@ string-width@^1.0.1:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
-string-width@^3.0.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==
+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:
- emoji-regex "^7.0.1"
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^5.1.0"
-
-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"
+ 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"
@@ -10069,21 +10738,14 @@ string.prototype.trimend@^1.0.1:
define-properties "^1.1.3"
es-abstract "^1.17.5"
-string.prototype.trimleft@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
- integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
+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:
- define-properties "^1.1.3"
- function-bind "^1.1.1"
-
-string.prototype.trimright@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
- integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
- dependencies:
- define-properties "^1.1.3"
- function-bind "^1.1.1"
+ 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"
@@ -10093,6 +10755,15 @@ string.prototype.trimstart@^1.0.1:
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"
@@ -10121,13 +10792,6 @@ strip-ansi@^4.0.0:
dependencies:
ansi-regex "^3.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.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -10155,12 +10819,12 @@ strip-final-newline@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-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-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.1:
+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==
@@ -10181,30 +10845,6 @@ subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16, subscrip
symbol-observable "^1.0.4"
ws "^5.2.0 || ^6.0.0 || ^7.0.0"
-superagent@^3.8.3:
- version "3.8.3"
- resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128"
- integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==
- dependencies:
- component-emitter "^1.2.0"
- cookiejar "^2.1.0"
- debug "^3.1.0"
- extend "^3.0.0"
- form-data "^2.3.1"
- formidable "^1.2.0"
- methods "^1.1.1"
- mime "^1.4.1"
- qs "^6.5.1"
- readable-stream "^2.3.5"
-
-supertest@~4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36"
- integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==
- dependencies:
- methods "^1.1.2"
- superagent "^3.8.3"
-
supports-color@^4.0.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
@@ -10240,6 +10880,14 @@ supports-color@^8.0.0:
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"
@@ -10260,15 +10908,18 @@ synchronous-promise@^2.0.10:
resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8"
integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==
-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==
+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:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
+ "@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"
@@ -10302,6 +10953,14 @@ term-size@^1.2.0:
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"
@@ -10311,11 +10970,6 @@ test-exclude@^6.0.0:
glob "^7.1.4"
minimatch "^3.0.4"
-text-encoding-utf-8@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13"
- integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==
-
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -10335,10 +10989,10 @@ thenify-all@^1.0.0:
dependencies:
any-promise "^1.0.0"
-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=
+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"
@@ -10368,6 +11022,11 @@ titleize@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"
@@ -10378,24 +11037,17 @@ tlds@^1.228.0:
resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.236.0.tgz#a118eebe33261c577e3a3025144faeabb7dd813c"
integrity sha512-oP2PZ3KeGlgpHgsEfrtva3/K9kzsJUNliQSbCfrJ7JMCWFoCdtG+9YMq/g2AnADQ1v5tVlbtvKJZ4KLpy/P6MA==
-tldts-core@^5.7.104:
- version "5.7.104"
- resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.104.tgz#4313a9663e4085332750a5fb04bfa0b0d91b826d"
- integrity sha512-8vhSgc2nzPNT0J7XyCqcOtQ6+ySBn+gsPmj5h95YytIZ7L2Xl40paUmj0T6Uko42HegHGQxXieunHIQuABWSmQ==
+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@~5.7.103:
- version "5.7.104"
- resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.7.104.tgz#c964cf8a194936b086fa4c72994e92d4cd4d2562"
- integrity sha512-PlziEIVPH/ogbqOhS35K6MOeD09rd9U5g2NHO5n9NZeMC1PGpXgsjQpoJ1KiRnjhZsWDkzN8EoX3xQZuz5ZyFQ==
+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 "^5.7.104"
-
-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"
+ tldts-core "^6.0.3"
tmpl@1.0.5:
version "1.0.5"
@@ -10414,11 +11066,6 @@ to-object-path@^0.3.0:
dependencies:
kind-of "^3.0.2"
-to-readable-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
- integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
-
to-regex-range@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
@@ -10461,13 +11108,15 @@ touch@^3.1.0:
dependencies:
nopt "~1.0.10"
-tough-cookie@^2.3.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==
+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.28"
+ 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"
@@ -10479,13 +11128,28 @@ tough-cookie@^4.1.2:
universalify "^0.2.0"
url-parse "^1.5.3"
-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==
+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"
@@ -10526,16 +11190,71 @@ ts-invariant@^0.4.0:
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.9.0, tslib@^1.9.3:
+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"
@@ -10548,6 +11267,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
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"
@@ -10560,6 +11286,11 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
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"
@@ -10570,11 +11301,6 @@ type-fest@^0.3.0:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
-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"
@@ -10588,6 +11314,15 @@ type@^1.0.1:
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"
@@ -10595,6 +11330,21 @@ typedarray-to-buffer@^3.1.5:
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"
@@ -10602,38 +11352,28 @@ undefsafe@^2.0.2:
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-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==
+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 "^1.0.4"
- unicode-property-aliases-ecmascript "^1.0.4"
+ 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@^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-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==
-
-"unicode@>= 0.3.1":
- version "11.0.1"
- resolved "https://registry.yarnpkg.com/unicode/-/unicode-11.0.1.tgz#735bd422ec75cf28d396eb224d535d168d5f1db6"
- integrity sha512-+cHtykLb+eF1yrSLWTwcYBrqJkTfX7Quoyg7Juhe6uylF43ZbMdxMuSHNYlnyLT8T7POAvavgBthzUF9AIaQvQ==
+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==
union-value@^1.0.0:
version "1.0.1"
@@ -10691,6 +11431,11 @@ unset-value@^1.0.0:
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"
@@ -10701,10 +11446,10 @@ upath@^1.1.1:
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==
+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"
@@ -10749,13 +11494,6 @@ url-parse-lax@^1.0.0:
dependencies:
prepend-http "^1.0.1"
-url-parse-lax@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
- integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
- dependencies:
- prepend-http "^2.0.0"
-
url-parse@^1.5.3:
version "1.5.10"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
@@ -10820,15 +11558,26 @@ util@0.10.3:
dependencies:
inherits "2.0.1"
+util@^0.12.4:
+ 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"
+
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@8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c"
+ integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==
uuid@^3.1.0, uuid@^3.3.2, uuid@^3.4.0:
version "3.4.0"
@@ -10845,19 +11594,19 @@ uuid@^8.0.0, uuid@~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@^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-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@^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==
+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:
- "@jridgewell/trace-mapping" "^0.3.12"
"@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"
@@ -10866,18 +11615,10 @@ v8flags@^3.1.1:
dependencies:
homedir-polyfill "^1.0.1"
-validate-npm-package-license@^3.0.1:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
- integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
- dependencies:
- spdx-correct "^3.0.0"
- spdx-expression-parse "^3.0.0"
-
-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==
+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"
@@ -10903,6 +11644,20 @@ video-extensions@~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"
@@ -10910,30 +11665,35 @@ w3c-xmlserializer@^4.0.0:
dependencies:
xml-name-validator "^4.0.0"
-wait-on@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-4.0.1.tgz#c49ca18b1ea60580404feed9df76ab3af2425a56"
- integrity sha512-x83fmTH2X0KL7vXoGt9aV5x4SMCvO8A/NbwWpaYYh4NJ16d3KSgbHwBy9dVdHj0B30cEhOFRvDob4fnpUmZxvA==
- dependencies:
- "@hapi/joi" "^17.1.0"
- lodash "^4.17.15"
- minimist "^1.2.0"
- request "^2.88.0"
- request-promise-native "^1.0.8"
- rxjs "^6.5.4"
-
-walker@^1.0.7, walker@^1.0.8, walker@~1.0.5:
+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"
@@ -10941,19 +11701,67 @@ whatwg-encoding@^2.0.0:
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@^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==
+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 "^3.0.0"
+ 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.11, which-typed-array@^1.1.2:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a"
+ integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==
+ 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"
+
+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"
@@ -10997,7 +11805,7 @@ widest-line@^2.0.0:
dependencies:
string-width "^2.1.1"
-word-wrap@~1.2.3:
+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==
@@ -11035,21 +11843,6 @@ write-file-atomic@^3.0.0:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-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@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 || ^6.0.0 || ^7.0.0":
version "7.5.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
@@ -11062,38 +11855,43 @@ ws@^6.0.0:
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==
+ws@^7.4.6:
+ version "7.5.9"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
+ integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
-x-xss-protection@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.3.0.tgz#3e3a8dd638da80421b0e9fff11a2dbe168f6d52c"
- integrity sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==
+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, xml2js@^0.4.17:
- version "0.4.19"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
- integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
+xml2js@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7"
+ integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==
dependencies:
sax ">=0.6.0"
- xmlbuilder "~9.0.1"
+ xmlbuilder "~11.0.0"
-xmlbuilder@~9.0.1:
- version "9.0.7"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
- integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
xmlchars@^2.2.0:
version "2.2.0"
@@ -11145,23 +11943,28 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-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@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@^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==
+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 "^8.0.1"
+ cliui "^7.0.2"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
- string-width "^4.2.3"
+ string-width "^4.2.0"
y18n "^5.0.5"
- yargs-parser "^21.1.1"
+ 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"
diff --git a/cypress/create-cucumber-html-report.js b/cypress/create-cucumber-html-report.js
new file mode 100644
index 000000000..9720f4281
--- /dev/null
+++ b/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/cypress/cypress.config.js b/cypress/cypress.config.js
new file mode 100644
index 000000000..b1d80575e
--- /dev/null
+++ b/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/cypress/cypress.json b/cypress/cypress.json
deleted file mode 100644
index de323f736..000000000
--- a/cypress/cypress.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "projectId": "qa7fe2",
- "defaultCommandTimeout": 10000,
- "ignoreTestFiles": "*.js",
- "chromeWebSecurity": false,
- "baseUrl": "http://localhost:3000",
- "video":false,
- "retries": {
- "runMode": 2,
- "openMode": 0
- }
-}
diff --git a/cypress/integration/Admin.DonationInfo.feature b/cypress/e2e/Admin.DonationInfo.feature
similarity index 100%
rename from cypress/integration/Admin.DonationInfo.feature
rename to cypress/e2e/Admin.DonationInfo.feature
diff --git a/cypress/integration/Admin.PinPost.feature b/cypress/e2e/Admin.PinPost.feature
similarity index 100%
rename from cypress/integration/Admin.PinPost.feature
rename to cypress/e2e/Admin.PinPost.feature
diff --git a/cypress/integration/Admin.TagOverview.feature b/cypress/e2e/Admin.TagOverview.feature
similarity index 100%
rename from cypress/integration/Admin.TagOverview.feature
rename to cypress/e2e/Admin.TagOverview.feature
diff --git a/cypress/integration/Internationalization.feature b/cypress/e2e/Internationalization.feature
similarity index 100%
rename from cypress/integration/Internationalization.feature
rename to cypress/e2e/Internationalization.feature
diff --git a/cypress/integration/Moderation.HidePost.feature b/cypress/e2e/Moderation.HidePost.feature
similarity index 100%
rename from cypress/integration/Moderation.HidePost.feature
rename to cypress/e2e/Moderation.HidePost.feature
diff --git a/cypress/integration/Moderation.ReportContent.feature b/cypress/e2e/Moderation.ReportContent.feature
similarity index 100%
rename from cypress/integration/Moderation.ReportContent.feature
rename to cypress/e2e/Moderation.ReportContent.feature
diff --git a/cypress/integration/Notification.Mention.feature b/cypress/e2e/Notification.Mention.feature
similarity index 100%
rename from cypress/integration/Notification.Mention.feature
rename to cypress/e2e/Notification.Mention.feature
diff --git a/cypress/integration/PersistentLinks.feature b/cypress/e2e/PersistentLinks.feature
similarity index 100%
rename from cypress/integration/PersistentLinks.feature
rename to cypress/e2e/PersistentLinks.feature
diff --git a/cypress/integration/Post.Comment.feature b/cypress/e2e/Post.Comment.feature
similarity index 100%
rename from cypress/integration/Post.Comment.feature
rename to cypress/e2e/Post.Comment.feature
diff --git a/cypress/integration/Post.Create.feature b/cypress/e2e/Post.Create.feature
similarity index 100%
rename from cypress/integration/Post.Create.feature
rename to cypress/e2e/Post.Create.feature
diff --git a/cypress/integration/Post.Images.feature b/cypress/e2e/Post.Images.feature
similarity index 100%
rename from cypress/integration/Post.Images.feature
rename to cypress/e2e/Post.Images.feature
diff --git a/cypress/integration/Post.feature b/cypress/e2e/Post.feature
similarity index 100%
rename from cypress/integration/Post.feature
rename to cypress/e2e/Post.feature
diff --git a/cypress/integration/Search.feature.broken b/cypress/e2e/Search.feature.broken
similarity index 100%
rename from cypress/integration/Search.feature.broken
rename to cypress/e2e/Search.feature.broken
diff --git a/cypress/integration/User.Authentication.feature b/cypress/e2e/User.Authentication.feature
similarity index 95%
rename from cypress/integration/User.Authentication.feature
rename to cypress/e2e/User.Authentication.feature
index db7680bd4..878ecad4a 100644
--- a/cypress/integration/User.Authentication.feature
+++ b/cypress/e2e/User.Authentication.feature
@@ -22,5 +22,6 @@ Feature: User authentication
Scenario: Log out
Given I am logged in as "peter-pan"
- When I log out
+ When I navigate to page "/"
+ And I log out
Then I am on page "login"
diff --git a/cypress/integration/User.Block.feature.broken b/cypress/e2e/User.Block.feature.broken
similarity index 100%
rename from cypress/integration/User.Block.feature.broken
rename to cypress/e2e/User.Block.feature.broken
diff --git a/cypress/integration/User.Mute.feature.broken b/cypress/e2e/User.Mute.feature.broken
similarity index 100%
rename from cypress/integration/User.Mute.feature.broken
rename to cypress/e2e/User.Mute.feature.broken
diff --git a/cypress/integration/User.SettingNotifications.feature b/cypress/e2e/User.SettingNotifications.feature
similarity index 100%
rename from cypress/integration/User.SettingNotifications.feature
rename to cypress/e2e/User.SettingNotifications.feature
diff --git a/cypress/integration/UserProfile.Avatar.feature b/cypress/e2e/UserProfile.Avatar.feature
similarity index 100%
rename from cypress/integration/UserProfile.Avatar.feature
rename to cypress/e2e/UserProfile.Avatar.feature
diff --git a/cypress/integration/UserProfile.ChangePassword.feature b/cypress/e2e/UserProfile.ChangePassword.feature
similarity index 100%
rename from cypress/integration/UserProfile.ChangePassword.feature
rename to cypress/e2e/UserProfile.ChangePassword.feature
diff --git a/cypress/integration/UserProfile.NameDescriptionLocation.feature b/cypress/e2e/UserProfile.NameDescriptionLocation.feature
similarity index 100%
rename from cypress/integration/UserProfile.NameDescriptionLocation.feature
rename to cypress/e2e/UserProfile.NameDescriptionLocation.feature
diff --git a/cypress/integration/UserProfile.SocialMedia.feature b/cypress/e2e/UserProfile.SocialMedia.feature
similarity index 100%
rename from cypress/integration/UserProfile.SocialMedia.feature
rename to cypress/e2e/UserProfile.SocialMedia.feature
diff --git a/cypress/integration/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js b/cypress/integration/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js
deleted file mode 100644
index 27830b239..000000000
--- a/cypress/integration/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
-
-When("I click on the avatar menu in the top right corner", () => {
- cy.get(".avatar-menu").click();
-});
\ No newline at end of file
diff --git a/cypress/integration/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js b/cypress/integration/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js
deleted file mode 100644
index 66c9baf61..000000000
--- a/cypress/integration/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
-
-Then('I see all the reported posts including the one from above', () => {
- cy.get('table tbody').within(() => {
- cy.contains('tr', 'The Truth about the Holocaust')
- })
-})
\ No newline at end of file
diff --git a/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js b/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js
deleted file mode 100644
index 3ca39e6e6..000000000
--- a/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Given } from "cypress-cucumber-preprocessor/steps";
-
-Given('somebody reported the following posts:', table => {
- 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
- })
- })
-})
\ No newline at end of file
diff --git a/cypress/integration/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js b/cypress/integration/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js
deleted file mode 100644
index ce5b54f25..000000000
--- a/cypress/integration/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
-
-Then("I should be able to {string} a teaser image", condition => {
- // cy.reload()
- switch(condition){
- case 'change':
- cy.get('.delete-image-button')
- .click()
- cy.fixture('humanconnection.png').as('postTeaserImage').then(function() {
- cy.get("#postdropzone").upload(
- { fileContent: this.postTeaserImage, fileName: 'humanconnection.png', mimeType: "image/png" },
- { subjectType: "drag-n-drop", force: true }
- ).wait(750);
- })
- break;
- case 'add':
- cy.fixture('onourjourney.png').as('postTeaserImage').then(function() {
- cy.get("#postdropzone").upload(
- { fileContent: this.postTeaserImage, fileName: 'onourjourney.png', mimeType: "image/png" },
- { subjectType: "drag-n-drop", force: true }
- ).wait(750);
- })
- break;
- case 'remove':
- cy.get('.delete-image-button')
- .click()
- break;
- }
-
-})
\ No newline at end of file
diff --git a/cypress/integration/User.SettingNotifications/I_click_save.js b/cypress/integration/User.SettingNotifications/I_click_save.js
deleted file mode 100644
index 32d702f1e..000000000
--- a/cypress/integration/User.SettingNotifications/I_click_save.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
-
-Then("I click save", () => {
- cy.get(".save-button").click()
-})
\ No newline at end of file
diff --git a/cypress/integration/User.SettingNotifications/I_click_the_checkbox_show_donations_progress_bar_and_save.js b/cypress/integration/User.SettingNotifications/I_click_the_checkbox_show_donations_progress_bar_and_save.js
deleted file mode 100644
index b4289dd5e..000000000
--- a/cypress/integration/User.SettingNotifications/I_click_the_checkbox_show_donations_progress_bar_and_save.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
-
-Then("I click the checkbox show donations progress bar and save", () => {
- cy.get("#showDonations").click()
- cy.get(".donations-info-button").click()
-})
\ No newline at end of file
diff --git a/cypress/integration/UserProfile.ChangePassword/I_submit_the_form.js b/cypress/integration/UserProfile.ChangePassword/I_submit_the_form.js
deleted file mode 100644
index 18349cff8..000000000
--- a/cypress/integration/UserProfile.ChangePassword/I_submit_the_form.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
-
-When("I submit the form", () => {
- cy.get("form").submit();
-});
\ No newline at end of file
diff --git a/cypress/integration/common/I_navigate_to_page_{string}.js b/cypress/integration/common/I_navigate_to_page_{string}.js
deleted file mode 100644
index aa929c80a..000000000
--- a/cypress/integration/common/I_navigate_to_page_{string}.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Given } from "cypress-cucumber-preprocessor/steps";
-
-Given("I navigate to page {string}", page => {
- cy.visit(page);
-});
\ No newline at end of file
diff --git a/cypress/integration/common/I_refresh_the_page.js b/cypress/integration/common/I_refresh_the_page.js
deleted file mode 100644
index 1ac655cb4..000000000
--- a/cypress/integration/common/I_refresh_the_page.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
-
-When('I refresh the page', () => {
- cy.visit('/')
- .reload();
-});
\ No newline at end of file
diff --git a/cypress/integration/common/I_wait_for_{int}_milliseconds.js b/cypress/integration/common/I_wait_for_{int}_milliseconds.js
deleted file mode 100644
index bc8ef906a..000000000
--- a/cypress/integration/common/I_wait_for_{int}_milliseconds.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
-
-When("I wait for {int} milliseconds", time => {
- cy.wait(time)
-});
\ No newline at end of file
diff --git a/cypress/parallel-features.sh b/cypress/parallel-features.sh
index c7d4d4878..24f5bfa9f 100755
--- a/cypress/parallel-features.sh
+++ b/cypress/parallel-features.sh
@@ -8,10 +8,10 @@ CUR_JOB=$(expr $1 - 1)
MAX_JOBS=$2
# Features
-FEATURE_LIST=( $(find cypress/integration/ -maxdepth 1 -name "*.feature") )
+FEATURE_LIST=( $(find cypress/e2e/ -maxdepth 1 -name "*.feature") )
# Calculation
-MAX_FEATURES=$(find cypress/integration/ -maxdepth 1 -name "*.feature" -print | wc -l)
+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
diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js
deleted file mode 100644
index 4e6b440ef..000000000
--- a/cypress/plugins/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-
-const cucumber = require('cypress-cucumber-preprocessor').default
-const dotenv = require('dotenv')
-
-// Import backend .env (smart)?
-const { parsed } = dotenv.config({ path: require.resolve('../../backend/.env') })
-
-// Test persistent(between commands) store
-const testStore = {}
-
-module.exports = (on, config) => {
- config.env.NEO4J_URI = parsed.NEO4J_URI
- config.env.NEO4J_USERNAME = parsed.NEO4J_USERNAME
- config.env.NEO4J_PASSWORD = parsed.NEO4J_PASSWORD
- config.env.JWT_SECRET = parsed.JWT_SECRET
- on('file:preprocessor', cucumber())
- on('task', {
- pushValue({ name, value }) {
- testStore[name] = value
- return true
- },
- getValue(name) {
- console.log("getValue",name,testStore)
- return testStore[name]
- },
- })
- return config
-}
\ No newline at end of file
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
index 7d3738a3d..92e8bf1f7 100644
--- a/cypress/support/commands.js
+++ b/cypress/support/commands.js
@@ -13,9 +13,8 @@
// Cypress.Commands.add('login', (email, password) => { ... })
/* globals Cypress cy */
-import "cypress-file-upload";
import { GraphQLClient, request } from 'graphql-request'
-import config from '../../backend/src/config'
+import CONFIG from '../../backend/build/src/config'
const authenticatedHeaders = (variables) => {
const mutation = `
@@ -24,7 +23,7 @@ const authenticatedHeaders = (variables) => {
}
`
return new Cypress.Promise((resolve, reject) => {
- request(config.GRAPHQL_URI, mutation, variables).then((response) => {
+ request(CONFIG.GRAPHQL_URI, mutation, variables).then((response) => {
resolve({ authorization: `Bearer ${response.login}` })
})
})
@@ -40,7 +39,7 @@ Cypress.Commands.add(
({email, password}) => {
return new Cypress.Promise((resolve, reject) => {
authenticatedHeaders({ email, password }).then((headers) => {
- resolve(new GraphQLClient(config.GRAPHQL_URI, { headers }))
+ resolve(new GraphQLClient(CONFIG.GRAPHQL_URI, { headers }))
})
})
})
@@ -48,9 +47,10 @@ Cypress.Commands.add(
Cypress.Commands.add(
'mutate',
{ prevSubject: true },
- (graphQLClient, mutation, variables) => {
- return new Cypress.Promise((resolve, reject) => {
+ (graphQLClient, mutation, variables, response) => {
+ return new Cypress.Promise(async (resolve, reject) => {
graphQLClient.request(mutation, variables).then(() => resolve(graphQLClient))
+
})
})
diff --git a/cypress/support/index.js b/cypress/support/e2e.js
similarity index 100%
rename from cypress/support/index.js
rename to cypress/support/e2e.js
diff --git a/cypress/support/factories.js b/cypress/support/factories.js
index 2ca46c483..a901d867f 100644
--- a/cypress/support/factories.js
+++ b/cypress/support/factories.js
@@ -1,22 +1,16 @@
-import Factory from '../../backend/src/db/factories'
-import { getNeode } from '../../backend/src/db/neo4j'
+import Factory from '../../backend/build/src/db/factories'
+import { getNeode } from '../../backend/build/src/db/neo4j'
+const neodeInstance = getNeode()
-const neo4jConfigs = {
- uri: Cypress.env('NEO4J_URI'),
- username: Cypress.env('NEO4J_USERNAME'),
- password: Cypress.env('NEO4J_PASSWORD')
-}
-const neodeInstance = getNeode(neo4jConfigs)
-
-beforeEach(() => cy.then(() => neodeInstance.cypher('MATCH (everything) DETACH DELETE everything;')))
+beforeEach(() => cy.then(() => neodeInstance.writeCypher('MATCH (everything) DETACH DELETE everything;')))
Cypress.Commands.add('neode', () => {
return neodeInstance
})
Cypress.Commands.add(
- 'first',
+ 'firstOf',
{ prevSubject: true },
(neode, model, properties) => {
return neode.first(model, properties)
diff --git a/cypress/integration/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js b/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js
similarity index 75%
rename from cypress/integration/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js
rename to cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js
index cd2473800..454aea44b 100644
--- a/cypress/integration/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js
+++ b/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_contains_goal_{string}_and_progress_{string}.js
@@ -1,8 +1,8 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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)
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Admin.DonationInfo/the_donation_info_is_{string}.js b/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_is_{string}.js
similarity index 68%
rename from cypress/integration/Admin.DonationInfo/the_donation_info_is_{string}.js
rename to cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_is_{string}.js
index d259e6520..da231f23a 100644
--- a/cypress/integration/Admin.DonationInfo/the_donation_info_is_{string}.js
+++ b/cypress/support/step_definitions/Admin.DonationInfo/the_donation_info_is_{string}.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js b/cypress/support/step_definitions/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js
similarity index 69%
rename from cypress/integration/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js
rename to cypress/support/step_definitions/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js
index a7be22495..2b8d00dc9 100644
--- a/cypress/integration/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js
+++ b/cypress/support/step_definitions/Admin.PinPost/I_open_the_content_menu_of_post_{string}.js
@@ -1,7 +1,7 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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()
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js b/cypress/support/step_definitions/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js
similarity index 76%
rename from cypress/integration/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js
rename to cypress/support/step_definitions/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js
index 1db51d2b0..3e9f43bc3 100644
--- a/cypress/integration/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js
+++ b/cypress/support/step_definitions/Admin.PinPost/the_post_with_title_{string}_has_a_ribbon_for_pinned_posts.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
@@ -6,4 +6,4 @@ Then("the post with title {string} has a ribbon for pinned posts", (title) => {
.parent()
.find(".ribbon.--pinned")
.should("contain", "Announcement")
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Admin.PinPost/there_is_no_button_to_pin_a_post.js b/cypress/support/step_definitions/Admin.PinPost/there_is_no_button_to_pin_a_post.js
similarity index 72%
rename from cypress/integration/Admin.PinPost/there_is_no_button_to_pin_a_post.js
rename to cypress/support/step_definitions/Admin.PinPost/there_is_no_button_to_pin_a_post.js
index 859b9faf1..70535b920 100644
--- a/cypress/integration/Admin.PinPost/there_is_no_button_to_pin_a_post.js
+++ b/cypress/support/step_definitions/Admin.PinPost/there_is_no_button_to_pin_a_post.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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")
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Internationalization/I_see_a_button_with_the_label_{string}.js b/cypress/support/step_definitions/Internationalization/I_see_a_button_with_the_label_{string}.js
similarity index 57%
rename from cypress/integration/Internationalization/I_see_a_button_with_the_label_{string}.js
rename to cypress/support/step_definitions/Internationalization/I_see_a_button_with_the_label_{string}.js
index a67f9d7df..73a4a5e50 100644
--- a/cypress/integration/Internationalization/I_see_a_button_with_the_label_{string}.js
+++ b/cypress/support/step_definitions/Internationalization/I_see_a_button_with_the_label_{string}.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I see a button with the label {string}", label => {
cy.contains("button", label);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Internationalization/I_select_{string}_in_the_language_menu.js b/cypress/support/step_definitions/Internationalization/I_select_{string}_in_the_language_menu.js
similarity index 71%
rename from cypress/integration/Internationalization/I_select_{string}_in_the_language_menu.js
rename to cypress/support/step_definitions/Internationalization/I_select_{string}_in_the_language_menu.js
index b850a7573..ba89fd3f5 100644
--- a/cypress/integration/Internationalization/I_select_{string}_in_the_language_menu.js
+++ b/cypress/support/step_definitions/Internationalization/I_select_{string}_in_the_language_menu.js
@@ -1,8 +1,8 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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();
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Internationalization/the_whole_user_interface_appears_in_{string}.js b/cypress/support/step_definitions/Internationalization/the_whole_user_interface_appears_in_{string}.js
similarity index 66%
rename from cypress/integration/Internationalization/the_whole_user_interface_appears_in_{string}.js
rename to cypress/support/step_definitions/Internationalization/the_whole_user_interface_appears_in_{string}.js
index 4d80b8a0d..d5a8ac95c 100644
--- a/cypress/integration/Internationalization/the_whole_user_interface_appears_in_{string}.js
+++ b/cypress/support/step_definitions/Internationalization/the_whole_user_interface_appears_in_{string}.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
-import locales from '../../../webapp/locales'
+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);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js b/cypress/support/step_definitions/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js
similarity index 65%
rename from cypress/integration/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js
rename to cypress/support/step_definitions/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js
index 611365bb0..26221ae66 100644
--- a/cypress/integration/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js
+++ b/cypress/support/step_definitions/Moderation.HidePost/I_should_see_only_{int}_posts_on_the_newsfeed.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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);
});
-
\ No newline at end of file
+
diff --git a/cypress/integration/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js b/cypress/support/step_definitions/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js
similarity index 81%
rename from cypress/integration/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js
rename to cypress/support/step_definitions/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js
index 6d9cfb2ef..538e8a64d 100644
--- a/cypress/integration/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js
+++ b/cypress/support/step_definitions/Moderation.HidePost/the_page_{string}_returns_a_404_error_with_a_message.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the page {string} returns a 404 error with a message:", (route, message) => {
cy.request({
@@ -11,4 +11,4 @@ Then("the page {string} returns a 404 error with a message:", (route, message) =
failOnStatusCode: false
});
cy.get(".error-message").should("contain", message);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js b/cypress/support/step_definitions/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js
similarity index 81%
rename from cypress/integration/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js
rename to cypress/support/step_definitions/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js
index 96706281a..fcb1cb686 100644
--- a/cypress/integration/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/I_can_t_see_the_moderation_menu_item.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then(`I can't see the moderation menu item`, () => {
cy.get('.avatar-menu-popover')
@@ -8,4 +8,4 @@ Then(`I can't see the moderation menu item`, () => {
cy.get('.avatar-menu-popover')
.find('a[href="/moderation"]', 'Moderation')
.should('not.exist')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Moderation.ReportContent/I_can_visit_the_post_page.js b/cypress/support/step_definitions/Moderation.ReportContent/I_can_visit_the_post_page.js
similarity index 74%
rename from cypress/integration/Moderation.ReportContent/I_can_visit_the_post_page.js
rename to cypress/support/step_definitions/Moderation.ReportContent/I_can_visit_the_post_page.js
index 8ca69da50..ce846c39a 100644
--- a/cypress/integration/Moderation.ReportContent/I_can_visit_the_post_page.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/I_can_visit_the_post_page.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js b/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js
similarity index 74%
rename from cypress/integration/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js
rename to cypress/support/step_definitions/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js
index 30682b009..8588e156a 100644
--- a/cypress/integration/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_Report_Post_from_the_content_menu_of_the_post.js
@@ -1,11 +1,11 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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({force: true})
+ .click()
cy.get('.popover .ds-menu-item-link')
.contains('Report Post')
.click()
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Moderation.ReportContent/I_click_on_the_author.js b/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_author.js
similarity index 66%
rename from cypress/integration/Moderation.ReportContent/I_click_on_the_author.js
rename to cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_author.js
index fad21e1a6..049eb8e72 100644
--- a/cypress/integration/Moderation.ReportContent/I_click_on_the_author.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_author.js
@@ -1,7 +1,7 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I click on the author', () => {
cy.get('[data-test="avatarUserLink"]')
.click()
.url().should('include', '/profile/')
-})
\ No newline at end of file
+})
diff --git a/cypress/support/step_definitions/Moderation.ReportContent/I_click_on_the_avatar_menu_in_the_top_right_corner.js b/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/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/cypress/integration/Moderation.ReportContent/I_confirm_the_reporting_dialog.js b/cypress/support/step_definitions/Moderation.ReportContent/I_confirm_the_reporting_dialog.js
similarity index 83%
rename from cypress/integration/Moderation.ReportContent/I_confirm_the_reporting_dialog.js
rename to cypress/support/step_definitions/Moderation.ReportContent/I_confirm_the_reporting_dialog.js
index 4009fa4e8..970c61c00 100644
--- a/cypress/integration/Moderation.ReportContent/I_confirm_the_reporting_dialog.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/I_confirm_the_reporting_dialog.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When(/^I confirm the reporting dialog .*:$/, message => {
cy.contains(message) // wait for element to become visible
@@ -13,4 +13,4 @@ When(/^I confirm the reporting dialog .*:$/, message => {
.contains('Report')
.click()
})
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js b/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js
similarity index 70%
rename from cypress/integration/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js
rename to cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js
index 522cd6c78..8989ecf68 100644
--- a/cypress/integration/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_from_the_user_who_muted_me.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
})
-})
\ No newline at end of file
+})
diff --git a/cypress/support/step_definitions/Moderation.ReportContent/I_see_all_the_reported_posts_including_the_one_from_above.js b/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/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/cypress/integration/Moderation.ReportContent/each_list_item_links_to_the_post_page.js b/cypress/support/step_definitions/Moderation.ReportContent/each_list_item_links_to_the_post_page.js
similarity index 70%
rename from cypress/integration/Moderation.ReportContent/each_list_item_links_to_the_post_page.js
rename to cypress/support/step_definitions/Moderation.ReportContent/each_list_item_links_to_the_post_page.js
index 9ce69d6de..e174113fc 100644
--- a/cypress/integration/Moderation.ReportContent/each_list_item_links_to_the_post_page.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/each_list_item_links_to_the_post_page.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
-})
\ No newline at end of file
+})
diff --git a/cypress/support/step_definitions/Moderation.ReportContent/somebody_reported_the_following_posts.js b/cypress/support/step_definitions/Moderation.ReportContent/somebody_reported_the_following_posts.js
new file mode 100644
index 000000000..38cdbee09
--- /dev/null
+++ b/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/cypress/integration/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js b/cypress/support/step_definitions/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js
similarity index 65%
rename from cypress/integration/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js
rename to cypress/support/step_definitions/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js
index 8d475ee43..8d61afd61 100644
--- a/cypress/integration/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js
+++ b/cypress/support/step_definitions/Moderation.ReportContent/there_is_an_annoying_user_who_has_muted_me.js
@@ -1,13 +1,15 @@
+import { Given } from "@badeball/cypress-cucumber-preprocessor";
+
Given("there is an annoying user who has muted me", () => {
cy.neode()
- .first("User", {
+ .firstOf("User", {
role: 'moderator'
})
.then(mutedUser => {
cy.neode()
- .first("User", {
+ .firstOf("User", {
id: 'user'
})
.relateTo(mutedUser, "muted");
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js b/cypress/support/step_definitions/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js
similarity index 73%
rename from cypress/integration/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js
rename to cypress/support/step_definitions/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js
index fde5042c1..b8e705c82 100644
--- a/cypress/integration/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js
+++ b/cypress/support/step_definitions/Notification.Mention/I_start_to_write_a_new_post_with_the_title_{string}_beginning_with.js
@@ -1,8 +1,8 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Notification.Mention/mention_{string}_in_the_text.js b/cypress/support/step_definitions/Notification.Mention/mention_{string}_in_the_text.js
similarity index 70%
rename from cypress/integration/Notification.Mention/mention_{string}_in_the_text.js
rename to cypress/support/step_definitions/Notification.Mention/mention_{string}_in_the_text.js
index fa8a29d4a..e1bd19da0 100644
--- a/cypress/integration/Notification.Mention/mention_{string}_in_the_text.js
+++ b/cypress/support/step_definitions/Notification.Mention/mention_{string}_in_the_text.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("mention {string} in the text", mention => {
cy.get(".ProseMirror")
@@ -6,4 +6,4 @@ When("mention {string} in the text", mention => {
cy.get(".suggestion-list__item")
.contains(mention)
.click();
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js b/cypress/support/step_definitions/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js
similarity index 79%
rename from cypress/integration/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js
rename to cypress/support/step_definitions/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js
index 0d3917f38..0143d1ac5 100644
--- a/cypress/integration/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js
+++ b/cypress/support/step_definitions/Notification.Mention/open_the_notification_menu_and_click_on_the_first_item.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("open the notification menu and click on the first item", () => {
cy.get(".notifications-menu")
@@ -7,4 +7,4 @@ When("open the notification menu and click on the first item", () => {
cy.get(".notification .link")
.first()
.click({force: true});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js b/cypress/support/step_definitions/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js
similarity index 65%
rename from cypress/integration/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js
rename to cypress/support/step_definitions/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js
index 124b61873..ae1644cef 100644
--- a/cypress/integration/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js
+++ b/cypress/support/step_definitions/Notification.Mention/see_{int}_unread_notifications_in_the_top_menu.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("see {int} unread notifications in the top menu", count => {
cy.get(".notifications-menu")
.should("contain", count);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js b/cypress/support/step_definitions/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js
similarity index 74%
rename from cypress/integration/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js
rename to cypress/support/step_definitions/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js
index e40827a16..a7204978e 100644
--- a/cypress/integration/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js
+++ b/cypress/support/step_definitions/Notification.Mention/the_notification_menu_button_links_to_the_all_notifications_page.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Notification.Mention/the_unread_counter_is_removed.js b/cypress/support/step_definitions/Notification.Mention/the_unread_counter_is_removed.js
similarity index 63%
rename from cypress/integration/Notification.Mention/the_unread_counter_is_removed.js
rename to cypress/support/step_definitions/Notification.Mention/the_unread_counter_is_removed.js
index 3859103e8..6c7ff96f0 100644
--- a/cypress/integration/Notification.Mention/the_unread_counter_is_removed.js
+++ b/cypress/support/step_definitions/Notification.Mention/the_unread_counter_is_removed.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the unread counter is removed", () => {
cy.get('.notifications-menu .counter-icon')
.should('not.exist');
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/I_comment_the_following.js b/cypress/support/step_definitions/Post.Comment/I_comment_the_following.js
similarity index 58%
rename from cypress/integration/Post.Comment/I_comment_the_following.js
rename to cypress/support/step_definitions/Post.Comment/I_comment_the_following.js
index 0f5a5049c..495075b60 100644
--- a/cypress/integration/Post.Comment/I_comment_the_following.js
+++ b/cypress/support/step_definitions/Post.Comment/I_comment_the_following.js
@@ -1,7 +1,7 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
-When("I comment the following:", async text => {
+When("I comment the following:", text => {
const comment = text.replace("\n", " ")
cy.task('pushValue', { name: 'lastComment', value: comment })
cy.get(".editor .ProseMirror").type(comment);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js b/cypress/support/step_definitions/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js
similarity index 66%
rename from cypress/integration/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js
rename to cypress/support/step_definitions/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js
index d0b7940f0..67dc9bef8 100644
--- a/cypress/integration/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js
+++ b/cypress/support/step_definitions/Post.Comment/I_should_see_an_abbreviated_version_of_my_comment.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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")
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/I_should_see_my_comment.js b/cypress/support/step_definitions/Post.Comment/I_should_see_my_comment.js
similarity index 85%
rename from cypress/integration/Post.Comment/I_should_see_my_comment.js
rename to cypress/support/step_definitions/Post.Comment/I_should_see_my_comment.js
index 8d439b112..7b30ee82d 100644
--- a/cypress/integration/Post.Comment/I_should_see_my_comment.js
+++ b/cypress/support/step_definitions/Post.Comment/I_should_see_my_comment.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I should see my comment", () => {
cy.get("article.comment-card p")
@@ -10,4 +10,4 @@ Then("I should see my comment", () => {
.and("contain", 'https://') // some url
.get(".user-teaser > .info > .text")
.should("contain", "today at");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/I_should_see_the_entirety_of_my_comment.js b/cypress/support/step_definitions/Post.Comment/I_should_see_the_entirety_of_my_comment.js
similarity index 65%
rename from cypress/integration/Post.Comment/I_should_see_the_entirety_of_my_comment.js
rename to cypress/support/step_definitions/Post.Comment/I_should_see_the_entirety_of_my_comment.js
index a903fa4d0..9ea48fa05 100644
--- a/cypress/integration/Post.Comment/I_should_see_the_entirety_of_my_comment.js
+++ b/cypress/support/step_definitions/Post.Comment/I_should_see_the_entirety_of_my_comment.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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")
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/I_type_in_a_comment_with_{int}_characters.js b/cypress/support/step_definitions/Post.Comment/I_type_in_a_comment_with_{int}_characters.js
similarity index 71%
rename from cypress/integration/Post.Comment/I_type_in_a_comment_with_{int}_characters.js
rename to cypress/support/step_definitions/Post.Comment/I_type_in_a_comment_with_{int}_characters.js
index 1522c0e64..ef39bdbf4 100644
--- a/cypress/integration/Post.Comment/I_type_in_a_comment_with_{int}_characters.js
+++ b/cypress/support/step_definitions/Post.Comment/I_type_in_a_comment_with_{int}_characters.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I type in a comment with {int} characters", size => {
var c="";
@@ -6,4 +6,4 @@ When("I type in a comment with {int} characters", size => {
c += "c"
}
cy.get(".editor .ProseMirror").type(c);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js b/cypress/support/step_definitions/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js
similarity index 70%
rename from cypress/integration/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js
rename to cypress/support/step_definitions/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js
index 3468badad..0e52e0f7a 100644
--- a/cypress/integration/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js
+++ b/cypress/support/step_definitions/Post.Comment/it_should_create_a_mention_in_the_CommentForm.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Post.Comment/my_comment_should_be_successfully_created.js b/cypress/support/step_definitions/Post.Comment/my_comment_should_be_successfully_created.js
similarity index 64%
rename from cypress/integration/Post.Comment/my_comment_should_be_successfully_created.js
rename to cypress/support/step_definitions/Post.Comment/my_comment_should_be_successfully_created.js
index 766106ddf..acb94f216 100644
--- a/cypress/integration/Post.Comment/my_comment_should_be_successfully_created.js
+++ b/cypress/support/step_definitions/Post.Comment/my_comment_should_be_successfully_created.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("my comment should be successfully created", () => {
cy.get(".iziToast-message").contains("Comment submitted!");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Comment/the_editor_should_be_cleared.js b/cypress/support/step_definitions/Post.Comment/the_editor_should_be_cleared.js
similarity index 61%
rename from cypress/integration/Post.Comment/the_editor_should_be_cleared.js
rename to cypress/support/step_definitions/Post.Comment/the_editor_should_be_cleared.js
index 579fc2ca9..f6e47313a 100644
--- a/cypress/integration/Post.Comment/the_editor_should_be_cleared.js
+++ b/cypress/support/step_definitions/Post.Comment/the_editor_should_be_cleared.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the editor should be cleared", () => {
cy.get(".ProseMirror p").should("have.class", "is-empty");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Create/I_choose_{string}_as_the_title.js b/cypress/support/step_definitions/Post.Create/I_choose_{string}_as_the_title.js
similarity index 60%
rename from cypress/integration/Post.Create/I_choose_{string}_as_the_title.js
rename to cypress/support/step_definitions/Post.Create/I_choose_{string}_as_the_title.js
index 9fbf8e58f..fc57b23a5 100644
--- a/cypress/integration/Post.Create/I_choose_{string}_as_the_title.js
+++ b/cypress/support/step_definitions/Post.Create/I_choose_{string}_as_the_title.js
@@ -1,8 +1,8 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
-When("I choose {string} as the title", async title => {
+When("I choose {string} as the title", title => {
const lastPost = {}
lastPost.title = title.replace("\n", " ");
cy.task('pushValue', { name: 'lastPost', value: lastPost })
cy.get('input[name="title"]').type(lastPost.title);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Create/the_post_was_saved_successfully.js b/cypress/support/step_definitions/Post.Create/the_post_was_saved_successfully.js
similarity index 61%
rename from cypress/integration/Post.Create/the_post_was_saved_successfully.js
rename to cypress/support/step_definitions/Post.Create/the_post_was_saved_successfully.js
index eec2f819b..50e414650 100644
--- a/cypress/integration/Post.Create/the_post_was_saved_successfully.js
+++ b/cypress/support/step_definitions/Post.Create/the_post_was_saved_successfully.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
-Then("the post was saved successfully", async () => {
+Then("the post was saved successfully", () => {
cy.task('getValue', 'lastPost').then(lastPost => {
cy.get(".base-card > .title").should("contain", lastPost.title);
cy.get(".content").should("contain", lastPost.content);
})
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Post.Images/I_add_all_required_fields.js b/cypress/support/step_definitions/Post.Images/I_add_all_required_fields.js
similarity index 69%
rename from cypress/integration/Post.Images/I_add_all_required_fields.js
rename to cypress/support/step_definitions/Post.Images/I_add_all_required_fields.js
index 52a95ab52..ce2e88a83 100644
--- a/cypress/integration/Post.Images/I_add_all_required_fields.js
+++ b/cypress/support/step_definitions/Post.Images/I_add_all_required_fields.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
- })
\ No newline at end of file
+ })
diff --git a/cypress/support/step_definitions/Post.Images/I_should_be_able_to_{string}_a_teaser_image.js b/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/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/cypress/integration/Post.Images/my_post_has_a_teaser_image.js b/cypress/support/step_definitions/Post.Images/my_post_has_a_teaser_image.js
similarity index 66%
rename from cypress/integration/Post.Images/my_post_has_a_teaser_image.js
rename to cypress/support/step_definitions/Post.Images/my_post_has_a_teaser_image.js
index 66ff3c31d..b9ce4b3c7 100644
--- a/cypress/integration/Post.Images/my_post_has_a_teaser_image.js
+++ b/cypress/support/step_definitions/Post.Images/my_post_has_a_teaser_image.js
@@ -1,7 +1,7 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Post.Images/the_first_image_should_not_be_displayed_anymore.js b/cypress/support/step_definitions/Post.Images/the_first_image_should_not_be_displayed_anymore.js
similarity index 74%
rename from cypress/integration/Post.Images/the_first_image_should_not_be_displayed_anymore.js
rename to cypress/support/step_definitions/Post.Images/the_first_image_should_not_be_displayed_anymore.js
index 867c97fdf..6388f4458 100644
--- a/cypress/integration/Post.Images/the_first_image_should_not_be_displayed_anymore.js
+++ b/cypress/support/step_definitions/Post.Images/the_first_image_should_not_be_displayed_anymore.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the first image should not be displayed anymore", () => {
cy.get(".hero-image")
@@ -6,4 +6,4 @@ Then("the first image should not be displayed anymore", () => {
.get('.hero-image > .image')
.should('have.length', 1)
.and('have.attr', 'src')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js b/cypress/support/step_definitions/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js
similarity index 87%
rename from cypress/integration/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js
rename to cypress/support/step_definitions/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js
index ece83d878..c0571068e 100644
--- a/cypress/integration/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js
+++ b/cypress/support/step_definitions/Post.Images/the_post_was_saved_successfully_with_the_{string}_teaser_image.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the post was saved successfully with the {string} teaser image", condition => {
cy.get(".base-card > .title")
@@ -8,4 +8,4 @@ Then("the post was saved successfully with the {string} teaser image", condition
.get('.post-page img')
.should("have.attr", "src")
.and("contains", condition === 'updated' ? 'humanconnection' : 'onourjourney')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js b/cypress/support/step_definitions/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js
similarity index 86%
rename from cypress/integration/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js
rename to cypress/support/step_definitions/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js
index abafcf0cc..40245df2b 100644
--- a/cypress/integration/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js
+++ b/cypress/support/step_definitions/Post.Images/the_{string}_post_was_saved_successfully_without_a_teaser_image.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then('the {string} post was saved successfully without a teaser image', condition => {
cy.get(".base-card > .title")
@@ -9,4 +9,4 @@ Then('the {string} post was saved successfully without a teaser image', conditio
.should('exist')
.get('.hero-image > .image')
.should('not.exist')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js b/cypress/support/step_definitions/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js
similarity index 79%
rename from cypress/integration/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js
rename to cypress/support/step_definitions/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js
index 3b42ea58e..f10896a33 100644
--- a/cypress/integration/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js
+++ b/cypress/support/step_definitions/Post/the_post_shows_up_on_the_newsfeed_at_position_{int}.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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');
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_select_a_post_entry.js b/cypress/support/step_definitions/Search/I_select_a_post_entry.js
similarity index 63%
rename from cypress/integration/Search/I_select_a_post_entry.js
rename to cypress/support/step_definitions/Search/I_select_a_post_entry.js
index 25611f91e..26e673499 100644
--- a/cypress/integration/Search/I_select_a_post_entry.js
+++ b/cypress/support/step_definitions/Search/I_select_a_post_entry.js
@@ -1,7 +1,7 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I select a post entry", () => {
cy.get(".searchable-input .search-post")
.first()
.trigger("click");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_select_a_user_entry.js b/cypress/support/step_definitions/Search/I_select_a_user_entry.js
similarity index 63%
rename from cypress/integration/Search/I_select_a_user_entry.js
rename to cypress/support/step_definitions/Search/I_select_a_user_entry.js
index b7222b2fb..3d186ffd8 100644
--- a/cypress/integration/Search/I_select_a_user_entry.js
+++ b/cypress/support/step_definitions/Search/I_select_a_user_entry.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I select a user entry", () => {
cy.get(".searchable-input .user-teaser")
.first()
.trigger("click");
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/Search/I_should_have_one_item_in_the_select_dropdown.js b/cypress/support/step_definitions/Search/I_should_have_one_item_in_the_select_dropdown.js
similarity index 71%
rename from cypress/integration/Search/I_should_have_one_item_in_the_select_dropdown.js
rename to cypress/support/step_definitions/Search/I_should_have_one_item_in_the_select_dropdown.js
index 7e5188ab6..148bb8195 100644
--- a/cypress/integration/Search/I_should_have_one_item_in_the_select_dropdown.js
+++ b/cypress/support/step_definitions/Search/I_should_have_one_item_in_the_select_dropdown.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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);
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js b/cypress/support/step_definitions/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js
similarity index 72%
rename from cypress/integration/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js
rename to cypress/support/step_definitions/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js
index a76ed6a5d..d2a2bc1df 100644
--- a/cypress/integration/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js
+++ b/cypress/support/step_definitions/Search/I_should_not_see_posts_without_the_searched-for_term_in_the_select_dropdown.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js b/cypress/support/step_definitions/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js
similarity index 73%
rename from cypress/integration/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js
rename to cypress/support/step_definitions/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js
index ce755abb0..41c132dea 100644
--- a/cypress/integration/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js
+++ b/cypress/support/step_definitions/Search/I_should_see_posts_with_the_searched-for_term_in_the_select_dropdown.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_should_see_the_following_posts_on_the_search_results_page.js b/cypress/support/step_definitions/Search/I_should_see_the_following_posts_on_the_search_results_page.js
similarity index 73%
rename from cypress/integration/Search/I_should_see_the_following_posts_on_the_search_results_page.js
rename to cypress/support/step_definitions/Search/I_should_see_the_following_posts_on_the_search_results_page.js
index f703a04f5..3e5da72f7 100644
--- a/cypress/integration/Search/I_should_see_the_following_posts_on_the_search_results_page.js
+++ b/cypress/support/step_definitions/Search/I_should_see_the_following_posts_on_the_search_results_page.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_should_see_the_following_users_in_the_select_dropdown.js b/cypress/support/step_definitions/Search/I_should_see_the_following_users_in_the_select_dropdown.js
similarity index 77%
rename from cypress/integration/Search/I_should_see_the_following_users_in_the_select_dropdown.js
rename to cypress/support/step_definitions/Search/I_should_see_the_following_users_in_the_select_dropdown.js
index 3e5e14043..830e19a8d 100644
--- a/cypress/integration/Search/I_should_see_the_following_users_in_the_select_dropdown.js
+++ b/cypress/support/step_definitions/Search/I_should_see_the_following_users_in_the_select_dropdown.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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);
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_type_{string}_and_press_Enter.js b/cypress/support/step_definitions/Search/I_type_{string}_and_press_Enter.js
similarity index 71%
rename from cypress/integration/Search/I_type_{string}_and_press_Enter.js
rename to cypress/support/step_definitions/Search/I_type_{string}_and_press_Enter.js
index 1a0fc6d42..796820ba0 100644
--- a/cypress/integration/Search/I_type_{string}_and_press_Enter.js
+++ b/cypress/support/step_definitions/Search/I_type_{string}_and_press_Enter.js
@@ -1,8 +1,8 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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 });
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/I_type_{string}_and_press_escape.js b/cypress/support/step_definitions/Search/I_type_{string}_and_press_escape.js
similarity index 68%
rename from cypress/integration/Search/I_type_{string}_and_press_escape.js
rename to cypress/support/step_definitions/Search/I_type_{string}_and_press_escape.js
index a3cde6cda..3e2e67be8 100644
--- a/cypress/integration/Search/I_type_{string}_and_press_escape.js
+++ b/cypress/support/step_definitions/Search/I_type_{string}_and_press_escape.js
@@ -1,8 +1,8 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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}");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/the_search_field_should_clear.js b/cypress/support/step_definitions/Search/the_search_field_should_clear.js
similarity index 64%
rename from cypress/integration/Search/the_search_field_should_clear.js
rename to cypress/support/step_definitions/Search/the_search_field_should_clear.js
index f571cdbd4..10f73959f 100644
--- a/cypress/integration/Search/the_search_field_should_clear.js
+++ b/cypress/support/step_definitions/Search/the_search_field_should_clear.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the search field should clear", () => {
cy.get(".searchable-input .ds-select input")
.should("have.text", "");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/Search/the_search_parameter_equals_{string}.js b/cypress/support/step_definitions/Search/the_search_parameter_equals_{string}.js
similarity index 61%
rename from cypress/integration/Search/the_search_parameter_equals_{string}.js
rename to cypress/support/step_definitions/Search/the_search_parameter_equals_{string}.js
index b8473584c..0f433cf1f 100644
--- a/cypress/integration/Search/the_search_parameter_equals_{string}.js
+++ b/cypress/support/step_definitions/Search/the_search_parameter_equals_{string}.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the search parameter equals {string}", search => {
cy.location("search")
.should("eq", search);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.Authentication/I_am_logged_in_with_username_{string}.js b/cypress/support/step_definitions/User.Authentication/I_am_logged_in_with_username_{string}.js
similarity index 74%
rename from cypress/integration/User.Authentication/I_am_logged_in_with_username_{string}.js
rename to cypress/support/step_definitions/User.Authentication/I_am_logged_in_with_username_{string}.js
index 4383282bd..d4af04ff6 100644
--- a/cypress/integration/User.Authentication/I_am_logged_in_with_username_{string}.js
+++ b/cypress/support/step_definitions/User.Authentication/I_am_logged_in_with_username_{string}.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.Block/I_block_the_user_{string}.js b/cypress/support/step_definitions/User.Block/I_block_the_user_{string}.js
similarity index 50%
rename from cypress/integration/User.Block/I_block_the_user_{string}.js
rename to cypress/support/step_definitions/User.Block/I_block_the_user_{string}.js
index cde1d96b9..be82f00d9 100644
--- a/cypress/integration/User.Block/I_block_the_user_{string}.js
+++ b/cypress/support/step_definitions/User.Block/I_block_the_user_{string}.js
@@ -1,11 +1,11 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I block the user {string}", name => {
cy.neode()
- .first("User", { name })
+ .firstOf("User", { name })
.then(blockedUser => {
cy.neode()
- .first("User", {id: "id-of-peter-pan"})
+ .firstOf("User", {id: "id-of-peter-pan"})
.relateTo(blockedUser, "blocked");
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.Block/I_should_not_see_{string}_button.js b/cypress/support/step_definitions/User.Block/I_should_not_see_{string}_button.js
similarity index 64%
rename from cypress/integration/User.Block/I_should_not_see_{string}_button.js
rename to cypress/support/step_definitions/User.Block/I_should_not_see_{string}_button.js
index 5bf0b7a68..791a5aaaf 100644
--- a/cypress/integration/User.Block/I_should_not_see_{string}_button.js
+++ b/cypress/support/step_definitions/User.Block/I_should_not_see_{string}_button.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Block/I_should_see_no_users_in_my_blocked_users_list.js b/cypress/support/step_definitions/User.Block/I_should_see_no_users_in_my_blocked_users_list.js
similarity index 69%
rename from cypress/integration/User.Block/I_should_see_no_users_in_my_blocked_users_list.js
rename to cypress/support/step_definitions/User.Block/I_should_see_no_users_in_my_blocked_users_list.js
index 11161ef2f..3e4813fbc 100644
--- a/cypress/integration/User.Block/I_should_see_no_users_in_my_blocked_users_list.js
+++ b/cypress/support/step_definitions/User.Block/I_should_see_no_users_in_my_blocked_users_list.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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.")
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Block/I_should_see_the_{string}_button.js b/cypress/support/step_definitions/User.Block/I_should_see_the_{string}_button.js
similarity index 67%
rename from cypress/integration/User.Block/I_should_see_the_{string}_button.js
rename to cypress/support/step_definitions/User.Block/I_should_see_the_{string}_button.js
index 373800870..7e6b7eacb 100644
--- a/cypress/integration/User.Block/I_should_see_the_{string}_button.js
+++ b/cypress/support/step_definitions/User.Block/I_should_see_the_{string}_button.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js b/cypress/support/step_definitions/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js
similarity index 79%
rename from cypress/integration/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js
rename to cypress/support/step_definitions/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js
index 0f44b5192..bcfd9bd7a 100644
--- a/cypress/integration/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js
+++ b/cypress/support/step_definitions/User.Block/I_{string}_see_{string}_from_the_content_menu_in_the_user_info_box.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Block/a_user_has_blocked_me.js b/cypress/support/step_definitions/User.Block/a_user_has_blocked_me.js
similarity index 65%
rename from cypress/integration/User.Block/a_user_has_blocked_me.js
rename to cypress/support/step_definitions/User.Block/a_user_has_blocked_me.js
index d1703407f..13b247ccf 100644
--- a/cypress/integration/User.Block/a_user_has_blocked_me.js
+++ b/cypress/support/step_definitions/User.Block/a_user_has_blocked_me.js
@@ -1,15 +1,15 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("a user has blocked me", () => {
cy.neode()
- .first("User", {
+ .firstOf("User", {
name: "Peter Pan"
})
.then(blockedUser => {
cy.neode()
- .first("User", {
+ .firstOf("User", {
name: 'Harassing User'
})
.relateTo(blockedUser, "blocked");
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.Block/they_should_not_see_the_comment_form.js b/cypress/support/step_definitions/User.Block/they_should_not_see_the_comment_form.js
similarity index 65%
rename from cypress/integration/User.Block/they_should_not_see_the_comment_form.js
rename to cypress/support/step_definitions/User.Block/they_should_not_see_the_comment_form.js
index 962934994..34aa86aaf 100644
--- a/cypress/integration/User.Block/they_should_not_see_the_comment_form.js
+++ b/cypress/support/step_definitions/User.Block/they_should_not_see_the_comment_form.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js b/cypress/support/step_definitions/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js
similarity index 73%
rename from cypress/integration/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js
rename to cypress/support/step_definitions/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js
index d95f3229c..64f0f0fd1 100644
--- a/cypress/integration/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js
+++ b/cypress/support/step_definitions/User.Block/they_should_see_a_text_explaining_why_commenting_is_not_possible.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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.")
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Mute/I_mute_the_user_{string}.js b/cypress/support/step_definitions/User.Mute/I_mute_the_user_{string}.js
similarity index 59%
rename from cypress/integration/User.Mute/I_mute_the_user_{string}.js
rename to cypress/support/step_definitions/User.Mute/I_mute_the_user_{string}.js
index e0ed382cb..7b52ca373 100644
--- a/cypress/integration/User.Mute/I_mute_the_user_{string}.js
+++ b/cypress/support/step_definitions/User.Mute/I_mute_the_user_{string}.js
@@ -1,13 +1,13 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I mute the user {string}", name => {
cy.neode()
- .first("User", { name })
+ .firstOf("User", { name })
.then(mutedUser => {
cy.neode()
- .first("User", {
+ .firstOf("User", {
name: "Peter Pan"
})
.relateTo(mutedUser, "muted");
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.Mute/the_list_of_posts_of_this_user_is_empty.js b/cypress/support/step_definitions/User.Mute/the_list_of_posts_of_this_user_is_empty.js
similarity index 69%
rename from cypress/integration/User.Mute/the_list_of_posts_of_this_user_is_empty.js
rename to cypress/support/step_definitions/User.Mute/the_list_of_posts_of_this_user_is_empty.js
index 038ca2168..66ac3bdb8 100644
--- a/cypress/integration/User.Mute/the_list_of_posts_of_this_user_is_empty.js
+++ b/cypress/support/step_definitions/User.Mute/the_list_of_posts_of_this_user_is_empty.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.Mute/the_search_should_contain_the_annoying_user.js b/cypress/support/step_definitions/User.Mute/the_search_should_contain_the_annoying_user.js
similarity index 83%
rename from cypress/integration/User.Mute/the_search_should_contain_the_annoying_user.js
rename to cypress/support/step_definitions/User.Mute/the_search_should_contain_the_annoying_user.js
index d29eafc2f..7d47c48aa 100644
--- a/cypress/integration/User.Mute/the_search_should_contain_the_annoying_user.js
+++ b/cypress/support/step_definitions/User.Mute/the_search_should_contain_the_annoying_user.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("the search should contain the annoying user", () => {
cy.get(".searchable-input .ds-select-dropdown")
@@ -10,4 +10,4 @@ Then("the search should contain the annoying user", () => {
cy.get(".searchable-input .ds-select input")
.focus()
.type("{esc}");
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js b/cypress/support/step_definitions/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js
similarity index 81%
rename from cypress/integration/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js
rename to cypress/support/step_definitions/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js
index a2f0a01d7..1dad99678 100644
--- a/cypress/integration/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js
+++ b/cypress/support/step_definitions/User.Mute/the_search_should_not_contain_posts_by_the_annoying_user.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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 => {
@@ -7,4 +7,4 @@ Then("the search should not contain posts by the annoying user", () => {
cy.get(".ds-select-dropdown")
.should("not.have.class", '.search-post')
.should("not.contain", 'Spam')
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/User.SettingNotifications/I_click_on_element_with_ID_{string}.js b/cypress/support/step_definitions/User.SettingNotifications/I_click_on_element_with_ID_{string}.js
similarity index 57%
rename from cypress/integration/User.SettingNotifications/I_click_on_element_with_ID_{string}.js
rename to cypress/support/step_definitions/User.SettingNotifications/I_click_on_element_with_ID_{string}.js
index 251c38941..7bdb20e5d 100644
--- a/cypress/integration/User.SettingNotifications/I_click_on_element_with_ID_{string}.js
+++ b/cypress/support/step_definitions/User.SettingNotifications/I_click_on_element_with_ID_{string}.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I click on element with ID {string}", (id) => {
cy.get('#' + id).click()
diff --git a/cypress/support/step_definitions/User.SettingNotifications/I_click_save.js b/cypress/support/step_definitions/User.SettingNotifications/I_click_save.js
new file mode 100644
index 000000000..9412d7912
--- /dev/null
+++ b/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/cypress/integration/UserProfile.Avatar/I_cannot_upload_a_picture.js b/cypress/support/step_definitions/UserProfile.Avatar/I_cannot_upload_a_picture.js
similarity index 71%
rename from cypress/integration/UserProfile.Avatar/I_cannot_upload_a_picture.js
rename to cypress/support/step_definitions/UserProfile.Avatar/I_cannot_upload_a_picture.js
index 8b501f3f5..9e44b55ba 100644
--- a/cypress/integration/UserProfile.Avatar/I_cannot_upload_a_picture.js
+++ b/cypress/support/step_definitions/UserProfile.Avatar/I_cannot_upload_a_picture.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js b/cypress/support/step_definitions/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js
similarity index 50%
rename from cypress/integration/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js
rename to cypress/support/step_definitions/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js
index 366fd8292..b1b2401e2 100644
--- a/cypress/integration/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js
+++ b/cypress/support/step_definitions/UserProfile.Avatar/I_should_be_able_to_change_my_profile_picture.js
@@ -1,17 +1,15 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I should be able to change my profile picture", () => {
const avatarUpload = "onourjourney.png";
-
- cy.fixture(avatarUpload, "base64").then(fileContent => {
- cy.get("#customdropzone").upload(
- { fileContent, fileName: avatarUpload, mimeType: "image/png" },
- { subjectType: "drag-n-drop", force: true }
- );
- });
+
+ 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);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/UserProfile.ChangePassword/I_can_login_successfully.js b/cypress/support/step_definitions/UserProfile.ChangePassword/I_can_login_successfully.js
similarity index 66%
rename from cypress/integration/UserProfile.ChangePassword/I_can_login_successfully.js
rename to cypress/support/step_definitions/UserProfile.ChangePassword/I_can_login_successfully.js
index d1a62cc4d..1349b5eb9 100644
--- a/cypress/integration/UserProfile.ChangePassword/I_can_login_successfully.js
+++ b/cypress/support/step_definitions/UserProfile.ChangePassword/I_can_login_successfully.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I can login successfully", () => {
// cy.reload();
cy.get(".iziToast-wrapper")
.should("contain", "You are logged in!");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/UserProfile.ChangePassword/I_cannot_login_anymore.js b/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_login_anymore.js
similarity index 69%
rename from cypress/integration/UserProfile.ChangePassword/I_cannot_login_anymore.js
rename to cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_login_anymore.js
index ff381d891..f6159c79b 100644
--- a/cypress/integration/UserProfile.ChangePassword/I_cannot_login_anymore.js
+++ b/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_login_anymore.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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.");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/UserProfile.ChangePassword/I_cannot_submit_the_form.js b/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_submit_the_form.js
similarity index 60%
rename from cypress/integration/UserProfile.ChangePassword/I_cannot_submit_the_form.js
rename to cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_submit_the_form.js
index 657d38bd8..02a2c7d83 100644
--- a/cypress/integration/UserProfile.ChangePassword/I_cannot_submit_the_form.js
+++ b/cypress/support/step_definitions/UserProfile.ChangePassword/I_cannot_submit_the_form.js
@@ -1,6 +1,6 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I cannot submit the form", () => {
cy.get("button[type=submit]")
.should('be.disabled');
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/UserProfile.ChangePassword/I_fill_the_password_form_with.js b/cypress/support/step_definitions/UserProfile.ChangePassword/I_fill_the_password_form_with.js
similarity index 81%
rename from cypress/integration/UserProfile.ChangePassword/I_fill_the_password_form_with.js
rename to cypress/support/step_definitions/UserProfile.ChangePassword/I_fill_the_password_form_with.js
index 69345ecc6..af0c6639b 100644
--- a/cypress/integration/UserProfile.ChangePassword/I_fill_the_password_form_with.js
+++ b/cypress/support/step_definitions/UserProfile.ChangePassword/I_fill_the_password_form_with.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I fill the password form with:", table => {
table = table.rowsHash();
@@ -8,4 +8,4 @@ When("I fill the password form with:", table => {
.type(table["Your new password"])
.get("input[id=passwordConfirmation]")
.type(table["Confirm new password"]);
-});
\ No newline at end of file
+});
diff --git a/cypress/support/step_definitions/UserProfile.ChangePassword/I_submit_the_form.js b/cypress/support/step_definitions/UserProfile.ChangePassword/I_submit_the_form.js
new file mode 100644
index 000000000..8b17f6de1
--- /dev/null
+++ b/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/cypress/integration/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js b/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
similarity index 85%
rename from cypress/integration/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js
rename to 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
index ca6b4798b..c5dd84bf0 100644
--- a/cypress/integration/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js
+++ b/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
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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) => {
diff --git a/cypress/integration/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js
similarity index 80%
rename from cypress/integration/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js
rename to cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js
index a1bc1c524..f0f6ba4da 100644
--- a/cypress/integration/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js
+++ b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_have_the_following_self-description.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I have the following self-description:', text => {
cy.get('textarea[id=about]')
@@ -9,4 +9,4 @@ When('I have the following self-description:', text => {
.not('[disabled]')
cy.get('.iziToast-message')
.should('contain', 'Your data was successfully updated')
- })
\ No newline at end of file
+ })
diff --git a/cypress/integration/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js
similarity index 82%
rename from cypress/integration/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js
rename to cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js
index de5143b9f..00d5141f8 100644
--- a/cypress/integration/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js
+++ b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_location.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I save {string} as my location', location => {
cy.get('input[id=city]').type(location)
@@ -10,4 +10,4 @@ When('I save {string} as my location', location => {
.not('[disabled]')
cy.get('.iziToast-message')
.should('contain', 'Your data was successfully updated')
- })
\ No newline at end of file
+ })
diff --git a/cypress/integration/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js
similarity index 79%
rename from cypress/integration/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js
rename to cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js
index 22e26cbc5..b94683a5b 100644
--- a/cypress/integration/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js
+++ b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/I_save_{string}_as_my_new_name.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I save {string} as my new name', name => {
cy.get('input[id=name]')
@@ -9,4 +9,4 @@ When('I save {string} as my new name', name => {
.not('[disabled]')
cy.get('.iziToast-message')
.should('contain', 'Your data was successfully updated')
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js
similarity index 60%
rename from cypress/integration/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js
rename to cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js
index 6d375a406..d416c8d10 100644
--- a/cypress/integration/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js
+++ b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_the_following_text_in_the_info_box_below_my_avatar.js
@@ -1,5 +1,5 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js
similarity index 60%
rename from cypress/integration/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js
rename to cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js
index ea328f441..ea8cf2158 100644
--- a/cypress/integration/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js
+++ b/cypress/support/step_definitions/UserProfile.NameDescriptionLocation/they_can_see_{string}_in_the_info_box_below_my_avatar.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then('they can see {string} in the info box below my avatar', location => {
cy.contains(location)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_add_a_social_media_link.js
similarity index 77%
rename from cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/I_add_a_social_media_link.js
index 07c80b30c..eab8ba0d6 100644
--- a/cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_add_a_social_media_link.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I add a social media link', () => {
cy.get('[data-test="add-save-button"]')
@@ -7,4 +7,4 @@ When('I add a social media link', () => {
.type('https://freeradical.zone/peter-pan')
.get('[data-test="add-save-button"]')
.click()
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/I_can_cancel_editing.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_can_cancel_editing.js
similarity index 67%
rename from cypress/integration/UserProfile.SocialMedia/I_can_cancel_editing.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/I_can_cancel_editing.js
index 03d60c44a..72d83c9a3 100644
--- a/cypress/integration/UserProfile.SocialMedia/I_can_cancel_editing.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_can_cancel_editing.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then('I can cancel editing', () => {
cy.get('button#cancel')
.click()
.get('input#editSocialMedia')
.should('have.length', 0)
-})
\ No newline at end of file
+})
diff --git a/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_a_social_media_link.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_a_social_media_link.js
new file mode 100644
index 000000000..1f0f3e22e
--- /dev/null
+++ b/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/cypress/integration/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js
similarity index 72%
rename from cypress/integration/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js
index 6b65e361b..3acba4756 100644
--- a/cypress/integration/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I delete the social media link {string}', (link) => {
cy.get('[data-test="delete-button"]')
@@ -8,5 +8,5 @@ When('I delete the social media link {string}', (link) => {
cy.get('[data-test="confirm-button"]')
.click()
cy.get('.ds-list-item-content > a')
- .contains(link).should('not.exist')
-})
\ No newline at end of file
+ .should('not.exist')
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_edit_and_save_the_link.js
similarity index 74%
rename from cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/I_edit_and_save_the_link.js
index 54712920d..3cec61688 100644
--- a/cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_edit_and_save_the_link.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I edit and save the link', () => {
cy.get('input#editSocialMedia')
@@ -6,4 +6,4 @@ When('I edit and save the link', () => {
.type('https://freeradical.zone/tinkerbell')
.get('[data-test="add-save-button"]')
.click()
-})
\ No newline at end of file
+})
diff --git a/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_a_social_media_link.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_a_social_media_link.js
new file mode 100644
index 000000000..b1eb698de
--- /dev/null
+++ b/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/cypress/integration/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js
similarity index 82%
rename from cypress/integration/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js
index 78a0191d2..d0daab843 100644
--- a/cypress/integration/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js
@@ -1,4 +1,4 @@
-import { Given } from "cypress-cucumber-preprocessor/steps";
+import { Given } from "@badeball/cypress-cucumber-preprocessor";
Given('I have added the social media link {string}', (link) => {
cy.visit('/settings/my-social-media')
@@ -10,4 +10,4 @@ Given('I have added the social media link {string}', (link) => {
.click()
cy.get('.ds-list-item-content > a')
.contains(link)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js
similarity index 60%
rename from cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js
index e3e5c2a22..11ee84084 100644
--- a/cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js
@@ -1,6 +1,6 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When('I start editing a social media link', () => {
cy.get('[data-test="edit-button"]')
.click()
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js b/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js
similarity index 69%
rename from cypress/integration/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js
index e72546f2a..fd1bf9350 100644
--- a/cypress/integration/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_social_media_link_shows_up_on_the_page.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/the_new_url_is_displayed.js b/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_url_is_displayed.js
similarity index 65%
rename from cypress/integration/UserProfile.SocialMedia/the_new_url_is_displayed.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/the_new_url_is_displayed.js
index c25e6f0bb..c9c7dd906 100644
--- a/cypress/integration/UserProfile.SocialMedia/the_new_url_is_displayed.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/the_new_url_is_displayed.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/UserProfile.SocialMedia/the_old_url_is_not_displayed.js b/cypress/support/step_definitions/UserProfile.SocialMedia/the_old_url_is_not_displayed.js
similarity index 66%
rename from cypress/integration/UserProfile.SocialMedia/the_old_url_is_not_displayed.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/the_old_url_is_not_displayed.js
index b3e804124..c0941f600 100644
--- a/cypress/integration/UserProfile.SocialMedia/the_old_url_is_not_displayed.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/the_old_url_is_not_displayed.js
@@ -1,7 +1,7 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
})
-
\ No newline at end of file
+
diff --git a/cypress/integration/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js b/cypress/support/step_definitions/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js
similarity index 77%
rename from cypress/integration/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js
rename to cypress/support/step_definitions/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js
index 89db2bd77..3b1692b59 100644
--- a/cypress/integration/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js
+++ b/cypress/support/step_definitions/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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)
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/common/I_am_logged_in_as_{string}.js b/cypress/support/step_definitions/common/I_am_logged_in_as_{string}.js
similarity index 70%
rename from cypress/integration/common/I_am_logged_in_as_{string}.js
rename to cypress/support/step_definitions/common/I_am_logged_in_as_{string}.js
index 96d1c28ab..1dbaa3d94 100644
--- a/cypress/integration/common/I_am_logged_in_as_{string}.js
+++ b/cypress/support/step_definitions/common/I_am_logged_in_as_{string}.js
@@ -1,9 +1,9 @@
-import { Given } from "cypress-cucumber-preprocessor/steps";
-import encode from '../../../backend/src/jwt/encode'
+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()
- .first("User", { slug })
+ .firstOf("User", { slug })
.then(user => {
return new Cypress.Promise((resolve, reject) => {
if(!user) {
@@ -15,4 +15,4 @@ Given("I am logged in as {string}", slug => {
.then(user => {
cy.setCookie('ocelot-social-token', encode(user))
})
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_am_on_page_{string}.js b/cypress/support/step_definitions/common/I_am_on_page_{string}.js
similarity index 61%
rename from cypress/integration/common/I_am_on_page_{string}.js
rename to cypress/support/step_definitions/common/I_am_on_page_{string}.js
index 5ef1b9852..44b10c4c4 100644
--- a/cypress/integration/common/I_am_on_page_{string}.js
+++ b/cypress/support/step_definitions/common/I_am_on_page_{string}.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I am on page {string}", page => {
cy.location("pathname")
.should("match", new RegExp(page));
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_can_see_the_following_table.js b/cypress/support/step_definitions/common/I_can_see_the_following_table.js
similarity index 84%
rename from cypress/integration/common/I_can_see_the_following_table.js
rename to cypress/support/step_definitions/common/I_can_see_the_following_table.js
index 9ebe1208c..f62e1a99a 100644
--- a/cypress/integration/common/I_can_see_the_following_table.js
+++ b/cypress/support/step_definitions/common/I_can_see_the_following_table.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then('I can see the following table:', table => {
const headers = table.raw()[0]
@@ -13,4 +13,4 @@ Then('I can see the following table:', table => {
.eq(i)
.should('contain', expected)
})
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/common/I_choose_the_following_text_as_content.js b/cypress/support/step_definitions/common/I_choose_the_following_text_as_content.js
similarity index 64%
rename from cypress/integration/common/I_choose_the_following_text_as_content.js
rename to cypress/support/step_definitions/common/I_choose_the_following_text_as_content.js
index 62b5426d5..51d77d8e1 100644
--- a/cypress/integration/common/I_choose_the_following_text_as_content.js
+++ b/cypress/support/step_definitions/common/I_choose_the_following_text_as_content.js
@@ -1,9 +1,9 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
-When("I choose the following text as content:", async text => {
+When("I choose the following text as content:", 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);
})
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_click_on_{string}.js b/cypress/support/step_definitions/common/I_click_on_{string}.js
similarity index 88%
rename from cypress/integration/common/I_click_on_{string}.js
rename to cypress/support/step_definitions/common/I_click_on_{string}.js
index 5f43eb912..9d51f27f7 100644
--- a/cypress/integration/common/I_click_on_{string}.js
+++ b/cypress/support/step_definitions/common/I_click_on_{string}.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I click on {string}", element => {
const elementSelectors = {
@@ -16,4 +16,4 @@ When("I click on {string}", element => {
cy.get(elementSelectors[element])
.click()
.wait(750);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js b/cypress/support/step_definitions/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js
similarity index 79%
rename from cypress/integration/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js
rename to cypress/support/step_definitions/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js
index f1a859bfe..66373037e 100644
--- a/cypress/integration/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js
+++ b/cypress/support/step_definitions/common/I_click_on_{string}_from_the_content_menu_in_the_user_info_box.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I click on {string} from the content menu in the user info box",
button => {
@@ -9,4 +9,4 @@ When("I click on {string} from the content menu in the user info box",
force: true
});
}
-);
\ No newline at end of file
+);
diff --git a/cypress/integration/Admin.DonationInfo/I_click_the_checkbox_show_donations_progress_bar_and_save.js b/cypress/support/step_definitions/common/I_click_the_checkbox_show_donations_progress_bar_and_save.js
similarity index 69%
rename from cypress/integration/Admin.DonationInfo/I_click_the_checkbox_show_donations_progress_bar_and_save.js
rename to cypress/support/step_definitions/common/I_click_the_checkbox_show_donations_progress_bar_and_save.js
index b4289dd5e..1806af807 100644
--- a/cypress/integration/Admin.DonationInfo/I_click_the_checkbox_show_donations_progress_bar_and_save.js
+++ b/cypress/support/step_definitions/common/I_click_the_checkbox_show_donations_progress_bar_and_save.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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()
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/common/I_fill_in_my_credentials_{string}_{string}.js b/cypress/support/step_definitions/common/I_fill_in_my_credentials_{string}_{string}.js
similarity index 81%
rename from cypress/integration/common/I_fill_in_my_credentials_{string}_{string}.js
rename to cypress/support/step_definitions/common/I_fill_in_my_credentials_{string}_{string}.js
index e2227f454..3c0b0d02e 100644
--- a/cypress/integration/common/I_fill_in_my_credentials_{string}_{string}.js
+++ b/cypress/support/step_definitions/common/I_fill_in_my_credentials_{string}_{string}.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I fill in my credentials {string} {string}", (email,password) => {
cy.get("input[name=email]")
@@ -9,4 +9,4 @@ When("I fill in my credentials {string} {string}", (email,password) => {
.trigger("focus")
.type('{selectall}{backspace}')
.type(password);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_follow_the_user_{string}.js b/cypress/support/step_definitions/common/I_follow_the_user_{string}.js
similarity index 60%
rename from cypress/integration/common/I_follow_the_user_{string}.js
rename to cypress/support/step_definitions/common/I_follow_the_user_{string}.js
index 56d50a5ae..3698daee8 100644
--- a/cypress/integration/common/I_follow_the_user_{string}.js
+++ b/cypress/support/step_definitions/common/I_follow_the_user_{string}.js
@@ -1,11 +1,13 @@
+import { Given } from "@badeball/cypress-cucumber-preprocessor";
+
Given("I follow the user {string}", name => {
cy.neode()
- .first("User", {name})
+ .firstOf("User", {name})
.then(followed => {
cy.neode()
- .first("User", {
+ .firstOf("User", {
name: "Peter Pan"
})
.relateTo(followed, "following");
});
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_get_removed_from_his_follower_collection.js b/cypress/support/step_definitions/common/I_get_removed_from_his_follower_collection.js
similarity index 73%
rename from cypress/integration/common/I_get_removed_from_his_follower_collection.js
rename to cypress/support/step_definitions/common/I_get_removed_from_his_follower_collection.js
index b32ca5961..7721efda0 100644
--- a/cypress/integration/common/I_get_removed_from_his_follower_collection.js
+++ b/cypress/support/step_definitions/common/I_get_removed_from_his_follower_collection.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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");
- });
\ No newline at end of file
+ });
diff --git a/cypress/integration/common/I_log_out.js b/cypress/support/step_definitions/common/I_log_out.js
similarity index 81%
rename from cypress/integration/common/I_log_out.js
rename to cypress/support/step_definitions/common/I_log_out.js
index 60185bc45..c97506535 100644
--- a/cypress/integration/common/I_log_out.js
+++ b/cypress/support/step_definitions/common/I_log_out.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I log out", () => {
cy.get(".avatar-menu").then(($menu) => {
diff --git a/cypress/integration/common/I_navigate_to_my_{string}_settings_page.js b/cypress/support/step_definitions/common/I_navigate_to_my_{string}_settings_page.js
similarity index 79%
rename from cypress/integration/common/I_navigate_to_my_{string}_settings_page.js
rename to cypress/support/step_definitions/common/I_navigate_to_my_{string}_settings_page.js
index 4d369eab2..91a3b58d9 100644
--- a/cypress/integration/common/I_navigate_to_my_{string}_settings_page.js
+++ b/cypress/support/step_definitions/common/I_navigate_to_my_{string}_settings_page.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I navigate to my {string} settings page", settingsPage => {
cy.get(".avatar-menu-trigger").click();
@@ -7,4 +7,4 @@ When("I navigate to my {string} settings page", settingsPage => {
.contains("Settings")
.click();
cy.contains(".ds-menu-item-link", settingsPage).click();
-});
\ No newline at end of file
+});
diff --git a/cypress/support/step_definitions/common/I_navigate_to_page_{string}.js b/cypress/support/step_definitions/common/I_navigate_to_page_{string}.js
new file mode 100644
index 000000000..d90cc906c
--- /dev/null
+++ b/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/cypress/support/step_definitions/common/I_refresh_the_page.js b/cypress/support/step_definitions/common/I_refresh_the_page.js
new file mode 100644
index 000000000..47e493fe4
--- /dev/null
+++ b/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/cypress/integration/common/I_search_for_{string}.js b/cypress/support/step_definitions/common/I_search_for_{string}.js
similarity index 78%
rename from cypress/integration/common/I_search_for_{string}.js
rename to cypress/support/step_definitions/common/I_search_for_{string}.js
index eaad481f7..f91959182 100644
--- a/cypress/integration/common/I_search_for_{string}.js
+++ b/cypress/support/step_definitions/common/I_search_for_{string}.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+import { When } from "@badeball/cypress-cucumber-preprocessor";
When("I search for {string}", value => {
cy.intercept({
@@ -9,4 +9,4 @@ When("I search for {string}", value => {
.focus()
.type(value);
cy.wait("@graphqlRequest");
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_see_a_toaster_with_status_{string}.js b/cypress/support/step_definitions/common/I_see_a_toaster_with_status_{string}.js
similarity index 73%
rename from cypress/integration/common/I_see_a_toaster_with_status_{string}.js
rename to cypress/support/step_definitions/common/I_see_a_toaster_with_status_{string}.js
index aa07d787c..c7bd91e29 100644
--- a/cypress/integration/common/I_see_a_toaster_with_status_{string}.js
+++ b/cypress/support/step_definitions/common/I_see_a_toaster_with_status_{string}.js
@@ -1,4 +1,4 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I see a toaster with status {string}", (status) => {
switch (status) {
@@ -6,4 +6,4 @@ Then("I see a toaster with status {string}", (status) => {
cy.get(".iziToast.iziToast-color-green").should("be.visible");
break;
}
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/common/I_see_a_toaster_with_{string}.js b/cypress/support/step_definitions/common/I_see_a_toaster_with_{string}.js
similarity index 61%
rename from cypress/integration/common/I_see_a_toaster_with_{string}.js
rename to cypress/support/step_definitions/common/I_see_a_toaster_with_{string}.js
index 1cf7da285..e1496b8de 100644
--- a/cypress/integration/common/I_see_a_toaster_with_{string}.js
+++ b/cypress/support/step_definitions/common/I_see_a_toaster_with_{string}.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I see a toaster with {string}", (title) => {
cy.get(".iziToast-message").should("contain", title);
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/common/I_see_a_{string}_message.js b/cypress/support/step_definitions/common/I_see_a_{string}_message.js
similarity index 54%
rename from cypress/integration/common/I_see_a_{string}_message.js
rename to cypress/support/step_definitions/common/I_see_a_{string}_message.js
index 6cc2cbf6b..cc8deca5f 100644
--- a/cypress/integration/common/I_see_a_{string}_message.js
+++ b/cypress/support/step_definitions/common/I_see_a_{string}_message.js
@@ -1,5 +1,5 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+import { Then } from "@badeball/cypress-cucumber-preprocessor";
Then("I see a {string} message:", (_type, message) => {
cy.contains(message);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/I_should_see_the_following_posts_in_the_select_dropdown.js b/cypress/support/step_definitions/common/I_should_see_the_following_posts_in_the_select_dropdown.js
similarity index 73%
rename from cypress/integration/common/I_should_see_the_following_posts_in_the_select_dropdown.js
rename to cypress/support/step_definitions/common/I_should_see_the_following_posts_in_the_select_dropdown.js
index 420c3376a..88e18a280 100644
--- a/cypress/integration/common/I_should_see_the_following_posts_in_the_select_dropdown.js
+++ b/cypress/support/step_definitions/common/I_should_see_the_following_posts_in_the_select_dropdown.js
@@ -1,8 +1,8 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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);
});
-});
\ No newline at end of file
+});
diff --git a/cypress/support/step_definitions/common/I_wait_for_{int}_milliseconds.js b/cypress/support/step_definitions/common/I_wait_for_{int}_milliseconds.js
new file mode 100644
index 000000000..2ed462340
--- /dev/null
+++ b/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/cypress/integration/common/the_checkbox_with_ID_{string}_should_{string}.js b/cypress/support/step_definitions/common/the_checkbox_with_ID_{string}_should_{string}.js
similarity index 62%
rename from cypress/integration/common/the_checkbox_with_ID_{string}_should_{string}.js
rename to cypress/support/step_definitions/common/the_checkbox_with_ID_{string}_should_{string}.js
index ad3f7f3cc..603524804 100644
--- a/cypress/integration/common/the_checkbox_with_ID_{string}_should_{string}.js
+++ b/cypress/support/step_definitions/common/the_checkbox_with_ID_{string}_should_{string}.js
@@ -1,4 +1,4 @@
-import { When } from "cypress-cucumber-preprocessor/steps";
+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/cypress/integration/common/the_first_post_on_the_newsfeed_has_the_title.js b/cypress/support/step_definitions/common/the_first_post_on_the_newsfeed_has_the_title.js
similarity index 65%
rename from cypress/integration/common/the_first_post_on_the_newsfeed_has_the_title.js
rename to cypress/support/step_definitions/common/the_first_post_on_the_newsfeed_has_the_title.js
index afe370e90..ba98a7a8e 100644
--- a/cypress/integration/common/the_first_post_on_the_newsfeed_has_the_title.js
+++ b/cypress/support/step_definitions/common/the_first_post_on_the_newsfeed_has_the_title.js
@@ -1,6 +1,6 @@
-import { Then } from "cypress-cucumber-preprocessor/steps";
+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);
-});
\ No newline at end of file
+});
diff --git a/cypress/integration/common/the_following_{string}_are_in_the_database.js b/cypress/support/step_definitions/common/the_following_{string}_are_in_the_database.js
similarity index 93%
rename from cypress/integration/common/the_following_{string}_are_in_the_database.js
rename to cypress/support/step_definitions/common/the_following_{string}_are_in_the_database.js
index e03a705f4..8e41afa2a 100644
--- a/cypress/integration/common/the_following_{string}_are_in_the_database.js
+++ b/cypress/support/step_definitions/common/the_following_{string}_are_in_the_database.js
@@ -1,4 +1,4 @@
-import { Given } from "cypress-cucumber-preprocessor/steps";
+import { Given } from "@badeball/cypress-cucumber-preprocessor";
Given("the following {string} are in the database:", (table,data) => {
switch(table){
@@ -37,4 +37,4 @@ Given("the following {string} are in the database:", (table,data) => {
});
break
}
-})
\ No newline at end of file
+})
diff --git a/cypress/integration/common/{string}_wrote_a_post_{string}.js b/cypress/support/step_definitions/common/{string}_wrote_a_post_{string}.js
similarity index 68%
rename from cypress/integration/common/{string}_wrote_a_post_{string}.js
rename to cypress/support/step_definitions/common/{string}_wrote_a_post_{string}.js
index 42ac98028..0da055951 100644
--- a/cypress/integration/common/{string}_wrote_a_post_{string}.js
+++ b/cypress/support/step_definitions/common/{string}_wrote_a_post_{string}.js
@@ -1,4 +1,4 @@
-import { Given } from "cypress-cucumber-preprocessor/steps";
+import { Given } from "@badeball/cypress-cucumber-preprocessor";
Given('{string} wrote a post {string}', (author, title) => {
cy.factory()
@@ -7,4 +7,4 @@ Given('{string} wrote a post {string}', (author, title) => {
}, {
authorId: author,
});
-});
\ No newline at end of file
+});
diff --git a/deployment/README.deployment.md b/deployment/README.deployment.md
deleted file mode 100644
index 5335c11ad..000000000
--- a/deployment/README.deployment.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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 !!!
diff --git a/deployment/README.md b/deployment/README.md
index 030eb8a44..93d3fb86c 100644
--- a/deployment/README.md
+++ b/deployment/README.md
@@ -6,11 +6,11 @@
[](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).
+The forked original repository is [stage.ocelot.social](https://github.com/Ocelot-Social-Community/stage.ocelot.social).
-
+
@@ -47,7 +47,8 @@ Since all deployment methods described here depend on [Docker](https://docker.co
The next step is:
-- [Configure And Branding](/branding/README.md)
+- [Set Environment Variables and Configurations](./deployment-values.md)
+- [Configure And Branding](./configurations/stage.ocelot.social/branding/README.md)
### Optional: Locally Testing Configuration And Branding
@@ -99,7 +100,7 @@ See the login details and browser addresses above.
### Deployment
-Afterwards you can [deploy](/deployment/README.md) it on your server:
+Afterwards you can [deploy](/deployment/deployment.md) it on your server:
- [Kubernetes with Helm](/deployment/kubernetes/README.md)
diff --git a/deployment/TODO-next-update.md b/deployment/TODO-next-update.md
index 769fe4d67..591ce899f 100644
--- a/deployment/TODO-next-update.md
+++ b/deployment/TODO-next-update.md
@@ -1,8 +1,21 @@
# Todo For Next Update
-When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings:
+When you introduce a new version and branding and deploy it on your network, you need to consider the following changes and actions:
-## Version >= 2.4.0 with 'ocelotDockerVersionTag' 2.4.0-XXX
+## Version >= 3.3.0 with 'ocelotDockerVersionTag' 3.3.0-XXX
+
+- We have the new option to configure DKIM for sent e-mails in environment variables (`.env` or `values.yaml`), see [deployment-values.md](deployment-values.md):
+ - `SMTP_DKIM_DOMAINNAME=`
+ - `SMTP_DKIM_KEYSELECTOR=`
+ - `SMTP_DKIM_PRIVATKEY=`
+
+## 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
diff --git a/deployment/configurations/stage.ocelot.social b/deployment/configurations/stage.ocelot.social
index 540bd503b..fdc2e52fa 160000
--- a/deployment/configurations/stage.ocelot.social
+++ b/deployment/configurations/stage.ocelot.social
@@ -1 +1 @@
-Subproject commit 540bd503b9401c1608ccda77bdd23fe47ba008fb
+Subproject commit fdc2e52fa444b300e1c4736600bc0e9ae3314222
diff --git a/deployment/deployment-values.md b/deployment/deployment-values.md
new file mode 100644
index 000000000..300a056dd
--- /dev/null
+++ b/deployment/deployment-values.md
@@ -0,0 +1,38 @@
+# Deployment Values
+
+For each deployment, you need to set the environment variables and configurations.
+Here is some specific information on how to set the values.
+
+## E-Mails
+
+You need to set environment variables to send registration and invitation information or notifications to users, for example.
+
+### SPF and DKIM
+
+More and more e-mail providers require settings for authorization and verification of e-mail senders.
+
+### SPF
+
+Sometimes it is enough to create an SPF record in your DNS.
+
+### DKIM
+
+However, if you need DKIM authorization and verification, you must set the appropriate environment variables:
+
+```bash
+SMTP_DKIM_DOMAINNAME=
+SMTP_DKIM_KEYSELECTOR=2017
+SMTP_DKIM_PRIVATKEY="-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----\n"
+```
+
+You can find out how DKIM works here:
+
+
+
+To create the private and public DKIM key, see here:
+
+
+
+Information about the required PEM format can be found here:
+
+
diff --git a/deployment/deployment.md b/deployment/deployment.md
new file mode 100644
index 000000000..f085b48d0
--- /dev/null
+++ b/deployment/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/deployment/docker-compose.yml b/deployment/docker-compose.yml
index a0dda4dc0..5236a7025 100644
--- a/deployment/docker-compose.yml
+++ b/deployment/docker-compose.yml
@@ -65,10 +65,10 @@ services:
backend:
image: ocelotsocialnetwork/backend-branded:local-${CONFIGURATION}
- container_name: backend
+ container_name: backend-branded
build:
dockerfile: src/docker/backend.Dockerfile
- target: branded-branded
+ target: branded
context: .
args:
- CONFIGURATION=$CONFIGURATION
@@ -142,19 +142,35 @@ services:
- 3001:80
neo4j:
+ # Neo4j v3.5.14-community
+ # image: wollehuss/neo4j-community-branded:latest
+ # Neo4j 4.4-community
image: ocelotsocialnetwork/neo4j-community:latest
- container_name: neo4j
+ container_name: neo4j-branded
networks:
- test-network
+ ports:
+ - 7687:7687
+ # only for development
+ # - 7474:7474
+ - 7474:7474
volumes:
- neo4j_data:/data
environment:
+ # settings reference: https://neo4j.com/docs/operations-manual/4.4/docker/ref-settings/
+ # TODO: This sounds scary for a production environment
- NEO4J_AUTH=none
- NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.*
- - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
- ports:
- - 7687:7687
- - 7474:7474
+ - NEO4J_dbms_allow__format__migration=true
+ - NEO4J_dbms_allow__upgrade=true
+ # TODO: clarify if that is the only thing needed to unlock the Enterprise version
+ # - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
+ # 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
+ # bring the database in offline mode to export or load dumps
+ # command: ["tail", "-f", "/dev/null"]
mailserver:
image: djfarrelly/maildev
diff --git a/deployment/scripts/branded-images.build.sh b/deployment/scripts/branded-images.build.sh
index bb86b29a6..fa9da67d1 100755
--- a/deployment/scripts/branded-images.build.sh
+++ b/deployment/scripts/branded-images.build.sh
@@ -16,6 +16,13 @@ if [ -z ${CONFIGURATION} ]; then
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")}
@@ -29,11 +36,11 @@ BUILD_COMMIT=${GITHUB_SHA:-"0000000"}
# backend
docker build --target branded \
- -t "${DOCKERHUB_ORGANISATION}/backend-branded:latest" \
- -t "${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION}" \
- -t "${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION_BUILD}" \
- -t "${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION_BASE}" \
- -t "${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION}" \
+ -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" \
@@ -42,11 +49,11 @@ docker build --target branded \
# webapp
docker build --target branded \
- -t "${DOCKERHUB_ORGANISATION}/webapp-branded:latest" \
- -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION}" \
- -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION_BUILD}" \
- -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION_BASE}" \
- -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION}" \
+ -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" \
@@ -55,11 +62,11 @@ docker build --target branded \
# mainteance
docker build --target branded \
- -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:latest" \
- -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION}" \
- -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION_BUILD}" \
- -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION_BASE}" \
- -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" \
+ -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" \
diff --git a/deployment/scripts/branded-images.upload.sh b/deployment/scripts/branded-images.upload.sh
index 0d3fdb6d6..83e27496b 100755
--- a/deployment/scripts/branded-images.upload.sh
+++ b/deployment/scripts/branded-images.upload.sh
@@ -10,6 +10,13 @@
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")}
@@ -23,22 +30,22 @@ BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION_BUILD}
echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin
# push backend images
-docker push ${DOCKERHUB_ORGANISATION}/backend-branded:latest
-docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION}
-docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION_BUILD}
-docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION_BASE}
-docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION}
+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-branded:latest
-docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION}
-docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION_BUILD}
-docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION_BASE}
-docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION}
+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-branded:latest
-docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION}
-docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION_BUILD}
-docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION_BASE}
-docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION}
\ No newline at end of file
+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/deployment/scripts/cluster.backup.sh b/deployment/scripts/cluster.backup.sh
index 22be2869b..64ea2a756 100755
--- a/deployment/scripts/cluster.backup.sh
+++ b/deployment/scripts/cluster.backup.sh
@@ -25,7 +25,7 @@ ${SCRIPT_DIR}/cluster.neo4j.sh offline-mode
# 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
+ -- neo4j-admin dump --database=graph.db --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
diff --git a/deployment/scripts/cluster.reseed.sh b/deployment/scripts/cluster.reseed.sh
index 9aba0a353..7bd44153b 100755
--- a/deployment/scripts/cluster.reseed.sh
+++ b/deployment/scripts/cluster.reseed.sh
@@ -15,4 +15,4 @@ echo "Using 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 dist/db/clean.js && node --experimental-repl-await dist/db/seed.js"
\ No newline at end of file
+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/deployment/src/docker/backend.Dockerfile b/deployment/src/docker/backend.Dockerfile
index 6d458c9d7..a0b6e4ed4 100644
--- a/deployment/src/docker/backend.Dockerfile
+++ b/deployment/src/docker/backend.Dockerfile
@@ -12,9 +12,9 @@ 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.js src/config/
-COPY configurations/${CONFIGURATION}/branding/constants/logos.js src/config/
-COPY configurations/${CONFIGURATION}/branding/constants/metadata.js src/config/
+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/
##################################################################################
@@ -34,11 +34,11 @@ 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}/dist ./dist
+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 ./public/providers.json
+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
diff --git a/deployment/src/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile
index b699e7f20..95501252c 100644
--- a/deployment/src/docker/maintenance.Dockerfile
+++ b/deployment/src/docker/maintenance.Dockerfile
@@ -14,6 +14,7 @@ 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/
diff --git a/deployment/src/docker/webapp.Dockerfile b/deployment/src/docker/webapp.Dockerfile
index f0c75e392..d811219c3 100644
--- a/deployment/src/docker/webapp.Dockerfile
+++ b/deployment/src/docker/webapp.Dockerfile
@@ -14,6 +14,7 @@ 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/
diff --git a/deployment/src/kubernetes/Backup.md b/deployment/src/kubernetes/Backup.md
index 227b5765f..34011a512 100644
--- a/deployment/src/kubernetes/Backup.md
+++ b/deployment/src/kubernetes/Backup.md
@@ -137,7 +137,7 @@ $ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j
# 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
+neo4j% neo4j-admin dump --database=graph.db --to=/var/lib/neo4j/$(date +%F)-neo4j-dump
# exit bash
neo4j% exit
diff --git a/deployment/src/kubernetes/README.md b/deployment/src/kubernetes/README.md
index 0f7ecd20f..126c37e9c 100644
--- a/deployment/src/kubernetes/README.md
+++ b/deployment/src/kubernetes/README.md
@@ -293,7 +293,7 @@ $ kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s
$ 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 dist/db/clean.js && node --experimental-repl-await dist/db/seed.js"
+$ 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/deployment/src/kubernetes/templates/backend/ConfigMap.yml b/deployment/src/kubernetes/templates/backend/ConfigMap.yml
index 1222b0da0..a421fab41 100644
--- a/deployment/src/kubernetes/templates/backend/ConfigMap.yml
+++ b/deployment/src/kubernetes/templates/backend/ConfigMap.yml
@@ -21,6 +21,8 @@ data:
SMTP_PORT: "{{ .Values.BACKEND.SMTP_PORT }}"
SMTP_IGNORE_TLS: "{{ .Values.BACKEND.SMTP_IGNORE_TLS }}"
SMTP_SECURE: "{{ .Values.BACKEND.SMTP_SECURE }}"
+ SMTP_DKIM_DOMAINNAME: "{{ .Values.BACKEND.SMTP_DKIM_DOMAINNAME }}"
+ SMTP_DKIM_KEYSELECTOR: "{{ .Values.BACKEND.SMTP_DKIM_KEYSELECTOR }}"
GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000"
NEO4J_URI: "bolt://{{ .Release.Name }}-neo4j:7687"
#REDIS_DOMAIN: ---toBeSet(IP)---
diff --git a/deployment/src/kubernetes/templates/backend/Deployment.yaml b/deployment/src/kubernetes/templates/backend/Deployment.yaml
index f475a0173..4d0f66dbc 100644
--- a/deployment/src/kubernetes/templates/backend/Deployment.yaml
+++ b/deployment/src/kubernetes/templates/backend/Deployment.yaml
@@ -39,6 +39,11 @@ spec:
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
diff --git a/deployment/src/kubernetes/templates/backend/Secret.yaml b/deployment/src/kubernetes/templates/backend/Secret.yaml
index 512505694..605a92234 100644
--- a/deployment/src/kubernetes/templates/backend/Secret.yaml
+++ b/deployment/src/kubernetes/templates/backend/Secret.yaml
@@ -16,6 +16,7 @@ stringData:
PRIVATE_KEY_PASSPHRASE: "{{ .Values.BACKEND.PRIVATE_KEY_PASSPHRASE }}"
SMTP_USERNAME: "{{ .Values.BACKEND.SMTP_USERNAME }}"
SMTP_PASSWORD: "{{ .Values.BACKEND.SMTP_PASSWORD }}"
+ SMTP_DKIM_PRIVATKEY: "{{ .Values.BACKEND.SMTP_DKIM_PRIVATKEY }}"
#NEO4J_USERNAME: ""
#NEO4J_PASSWORD: ""
#REDIS_PASSWORD: ---toBeSet---
diff --git a/deployment/src/kubernetes/templates/maintenance/Deployment.yaml b/deployment/src/kubernetes/templates/maintenance/Deployment.yaml
index fd1aa311a..ec37552d1 100644
--- a/deployment/src/kubernetes/templates/maintenance/Deployment.yaml
+++ b/deployment/src/kubernetes/templates/maintenance/Deployment.yaml
@@ -34,6 +34,11 @@ spec:
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 }}
diff --git a/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml
index 9f0aa4bee..f71f11285 100644
--- a/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml
+++ b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml
@@ -18,4 +18,6 @@ data:
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/deployment/src/kubernetes/templates/webapp/Deployment.yaml b/deployment/src/kubernetes/templates/webapp/Deployment.yaml
index a334738ec..41221185c 100644
--- a/deployment/src/kubernetes/templates/webapp/Deployment.yaml
+++ b/deployment/src/kubernetes/templates/webapp/Deployment.yaml
@@ -40,5 +40,10 @@ spec:
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/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml
similarity index 100%
rename from deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml
rename to deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml
diff --git a/docker-compose.yml b/docker-compose.yml
index aeb26e4fd..78cee69b3 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -108,13 +108,18 @@ services:
volumes:
- neo4j_data:/data
environment:
+ # settings reference: https://neo4j.com/docs/operations-manual/4.4/docker/ref-settings/
# 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
+ # bring the database in offline mode to export or load dumps
+ # command: ["tail", "-f", "/dev/null"]
networks:
external-net:
diff --git a/neo4j/Dockerfile b/neo4j/Dockerfile
index dc5a912f0..89c45ff66 100644
--- a/neo4j/Dockerfile
+++ b/neo4j/Dockerfile
@@ -1,7 +1,7 @@
##################################################################################
# COMMUNITY ######################################################################
##################################################################################
-FROM amd64/neo4j:3.5.14 as 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
@@ -16,11 +16,11 @@ 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.name="ocelot.social:neo4j"
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-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/neo4j"
LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}"
LABEL org.label-schema.vendor="ocelot.social Community"
LABEL org.label-schema.version="${BUILD_VERSION}"
@@ -31,15 +31,15 @@ LABEL maintainer="devops@ocelot.social"
## 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/3.5.0.4/apoc-3.5.0.4-all.jar -P plugins/
+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:3.5.14-enterprise as 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/3.5.0.4/apoc-3.5.0.4-all.jar -P plugins/
\ No newline at end of file
+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/neo4j/README.md b/neo4j/README.md
index 1ea625d89..dcf5714ea 100644
--- a/neo4j/README.md
+++ b/neo4j/README.md
@@ -51,6 +51,48 @@ in `backend/.env`.
Start Neo4J and confirm the database is running at [http://localhost:7474](http://localhost:7474).
+## Operations on Neo4j
+
+### Docker or Docker Compose
+
+- we need to set `command: ["tail", "-f", "/dev/null"]` in the Neo4j block of `docker-compose.yml` on top level so the Neo4j database is in maintenance mode
+
+### Create Neo4j Dump
+
+To create a dump in Neo4j running in a Docker container:
+
+- set the database to maintenance mode, see above
+- entering the following commands:
+
+```bash
+# connect to the Docker containers Neo4j terminal
+$ docker exec -it neo4j bash
+# generate Dump
+neo4j% neo4j-admin dump --database=graph.db --to=/var/lib/neo4j/$(date +%F)-neo4j-dump
+# exit bash
+neo4j% exit
+# copy the dump out of the running Docker container
+$ docker cp :/var/lib/neo4j/neo4j-dump /$(date +%F)-neo4j-dump
+```
+
+### Import Neo4j Dump
+
+To import a dump into Neo4j running in a Docker container:
+
+- set the database to maintenance mode, see above
+- entering the following commands:
+
+```bash
+# copy the dump into the running Docker container
+$ docker cp /neo4j-dump :/var/lib/neo4j/$(date +%F)-neo4j-dump
+# connect to the Docker containers Neo4j terminal
+$ docker exec -it neo4j bash
+# to load the dump into the database we need the following command in this terminal
+neo4j% neo4j-admin load --expand-commands --database=graph.db --from /var/lib/neo4j/$(date +%F)-neo4j-dump --force
+# leave the terminal by entering
+neo4j% exit
+```
+
## Commands
Here we describe some rarely used Cypher commands for Neo4j that are needed from time to time:
diff --git a/package.json b/package.json
index 7bcdce3a8..90042bf3c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ocelot-social",
- "version": "2.5.0",
+ "version": "3.1.2",
"description": "Free and open source software program code available to run social networks.",
"author": "ocelot.social Community",
"license": "MIT",
@@ -10,46 +10,58 @@
"url": "https://github.com/Ocelot-Social-Community/Ocelot-Social.git"
},
"cypress-cucumber-preprocessor": {
- "nonGlobalStepDefinitions": true
+ "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 --browser electron --config-file ./cypress/cypress.json",
- "cypress:open": "cypress open --browser electron --config-file ./cypress/cypress.json",
+ "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.9.0",
- "@babel/preset-env": "^7.12.7",
- "@babel/register": "^7.12.10",
- "@faker-js/faker": "5.1.0",
+ "@babel/core": "^7.22.9",
+ "@babel/preset-env": "^7.22.9",
+ "@babel/register": "^7.22.15",
+ "@badeball/cypress-cucumber-preprocessor": "^18.0.6",
+ "@cypress/browserify-preprocessor": "^3.0.2",
+ "@faker-js/faker": "8.1.0",
"auto-changelog": "^2.3.0",
"bcryptjs": "^2.4.3",
- "codecov": "^3.8.2",
"cross-env": "^7.0.3",
"cucumber": "^6.0.5",
- "cypress": "^7.0.1",
- "cypress-cucumber-preprocessor": "^2.2.1",
- "cypress-file-upload": "^3.5.3",
+ "cypress": "^13.3.1",
+ "cypress-network-idle": "^1.14.2",
"date-fns": "^2.25.0",
- "dotenv": "^8.2.0",
- "expect": "^25.3.0",
+ "dotenv": "^16.3.1",
+ "expect": "^29.6.4",
"graphql-request": "^2.0.0",
"import": "^0.0.6",
- "jsonwebtoken": "^8.5.1",
+ "jsonwebtoken": "^9.0.2",
"mock-socket": "^9.0.3",
+ "multiple-cucumber-html-reporter": "^3.4.0",
"neo4j-driver": "^4.3.4",
"neode": "^0.4.8",
- "npm-run-all": "^4.1.5",
"rosie": "^2.1.0",
- "slug": "^6.0.0"
+ "slug": "^8.2.3",
+ "wait-on": "^7.0.1"
},
"resolutions": {
"set-value": "^2.0.1",
"nan": "2.17.0"
- },
- "dependencies": {}
+ }
}
diff --git a/webapp/.eslintignore b/webapp/.eslintignore
index be90fc8e3..a90a66efa 100644
--- a/webapp/.eslintignore
+++ b/webapp/.eslintignore
@@ -1,5 +1,5 @@
node_modules
-build
+dist
.nuxt
styleguide/
**/*.min.js
diff --git a/webapp/.nvmrc b/webapp/.nvmrc
index cb77acbfe..58b8c2a00 100644
--- a/webapp/.nvmrc
+++ b/webapp/.nvmrc
@@ -1 +1 @@
-v19.4.0
\ No newline at end of file
+v20.2.0
\ No newline at end of file
diff --git a/webapp/Dockerfile b/webapp/Dockerfile
index 7952d02c1..c58fec40c 100644
--- a/webapp/Dockerfile
+++ b/webapp/Dockerfile
@@ -1,7 +1,7 @@
##################################################################################
# BASE (Is pushed to DockerHub for rebranding) ###################################
##################################################################################
-FROM node:19.4.0-alpine3.17 as base
+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
@@ -22,11 +22,11 @@ ENV PORT="3000"
# Labels
LABEL org.label-schema.build-date="${BUILD_DATE}"
-LABEL org.label-schema.name="ocelot.social:backend"
+LABEL org.label-schema.name="ocelot.social:webapp"
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-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/webapp"
LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}"
LABEL org.label-schema.vendor="ocelot.social Community"
LABEL org.label-schema.version="${BUILD_VERSION}"
diff --git a/webapp/Dockerfile.maintenance b/webapp/Dockerfile.maintenance
index e148da555..7074bd05a 100644
--- a/webapp/Dockerfile.maintenance
+++ b/webapp/Dockerfile.maintenance
@@ -1,7 +1,7 @@
##################################################################################
# BASE ###########################################################################
##################################################################################
-FROM node:19.4.0-alpine3.17 as base
+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
@@ -22,11 +22,11 @@ ENV PORT="3000"
# Labels
LABEL org.label-schema.build-date="${BUILD_DATE}"
-LABEL org.label-schema.name="ocelot.social:backend"
+LABEL org.label-schema.name="ocelot.social:maintenance"
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-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/webapp"
LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}"
LABEL org.label-schema.vendor="ocelot.social Community"
LABEL org.label-schema.version="${BUILD_VERSION}"
diff --git a/webapp/assets/_new/icons/svgs/align-center.svg b/webapp/assets/_new/icons/svgs/align-center.svg
new file mode 100755
index 000000000..4232dff91
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/align-center.svg
@@ -0,0 +1,5 @@
+
+
+align-center
+
+
diff --git a/webapp/assets/_new/icons/svgs/align-justify.svg b/webapp/assets/_new/icons/svgs/align-justify.svg
new file mode 100755
index 000000000..ce82c7f0a
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/align-justify.svg
@@ -0,0 +1,5 @@
+
+
+align-justify
+
+
diff --git a/webapp/assets/_new/icons/svgs/align-left.svg b/webapp/assets/_new/icons/svgs/align-left.svg
new file mode 100755
index 000000000..c76e93dc9
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/align-left.svg
@@ -0,0 +1,5 @@
+
+
+align-left
+
+
diff --git a/webapp/assets/_new/icons/svgs/align-right.svg b/webapp/assets/_new/icons/svgs/align-right.svg
new file mode 100755
index 000000000..24972ed83
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/align-right.svg
@@ -0,0 +1,5 @@
+
+
+align-right
+
+
diff --git a/webapp/assets/_new/icons/svgs/angle-left.svg b/webapp/assets/_new/icons/svgs/angle-left.svg
new file mode 100755
index 000000000..826dd8e34
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/angle-left.svg
@@ -0,0 +1,5 @@
+
+
+angle-left
+
+
diff --git a/webapp/assets/_new/icons/svgs/angle-right.svg b/webapp/assets/_new/icons/svgs/angle-right.svg
new file mode 100755
index 000000000..1df45a590
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/angle-right.svg
@@ -0,0 +1,5 @@
+
+
+angle-right
+
+
diff --git a/webapp/assets/_new/icons/svgs/archive.svg b/webapp/assets/_new/icons/svgs/archive.svg
new file mode 100755
index 000000000..878713822
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/archive.svg
@@ -0,0 +1,5 @@
+
+
+archive
+
+
diff --git a/webapp/assets/_new/icons/svgs/arrow-up.svg b/webapp/assets/_new/icons/svgs/arrow-up.svg
new file mode 100755
index 000000000..f48c186c0
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/arrow-up.svg
@@ -0,0 +1,5 @@
+
+
+arrow-up
+
+
diff --git a/webapp/assets/_new/icons/svgs/bar-chart.svg b/webapp/assets/_new/icons/svgs/bar-chart.svg
new file mode 100755
index 000000000..0c853e737
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/bar-chart.svg
@@ -0,0 +1,5 @@
+
+
+bar-chart
+
+
diff --git a/webapp/assets/_new/icons/svgs/book.svg b/webapp/assets/_new/icons/svgs/book.svg
new file mode 100644
index 000000000..305e367ac
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/book.svg
@@ -0,0 +1,5 @@
+
+
+book
+
+
diff --git a/webapp/assets/_new/icons/svgs/briefcase.svg b/webapp/assets/_new/icons/svgs/briefcase.svg
new file mode 100755
index 000000000..c0f6552a0
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/briefcase.svg
@@ -0,0 +1,5 @@
+
+
+briefcase
+
+
diff --git a/webapp/assets/_new/icons/svgs/bug.svg b/webapp/assets/_new/icons/svgs/bug.svg
new file mode 100755
index 000000000..66374d8bc
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/bug.svg
@@ -0,0 +1,5 @@
+
+
+bug
+
+
diff --git a/webapp/assets/_new/icons/svgs/calculator.svg b/webapp/assets/_new/icons/svgs/calculator.svg
new file mode 100755
index 000000000..657b19919
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/calculator.svg
@@ -0,0 +1,5 @@
+
+
+calculator
+
+
diff --git a/webapp/assets/_new/icons/svgs/calendar.svg b/webapp/assets/_new/icons/svgs/calendar.svg
new file mode 100644
index 000000000..5a67a8299
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/calendar.svg
@@ -0,0 +1,5 @@
+
+
+calendar
+
+
diff --git a/webapp/assets/_new/icons/svgs/camera.svg b/webapp/assets/_new/icons/svgs/camera.svg
new file mode 100755
index 000000000..793620544
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/camera.svg
@@ -0,0 +1,5 @@
+
+
+camera
+
+
diff --git a/webapp/assets/_new/icons/svgs/cart-plus.svg b/webapp/assets/_new/icons/svgs/cart-plus.svg
new file mode 100755
index 000000000..84ea385bd
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cart-plus.svg
@@ -0,0 +1,5 @@
+
+
+cart-plus
+
+
diff --git a/webapp/assets/_new/icons/svgs/certificate.svg b/webapp/assets/_new/icons/svgs/certificate.svg
new file mode 100755
index 000000000..341b4af3e
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/certificate.svg
@@ -0,0 +1,5 @@
+
+
+certificate
+
+
diff --git a/webapp/assets/_new/icons/svgs/chain-broken.svg b/webapp/assets/_new/icons/svgs/chain-broken.svg
new file mode 100755
index 000000000..4ba13f49c
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/chain-broken.svg
@@ -0,0 +1,5 @@
+
+
+chain-broken
+
+
diff --git a/webapp/assets/_new/icons/svgs/chain.svg b/webapp/assets/_new/icons/svgs/chain.svg
new file mode 100755
index 000000000..9d390e126
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/chain.svg
@@ -0,0 +1,5 @@
+
+
+chain
+
+
diff --git a/webapp/assets/_new/icons/svgs/chat-bubble.svg b/webapp/assets/_new/icons/svgs/chat-bubble.svg
new file mode 100644
index 000000000..377b52f2f
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/chat-bubble.svg
@@ -0,0 +1,4 @@
+
+chat-bubble
+
+
\ No newline at end of file
diff --git a/webapp/assets/_new/icons/svgs/cloud-download.svg b/webapp/assets/_new/icons/svgs/cloud-download.svg
new file mode 100755
index 000000000..fcc46456b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cloud-download.svg
@@ -0,0 +1,5 @@
+
+
+cloud-download
+
+
diff --git a/webapp/assets/_new/icons/svgs/cloud-upload.svg b/webapp/assets/_new/icons/svgs/cloud-upload.svg
new file mode 100755
index 000000000..8a0c486b2
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cloud-upload.svg
@@ -0,0 +1,5 @@
+
+
+cloud-upload
+
+
diff --git a/webapp/assets/_new/icons/svgs/cloud.svg b/webapp/assets/_new/icons/svgs/cloud.svg
new file mode 100755
index 000000000..7ee840e92
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cloud.svg
@@ -0,0 +1,5 @@
+
+
+cloud
+
+
diff --git a/webapp/assets/_new/icons/svgs/code.svg b/webapp/assets/_new/icons/svgs/code.svg
new file mode 100755
index 000000000..2581fa884
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/code.svg
@@ -0,0 +1,5 @@
+
+
+code
+
+
diff --git a/webapp/assets/_new/icons/svgs/coffee.svg b/webapp/assets/_new/icons/svgs/coffee.svg
new file mode 100755
index 000000000..302150d0a
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/coffee.svg
@@ -0,0 +1,5 @@
+
+
+coffee
+
+
diff --git a/webapp/assets/_new/icons/svgs/columns.svg b/webapp/assets/_new/icons/svgs/columns.svg
new file mode 100755
index 000000000..f77576ed4
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/columns.svg
@@ -0,0 +1,5 @@
+
+
+columns
+
+
diff --git a/webapp/assets/_new/icons/svgs/compass.svg b/webapp/assets/_new/icons/svgs/compass.svg
new file mode 100755
index 000000000..935cb5791
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/compass.svg
@@ -0,0 +1,5 @@
+
+
+compass
+
+
diff --git a/webapp/assets/_new/icons/svgs/credit-card.svg b/webapp/assets/_new/icons/svgs/credit-card.svg
new file mode 100755
index 000000000..29c1fb96f
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/credit-card.svg
@@ -0,0 +1,5 @@
+
+
+credit-card
+
+
diff --git a/webapp/assets/_new/icons/svgs/crop.svg b/webapp/assets/_new/icons/svgs/crop.svg
new file mode 100755
index 000000000..069de9d1e
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/crop.svg
@@ -0,0 +1,5 @@
+
+
+crop
+
+
diff --git a/webapp/assets/_new/icons/svgs/crosshairs.svg b/webapp/assets/_new/icons/svgs/crosshairs.svg
new file mode 100755
index 000000000..6d8b9aa04
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/crosshairs.svg
@@ -0,0 +1,5 @@
+
+
+crosshairs
+
+
diff --git a/webapp/assets/_new/icons/svgs/cube.svg b/webapp/assets/_new/icons/svgs/cube.svg
new file mode 100755
index 000000000..97fbdf121
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cube.svg
@@ -0,0 +1,5 @@
+
+
+cube
+
+
diff --git a/webapp/assets/_new/icons/svgs/cubes.svg b/webapp/assets/_new/icons/svgs/cubes.svg
new file mode 100755
index 000000000..aeb3d66d1
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cubes.svg
@@ -0,0 +1,5 @@
+
+
+cubes
+
+
diff --git a/webapp/assets/_new/icons/svgs/cut.svg b/webapp/assets/_new/icons/svgs/cut.svg
new file mode 100755
index 000000000..f04b85c3b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/cut.svg
@@ -0,0 +1,5 @@
+
+
+cut
+
+
diff --git a/webapp/assets/_new/icons/svgs/dashboard.svg b/webapp/assets/_new/icons/svgs/dashboard.svg
new file mode 100755
index 000000000..74358fd41
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/dashboard.svg
@@ -0,0 +1,5 @@
+
+
+dashboard
+
+
diff --git a/webapp/assets/_new/icons/svgs/diamond.svg b/webapp/assets/_new/icons/svgs/diamond.svg
new file mode 100755
index 000000000..5cad085d9
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/diamond.svg
@@ -0,0 +1,5 @@
+
+
+diamond
+
+
diff --git a/webapp/assets/_new/icons/svgs/exchange.svg b/webapp/assets/_new/icons/svgs/exchange.svg
new file mode 100755
index 000000000..fc8bfaa48
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/exchange.svg
@@ -0,0 +1,5 @@
+
+
+exchange
+
+
diff --git a/webapp/assets/_new/icons/svgs/exclamation-triangle.svg b/webapp/assets/_new/icons/svgs/exclamation-triangle.svg
new file mode 100755
index 000000000..aa2f7bbac
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/exclamation-triangle.svg
@@ -0,0 +1,5 @@
+
+
+exclamation-triangle
+
+
diff --git a/webapp/assets/_new/icons/svgs/expand.svg b/webapp/assets/_new/icons/svgs/expand.svg
new file mode 100755
index 000000000..dc21a7e24
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/expand.svg
@@ -0,0 +1,5 @@
+
+
+expand
+
+
diff --git a/webapp/assets/_new/icons/svgs/external-link.svg b/webapp/assets/_new/icons/svgs/external-link.svg
new file mode 100755
index 000000000..3d7f95574
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/external-link.svg
@@ -0,0 +1,5 @@
+
+
+external-link
+
+
diff --git a/webapp/assets/_new/icons/svgs/eyedropper.svg b/webapp/assets/_new/icons/svgs/eyedropper.svg
new file mode 100755
index 000000000..6cf4151ed
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/eyedropper.svg
@@ -0,0 +1,5 @@
+
+
+eyedropper
+
+
diff --git a/webapp/assets/_new/icons/svgs/facebook.svg b/webapp/assets/_new/icons/svgs/facebook.svg
new file mode 100755
index 000000000..a9e41dfb3
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/facebook.svg
@@ -0,0 +1,5 @@
+
+
+facebook
+
+
diff --git a/webapp/assets/_new/icons/svgs/female.svg b/webapp/assets/_new/icons/svgs/female.svg
new file mode 100755
index 000000000..2cbe5b470
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/female.svg
@@ -0,0 +1,5 @@
+
+
+female
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-archive.svg b/webapp/assets/_new/icons/svgs/file-archive.svg
new file mode 100755
index 000000000..94a1e7ab8
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-archive.svg
@@ -0,0 +1,5 @@
+
+
+file-archive-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-audio.svg b/webapp/assets/_new/icons/svgs/file-audio.svg
new file mode 100755
index 000000000..e253cbf94
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-audio.svg
@@ -0,0 +1,5 @@
+
+
+file-audio-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-code.svg b/webapp/assets/_new/icons/svgs/file-code.svg
new file mode 100755
index 000000000..c241a932b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-code.svg
@@ -0,0 +1,5 @@
+
+
+file-code-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-excel.svg b/webapp/assets/_new/icons/svgs/file-excel.svg
new file mode 100755
index 000000000..77a7a73b0
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-excel.svg
@@ -0,0 +1,5 @@
+
+
+file-excel-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-image.svg b/webapp/assets/_new/icons/svgs/file-image.svg
new file mode 100755
index 000000000..ba296f51b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-image.svg
@@ -0,0 +1,5 @@
+
+
+file-image-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-movie.svg b/webapp/assets/_new/icons/svgs/file-movie.svg
new file mode 100755
index 000000000..fd88fd23d
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-movie.svg
@@ -0,0 +1,5 @@
+
+
+file-movie-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-pdf.svg b/webapp/assets/_new/icons/svgs/file-pdf.svg
new file mode 100755
index 000000000..810128b55
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-pdf.svg
@@ -0,0 +1,5 @@
+
+
+file-pdf-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-photo.svg b/webapp/assets/_new/icons/svgs/file-photo.svg
new file mode 100755
index 000000000..c67616527
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-photo.svg
@@ -0,0 +1,5 @@
+
+
+file-photo-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-picture.svg b/webapp/assets/_new/icons/svgs/file-picture.svg
new file mode 100755
index 000000000..e16498317
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-picture.svg
@@ -0,0 +1,5 @@
+
+
+file-picture-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-powerpoint.svg b/webapp/assets/_new/icons/svgs/file-powerpoint.svg
new file mode 100755
index 000000000..8df8f896b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-powerpoint.svg
@@ -0,0 +1,5 @@
+
+
+file-powerpoint-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-sound.svg b/webapp/assets/_new/icons/svgs/file-sound.svg
new file mode 100755
index 000000000..cb9b5dc76
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-sound.svg
@@ -0,0 +1,5 @@
+
+
+file-sound-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-text.svg b/webapp/assets/_new/icons/svgs/file-text.svg
new file mode 100755
index 000000000..38d75ef65
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-text.svg
@@ -0,0 +1,5 @@
+
+
+file-text
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-video.svg b/webapp/assets/_new/icons/svgs/file-video.svg
new file mode 100755
index 000000000..4a6db285b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-video.svg
@@ -0,0 +1,5 @@
+
+
+file-video-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-word.svg b/webapp/assets/_new/icons/svgs/file-word.svg
new file mode 100755
index 000000000..c8447a696
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-word.svg
@@ -0,0 +1,5 @@
+
+
+file-word-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/file-zip.svg b/webapp/assets/_new/icons/svgs/file-zip.svg
new file mode 100755
index 000000000..c4eb66dd0
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/file-zip.svg
@@ -0,0 +1,5 @@
+
+
+file-zip-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/files.svg b/webapp/assets/_new/icons/svgs/files.svg
new file mode 100755
index 000000000..602a25658
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/files.svg
@@ -0,0 +1,5 @@
+
+
+files-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/film.svg b/webapp/assets/_new/icons/svgs/film.svg
new file mode 100755
index 000000000..2318d2f73
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/film.svg
@@ -0,0 +1,5 @@
+
+
+film
+
+
diff --git a/webapp/assets/_new/icons/svgs/fire.svg b/webapp/assets/_new/icons/svgs/fire.svg
new file mode 100755
index 000000000..0d579c495
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/fire.svg
@@ -0,0 +1,5 @@
+
+
+fire
+
+
diff --git a/webapp/assets/_new/icons/svgs/flask.svg b/webapp/assets/_new/icons/svgs/flask.svg
new file mode 100755
index 000000000..e1ca6bde6
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/flask.svg
@@ -0,0 +1,5 @@
+
+
+flask
+
+
diff --git a/webapp/assets/_new/icons/svgs/floppy.svg b/webapp/assets/_new/icons/svgs/floppy.svg
new file mode 100755
index 000000000..f924d3bb5
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/floppy.svg
@@ -0,0 +1,5 @@
+
+
+floppy-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/folder-open.svg b/webapp/assets/_new/icons/svgs/folder-open.svg
new file mode 100755
index 000000000..63a941b71
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/folder-open.svg
@@ -0,0 +1,5 @@
+
+
+folder-open
+
+
diff --git a/webapp/assets/_new/icons/svgs/folder.svg b/webapp/assets/_new/icons/svgs/folder.svg
new file mode 100755
index 000000000..287a37768
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/folder.svg
@@ -0,0 +1,5 @@
+
+
+folder
+
+
diff --git a/webapp/assets/_new/icons/svgs/frown.svg b/webapp/assets/_new/icons/svgs/frown.svg
new file mode 100755
index 000000000..a03906c69
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/frown.svg
@@ -0,0 +1,5 @@
+
+
+frown-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/gamepad.svg b/webapp/assets/_new/icons/svgs/gamepad.svg
new file mode 100755
index 000000000..85a2b7434
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/gamepad.svg
@@ -0,0 +1,5 @@
+
+
+gamepad
+
+
diff --git a/webapp/assets/_new/icons/svgs/gear.svg b/webapp/assets/_new/icons/svgs/gear.svg
new file mode 100755
index 000000000..f657c9494
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/gear.svg
@@ -0,0 +1,5 @@
+
+
+gear
+
+
diff --git a/webapp/assets/_new/icons/svgs/gears.svg b/webapp/assets/_new/icons/svgs/gears.svg
new file mode 100755
index 000000000..f9727888d
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/gears.svg
@@ -0,0 +1,5 @@
+
+
+gears
+
+
diff --git a/webapp/assets/_new/icons/svgs/gift.svg b/webapp/assets/_new/icons/svgs/gift.svg
new file mode 100755
index 000000000..355dc7b08
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/gift.svg
@@ -0,0 +1,5 @@
+
+
+gift
+
+
diff --git a/webapp/assets/_new/icons/svgs/github.svg b/webapp/assets/_new/icons/svgs/github.svg
new file mode 100755
index 000000000..1d61e0788
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/github.svg
@@ -0,0 +1,5 @@
+
+
+github
+
+
diff --git a/webapp/assets/_new/icons/svgs/glass.svg b/webapp/assets/_new/icons/svgs/glass.svg
new file mode 100755
index 000000000..c2a18e99f
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/glass.svg
@@ -0,0 +1,5 @@
+
+
+glass
+
+
diff --git a/webapp/assets/_new/icons/svgs/group.svg b/webapp/assets/_new/icons/svgs/group.svg
new file mode 100755
index 000000000..efb1c6184
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/group.svg
@@ -0,0 +1,5 @@
+
+
+group
+
+
diff --git a/webapp/assets/_new/icons/svgs/hand-down.svg b/webapp/assets/_new/icons/svgs/hand-down.svg
new file mode 100755
index 000000000..1a06a97fd
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/hand-down.svg
@@ -0,0 +1,5 @@
+
+
+hand-o-down
+
+
diff --git a/webapp/assets/_new/icons/svgs/hand-left.svg b/webapp/assets/_new/icons/svgs/hand-left.svg
new file mode 100755
index 000000000..49fb68314
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/hand-left.svg
@@ -0,0 +1,5 @@
+
+
+hand-o-left
+
+
diff --git a/webapp/assets/_new/icons/svgs/hand-pointer.svg b/webapp/assets/_new/icons/svgs/hand-pointer.svg
index bdd2c8fe0..e74339724 100644
--- a/webapp/assets/_new/icons/svgs/hand-pointer.svg
+++ b/webapp/assets/_new/icons/svgs/hand-pointer.svg
@@ -1,5 +1,5 @@
hand-pointer-o
-
+
diff --git a/webapp/assets/_new/icons/svgs/hand-right.svg b/webapp/assets/_new/icons/svgs/hand-right.svg
new file mode 100755
index 000000000..c165ea020
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/hand-right.svg
@@ -0,0 +1,5 @@
+
+
+hand-o-right
+
+
diff --git a/webapp/assets/_new/icons/svgs/hand-stop.svg b/webapp/assets/_new/icons/svgs/hand-stop.svg
new file mode 100755
index 000000000..dbf393138
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/hand-stop.svg
@@ -0,0 +1,5 @@
+
+
+hand-stop-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/hand-up.svg b/webapp/assets/_new/icons/svgs/hand-up.svg
new file mode 100755
index 000000000..472c8435d
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/hand-up.svg
@@ -0,0 +1,5 @@
+
+
+hand-o-up
+
+
diff --git a/webapp/assets/_new/icons/svgs/headphones.svg b/webapp/assets/_new/icons/svgs/headphones.svg
new file mode 100755
index 000000000..a197eca3a
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/headphones.svg
@@ -0,0 +1,5 @@
+
+
+headphones
+
+
diff --git a/webapp/assets/_new/icons/svgs/heart.svg b/webapp/assets/_new/icons/svgs/heart.svg
new file mode 100755
index 000000000..64f1195b1
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/heart.svg
@@ -0,0 +1,5 @@
+
+
+heart
+
+
diff --git a/webapp/assets/_new/icons/svgs/history.svg b/webapp/assets/_new/icons/svgs/history.svg
new file mode 100755
index 000000000..fd5fcc328
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/history.svg
@@ -0,0 +1,5 @@
+
+
+history
+
+
diff --git a/webapp/assets/_new/icons/svgs/hourglass.svg b/webapp/assets/_new/icons/svgs/hourglass.svg
new file mode 100755
index 000000000..e5e5ea6a1
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/hourglass.svg
@@ -0,0 +1,5 @@
+
+
+hourglass
+
+
diff --git a/webapp/assets/_new/icons/svgs/inbox.svg b/webapp/assets/_new/icons/svgs/inbox.svg
new file mode 100755
index 000000000..aba1d2eb0
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/inbox.svg
@@ -0,0 +1,5 @@
+
+
+inbox
+
+
diff --git a/webapp/assets/_new/icons/svgs/indent.svg b/webapp/assets/_new/icons/svgs/indent.svg
new file mode 100755
index 000000000..35f087427
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/indent.svg
@@ -0,0 +1,5 @@
+
+
+indent
+
+
diff --git a/webapp/assets/_new/icons/svgs/info-circle.svg b/webapp/assets/_new/icons/svgs/info-circle.svg
new file mode 100755
index 000000000..f971f5b3a
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/info-circle.svg
@@ -0,0 +1,5 @@
+
+
+info-circle
+
+
diff --git a/webapp/assets/_new/icons/svgs/keyboard.svg b/webapp/assets/_new/icons/svgs/keyboard.svg
new file mode 100755
index 000000000..cf49166d4
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/keyboard.svg
@@ -0,0 +1,5 @@
+
+
+keyboard-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/leaf.svg b/webapp/assets/_new/icons/svgs/leaf.svg
new file mode 100755
index 000000000..52b1693ba
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/leaf.svg
@@ -0,0 +1,5 @@
+
+
+leaf
+
+
diff --git a/webapp/assets/_new/icons/svgs/level-up.svg b/webapp/assets/_new/icons/svgs/level-up.svg
new file mode 100755
index 000000000..1c3c82192
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/level-up.svg
@@ -0,0 +1,5 @@
+
+
+level-up
+
+
diff --git a/webapp/assets/_new/icons/svgs/life-ring.svg b/webapp/assets/_new/icons/svgs/life-ring.svg
new file mode 100755
index 000000000..64f4aa7e8
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/life-ring.svg
@@ -0,0 +1,5 @@
+
+
+life-ring
+
+
diff --git a/webapp/assets/_new/icons/svgs/list.svg b/webapp/assets/_new/icons/svgs/list.svg
new file mode 100755
index 000000000..f07692281
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/list.svg
@@ -0,0 +1,5 @@
+
+
+list
+
+
diff --git a/webapp/assets/_new/icons/svgs/location-arrow.svg b/webapp/assets/_new/icons/svgs/location-arrow.svg
new file mode 100755
index 000000000..942a37fa5
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/location-arrow.svg
@@ -0,0 +1,5 @@
+
+
+location-arrow
+
+
diff --git a/webapp/assets/_new/icons/svgs/magnet.svg b/webapp/assets/_new/icons/svgs/magnet.svg
new file mode 100755
index 000000000..998495351
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/magnet.svg
@@ -0,0 +1,5 @@
+
+
+magnet
+
+
diff --git a/webapp/assets/_new/icons/svgs/male.svg b/webapp/assets/_new/icons/svgs/male.svg
new file mode 100755
index 000000000..5c35184b4
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/male.svg
@@ -0,0 +1,5 @@
+
+
+male
+
+
diff --git a/webapp/assets/_new/icons/svgs/map-pin.svg b/webapp/assets/_new/icons/svgs/map-pin.svg
new file mode 100755
index 000000000..dbba740b1
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/map-pin.svg
@@ -0,0 +1,5 @@
+
+
+map-pin
+
+
diff --git a/webapp/assets/_new/icons/svgs/map-signs.svg b/webapp/assets/_new/icons/svgs/map-signs.svg
new file mode 100755
index 000000000..0d46cc195
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/map-signs.svg
@@ -0,0 +1,5 @@
+
+
+map-signs
+
+
diff --git a/webapp/assets/_new/icons/svgs/map.svg b/webapp/assets/_new/icons/svgs/map.svg
new file mode 100755
index 000000000..157a29ea8
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/map.svg
@@ -0,0 +1,5 @@
+
+
+map
+
+
diff --git a/webapp/assets/_new/icons/svgs/microphone.svg b/webapp/assets/_new/icons/svgs/microphone.svg
index 121342b70..9a051cebe 100644
--- a/webapp/assets/_new/icons/svgs/microphone.svg
+++ b/webapp/assets/_new/icons/svgs/microphone.svg
@@ -1,4 +1,3 @@
-
microphone
diff --git a/webapp/assets/_new/icons/svgs/mobile-phone.svg b/webapp/assets/_new/icons/svgs/mobile-phone.svg
new file mode 100755
index 000000000..542ad25b8
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/mobile-phone.svg
@@ -0,0 +1,5 @@
+
+
+mobile-phone
+
+
diff --git a/webapp/assets/_new/icons/svgs/paperclip.svg b/webapp/assets/_new/icons/svgs/paperclip.svg
new file mode 100755
index 000000000..099453e71
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/paperclip.svg
@@ -0,0 +1,5 @@
+
+
+paperclip
+
+
diff --git a/webapp/assets/_new/icons/svgs/paste.svg b/webapp/assets/_new/icons/svgs/paste.svg
new file mode 100755
index 000000000..32084e808
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/paste.svg
@@ -0,0 +1,5 @@
+
+
+paste
+
+
diff --git a/webapp/assets/_new/icons/svgs/pause.svg b/webapp/assets/_new/icons/svgs/pause.svg
new file mode 100755
index 000000000..ce3acef04
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/pause.svg
@@ -0,0 +1,5 @@
+
+
+pause
+
+
diff --git a/webapp/assets/_new/icons/svgs/pencil.svg b/webapp/assets/_new/icons/svgs/pencil.svg
new file mode 100755
index 000000000..0c1b963f8
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/pencil.svg
@@ -0,0 +1,5 @@
+
+
+pencil
+
+
diff --git a/webapp/assets/_new/icons/svgs/phone.svg b/webapp/assets/_new/icons/svgs/phone.svg
new file mode 100755
index 000000000..413c48f16
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/phone.svg
@@ -0,0 +1,5 @@
+
+
+phone
+
+
diff --git a/webapp/assets/_new/icons/svgs/photo.svg b/webapp/assets/_new/icons/svgs/photo.svg
new file mode 100755
index 000000000..abc66b8f3
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/photo.svg
@@ -0,0 +1,5 @@
+
+
+photo
+
+
diff --git a/webapp/assets/_new/icons/svgs/pie-chart.svg b/webapp/assets/_new/icons/svgs/pie-chart.svg
new file mode 100755
index 000000000..1d942226e
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/pie-chart.svg
@@ -0,0 +1,5 @@
+
+
+pie-chart
+
+
diff --git a/webapp/assets/_new/icons/svgs/play-circle.svg b/webapp/assets/_new/icons/svgs/play-circle.svg
new file mode 100755
index 000000000..e8b842bf5
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/play-circle.svg
@@ -0,0 +1,5 @@
+
+
+play-circle
+
+
diff --git a/webapp/assets/_new/icons/svgs/play.svg b/webapp/assets/_new/icons/svgs/play.svg
new file mode 100755
index 000000000..a0b1eafa2
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/play.svg
@@ -0,0 +1,5 @@
+
+
+play
+
+
diff --git a/webapp/assets/_new/icons/svgs/power-off.svg b/webapp/assets/_new/icons/svgs/power-off.svg
new file mode 100755
index 000000000..7b362c167
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/power-off.svg
@@ -0,0 +1,5 @@
+
+
+power-off
+
+
diff --git a/webapp/assets/_new/icons/svgs/print.svg b/webapp/assets/_new/icons/svgs/print.svg
new file mode 100755
index 000000000..a9fc409e2
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/print.svg
@@ -0,0 +1,5 @@
+
+
+print
+
+
diff --git a/webapp/assets/_new/icons/svgs/recycle.svg b/webapp/assets/_new/icons/svgs/recycle.svg
new file mode 100755
index 000000000..9bbdb3ad3
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/recycle.svg
@@ -0,0 +1,5 @@
+
+
+recycle
+
+
diff --git a/webapp/assets/_new/icons/svgs/refresh.svg b/webapp/assets/_new/icons/svgs/refresh.svg
new file mode 100755
index 000000000..1995ab604
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/refresh.svg
@@ -0,0 +1,5 @@
+
+
+refresh
+
+
diff --git a/webapp/assets/_new/icons/svgs/rocket.svg b/webapp/assets/_new/icons/svgs/rocket.svg
new file mode 100755
index 000000000..f83674f15
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/rocket.svg
@@ -0,0 +1,5 @@
+
+
+rocket
+
+
diff --git a/webapp/assets/_new/icons/svgs/server.svg b/webapp/assets/_new/icons/svgs/server.svg
new file mode 100755
index 000000000..fa00771ea
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/server.svg
@@ -0,0 +1,5 @@
+
+
+server
+
+
diff --git a/webapp/assets/_new/icons/svgs/share.svg b/webapp/assets/_new/icons/svgs/share.svg
new file mode 100755
index 000000000..b2fee7622
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/share.svg
@@ -0,0 +1,5 @@
+
+
+share
+
+
diff --git a/webapp/assets/_new/icons/svgs/sort-alpha-asc.svg b/webapp/assets/_new/icons/svgs/sort-alpha-asc.svg
new file mode 100755
index 000000000..f96023d0d
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/sort-alpha-asc.svg
@@ -0,0 +1,5 @@
+
+
+sort-alpha-asc
+
+
diff --git a/webapp/assets/_new/icons/svgs/sort-alpha-desc.svg b/webapp/assets/_new/icons/svgs/sort-alpha-desc.svg
new file mode 100755
index 000000000..461e65611
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/sort-alpha-desc.svg
@@ -0,0 +1,5 @@
+
+
+sort-alpha-desc
+
+
diff --git a/webapp/assets/_new/icons/svgs/sort.svg b/webapp/assets/_new/icons/svgs/sort.svg
new file mode 100755
index 000000000..d7fc07efd
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/sort.svg
@@ -0,0 +1,5 @@
+
+
+sort
+
+
diff --git a/webapp/assets/_new/icons/svgs/spinner.svg b/webapp/assets/_new/icons/svgs/spinner.svg
new file mode 100755
index 000000000..b5d0cf71a
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/spinner.svg
@@ -0,0 +1,5 @@
+
+
+spinner
+
+
diff --git a/webapp/assets/_new/icons/svgs/star-half-o.svg b/webapp/assets/_new/icons/svgs/star-half-o.svg
new file mode 100755
index 000000000..40070bbef
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/star-half-o.svg
@@ -0,0 +1,5 @@
+
+
+star-half-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/star-o.svg b/webapp/assets/_new/icons/svgs/star-o.svg
new file mode 100755
index 000000000..3bc7af681
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/star-o.svg
@@ -0,0 +1,5 @@
+
+
+star-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/star.svg b/webapp/assets/_new/icons/svgs/star.svg
new file mode 100755
index 000000000..5b4236991
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/star.svg
@@ -0,0 +1,5 @@
+
+
+star
+
+
diff --git a/webapp/assets/_new/icons/svgs/subscript.svg b/webapp/assets/_new/icons/svgs/subscript.svg
new file mode 100755
index 000000000..07663bcc6
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/subscript.svg
@@ -0,0 +1,5 @@
+
+
+subscript
+
+
diff --git a/webapp/assets/_new/icons/svgs/sun.svg b/webapp/assets/_new/icons/svgs/sun.svg
new file mode 100755
index 000000000..bddbcebcc
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/sun.svg
@@ -0,0 +1,5 @@
+
+
+sun-o
+
+
diff --git a/webapp/assets/_new/icons/svgs/superscript.svg b/webapp/assets/_new/icons/svgs/superscript.svg
new file mode 100755
index 000000000..08938a2b5
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/superscript.svg
@@ -0,0 +1,5 @@
+
+
+superscript
+
+
diff --git a/webapp/assets/_new/icons/svgs/table.svg b/webapp/assets/_new/icons/svgs/table.svg
new file mode 100755
index 000000000..bdb7c8e7b
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/table.svg
@@ -0,0 +1,5 @@
+
+
+table
+
+
diff --git a/webapp/assets/_new/icons/svgs/tablet.svg b/webapp/assets/_new/icons/svgs/tablet.svg
new file mode 100755
index 000000000..7142d4644
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/tablet.svg
@@ -0,0 +1,5 @@
+
+
+tablet
+
+
diff --git a/webapp/assets/_new/icons/svgs/tag.svg b/webapp/assets/_new/icons/svgs/tag.svg
new file mode 100755
index 000000000..875a3be33
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/tag.svg
@@ -0,0 +1,5 @@
+
+
+tag
+
+
diff --git a/webapp/assets/_new/icons/svgs/tags.svg b/webapp/assets/_new/icons/svgs/tags.svg
new file mode 100755
index 000000000..f248cc080
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/tags.svg
@@ -0,0 +1,5 @@
+
+
+tags
+
+
diff --git a/webapp/assets/_new/icons/svgs/terminal.svg b/webapp/assets/_new/icons/svgs/terminal.svg
new file mode 100755
index 000000000..9f336dc12
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/terminal.svg
@@ -0,0 +1,5 @@
+
+
+terminal
+
+
diff --git a/webapp/assets/_new/icons/svgs/ticket.svg b/webapp/assets/_new/icons/svgs/ticket.svg
new file mode 100755
index 000000000..5e7cfb92c
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/ticket.svg
@@ -0,0 +1,5 @@
+
+
+ticket
+
+
diff --git a/webapp/assets/_new/icons/svgs/toggle-off.svg b/webapp/assets/_new/icons/svgs/toggle-off.svg
new file mode 100755
index 000000000..c69ce1b5f
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/toggle-off.svg
@@ -0,0 +1,5 @@
+
+
+toggle-off
+
+
diff --git a/webapp/assets/_new/icons/svgs/toggle-on.svg b/webapp/assets/_new/icons/svgs/toggle-on.svg
new file mode 100755
index 000000000..280c7d249
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/toggle-on.svg
@@ -0,0 +1,5 @@
+
+
+toggle-on
+
+
diff --git a/webapp/assets/_new/icons/svgs/undo.svg b/webapp/assets/_new/icons/svgs/undo.svg
new file mode 100755
index 000000000..707b60150
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/undo.svg
@@ -0,0 +1,5 @@
+
+
+undo
+
+
diff --git a/webapp/assets/_new/icons/svgs/upload.svg b/webapp/assets/_new/icons/svgs/upload.svg
new file mode 100755
index 000000000..83dfe5bcf
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/upload.svg
@@ -0,0 +1,5 @@
+
+
+upload
+
+
diff --git a/webapp/assets/_new/icons/svgs/video-camera.svg b/webapp/assets/_new/icons/svgs/video-camera.svg
new file mode 100755
index 000000000..b6a9cc0df
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/video-camera.svg
@@ -0,0 +1,5 @@
+
+
+video-camera
+
+
diff --git a/webapp/assets/_new/icons/svgs/volume-down.svg b/webapp/assets/_new/icons/svgs/volume-down.svg
new file mode 100755
index 000000000..f8b25dc25
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/volume-down.svg
@@ -0,0 +1,5 @@
+
+
+volume-down
+
+
diff --git a/webapp/assets/_new/icons/svgs/volume-off.svg b/webapp/assets/_new/icons/svgs/volume-off.svg
new file mode 100755
index 000000000..daaeb19f5
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/volume-off.svg
@@ -0,0 +1,5 @@
+
+
+volume-off
+
+
diff --git a/webapp/assets/_new/icons/svgs/volume-up.svg b/webapp/assets/_new/icons/svgs/volume-up.svg
new file mode 100755
index 000000000..03816d0d3
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/volume-up.svg
@@ -0,0 +1,5 @@
+
+
+volume-up
+
+
diff --git a/webapp/assets/_new/icons/svgs/wheelchair.svg b/webapp/assets/_new/icons/svgs/wheelchair.svg
new file mode 100755
index 000000000..3854969b8
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/wheelchair.svg
@@ -0,0 +1,5 @@
+
+
+wheelchair
+
+
diff --git a/webapp/assets/_new/icons/svgs/wifi.svg b/webapp/assets/_new/icons/svgs/wifi.svg
new file mode 100755
index 000000000..0df70f686
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/wifi.svg
@@ -0,0 +1,5 @@
+
+
+wifi
+
+
diff --git a/webapp/assets/_new/icons/svgs/youtube-play.svg b/webapp/assets/_new/icons/svgs/youtube-play.svg
new file mode 100755
index 000000000..80370a4e6
--- /dev/null
+++ b/webapp/assets/_new/icons/svgs/youtube-play.svg
@@ -0,0 +1,5 @@
+
+
+youtube-play
+
+
diff --git a/webapp/assets/_new/styles/export.scss b/webapp/assets/_new/styles/export.scss
new file mode 100644
index 000000000..e29c014e2
--- /dev/null
+++ b/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/webapp/assets/_new/styles/tokens.scss b/webapp/assets/_new/styles/tokens.scss
index 66bd03ecc..dd3a042d1 100644
--- a/webapp/assets/_new/styles/tokens.scss
+++ b/webapp/assets/_new/styles/tokens.scss
@@ -90,6 +90,9 @@ $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);
@@ -336,10 +339,12 @@ $ease-in-sharp: cubic-bezier(0.895, 0.03, 0.685, 0.22);
*/
$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;
@@ -393,3 +398,27 @@ $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/webapp/assets/styles/main.scss b/webapp/assets/styles/main.scss
index 144701f83..b726758c7 100644
--- a/webapp/assets/styles/main.scss
+++ b/webapp/assets/styles/main.scss
@@ -95,7 +95,7 @@ blockquote {
box-shadow: $box-shadow-base;
position: fixed;
width: 100%;
- z-index: 10;
+ z-index: $z-index-page-submenu;
a {
outline: none;
@@ -131,7 +131,7 @@ hr {
left: 0;
position: fixed;
background: rgba(0, 0, 0, 0.15);
- z-index: 99;
+ z-index: $z-index-overlay;
pointer-events: none;
transition: opacity 150ms ease-out;
transition-delay: 50ms;
diff --git a/webapp/components/AvatarMenu/AvatarMenu.vue b/webapp/components/AvatarMenu/AvatarMenu.vue
index 5ec031e61..977996092 100644
--- a/webapp/components/AvatarMenu/AvatarMenu.vue
+++ b/webapp/components/AvatarMenu/AvatarMenu.vue
@@ -11,7 +11,15 @@
"
@click.prevent="toggleMenu"
>
-
+
@@ -80,7 +88,7 @@ export default {
icon: 'user',
},
{
- name: this.$t('header.avatarMenu.Groups'),
+ name: this.$t('header.avatarMenu.groups'),
path: '/groups',
icon: 'users',
},
diff --git a/webapp/components/CategoriesSelect/CategoriesSelect.vue b/webapp/components/CategoriesSelect/CategoriesSelect.vue
index 4f7a555a3..91fb7704c 100644
--- a/webapp/components/CategoriesSelect/CategoriesSelect.vue
+++ b/webapp/components/CategoriesSelect/CategoriesSelect.vue
@@ -43,6 +43,14 @@ export default {
selectedCategoryIds: this.existingCategoryIds,
}
},
+ watch: {
+ existingCategoryIds() {
+ if (!this.selectedCategoryIds.length && this.existingCategoryIds.length) {
+ this.selectedCategoryIds = this.existingCategoryIds
+ this.$forceUpdate()
+ }
+ },
+ },
computed: {
selectedCount() {
return this.selectedCategoryIds.length
diff --git a/webapp/components/Chat/AddChatRoomByUserSearch.vue b/webapp/components/Chat/AddChatRoomByUserSearch.vue
new file mode 100644
index 000000000..8ab21f06f
--- /dev/null
+++ b/webapp/components/Chat/AddChatRoomByUserSearch.vue
@@ -0,0 +1,67 @@
+
+
+
+ {{ $t('chat.addRoomHeadline') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webapp/components/Chat/Chat.vue b/webapp/components/Chat/Chat.vue
new file mode 100644
index 000000000..faffa45e0
--- /dev/null
+++ b/webapp/components/Chat/Chat.vue
@@ -0,0 +1,489 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getInitialsName(selectedRoom.roomName) }}
+
+
+
+
+
+
+ {{ getInitialsName(room.roomName) }}
+
+
+
+
+
+
+
+
+
diff --git a/webapp/components/ChatNotificationMenu/ChatNotificationMenu.vue b/webapp/components/ChatNotificationMenu/ChatNotificationMenu.vue
new file mode 100644
index 000000000..dd36b965a
--- /dev/null
+++ b/webapp/components/ChatNotificationMenu/ChatNotificationMenu.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/webapp/components/CommentForm/CommentForm.vue b/webapp/components/CommentForm/CommentForm.vue
index 5f6a2420d..6d9b59de6 100644
--- a/webapp/components/CommentForm/CommentForm.vue
+++ b/webapp/components/CommentForm/CommentForm.vue
@@ -8,7 +8,6 @@
:disabled="disabled && !update"
@click="handleCancel"
data-test="cancel-button"
- danger
>
{{ $t('actions.cancel') }}
diff --git a/webapp/components/ContentMenu/ContentMenu.vue b/webapp/components/ContentMenu/ContentMenu.vue
index 60bcccf43..d723a9667 100644
--- a/webapp/components/ContentMenu/ContentMenu.vue
+++ b/webapp/components/ContentMenu/ContentMenu.vue
@@ -80,7 +80,7 @@ export default {
})
}
- if (this.isAdmin) {
+ if (this.isAdmin && !this.resource.group) {
if (!this.resource.pinnedBy) {
routes.push({
label: this.$t(`post.menu.pin`),
diff --git a/webapp/components/ContentMenu/GroupContentMenu.vue b/webapp/components/ContentMenu/GroupContentMenu.vue
index 7a7737320..1ca1b5b33 100644
--- a/webapp/components/ContentMenu/GroupContentMenu.vue
+++ b/webapp/components/ContentMenu/GroupContentMenu.vue
@@ -58,14 +58,14 @@ export default {
routes.push({
label: this.$t('group.contentMenu.visitGroupPage'),
icon: 'home',
- name: 'group-id-slug',
+ path: `/groups/${this.group.id}`,
params: { id: this.group.id, slug: this.group.slug },
})
}
if (this.group.myRole === 'owner') {
routes.push({
label: this.$t('admin.settings.name'),
- path: `/group/edit/${this.group.id}`,
+ path: `/groups/edit/${this.group.id}`,
icon: 'edit',
})
}
diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js
index ef3b47c37..9095665fc 100644
--- a/webapp/components/ContributionForm/ContributionForm.spec.js
+++ b/webapp/components/ContributionForm/ContributionForm.spec.js
@@ -1,8 +1,8 @@
import { mount } from '@vue/test-utils'
import ContributionForm from './ContributionForm.vue'
+import PostMutations from '~/graphql/PostMutations.js'
import Vuex from 'vuex'
-import PostMutations from '~/graphql/PostMutations.js'
import ImageUploader from '~/components/Uploader/ImageUploader'
import MutationObserver from 'mutation-observer'
@@ -15,6 +15,7 @@ const stubs = {
'client-only': true,
'nuxt-link': true,
'v-popover': true,
+ 'date-picker': true,
}
describe('ContributionForm.vue', () => {
@@ -45,6 +46,7 @@ describe('ContributionForm.vue', () => {
slug: 'this-is-a-title-for-a-post',
content: postContent,
contentExcerpt: postContent,
+ postType: ['Article'],
},
},
}),
@@ -106,6 +108,10 @@ describe('ContributionForm.vue', () => {
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')
@@ -142,6 +148,7 @@ describe('ContributionForm.vue', () => {
id: null,
image: null,
groupId: null,
+ postType: 'Article',
},
}
postTitleInput = wrapper.find('.ds-input')
@@ -268,6 +275,7 @@ describe('ContributionForm.vue', () => {
image: {
sensitive: false,
},
+ postType: 'Article',
},
}
})
@@ -289,5 +297,88 @@ describe('ContributionForm.vue', () => {
})
})
})
+
+ 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/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue
index 8863fbc8a..0a5eba0cd 100644
--- a/webapp/components/ContributionForm/ContributionForm.vue
+++ b/webapp/components/ContributionForm/ContributionForm.vue
@@ -1,98 +1,191 @@
-
-
-
-
-
-
-
-
-
{{ $t('contribution.inappropriatePicture') }}
-
-
- {{ $t('contribution.inappropriatePicture') }}
-
-
-
-
-
- {{ formData.title.length }}/{{ formSchema.title.max }}
-
-
-
-
- {{ contentLength }}
-
-
-
-
- {{ formData.categoryIds.length }} / 3
-
-
-
-
-
-
-
+
+
+
+
{{ $t('contribution.inappropriatePicture') }}
+
+
+ {{ $t('contribution.inappropriatePicture') }}
+
+
+
+
+
+
+ {{ formData.title.length }}/{{ formSchema.title.max }}
+
+
+
+
+ {{ contentLength }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formData.eventVenue.length }}/{{ formSchema.eventVenue.max }}
+
+
+
+
+
+
+
+
+ {{ formData.eventLocationName.length }}/{{ formSchema.eventLocationName.max }}
+
+
+
+
+
+
+
+
+ {{ $t('post.viewEvent.eventIsOnline') }}
+
+
+
+
+
+ {{ formData.categoryIds.length }} / 3
+
+
+
+
+
+
+
+
diff --git a/webapp/components/DateTimeRange/DateTimeRange.vue b/webapp/components/DateTimeRange/DateTimeRange.vue
new file mode 100644
index 000000000..de9b442c5
--- /dev/null
+++ b/webapp/components/DateTimeRange/DateTimeRange.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+ {{ getStartDateString }}
+
+
+
+ {{
+ getStartTimeString +
+ (this.endDateAsDate && isSameDayLocal ? '—' + getEndTimeString : '')
+ }}
+
+
+
+ —
+
+
+
+ {{ getEndDateString }}
+
+
+
+ {{ getEndTimeString }}
+
+
+
+
+
+
+
+
+
diff --git a/webapp/components/DonationInfo/DonationInfo.vue b/webapp/components/DonationInfo/DonationInfo.vue
index b66f33305..00b9bf584 100644
--- a/webapp/components/DonationInfo/DonationInfo.vue
+++ b/webapp/components/DonationInfo/DonationInfo.vue
@@ -47,5 +47,6 @@ export default {
display: flex;
flex: 1;
margin-bottom: $space-x-small;
+ margin-top: 16px;
}
diff --git a/webapp/components/Editor/Editor.vue b/webapp/components/Editor/Editor.vue
index cf0fd710b..8bc0a04d3 100644
--- a/webapp/components/Editor/Editor.vue
+++ b/webapp/components/Editor/Editor.vue
@@ -28,10 +28,10 @@ import { replace, build } from 'xregexp/xregexp-all.js'
import * as key from '../../constants/keycodes'
import { HASHTAG, MENTION } from '../../constants/editor'
-import defaultExtensions from './defaultExtensions.js'
-import EventHandler from './plugins/eventHandler.js'
-import Hashtag from './nodes/Hashtag.js'
-import Mention from './nodes/Mention.js'
+import defaultExtensions from './defaultExtensions'
+import EventHandler from './plugins/eventHandler'
+import Hashtag from './nodes/Hashtag'
+import Mention from './nodes/Mention'
import MenuBar from './MenuBar'
import ContextMenu from './ContextMenu'
import SuggestionList from './SuggestionList'
diff --git a/webapp/components/Editor/nodes/Mention.js b/webapp/components/Editor/nodes/Mention.js
index dad983ed6..fa1555877 100644
--- a/webapp/components/Editor/nodes/Mention.js
+++ b/webapp/components/Editor/nodes/Mention.js
@@ -17,7 +17,7 @@ export default class Mention extends TipTapMention {
'data-mention-id': node.attrs.id,
target: '_blank',
},
- `${this.options.matcher.char}${node.attrs.label}`,
+ `${this.options.matcher.char}${node.attrs.label} `,
]
},
parseDOM: [
diff --git a/webapp/components/FilterMenu/CategoriesFilter.spec.js b/webapp/components/FilterMenu/CategoriesFilter.spec.js
index 677217585..e7bf74c40 100644
--- a/webapp/components/FilterMenu/CategoriesFilter.spec.js
+++ b/webapp/components/FilterMenu/CategoriesFilter.spec.js
@@ -4,7 +4,7 @@ import CategoriesFilter from './CategoriesFilter'
const localVue = global.localVue
-let wrapper, environmentAndNatureButton, democracyAndPoliticsButton
+let wrapper, environmentAndNatureButton
describe('CategoriesFilter.vue', () => {
const mutations = {
@@ -63,18 +63,17 @@ describe('CategoriesFilter.vue', () => {
expect(allCategoriesButton.attributes().class).toContain('--filled')
})
- 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')
- })
+ // 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('.categories-filter .item-category .base-button')
- .at(0)
+ environmentAndNatureButton = wrapper.findAll('.category-filter-list .base-button').at(0)
environmentAndNatureButton.trigger('click')
expect(mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat4')
})
@@ -90,13 +89,14 @@ describe('CategoriesFilter.vue', () => {
})
})
- 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()
- })
- })
+ // 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/webapp/components/FilterMenu/CategoriesFilter.vue b/webapp/components/FilterMenu/CategoriesFilter.vue
index bcbfc7d1c..73170cf4b 100644
--- a/webapp/components/FilterMenu/CategoriesFilter.vue
+++ b/webapp/components/FilterMenu/CategoriesFilter.vue
@@ -1,34 +1,34 @@
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+ {{ $t('filter-menu.all') }}
+
+
+
+
+
-
+ >
+ {{ $t(`contribution.category.name.${category.slug}`) }}
+
+
@@ -36,15 +36,12 @@
+
diff --git a/webapp/components/FilterMenu/EmotionsFilter.spec.js b/webapp/components/FilterMenu/EmotionsFilter.spec.js.old
similarity index 100%
rename from webapp/components/FilterMenu/EmotionsFilter.spec.js
rename to webapp/components/FilterMenu/EmotionsFilter.spec.js.old
diff --git a/webapp/components/FilterMenu/EmotionsFilter.vue b/webapp/components/FilterMenu/EmotionsFilter.vue.old
similarity index 100%
rename from webapp/components/FilterMenu/EmotionsFilter.vue
rename to webapp/components/FilterMenu/EmotionsFilter.vue.old
diff --git a/webapp/components/FilterMenu/EventsByFilter.vue b/webapp/components/FilterMenu/EventsByFilter.vue
new file mode 100644
index 000000000..852300725
--- /dev/null
+++ b/webapp/components/FilterMenu/EventsByFilter.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+ {{ $t('filter-menu.ended.all.label') }}
+
+
+
+
+ {{ $t('filter-menu.ended.onlyEnded.label') }}
+
+
+
+
+
+
+
diff --git a/webapp/components/FilterMenu/FilterMenu.spec.js b/webapp/components/FilterMenu/FilterMenu.spec.js
index 6e9741e79..30f970b62 100644
--- a/webapp/components/FilterMenu/FilterMenu.spec.js
+++ b/webapp/components/FilterMenu/FilterMenu.spec.js
@@ -15,11 +15,13 @@ describe('FilterMenu.vue', () => {
const getters = {
'posts/isActive': () => false,
+ 'posts/filteredPostTypes': () => [],
'posts/orderBy': () => 'createdAt_desc',
}
const stubs = {
FollowingFilter: true,
+ PostTypeFilter: true,
CategoriesFilter: true,
EmotionsFilter: true,
LanguagesFilter: true,
diff --git a/webapp/components/FilterMenu/FilterMenuComponent.vue b/webapp/components/FilterMenu/FilterMenuComponent.vue
index 7a582a7c4..e362e758f 100644
--- a/webapp/components/FilterMenu/FilterMenuComponent.vue
+++ b/webapp/components/FilterMenu/FilterMenuComponent.vue
@@ -1,10 +1,25 @@
+
+
+
diff --git a/webapp/components/Notification/Notification.vue b/webapp/components/Notification/Notification.vue
index a9cd75f4e..a657b10ba 100644
--- a/webapp/components/Notification/Notification.vue
+++ b/webapp/components/Notification/Notification.vue
@@ -9,7 +9,7 @@
{{ $t(`notifications.reason.${notification.reason}`) }}
diff --git a/webapp/components/NotificationMenu/NotificationMenu.vue b/webapp/components/NotificationMenu/NotificationMenu.vue
index 0cc643516..d0e21bf96 100644
--- a/webapp/components/NotificationMenu/NotificationMenu.vue
+++ b/webapp/components/NotificationMenu/NotificationMenu.vue
@@ -4,11 +4,27 @@
class="notifications-menu"
:to="{ name: 'notifications' }"
>
-
+
{{ post.title }}
+
+
+
+
@@ -86,7 +106,9 @@
import Category from '~/components/Category'
import ContentMenu from '~/components/ContentMenu/ContentMenu'
import CounterIcon from '~/components/_new/generic/CounterIcon/CounterIcon'
+import DateTimeRange from '~/components/DateTimeRange/DateTimeRange'
import HcRibbon from '~/components/Ribbon'
+import LocationTeaser from '~/components/LocationTeaser/LocationTeaser'
import UserTeaser from '~/components/UserTeaser/UserTeaser'
import { mapGetters } from 'vuex'
import PostMutations from '~/graphql/PostMutations'
@@ -98,7 +120,9 @@ export default {
Category,
ContentMenu,
CounterIcon,
+ DateTimeRange,
HcRibbon,
+ LocationTeaser,
UserTeaser,
},
props: {
@@ -152,6 +176,11 @@ export default {
isPinned() {
return this.post && this.post.pinned
},
+ ribbonText() {
+ if (this.post.pinned) return this.$t('post.pinned')
+ if (this.post.postType[0] === 'Event') return this.$t('post.event')
+ return this.$t('post.name')
+ },
},
methods: {
async deletePostCallback() {
@@ -186,6 +215,7 @@ export default {
},
}
+
diff --git a/webapp/components/Select/ActionRadiusSelect.spec.js b/webapp/components/Select/ActionRadiusSelect.spec.js
new file mode 100644
index 000000000..7629ac788
--- /dev/null
+++ b/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/webapp/components/Select/ActionRadiusSelect.vue b/webapp/components/Select/ActionRadiusSelect.vue
new file mode 100644
index 000000000..0a090e0a5
--- /dev/null
+++ b/webapp/components/Select/ActionRadiusSelect.vue
@@ -0,0 +1,33 @@
+
+
+
+ {{ $t(`group.actionRadii.${actionRadius}`) }}
+
+
+
+
+
diff --git a/webapp/components/UserTeaser/UserTeaser.vue b/webapp/components/UserTeaser/UserTeaser.vue
index 9fa3252ff..a82b91039 100644
--- a/webapp/components/UserTeaser/UserTeaser.vue
+++ b/webapp/components/UserTeaser/UserTeaser.vue
@@ -96,7 +96,7 @@ export default {
groupLink() {
const { id, slug } = this.group
if (!(id && slug)) return ''
- return { name: 'group-id-slug', params: { slug, id } }
+ return { name: 'groups-id-slug', params: { slug, id } }
},
groupSlug() {
const { slug } = this.group || {}
diff --git a/webapp/components/_new/features/MySomethingList/MySomethingList.vue b/webapp/components/_new/features/MySomethingList/MySomethingList.vue
index e4f625c11..5d904675e 100644
--- a/webapp/components/_new/features/MySomethingList/MySomethingList.vue
+++ b/webapp/components/_new/features/MySomethingList/MySomethingList.vue
@@ -56,7 +56,7 @@
>
{{ isEditing ? $t('actions.save') : texts.addButton }}
-
+
{{ $t('actions.cancel') }}
diff --git a/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue b/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue
index 391c4722e..5d7cdeea2 100644
--- a/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue
+++ b/webapp/components/_new/features/PageParamsLink/PageParamsLink.vue
@@ -1,17 +1,12 @@
-
+
@@ -21,6 +16,24 @@ export default {
name: 'PageParamsLink',
props: {
pageParams: { type: Object, required: true },
+ forceTargetBlank: { type: Boolean, default: false },
+ },
+ computed: {
+ href() {
+ return this.pageParams.isInternalPage
+ ? this.pageParams.internalPage.pageRoute
+ : this.pageParams.externalLink.url
+ },
+ target() {
+ return this.forceTargetBlank
+ ? '_blank'
+ : !this.pageParams.isInternalPage
+ ? this.pageParams.externalLink.target
+ : ''
+ },
+ isInternalLink() {
+ return !this.forceTargetBlank && this.pageParams.isInternalPage
+ },
},
}
diff --git a/webapp/components/_new/generic/CounterIcon/CounterIcon.vue b/webapp/components/_new/generic/CounterIcon/CounterIcon.vue
index 0d97921ce..221f0b599 100644
--- a/webapp/components/_new/generic/CounterIcon/CounterIcon.vue
+++ b/webapp/components/_new/generic/CounterIcon/CounterIcon.vue
@@ -1,7 +1,7 @@
- {{ cappedCount }}
+ {{ cappedCount }}
diff --git a/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue b/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue
index 46e3968fc..d681276b5 100644
--- a/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue
+++ b/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.vue
@@ -8,7 +8,7 @@
:src="profile.avatar | proxyApiUrl"
class="image"
:alt="profile.name"
- :title="profile.name"
+ :title="showProfileNameTitle ? profile.name : ''"
@error="$event.target.style.display = 'none'"
/>
@@ -29,6 +29,10 @@ export default {
type: Object,
default: null,
},
+ showProfileNameTitle: {
+ type: Boolean,
+ default: true,
+ },
},
computed: {
isAnonymous() {
diff --git a/webapp/components/generic/SearchableInput/SearchableInput.spec.js b/webapp/components/generic/SearchableInput/SearchableInput.spec.js
index cda9150b8..223ee6186 100644
--- a/webapp/components/generic/SearchableInput/SearchableInput.spec.js
+++ b/webapp/components/generic/SearchableInput/SearchableInput.spec.js
@@ -63,13 +63,6 @@ describe('SearchableInput.vue', () => {
expect(select.element.value).toBe('abcd')
})
- it('calls onDelete when the delete key is pressed', () => {
- const spy = jest.spyOn(wrapper.vm, 'onDelete')
- select.trigger('input')
- select.trigger('keyup.delete')
- expect(spy).toHaveBeenCalledTimes(1)
- })
-
describe('navigating to resource', () => {
beforeEach(() => {
propsData = { options: searchResults }
diff --git a/webapp/components/generic/SearchableInput/SearchableInput.vue b/webapp/components/generic/SearchableInput/SearchableInput.vue
index 2149732c5..d08655893 100644
--- a/webapp/components/generic/SearchableInput/SearchableInput.vue
+++ b/webapp/components/generic/SearchableInput/SearchableInput.vue
@@ -1,9 +1,10 @@
@@ -41,4 +63,18 @@ export default {
padding-top: 6rem;
padding-bottom: 5rem;
}
+
+.chat-modul {
+ background-color: rgb(233, 228, 228);
+ width: 355px;
+ position: fixed;
+ bottom: 45px;
+ right: 0;
+ z-index: 10000;
+ .close {
+ padding: 10px;
+ color: blue;
+ cursor: pointer;
+ }
+}
diff --git a/webapp/locales/de.json b/webapp/locales/de.json
index a4398df4c..62860ae13 100644
--- a/webapp/locales/de.json
+++ b/webapp/locales/de.json
@@ -6,7 +6,8 @@
"edit": "Bearbeiten",
"loading": "wird geladen",
"loadMore": "mehr laden",
- "save": "Speichern"
+ "save": "Speichern",
+ "saveCategories": "Themen speichern"
},
"admin": {
"categories": {
@@ -77,6 +78,28 @@
}
}
},
+ "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 …"
},
@@ -115,11 +138,20 @@
"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?",
@@ -267,17 +299,20 @@
"happy": "Glücklich",
"surprised": "Erstaunt"
},
- "filterFollow": "Beiträge von Nutzern filtern, denen ich folge",
+ "filterFollow": "Nutzern, denen ich folge",
"filterMasonryGrid": {
- "myFriends": "Nutzer denen ich folge",
+ "myFriends": "Nutzer, denen ich folge",
"myGroups": "Aus meinen Gruppen",
"myTopics": "Meine Themen",
- "noFilter": "Beiträge filtern"
+ "noFilter": "Inhalte filtern",
+ "onlyArticles": "Beiträge",
+ "onlyEvents": "Veranstaltungen"
},
- "filterMyGroups": "Beiträge in meinen Gruppen",
+ "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": {
@@ -377,28 +412,54 @@
},
"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": "Nutzer, denen ich folge",
+ "following-title": "Quellen",
"languages": "Sprachen",
- "my-groups": "Meinen Gruppen",
+ "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",
@@ -510,8 +571,14 @@
},
"header": {
"avatarMenu": {
- "Groups": "Gruppen",
+ "button": {
+ "tooltip": "Mein Profil"
+ },
+ "groups": "Gruppen",
"myProfile": "Mein Profil"
+ },
+ "chat": {
+ "tooltip": "Meine Chats"
}
},
"index": {
@@ -520,13 +587,16 @@
},
"invite-codes": {
"button": {
- "tooltip": "Lade deine Freunde ein"
+ "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.",
@@ -537,7 +607,7 @@
"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 must Cookies akzeptieren.",
+ "no-cookie": "Es kann kein Cookie angelegt werden. Du musst Cookies akzeptieren.",
"password": "Dein Passwort",
"register": "Nutzerkonto erstellen",
"success": "Du bist eingeloggt!"
@@ -552,9 +622,16 @@
"button": {
"tooltip": "Landkarte anzeigen"
},
- "markerTypes": {
+ "legend": {
+ "event": "Veranstaltung",
"group": "Gruppe",
- "theUser": "deine Position",
+ "theUser": "Meine Position",
+ "user": "Nutzer"
+ },
+ "markerTypes": {
+ "event": "Veranstaltung",
+ "group": "Gruppe",
+ "theUser": "meine Position",
"user": "Nutzer"
},
"pageTitle": "Landkarte",
@@ -648,6 +725,9 @@
"unread": "Ungelesen"
},
"group": "Beschreibung",
+ "headerMenuButton": {
+ "tooltip": "Meine Banachrichtigungen"
+ },
"markAllAsRead": "Markiere alle als gelesen",
"pageLink": "Alle Benachrichtigungen",
"post": "Beitrag oder Gruppe",
@@ -663,11 +743,6 @@
"title": "Benachrichtigungen",
"user": "Nutzer"
},
- "position": {
- "group": "Gruppe",
- "my": "Meine Position",
- "user": "Nutzer"
- },
"post": {
"comment": {
"reply": "Antworten",
@@ -675,19 +750,27 @@
"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 neuen Beitrag"
+ "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",
@@ -701,6 +784,14 @@
"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}“"
@@ -816,7 +907,7 @@
"Tag": "Hashtag ::: Hashtags",
"User": "Nutzer ::: Nutzer"
},
- "hint": "Wonach suchst Du? Nutze !… für Beiträge, @… für Mitglieder, &… für Gruppen, #… für Hashtags",
+ "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",
diff --git a/webapp/locales/en.json b/webapp/locales/en.json
index b6afbfa96..a6060f3a0 100644
--- a/webapp/locales/en.json
+++ b/webapp/locales/en.json
@@ -6,7 +6,8 @@
"edit": "Edit",
"loading": "loading",
"loadMore": "load more",
- "save": "Save"
+ "save": "Save",
+ "saveCategories": "Save topics"
},
"admin": {
"categories": {
@@ -77,6 +78,28 @@
}
}
},
+ "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 …"
},
@@ -115,11 +138,20 @@
"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?",
@@ -267,17 +299,20 @@
"happy": "Happy",
"surprised": "Surprised"
},
- "filterFollow": "Filter contributions from users I follow",
+ "filterFollow": "Users I follow",
"filterMasonryGrid": {
"myFriends": "Users I follow",
"myGroups": "By my groups",
"myTopics": "My topics",
- "noFilter": "Filter posts"
+ "noFilter": "Filter content",
+ "onlyArticles": "Articles",
+ "onlyEvents": "Events"
},
- "filterMyGroups": "Contributions in my groups",
+ "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": {
@@ -377,28 +412,54 @@
},
"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",
@@ -417,7 +478,7 @@
"addMemberToGroupSuccess": "“{name}” was added to the group with the role “{role}”!",
"addUser": "Add User",
"addUserNoOptions": "No users found!",
- "addUserPlaceholder": " Username",
+ "addUserPlaceholder": "User name",
"allGroups": "All Groups",
"button": {
"tooltip": "Show groups"
@@ -510,8 +571,14 @@
},
"header": {
"avatarMenu": {
- "Groups": "Groups",
+ "button": {
+ "tooltip": "My profile"
+ },
+ "groups": "Groups",
"myProfile": "My profile"
+ },
+ "chat": {
+ "tooltip": "My chats"
}
},
"index": {
@@ -520,13 +587,16 @@
},
"invite-codes": {
"button": {
- "tooltip": "Invite your friends"
+ "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.",
@@ -552,9 +622,16 @@
"button": {
"tooltip": "Show map"
},
+ "legend": {
+ "event": "Event",
+ "group": "Group",
+ "theUser": "My position",
+ "user": "User"
+ },
"markerTypes": {
+ "event": "event",
"group": "group",
- "theUser": "your position",
+ "theUser": "my position",
"user": "user"
},
"pageTitle": "Map",
@@ -648,6 +725,9 @@
"unread": "Unread"
},
"group": "Description",
+ "headerMenuButton": {
+ "tooltip": "My notifications"
+ },
"markAllAsRead": "Mark all as read",
"pageLink": "All notifications",
"post": "Post or Group",
@@ -663,11 +743,6 @@
"title": "Notifications",
"user": "User"
},
- "position": {
- "group": "Group",
- "my": "My position",
- "user": "User"
- },
"post": {
"comment": {
"reply": "Reply",
@@ -675,19 +750,27 @@
"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 A New Post"
+ "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",
@@ -696,11 +779,19 @@
"unpin": "Unpin post",
"unpinnedSuccessfully": "Post unpinned successfully!"
},
- "name": "Post",
+ "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}”"
@@ -816,7 +907,7 @@
"Tag": "Hashtag ::: Hashtags",
"User": "User ::: Users"
},
- "hint": "What are you searching for? Use !… for posts, @… for users, &… for groups, #… for hashtags.",
+ "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",
diff --git a/webapp/locales/es.json b/webapp/locales/es.json
index a313b3dc4..ae455e5eb 100644
--- a/webapp/locales/es.json
+++ b/webapp/locales/es.json
@@ -75,6 +75,9 @@
}
}
},
+ "chat": {
+ "search": "Filtrar salas de chat"
+ },
"code-of-conduct": {
"subheader": "para la red social de {ORGANIZATION_NAME}"
},
diff --git a/webapp/locales/fr.json b/webapp/locales/fr.json
index 511ca4568..6f98be2e9 100644
--- a/webapp/locales/fr.json
+++ b/webapp/locales/fr.json
@@ -75,6 +75,9 @@
}
}
},
+ "chat": {
+ "search": "Filtrer les salons de chat"
+ },
"code-of-conduct": {
"subheader": "pour le réseau social de {ORGANIZATION_NAME}"
},
@@ -402,6 +405,10 @@
"read": "Lire",
"unread": "Non lu"
},
+ "group": "Description",
+ "headerMenuButton": {
+ "tooltip": "Mes notifications"
+ },
"markAllAsRead": "Tout marquer comme lu",
"pageLink": "Toutes les notifications",
"post": "Post",
diff --git a/webapp/maintenance/source/package.json b/webapp/maintenance/source/package.json
index 8c4ee7da9..546f2cd15 100644
--- a/webapp/maintenance/source/package.json
+++ b/webapp/maintenance/source/package.json
@@ -1,6 +1,6 @@
{
"name": "@ocelot-social/maintenance",
- "version": "2.5.0",
+ "version": "3.1.2",
"description": "Maintenance page for ocelot.social",
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
"author": "ocelot.social Community",
diff --git a/webapp/nuxt.config.js b/webapp/nuxt.config.js
index 2a837ffb4..c9b4db317 100644
--- a/webapp/nuxt.config.js
+++ b/webapp/nuxt.config.js
@@ -105,6 +105,7 @@ export default {
styleguideStyles,
'~assets/_new/styles/tokens.scss',
'~assets/styles/imports/_branding.scss',
+ '~assets/_new/styles/export.scss',
],
},
@@ -127,6 +128,7 @@ export default {
{ 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: {
@@ -248,6 +250,14 @@ export default {
** 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({
diff --git a/webapp/package.json b/webapp/package.json
index fb8dceed7..12fc93ef3 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -1,6 +1,6 @@
{
"name": "ocelot-social-webapp",
- "version": "2.5.0",
+ "version": "3.1.2",
"description": "ocelot.social Frontend",
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
"author": "ocelot.social Community",
@@ -38,7 +38,7 @@
"express": "~4.17.1",
"graphql": "~14.7.0",
"intersection-observer": "^0.12.0",
- "jsonwebtoken": "~8.5.1",
+ "jsonwebtoken": "~9.0.0",
"linkify-it": "~3.0.2",
"mapbox-gl": "1.13.2",
"node-fetch": "^2.6.1",
@@ -54,34 +54,37 @@
"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.12.3",
+ "@babel/core": "~7.22.1",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/preset-env": "^7.20.2",
+ "@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",
+ "@storybook/vue": "~7.4.0",
"@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-core": "^7.0.0-bridge.0",
"babel-eslint": "~10.1.0",
- "babel-jest": "29.4",
+ "babel-jest": "29.5",
"babel-loader": "~8.1.0",
"babel-plugin-require-context-hook": "^1.0.0",
"babel-preset-vue": "~2.0.2",
@@ -100,7 +103,7 @@
"eslint-plugin-vue": "~6.2.2",
"flush-promises": "^1.0.2",
"identity-obj-proxy": "^3.0.0",
- "jest": "29.4",
+ "jest": "29.5",
"jest-environment-jsdom": "^29.4.2",
"mutation-observer": "^1.0.3",
"prettier": "~2.7.1",
@@ -109,7 +112,6 @@
"storybook-vue-router": "^1.0.7",
"style-loader": "~0.23.1",
"style-resources-loader": "~1.3.3",
- "vue-jest": "~3.0.5",
"vue-svg-loader": "~0.16.0",
"vue-template-compiler": "^2.6.11"
},
diff --git a/webapp/pages/chat.vue b/webapp/pages/chat.vue
new file mode 100644
index 000000000..9f93fabcb
--- /dev/null
+++ b/webapp/pages/chat.vue
@@ -0,0 +1,54 @@
+
+
+
{{ $t('chat.page.headline') }}
+
+
+
+
+
+
+
diff --git a/webapp/pages/group/_id.spec.js b/webapp/pages/groups/_id.spec.js
similarity index 100%
rename from webapp/pages/group/_id.spec.js
rename to webapp/pages/groups/_id.spec.js
diff --git a/webapp/pages/group/_id.vue b/webapp/pages/groups/_id.vue
similarity index 96%
rename from webapp/pages/group/_id.vue
rename to webapp/pages/groups/_id.vue
index d743633d1..ab8f3c41e 100644
--- a/webapp/pages/group/_id.vue
+++ b/webapp/pages/groups/_id.vue
@@ -24,7 +24,7 @@ const options = {
}
`,
message: 'error-pages.group-not-found',
- path: 'group',
+ path: 'groups',
}
const persistentLinks = PersistentLinks(options)
diff --git a/webapp/pages/group/_id/_slug.spec.js b/webapp/pages/groups/_id/_slug.spec.js
similarity index 100%
rename from webapp/pages/group/_id/_slug.spec.js
rename to webapp/pages/groups/_id/_slug.spec.js
diff --git a/webapp/pages/group/_id/_slug.vue b/webapp/pages/groups/_id/_slug.vue
similarity index 100%
rename from webapp/pages/group/_id/_slug.vue
rename to webapp/pages/groups/_id/_slug.vue
diff --git a/webapp/pages/group/create.vue b/webapp/pages/groups/create.vue
similarity index 98%
rename from webapp/pages/group/create.vue
rename to webapp/pages/groups/create.vue
index ebdbbe37c..8dd661d8d 100644
--- a/webapp/pages/group/create.vue
+++ b/webapp/pages/groups/create.vue
@@ -59,7 +59,7 @@ export default {
})
this.$toast.success(this.$t('group.groupCreated'))
this.$router.history.push({
- name: 'group-id-slug',
+ name: 'groups-id-slug',
params: { id: responseId, slug: responseSlug },
})
} catch (error) {
diff --git a/webapp/pages/group/edit/_id.vue b/webapp/pages/groups/edit/_id.vue
similarity index 93%
rename from webapp/pages/group/edit/_id.vue
rename to webapp/pages/groups/edit/_id.vue
index 7a0f9d051..57c7d9f6a 100644
--- a/webapp/pages/group/edit/_id.vue
+++ b/webapp/pages/groups/edit/_id.vue
@@ -33,11 +33,11 @@ export default {
return [
{
name: this.$t('group.general'),
- path: `/group/edit/${this.group.id}`,
+ path: `/groups/edit/${this.group.id}`,
},
{
name: this.$t('group.members'),
- path: `/group/edit/${this.group.id}/members`,
+ path: `/groups/edit/${this.group.id}/members`,
},
]
},
diff --git a/webapp/pages/group/edit/_id/index.vue b/webapp/pages/groups/edit/_id/index.vue
similarity index 97%
rename from webapp/pages/group/edit/_id/index.vue
rename to webapp/pages/groups/edit/_id/index.vue
index e3c934dc5..70807b338 100644
--- a/webapp/pages/group/edit/_id/index.vue
+++ b/webapp/pages/groups/edit/_id/index.vue
@@ -60,7 +60,7 @@ export default {
})
this.$toast.success(this.$t('group.updatedGroup'))
this.$router.history.push({
- name: 'group-id-slug',
+ name: 'groups-id-slug',
params: { id: responseId, slug: responseSlug },
})
} catch (error) {
diff --git a/webapp/pages/group/edit/_id/members.vue b/webapp/pages/groups/edit/_id/members.vue
similarity index 100%
rename from webapp/pages/group/edit/_id/members.vue
rename to webapp/pages/groups/edit/_id/members.vue
diff --git a/webapp/pages/groups.spec.js b/webapp/pages/groups/index.spec.js
similarity index 94%
rename from webapp/pages/groups.spec.js
rename to webapp/pages/groups/index.spec.js
index 3761f7ec2..ecb28c2c9 100644
--- a/webapp/pages/groups.spec.js
+++ b/webapp/pages/groups/index.spec.js
@@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils'
-import groups from './groups.vue'
+import groups from './index.vue'
const localVue = global.localVue
diff --git a/webapp/pages/groups.vue b/webapp/pages/groups/index.vue
similarity index 98%
rename from webapp/pages/groups.vue
rename to webapp/pages/groups/index.vue
index 6b895de72..13002859b 100644
--- a/webapp/pages/groups.vue
+++ b/webapp/pages/groups/index.vue
@@ -7,7 +7,7 @@
-
+
{
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' }
diff --git a/webapp/pages/index.vue b/webapp/pages/index.vue
index 490b1ec8f..7b5c4a903 100644
--- a/webapp/pages/index.vue
+++ b/webapp/pages/index.vue
@@ -18,19 +18,14 @@
-
-
-