diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c5433c921..ac1dfa858 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,179 +1,68 @@ version: 2 updates: +- package-ecosystem: "github-actions" + directory: "/" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" + - package-ecosystem: npm directory: "/" + rebase-strategy: "disabled" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: cypress - versions: - - 6.3.0 - - 6.4.0 - - 6.5.0 - - 6.6.0 - - 6.7.1 - - 6.8.0 - - 7.0.0 - - 7.0.1 - - 7.1.0 - - dependency-name: cypress-cucumber-preprocessor - versions: - - 4.0.0 - - 4.0.1 - - 4.0.3 - - dependency-name: date-fns - versions: - - 2.16.1 - - 2.17.0 - - 2.18.0 - - 2.19.0 - - 2.20.0 - - 2.20.1 - - 2.20.2 - - 2.20.3 - - 2.21.0 - - dependency-name: cypress-file-upload - versions: - - 5.0.2 - - 5.0.3 - - 5.0.4 - - 5.0.5 - - dependency-name: neo4j-driver - versions: - - 4.2.2 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" - package-ecosystem: npm directory: "/backend" + rebase-strategy: "disabled" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: y18n - versions: - - 4.0.1 - - 4.0.2 - - dependency-name: metascraper-publisher - versions: - - 5.16.16 - - 5.18.1 - - 5.18.12 - - 5.18.2 - - 5.18.4 - - 5.18.5 - - 5.18.6 - - 5.18.9 - - 5.20.0 - - 5.21.0 - - 5.21.2 - - 5.21.3 - - 5.21.4 - - 5.21.5 - - dependency-name: metascraper-author - versions: - - 5.16.16 - - 5.18.1 - - 5.18.12 - - 5.18.2 - - 5.18.4 - - 5.18.5 - - 5.18.6 - - 5.18.9 - - 5.20.0 - - 5.21.0 - - 5.21.2 - - 5.21.3 - - 5.21.4 - - 5.21.5 - - dependency-name: neo4j-driver - versions: - - 4.2.2 - - dependency-name: neo4j-graphql-js - versions: - - 2.19.1 - - dependency-name: mustache - versions: - - 4.1.0 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" - package-ecosystem: npm directory: "/webapp" + rebase-strategy: "disabled" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: nuxt - versions: - - 2.14.12 - - 2.15.0 - - 2.15.1 - - 2.15.2 - - 2.15.3 - - dependency-name: v-tooltip - versions: - - 2.1.2 - - dependency-name: "@vue/server-test-utils" - versions: - - 1.1.2 - - 1.1.3 - - dependency-name: node-notifier - versions: - - 8.0.1 -- package-ecosystem: docker - directory: "/webapp" - schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: node - versions: - - ">= 15.5.a, < 15.6" - - dependency-name: node - versions: - - 15.10.0.pre.alpine3.10 - - 15.11.0.pre.alpine3.10 - - 15.12.0.pre.alpine3.10 - - 15.13.0.pre.alpine3.10 - - 15.7.0.pre.alpine3.10 - - 15.8.0.pre.alpine3.10 - - 15.9.0.pre.alpine3.10 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" + - package-ecosystem: docker directory: "/backend" + rebase-strategy: "disabled" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: node - versions: - - ">= 15.4.a, < 15.5" - - dependency-name: node - versions: - - ">= 15.5.a, < 15.6" - - dependency-name: node - versions: - - 15.10.0.pre.alpine3.10 - - 15.11.0.pre.alpine3.10 - - 15.12.0.pre.alpine3.10 - - 15.13.0.pre.alpine3.10 - - 15.7.0.pre.alpine3.10 - - 15.8.0.pre.alpine3.10 - - 15.9.0.pre.alpine3.10 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" +- package-ecosystem: docker + directory: "/webapp" + rebase-strategy: "disabled" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" - package-ecosystem: docker directory: "/neo4j" + rebase-strategy: "disabled" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: neo4j - versions: - - 4.2.3 - - 4.2.4 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" - package-ecosystem: docker - directory: "/deployment/legacy-migration/maintenance-worker" + directory: "/deployment/src/docker" + rebase-strategy: "disabled" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" diff --git a/.github/workflows/lint_pr.yml b/.github/workflows/lint_pr.yml index 8ef9750a4..5a8bb662f 100644 --- a/.github/workflows/lint_pr.yml +++ b/.github/workflows/lint_pr.yml @@ -1,7 +1,6 @@ name: "ocelot.social lint pull request CI" on: - pull_request: pull_request_target: types: - opened @@ -12,6 +11,7 @@ jobs: main: name: Validate PR title runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} steps: - uses: amannn/action-semantic-pull-request@v5 env: diff --git a/.github/workflows/publish-branded.yml b/.github/workflows/publish-branded.yml new file mode 100644 index 000000000..a404453e6 --- /dev/null +++ b/.github/workflows/publish-branded.yml @@ -0,0 +1,74 @@ +name: publish-branded +on: + repository_dispatch: + types: [trigger-build-success] +jobs: + build_branded: + name: Docker Build Branded + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.event.client_payload.ref }} + - name: Setup env + run: echo "OCELOT_VERSION=${{ github.event.client_payload.BUILD_VERSION }}" >> $GITHUB_ENV + - name: Build branded images + run: | + deployment/scripts/branded-images.build.sh + docker save "ocelotsocialnetwork/backend-branded" > /tmp/backend-branded.tar + docker save "ocelotsocialnetwork/webapp-branded" > /tmp/webapp-branded.tar + docker save "ocelotsocialnetwork/maintenance-branded" > /tmp/maintenance-branded.tar + + - name: Upload Artifact (Backend) + uses: actions/upload-artifact@v2 + with: + name: docker-backend-branded + path: /tmp/backend-branded.tar + + - name: Upload Artifact (Webapp) + uses: actions/upload-artifact@v2 + with: + name: docker-webapp-branded + path: /tmp/webapp-branded.tar + + - name: Upload Artifact (Maintenance) + uses: actions/upload-artifact@v2 + with: + name: docker-maintenance-branded + path: /tmp/maintenance-branded.tar + + upload_to_dockerhub: + name: Upload to Dockerhub + runs-on: ubuntu-latest + needs: [build_branded] + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + steps: + - name: Download Docker Image (Backend) + uses: actions/download-artifact@v2 + with: + name: docker-backend-branded + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/backend-branded.tar + + - name: Download Docker Image (Webapp) + uses: actions/download-artifact@v2 + with: + name: docker-webapp-branded + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/webapp-branded.tar + + - name: Download Docker Image (Maintenance) + uses: actions/download-artifact@v2 + with: + name: docker-maintenance-branded + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/maintenance-branded.tar + + - name: Upload to dockerhub + run: deployment/scripts/branded-images.upload.sh \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2a2e73dc6..01256d719 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,68 +1,40 @@ -name: ocelot.social publish CI +name: publish on: push: branches: - master - # - 5059-epic-groups # for testing while developing - # template branches in repo - # - template--separate-branch-auto-deployment--5059-epic-groups jobs: - ############################################################################## - # JOB: PREPARE ############################################################### - ############################################################################## - prepare: - name: Prepare - runs-on: ubuntu-latest - # needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # TODO: DO STUFF ??? ##################################################### - ########################################################################## - - name: Check translation files - run: | - scripts/translations/sort.sh - scripts/translations/missing-keys.sh - ############################################################################## # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## ############################################################################## build_production_neo4j: name: Docker Build Production - Neo4J runs-on: ubuntu-latest - needs: [prepare] steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # NEO4J ################################################################## - ########################################################################## + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: Neo4J | Build `community` image - run: docker build --target community -t "ocelotsocialnetwork/neo4j-community:latest" -t "ocelotsocialnetwork/neo4j-community:${VERSION}" -t "ocelotsocialnetwork/neo4j-community:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT neo4j/ + run: | + docker build --target community \ + --tag "ocelotsocialnetwork/neo4j-community:latest" \ + --tag "ocelotsocialnetwork/neo4j-community:${VERSION}" \ + --tag "ocelotsocialnetwork/neo4j-community:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + neo4j/ - name: Neo4J | Save docker image run: docker save "ocelotsocialnetwork/neo4j-community" > /tmp/neo4j.tar - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: docker-neo4j-community path: /tmp/neo4j.tar @@ -73,36 +45,45 @@ jobs: build_production_backend: name: Docker Build Production - Backend runs-on: ubuntu-latest - needs: [prepare] steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD BACKEND DOCKER IMAGE (production) ################################ - ########################################################################## + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: Backend | Build `production` image run: | - docker build --target base -t "ocelotsocialnetwork/backend:latest-base" -t "ocelotsocialnetwork/backend:${VERSION}-base" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ - docker build --target code -t "ocelotsocialnetwork/backend:latest-code" -t "ocelotsocialnetwork/backend:${VERSION}-code" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ - docker build --target production -t "ocelotsocialnetwork/backend:latest" -t "ocelotsocialnetwork/backend:${VERSION}" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ + docker build --target base \ + --tag "ocelotsocialnetwork/backend:latest-base" \ + --tag "ocelotsocialnetwork/backend:${VERSION}-base" \ + --tag "ocelotsocialnetwork/backend:${BUILD_VERSION}-base" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + backend/ + docker build --target code \ + --tag "ocelotsocialnetwork/backend:latest-code" \ + --tag "ocelotsocialnetwork/backend:${VERSION}-code" \ + --tag "ocelotsocialnetwork/backend:${BUILD_VERSION}-code" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + backend/ + docker build --target production \ + --tag "ocelotsocialnetwork/backend:latest" \ + --tag "ocelotsocialnetwork/backend:${VERSION}" \ + --tag "ocelotsocialnetwork/backend:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + backend/ - name: Backend | Save docker image run: docker save "ocelotsocialnetwork/backend" > /tmp/backend.tar - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: docker-backend-production path: /tmp/backend.tar @@ -113,36 +94,45 @@ jobs: build_production_webapp: name: Docker Build Production - WebApp runs-on: ubuntu-latest - needs: [prepare] steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD WEBAPP DOCKER IMAGE (build) ###################################### - ########################################################################## + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: Webapp | Build `production` image run: | - docker build --target base -t "ocelotsocialnetwork/webapp:latest-base" -t "ocelotsocialnetwork/webapp:${VERSION}-base" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ - docker build --target code -t "ocelotsocialnetwork/webapp:latest-code" -t "ocelotsocialnetwork/webapp:${VERSION}-code" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ - docker build --target production -t "ocelotsocialnetwork/webapp:latest" -t "ocelotsocialnetwork/webapp:${VERSION}" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ + docker build --target base \ + --tag "ocelotsocialnetwork/webapp:latest-base" \ + --tag "ocelotsocialnetwork/webapp:${VERSION}-base" \ + --tag "ocelotsocialnetwork/webapp:${BUILD_VERSION}-base" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + webapp/ + docker build --target code \ + --tag "ocelotsocialnetwork/webapp:latest-code" \ + --tag "ocelotsocialnetwork/webapp:${VERSION}-code" \ + --tag "ocelotsocialnetwork/webapp:${BUILD_VERSION}-code" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + webapp/ + docker build --target production \ + --tag "ocelotsocialnetwork/webapp:latest" \ + --tag "ocelotsocialnetwork/webapp:${VERSION}" \ + --tag "ocelotsocialnetwork/webapp:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + webapp/ - name: Webapp | Save docker image run: docker save "ocelotsocialnetwork/webapp" > /tmp/webapp.tar - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: docker-webapp-production path: /tmp/webapp.tar @@ -153,36 +143,48 @@ jobs: build_production_maintenance: name: Docker Build Production - Maintenance runs-on: ubuntu-latest - needs: [prepare] steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD MAINTENANCE DOCKER IMAGE (build) ################################# - ########################################################################## + uses: actions/checkout@v3 + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: Maintenance | Build `production` image run: | - docker build --target base -t "ocelotsocialnetwork/maintenance:latest-base" -t "ocelotsocialnetwork/maintenance:${VERSION}-base" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance - docker build --target code -t "ocelotsocialnetwork/maintenance:latest-code" -t "ocelotsocialnetwork/maintenance:${VERSION}-code" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance - docker build --target production -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance + docker build --target base \ + --tag "ocelotsocialnetwork/maintenance:latest-base" \ + --tag "ocelotsocialnetwork/maintenance:${VERSION}-base" \ + --tag "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-base" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + -f webapp/Dockerfile.maintenance \ + webapp/ + docker build --target code \ + --tag "ocelotsocialnetwork/maintenance:latest-code" \ + --tag "ocelotsocialnetwork/maintenance:${VERSION}-code" \ + --tag "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-code" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + -f webapp/Dockerfile.maintenance \ + webapp/ + docker build --target production \ + --tag "ocelotsocialnetwork/maintenance:latest" \ + --tag "ocelotsocialnetwork/maintenance:${VERSION}" \ + --tag "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" \ + --build-arg BBUILD_DATE=$BUILD_DATE \ + --build-arg BBUILD_VERSION=$BUILD_VERSION \ + --build-arg BBUILD_COMMIT=$BUILD_COMMIT \ + -f webapp/Dockerfile.maintenance \ + webapp/ - name: Maintenance | Save docker image run: docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: docker-maintenance-production path: /tmp/maintenance.tar @@ -198,130 +200,39 @@ jobs: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # DOWNLOAD DOCKER IMAGES ################################################# - ########################################################################## - name: Download Docker Image (Neo4J) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-neo4j-community path: /tmp - - name: Load Docker Image - run: docker load < /tmp/neo4j.tar + - run: docker load < /tmp/neo4j.tar - name: Download Docker Image (Backend) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-backend-production path: /tmp - - name: Load Docker Image - run: docker load < /tmp/backend.tar + - run: docker load < /tmp/backend.tar - name: Download Docker Image (WebApp) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-webapp-production path: /tmp - - name: Load Docker Image - run: docker load < /tmp/webapp.tar + - run: docker load < /tmp/webapp.tar - name: Download Docker Image (Maintenance) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-maintenance-production path: /tmp - - name: Load Docker Image - run: docker load < /tmp/maintenance.tar - ########################################################################## - # Upload ################################################################# - ########################################################################## + - run: docker load < /tmp/maintenance.tar + - name: login to dockerhub run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin - - name: Push neo4j - run: docker push --all-tags ocelotsocialnetwork/neo4j-community - - name: Push backend - run: docker push --all-tags ocelotsocialnetwork/backend - - name: Push webapp - run: docker push --all-tags ocelotsocialnetwork/webapp - - name: Push maintenance - run: docker push --all-tags ocelotsocialnetwork/maintenance - - ############################################################################## - # JOB: KUBERNETES DEPLOY ACTUAL/LATEST VERSION ###################################### - ############################################################################## - kubernetes_deploy: - # see example https://github.com/do-community/example-doctl-action - # see example https://github.com/do-community/example-doctl-action/blob/main/.github/workflows/workflow.yaml - name: Kubernetes deploy of latest version to stage.ocelot.social cluster at DigitalOcean - runs-on: ubuntu-latest - needs: [upload_to_dockerhub] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - ########################################################################## - # Install DigitalOceans doctl and set kubeconfig ######################### - ########################################################################## - - name: Install doctl - uses: digitalocean/action-doctl@v2 - with: - token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} - - name: Save DigitalOcean kubeconfig with short-lived credentials - run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 cluster-stage-ocelot-social - ########################################################################## - # Deploy new Docker images to DigitalOcean Kubernetes cluster ############ - ########################################################################## - # - name: Deploy 'latest' to DigitalOcean Kubernetes - # run: | - # kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:latest - # kubectl -n default rollout restart deployment/ocelot-webapp - # kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:latest - # kubectl -n default rollout restart deployment/ocelot-backend - # kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:latest - # kubectl -n default rollout restart deployment/ocelot-maintenance - # kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:latest - # kubectl -n default rollout restart deployment/ocelot-neo4j - - name: Deploy actual version '$BUILD_VERSION' to DigitalOcean Kubernetes + - name: Push images run: | - kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION - kubectl -n default rollout restart deployment/ocelot-webapp - kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION - kubectl -n default rollout restart deployment/ocelot-backend - kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION - kubectl -n default rollout restart deployment/ocelot-maintenance - kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION - kubectl -n default rollout restart deployment/ocelot-neo4j - # because this step 'kubectl -n default rollout status deployment/* --timeout=600s' does not work as expected - # and we need the pods to be up again for cleaning and seeding the Neo4j database and the backend. - # !!! this is not a perfect solution !!! - # deployments are regularly up again after 3 minutes and 10 seconds - - name: Sleep for 4 minutes, means 240 seconds - run: sleep 240s - shell: bash - - name: Verify deployment and wait for the pods of each deployment to get ready for cleaning and seeding of the database - run: | - kubectl -n default rollout status deployment/ocelot-backend --timeout=600s - kubectl -n default rollout status deployment/ocelot-neo4j --timeout=600s - kubectl -n default rollout status deployment/ocelot-maintenance --timeout=600s - kubectl -n default rollout status deployment/ocelot-webapp --timeout=600s - - name: Run migrations for Neo4j database via backend for staging - run: | - kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "yarn prod:migrate up" - - name: Reset and seed Neo4j database via backend for staging - # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment - run: | - 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" + docker push --all-tags ocelotsocialnetwork/neo4j-community + docker push --all-tags ocelotsocialnetwork/backend + docker push --all-tags ocelotsocialnetwork/webapp + docker push --all-tags ocelotsocialnetwork/maintenance ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# @@ -331,39 +242,16 @@ jobs: runs-on: ubuntu-latest needs: [upload_to_dockerhub] steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 # Fetch full History for changelog - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # Push version tag to GitHub ############################################# - ########################################################################## - # TODO: this will error on duplicate - #- name: package-version-to-git-tag - # uses: pkgdeps/git-tag-action@v2 - # with: - # github_token: ${{ secrets.GITHUB_TOKEN }} - # github_repo: ${{ github.repository }} - # version: ${{ env.VERSION }} - # git_commit_sha: ${{ github.sha }} - # git_tag_prefix: "v" - ########################################################################## - # Push build tag to GitHub ############################################### - ########################################################################## + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: package-version-to-git-tag + build number uses: pkgdeps/git-tag-action@v2 with: @@ -372,13 +260,10 @@ jobs: version: ${{ env.BUILD_VERSION }} git_commit_sha: ${{ github.sha }} git_tag_prefix: "b" - ########################################################################## - # Push release tag to GitHub ############################################# - ########################################################################## - - name: yarn install - run: yarn install - - name: generate changelog - run: yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only + - name: Generate changelog + run: | + yarn install + yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only - name: package-version-to-git-release continue-on-error: true # Will fail if tag exists id: create_release @@ -391,3 +276,101 @@ jobs: body_path: ./CHANGELOG.md draft: false prerelease: false + + build_trigger: + name: Trigger successful build + runs-on: ubuntu-latest + needs: [github_tag] + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Fetch full History for changelog + - name: Setup env + run: | + echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: Repository Dispatch + uses: peter-evans/repository-dispatch@v1 + with: + token: ${{ github.token }} + event-type: trigger-build-success + repository: ${{ github.repository }} + client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' + + # ############################################################################## + # # JOB: KUBERNETES DEPLOY ACTUAL/LATEST VERSION ###################################### + # ############################################################################## + # kubernetes_deploy: + # # see example https://github.com/do-community/example-doctl-action + # # see example https://github.com/do-community/example-doctl-action/blob/main/.github/workflows/workflow.yaml + # name: Kubernetes deploy of latest version to stage.ocelot.social cluster at DigitalOcean + # runs-on: ubuntu-latest + # needs: [upload_to_dockerhub] + # steps: + # ########################################################################## + # # CHECKOUT CODE ########################################################## + # ########################################################################## + # - name: Checkout code + # uses: actions/checkout@v3 + # ########################################################################## + # # SET ENVS ############################################################### + # ########################################################################## + # - name: ENV - VERSION + # run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + # - name: ENV - BUILD_VERSION + # run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + # ########################################################################## + # # Install DigitalOceans doctl and set kubeconfig ######################### + # ########################################################################## + # - name: Install doctl + # uses: digitalocean/action-doctl@v2 + # with: + # token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + # - name: Save DigitalOcean kubeconfig with short-lived credentials + # run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 cluster-stage-ocelot-social + # ########################################################################## + # # Deploy new Docker images to DigitalOcean Kubernetes cluster ############ + # ########################################################################## + # # - name: Deploy 'latest' to DigitalOcean Kubernetes + # # run: | + # # kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:latest + # # kubectl -n default rollout restart deployment/ocelot-webapp + # # kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:latest + # # kubectl -n default rollout restart deployment/ocelot-backend + # # kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:latest + # # kubectl -n default rollout restart deployment/ocelot-maintenance + # # kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:latest + # # kubectl -n default rollout restart deployment/ocelot-neo4j + # - name: Deploy actual version '$BUILD_VERSION' to DigitalOcean Kubernetes + # run: | + # kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION + # kubectl -n default rollout restart deployment/ocelot-webapp + # kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION + # kubectl -n default rollout restart deployment/ocelot-backend + # kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION + # kubectl -n default rollout restart deployment/ocelot-maintenance + # kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION + # kubectl -n default rollout restart deployment/ocelot-neo4j + # # because this step 'kubectl -n default rollout status deployment/* --timeout=600s' does not work as expected + # # and we need the pods to be up again for cleaning and seeding the Neo4j database and the backend. + # # !!! this is not a perfect solution !!! + # # deployments are regularly up again after 3 minutes and 10 seconds + # - name: Sleep for 4 minutes, means 240 seconds + # run: sleep 240s + # shell: bash + # - name: Verify deployment and wait for the pods of each deployment to get ready for cleaning and seeding of the database + # run: | + # kubectl -n default rollout status deployment/ocelot-backend --timeout=600s + # kubectl -n default rollout status deployment/ocelot-neo4j --timeout=600s + # kubectl -n default rollout status deployment/ocelot-maintenance --timeout=600s + # kubectl -n default rollout status deployment/ocelot-webapp --timeout=600s + # - name: Run migrations for Neo4j database via backend for staging + # run: | + # kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "yarn prod:migrate up" + # - name: Reset and seed Neo4j database via backend for staging + # # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment + # run: | + # 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" \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4b310a20b..46d80241f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # TODO: DO STUFF ??? ##################################################### ########################################################################## @@ -37,7 +37,7 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # NEO4J ################################################################## ########################################################################## @@ -46,7 +46,7 @@ jobs: 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@v2 + uses: actions/upload-artifact@v3 with: name: docker-neo4j-image path: /tmp/neo4j.tar @@ -63,7 +63,7 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # BUILD BACKEND DOCKER IMAGE (build) ##################################### ########################################################################## @@ -72,7 +72,7 @@ jobs: docker build --target test -t "ocelotsocialnetwork/backend:test" backend/ docker save "ocelotsocialnetwork/backend:test" > /tmp/backend.tar - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: docker-backend-test path: /tmp/backend.tar @@ -89,7 +89,7 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## @@ -98,7 +98,7 @@ jobs: docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/ docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: docker-webapp-test path: /tmp/webapp.tar @@ -115,12 +115,12 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # DOWNLOAD DOCKER IMAGE ################################################## ########################################################################## - name: Download Docker Image (Backend) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-backend-test path: /tmp @@ -144,12 +144,12 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # DOWNLOAD DOCKER IMAGE ################################################## ########################################################################## - name: Download Docker Image (Webapp) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-webapp-test path: /tmp @@ -168,24 +168,26 @@ jobs: 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@v2 + uses: actions/checkout@v3 ########################################################################## # DOWNLOAD DOCKER IMAGES ################################################# ########################################################################## - name: Download Docker Image (Neo4J) - uses: actions/download-artifact@v2 + 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@v2 + uses: actions/download-artifact@v3 with: name: docker-backend-test path: /tmp @@ -225,17 +227,19 @@ jobs: name: Unit tests - webapp runs-on: ubuntu-latest needs: [build_test_webapp] + permissions: + checks: write steps: ########################################################################## # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # DOWNLOAD DOCKER IMAGES ################################################# ########################################################################## - name: Download Docker Image (Webapp) - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: docker-webapp-test path: /tmp @@ -269,7 +273,7 @@ jobs: report_name: Coverage Webapp type: lcov result_path: ./coverage/lcov.info - min_coverage: 63 + min_coverage: 83 token: ${{ github.token }} ############################################################################## @@ -290,26 +294,26 @@ jobs: # CHECKOUT CODE ########################################################## ########################################################################## - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 ########################################################################## # DOWNLOAD DOCKER IMAGES ################################################# ########################################################################## - name: Download Docker Image (Neo4J) - uses: actions/download-artifact@v2 + 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@v2 + 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@v2 + uses: actions/download-artifact@v3 with: name: docker-webapp-test path: /tmp @@ -332,12 +336,12 @@ jobs: # UPLOAD SCREENSHOTS & VIDEO ############################################# ########################################################################## - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: cypress-screenshots path: cypress/screenshots/ - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: cypress-videos path: cypress/videos/ diff --git a/.nvmrc b/.nvmrc index ce4572cce..cb77acbfe 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v17.9.0 \ No newline at end of file +v19.4.0 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e029abcf3..ac1cf7e02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,54 @@ 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). -#### [2.2.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.1.0...2.2.0) +#### [2.4.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.3.0...2.4.0) +- fix(webapp): post teaser width in mobile view [`#5958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5958) +- fix(webapp): navbar disappears when scrolling to top [`#5957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5957) +- fix(webapp): close mobile menu on all links [`#5956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5956) +- feat(webapp): mark active filters on the posts [`#5952`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5952) +- refactor(webapp): refacchange postion add content button, refactor mobile filter menu [`#5943`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5943) +- refactor(webapp): set legend to map [`#5950`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5950) +- fix(webapp): small changes for deploy [`#5949`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5949) +- feat(webapp): hide navbar by scroll, filter button for content [`#5926`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5926) +- feat(webapp): map [`#5843`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5843) +- refactor(webapp): upgrade node version to 19.4 [`#5910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5910) +- fix(webapp): texts for groups [`#5923`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5923) +- fix(webapp): add category name in tooltip [`#5884`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5884) +- refactor(webapp): 🍰 Refactor Social Media And `MySomethingList` [`#5138`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5138) +- fix(backend): do not expose registered emails on registration [`#5909`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5909) +- refactor(backend): node 19 with fixed image upload [`#5897`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5897) +- refactor(webapp): nump docker version to `16.19.0` in webapp & maintenance [`#5842`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5842) +- updated required packages for node19, fix fs-capacitator [`11087cb`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/11087cbaefde604668ac192b710666df09cb813c) +- fixed build error [`3889204`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/3889204f871df97b307401032900db7940913038) +- linting [`8bfe486`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8bfe486034badd55a8096982f81aba08207b9e83) + +#### [2.3.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.2.0...2.3.0) + +> 5 December 2022 + +- chore(release): v2.3.0 [`#5768`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5768) +- feat(webapp): 🍰 Sort Categories By Name [`#5709`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5709) +- fix(backend): sanitize group description [`#5707`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5707) +- fix(webapp): clean up webapp unit tests [`#5711`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5711) +- feat(webapp): 🍰 Search Users To Add To Group [`#5652`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5652) +- feat(webapp): 🍰 Params For Category Filter [`#5699`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5699) +- fix(backend): 🍰 Misspelled Notification [`#5703`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5703) +- test(other): jest coverage report in console [`#5637`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5637) +- fix(webapp): centralize mobile hamburger menu [`#5674`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5674) +- refactor(backend): 🍰 Move `db/graphql` Folder Content To `graphql` Folder [`#5661`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5661) +- feat(other): semantic pullrequest workflow [`#5634`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5634) +- fix: Cannot Add Group Members as New Members to Group [`#5635`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5635) +- fix: My Groups Count Includes Pending Membership [`#5631`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5631) +- frontend: jest coverage [`f57e11d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f57e11dd021dbb156b33fbd5538cf5ca32df7334) +- reverted yarn lock [`a01aee8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a01aee89a92bbc9885e2895c577eb3c63042ba22) +- reverted all package updates [`a520089`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a5200893f4508d45619447231b6789178a51daf7) + +#### [2.2.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.1.0...2.2.0) + +> 28 October 2022 + +- chore: 🍰 Release v2.2.0 [`#5610`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5610) - refactor: 🍰 Refactor Design Of Category Filter In Filter Menu [`#5597`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5597) - feat: 🍰 Footer And Header Links Configurable To Have External Link Target [`#5590`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5590) - feat: 🍰 Header Menu To Component And Other Refinements [`#5546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5546) @@ -19,10 +65,26 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix: 🍰 Fix Group Teaser [`#5584`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5584) - feat: 🍰 List All Groups [`#5582`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5582) - feat: 🍰 Header Logo Routing Update [`#5579`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5579) +- add header menu to component, central variabl for screen width [`401f59a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/401f59ae8de5b1c27f0e26e1f71778d3257d2180) +- comment out LanguagesFilter, EmotionsFilter, fix tests, fix lint [`52dcd77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/52dcd772fa81e02a0d95e89a9fc8232e70a09d28) +- fix lint [`15561cb`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/15561cb94f8768e93846c25945c935ae83977553) + +#### [2.1.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.0.0...2.1.0) + +> 25 October 2022 + - chore: 🍰 Release v2.1.0 [`#5574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5574) - feat: 🍰 EPIC Groups [`#5132`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5132) - chore: 🍰 Remove Group Branchs `5059-epic-groups` Separate Auto-Deployment [`#5552`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5552) - fix: [WIP] 🍰 Long Words Are Being Wrapped Now [`#5559`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5559) +- Remove groups separate auto-deployment [`c8d8168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c8d816887b2d49293d1b8ee2805d452fe10d907e) +- Release v2.1.0 [`dc085e9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/dc085e9e69b288fce6dd06e8d7eb05ef34bd9a7b) +- Add database migration to auto-deployment on publish [`ef06f1a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ef06f1a67d2654aaeb55d0434d3324a3ac37a380) + +### [2.0.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.1.1...2.0.0) + +> 23 October 2022 + - feat: 🍰 Search For Groups [`#5543`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5543) - feat: 🍰 Mobile Footer Menu To Header Menu [`#5524`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5524) - feat: 🍰 Implement `LOGO_HEADER_CLICK` As Configuration [`#5525`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5525) @@ -39,25 +101,35 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - feat: 🍰 Group Members Management [`#5345`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5345) - feat: 🍰 Have My Groups In The User Menu And Configure Groups Button In Header [`#5411`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5411) - chore: 🍰 Implement Automatic Deployment For Groups Branch '5059-epic-groups' [`#5408`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5408) -- Chore: 🍰 Release v1.1.1 – Refactor Rebranding [`#5392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5392) -- chore: 🍰 Refactor Rebranding [`#5390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5390) - feat: 🍰 Group Profile Description Etc [`#5368`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5368) -- feat: 🍰 Tooltips For Topics [`#5350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5350) - feat: 🍰 Group Profile Members List Etc [`#5335`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5335) - feat: 🍰 Implement Group Profile – Visibility [`#5332`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5332) -- feat: 🍰 Save Categories In Frontend [`#5284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5284) -- feat: 🍰 Add New Yunite Icons [`#5319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5319) -- chore: 🍰 Update Neode From v^0.4.7 To v^0.4.8 In Backend [`#5334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5334) - feat: 🍰 My Groups Page [`#5148`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5148) - feat: 🍰 Hidden Groups Shall Not Be Visible For None Or Pending Members In Backend [`#5317`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5317) - feat: 🍰 Implement Group Profile [`#5197`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5197) +- feat: 🍰 Implement `UpdateGroup` Resolver [`#5224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5224) +- feat: 🍰 Implement `JoinGroup`, `GroupMember`, `SwitchGroupMemberRole` Resolvers [`#5199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5199) +- chore: 🍰 Add Groups To Seeding [`#5185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5185) +- feat: 🍰 Implement Group GQL Model And CRUD Resolvers – First Step [`#5139`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5139) +- Refine design and functionality of group list and create, edit group [`7b11122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/7b11122bea4868624dd1c1641219e71070412e20) +- improved code and tests as suggested by @tirokk, thanks for the great review! [`631f34a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/631f34a2e5224d68279337a92e7535794b670d70) +- implement and test post visibilty when leaving or changing the role in a group [`76bfe48`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/76bfe484768cf9b20b2dced865d5d3e3eb999235) + +#### [1.1.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.1.0...1.1.1) + +> 22 September 2022 + +- Chore: 🍰 Release v1.1.1 – Refactor Rebranding [`#5392`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5392) +- chore: 🍰 Refactor Rebranding [`#5390`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5390) +- feat: 🍰 Tooltips For Topics [`#5350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5350) +- feat: 🍰 Save Categories In Frontend [`#5284`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5284) +- feat: 🍰 Add New Yunite Icons [`#5319`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5319) +- chore: 🍰 Update Neode From v^0.4.7 To v^0.4.8 In Backend [`#5334`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5334) - fix: Category Filter Menu Client Only [`#5301`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5301) - feat: Save Category Settings [`#5261`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5261) -- feat: 🍰 Implement `UpdateGroup` Resolver [`#5224`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5224) - feat: Topics Menu [`#5248`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5248) - docs: 🍰 Document GraqhQL Playground [`#5253`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5253) - feat: Categories Filter Menu [`#5198`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5198) -- feat: 🍰 Implement `JoinGroup`, `GroupMember`, `SwitchGroupMemberRole` Resolvers [`#5199`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5199) - fix: 🍰 Fix Test Description From `enter-nonce.vue` To `change-password` [`#5217`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5217) - Bump cookie-universal-nuxt from 2.1.5 to 2.2.2 in /webapp [`#5218`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5218) - Bump prettier from 2.2.1 to 2.7.1 in /webapp [`#5170`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5170) @@ -69,12 +141,10 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - feat: 🍰 Change Error Message With `Authorised` To `Authorized` All Over The Place To Have American English [`#5206`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5206) - Bump cross-env from 7.0.2 to 7.0.3 in /webapp [`#5168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5168) - chore: 🍰 Add `--logHeapUsage` To Jest Test Call [`#5182`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5182) -- chore: 🍰 Add Groups To Seeding [`#5185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5185) -- feat: 🍰 Implement Group GQL Model And CRUD Resolvers – First Step [`#5139`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5139) - refactor: 🍰 Rename `UserGroup` To `UserRole` [`#5143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5143) -- improved code and tests as suggested by @tirokk, thanks for the great review! [`631f34a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/631f34a2e5224d68279337a92e7535794b670d70) -- implement and test post visibilty when leaving or changing the role in a group [`76bfe48`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/76bfe484768cf9b20b2dced865d5d3e3eb999235) -- comment out LanguagesFilter, EmotionsFilter, fix tests, fix lint [`52dcd77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/52dcd772fa81e02a0d95e89a9fc8232e70a09d28) +- add new yunite icons [`bb0d632`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/bb0d6329e7e36ea03671318ea8dd128a6d5a5a7a) +- cleanup refactor rebranding [`5f5c0fa`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5f5c0faa1f28cd4df7681eba335ae5998b2d9cca) +- change color and scss in branding [`52070b8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/52070b8c570970bf48df561134bf67cb4111b640) #### [1.1.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.9...1.1.0) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 27a4ed15a..650785331 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -105,7 +105,7 @@ Sprint retrospective ## Philosophy -We practise [collective code ownership](http://www.extremeprogramming.org/rules/collective.html) rather than strong code ownership, which means that: +We practice [collective code ownership](http://www.extremeprogramming.org/rules/collective.html) rather than strong code ownership, which means that: * developers can make contributions to other people's PRs (after checking in with them) * we avoid blocking because someone else isn't working, so we sometimes take over PRs from other developers @@ -115,7 +115,7 @@ We believe in open source contributions as a learning experience – everyone is We use pair programming sessions as a tool for knowledge sharing. We can learn a lot from each other and only by sharing what we know and overcoming challenges together can we grow as a team and truly own this project collectively. -As a volunteeer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you! +As a volunteer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you! + +## Programming + +### Localization + +#### Quotation Marks + +The following characters are different from the programming quotation mark: + +`"` or `\"` + +Please copy and paste the following quotes for the languages: + +* de: „Dies ist ein Beispielsatz.“ +* en: “This is a sample sentence.” + * See + +## Docker – More Closely + +### Apple M1 Platform + +***Attention:** For using Docker commands in Apple M1 environments!* + +#### Environment Variable For Apple M1 Platform + +If you encounter trouble building the docker containers on an Apple M1 chip you can try to explicitly define the target platform docker builds and pulls images for: + +```bash +# set env variable for your shell +$ export DOCKER_DEFAULT_PLATFORM=linux/amd64 +``` + +Or alternatively use a `YAML` docker compose overwrite file with `platform: linux/amd64`. + +### Analyzing Docker Builds + +To analyze a Docker build, there is a wonderful tool called [dive](https://github.com/wagoodman/dive). Please sponsor if you're using it! + +The `dive build` command is exactly the right one to fulfill what we are looking for. +We can use it just like the `docker build` command and get an analysis afterwards. + +So, in our main folder, we use it in the following way: + +```bash +# in main folder +$ dive build --target -t "ocelotsocialnetwork/:local-" --build-arg BBUILD_DATE="" --build-arg BBUILD_VERSION="" --build-arg BBUILD_COMMIT="" / +``` + +The build arguments are optional. + +For the specific applications, we use them as follows. + +#### Backend + +##### Production For Backend + +```bash +# in main folder +$ dive build --target production -t "ocelotsocialnetwork/backend:local-production" backend/ +``` + +##### Development For Backend + +```bash +# in main folder +$ dive build --target development -t "ocelotsocialnetwork/backend:local-development" backend/ +``` + +#### Webapp + +##### Production For Webapp + +```bash +# in main folder +$ dive build --target production -t "ocelotsocialnetwork/webapp:local-production" webapp/ +``` + +##### Development For Webapp + +```bash +# in main folder +$ dive build --target development -t "ocelotsocialnetwork/webapp:local-development" webapp/ +``` diff --git a/DOCKER_MORE_CLOSELY.md b/DOCKER_MORE_CLOSELY.md deleted file mode 100644 index 03e6417ec..000000000 --- a/DOCKER_MORE_CLOSELY.md +++ /dev/null @@ -1,86 +0,0 @@ -# Docker More Closely - -## Apple M1 Platform - -***Attention:** For using Docker commands in Apple M1 environments!* - -### Enviroment Variable For Apple M1 Platform - -To set the Docker platform environment variable in your terminal tab, run: - -```bash -# set env variable for your shell -$ export DOCKER_DEFAULT_PLATFORM=linux/amd64 -``` - -### Docker Compose Override File For Apple M1 Platform - -For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform: - -```bash -# in main folder - -# for development -$ docker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.apple-m1.override.yml up -# only once: init admin user and create indexes and contraints in Neo4j database -$ docker compose exec backend yarn prod:migrate init -# clean db -$ docker compose exec backend yarn db:reset -# seed db -$ docker compose exec backend yarn db:seed - -# for production -$ docker compose -f docker-compose.yml -f docker-compose.apple-m1.override.yml up -# only once: init admin user and create indexes and contraints in Neo4j database -$ docker compose exec backend /bin/sh -c "yarn prod:migrate init" -``` - -## Analysing Docker Builds - -To analyze a Docker build, there is a wonderful tool called [dive](https://github.com/wagoodman/dive). Please sponsor if you're using it! - -The `dive build` command is exactly the right one to fulfill what we are looking for. -We can use it just like the `docker build` command and get an analysis afterwards. - -So, in our main folder, we use it in the following way: - -```bash -# in main folder -$ dive build --target -t "ocelotsocialnetwork/:local-" --build-arg BBUILD_DATE="" --build-arg BBUILD_VERSION="" --build-arg BBUILD_COMMIT="" / -``` - -The build arguments are optional. - -For the specific applications, we use them as follows. - -### Backend - -#### Production For Backend - -```bash -# in main folder -$ dive build --target production -t "ocelotsocialnetwork/backend:local-production" backend/ -``` - -#### Development For Backend - -```bash -# in main folder -$ dive build --target development -t "ocelotsocialnetwork/backend:local-development" backend/ -``` - -### Webapp - -#### Production For Webapp - -```bash -# in main folder -$ dive build --target production -t "ocelotsocialnetwork/webapp:local-production" webapp/ -``` - -#### Development For Webapp - -```bash -# in main folder -$ dive build --target development -t "ocelotsocialnetwork/webapp:local-development" webapp/ -``` diff --git a/README.md b/README.md index f0688f820..8ddf97fe5 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,71 @@ At the same time, it should be possible in the future to link these networks wit In other words, we are interested in a network of networks and in keeping the data as close as possible to the user and the operator they trusts. -## Introduction +## Screenshots + +Post feed + +Check out more screenshots [here](/wiki/en:Screenshots). + +## Features + +Ocelot.social networks feature: +* user accounts +* user roles +* posts and comments +* groups +* maps +* search +* filters +* and more … + +Check out the [full feature list](/wiki/en:FAQ#what-are-the-features). + +## User Guide and Frequently Asked Questions + +In the [wiki](/wiki) you can find more information. + +* [User Guide](/wiki/en:User-Guide) +* [Frequently Asked Questions](/wiki/en:FAQ) + +## Demo + +Try out our live demo network, see [here](#live-demo-and-developer-logins). + +## Help us + +If you're wondering how you could help, there are plenty of ways, e.g.: + +* Spread the good word about ocelot.social to make it more popular: + * Add the link [ocelot.social](https://ocelot.social) to your website. + * Give ocelot.social a Like at https://alternativeto.net/software/ocelot-social/. + * Star our project on GitHub at https://github.com/Ocelot-Social-Community/Ocelot-Social/. + * Promote it on your social networks. + * Tell your friends about it by word-of-mouth. + * Write a press article on ocelot.social or contact the editorial office of your local newspage or radio station. +* Take a [good first issue](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) or issues that need help. Make sure to read [CONTRIBUTING.md](/CONTRIBUTING.md) first though. +* Testing and [reporting](/issues/new/choose) bugs. +* Translating: Please [contact us](#contact). +* Reviewing and testing pull requests. + +## Donate + +Your donation is very welcome and helps to enhance and improve the network. This software is mostly developped and maintained by the association [busFaktor() e.V.](https://www.busfaktor.org/en). Please support us with a [donation](https://www.busfaktor.org/en/donations) to busFaktor() e.V.. Thanks a lot! ❤️ + +## Contact + +Are you interested in operating your own ocelot.social network or becoming a user? Please contact us here: +* [hello@ocelot.social](mailto:hello@ocelot.social) +* [Discord](https://discord.com/invite/DFSjPaX) + +## For Developers and Contributors + +### Introduction Have a look into our short video: [ocelot.social - GitHub - Developer Welcome - Tutorial (english)](https://www.youtube.com/watch?v=gZSL6KvBIiY&list=PLFMD5liPP01kbuReHxYXxv_1fI5rIgS1f&index=1) -## Directory Layout +### Directory Layout There are three important directories: @@ -41,9 +100,9 @@ There are two approaches: 1. [Local](#local-installation) installation, which means you have to take care of dependencies yourself. 2. **Or** Install everything through [Docker](#docker-installation) which takes care of dependencies for you. -## Installation +### Installation -### Clone the Repository +#### Clone the Repository Clone the repository, this will create a new folder called `Ocelot-Social`: @@ -65,7 +124,7 @@ Change into the new folder. $ cd Ocelot-Social ``` -## Live Demo And Developer Logins +### Live Demo And Developer Logins **Try out our deployed [development environment](https://stage.ocelot.social).** @@ -74,7 +133,7 @@ Visit our staging networks: * central staging network: [stage.ocelot.social](https://stage.ocelot.social) -### Login +#### Login Logins for the live demos and developers (local developers after the following installations) in the browser: @@ -84,11 +143,11 @@ Logins for the live demos and developers (local developers after the following i | `moderator@example.org` | 1234 | moderator | | `admin@example.org` | 1234 | admin | -### Docker Installation +#### Docker Installation Docker is a software development container tool that combines software and its dependencies into one standardized unit that contains everything needed to run it. This helps us to avoid problems with dependencies and makes installation easier. -#### General Installation of Docker +##### General Installation of Docker There are [several ways to install Docker CE](https://docs.docker.com/install/) on your computer or server. @@ -105,7 +164,7 @@ $ docker-compose --version docker-compose version 1.23.2 ``` -#### Start Ocelot-Social via Docker-Compose +##### Start Ocelot-Social via Docker-Compose Prepare ENVs once beforehand: @@ -152,11 +211,11 @@ $ docker-compose exec backend yarn run db:seed For a closer description see [backend README.md](./backend/README.md). For a full documentation see [SUMMARY](./SUMMARY.md). -### Local Installation +#### Local Installation For a full documentation see [SUMMARY](./SUMMARY.md). -## Contributing +### Contributing Choose an issue (consider our label [good-first-issue](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)) and leave a comment there. We will then invite you to join our volunteers team. To have the necessary permission to push directly to this repository, please accept our invitation to join our volunteers team, you will receive via the email, Github will send you, once invited. If we did not invite you yet, please request an invitation via Discord. @@ -182,7 +241,7 @@ $ yarn test Check out our [contribution guideline](./CONTRIBUTING.md), too! -### Developer Chat +#### Developer Chat Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat: Just introduce yourself at `#introduce-yourself` and mention a mentor or `@@Mentors` to get you onboard :neckbeard: @@ -190,13 +249,13 @@ Just introduce yourself at `#introduce-yourself` and mention a mentor or `@@Ment We give write permissions to every developer who asks for it. Just text us on [Discord](https://discord.gg/AJSX9DCSUA). -## Deployment +### Deployment Deployment methods can be found in the [Ocelot-Social-Deploy-Rebranding](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding) repository. The only deployment method in this repository for development purposes as described above is `docker-compose`. -## Technology Stack +### Technology Stack * [VueJS](https://vuejs.org/) * [NuxtJS](https://nuxtjs.org/) @@ -204,7 +263,7 @@ The only deployment method in this repository for development purposes as descri * [NodeJS](https://nodejs.org/en/) * [Neo4J](https://neo4j.com/) -### For Testing +#### For Testing * [Cypress](https://docs.cypress.io/) * [Storybook](https://storybook.js.org/) @@ -212,7 +271,7 @@ The only deployment method in this repository for development purposes as descri * [Vue Test Utils](https://vue-test-utils.vuejs.org/) * [ESLint](https://eslint.org/) -## Attributions +### Attributions Locale Icons made by [Freepik](http://www.freepik.com/) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/). @@ -220,6 +279,6 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/) BrowserStack Logo -## License +### License See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT). diff --git a/backend/.nvmrc b/backend/.nvmrc index e4ab7d287..cb77acbfe 100644 --- a/backend/.nvmrc +++ b/backend/.nvmrc @@ -1 +1 @@ -v12.19.0 \ No newline at end of file +v19.4.0 \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile index 6c2f72bd3..c04cd9bc9 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BASE (Is pushed to DockerHub for rebranding) ################################### ################################################################################## -FROM node:12.19.0-alpine3.10 as base +FROM node:19.4.0-alpine3.17 as base # ENVs ## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame @@ -35,7 +35,7 @@ LABEL maintainer="devops@ocelot.social" # Install Additional Software ## install: git -RUN apk --no-cache add git +RUN apk --no-cache add git python3 make g++ # Settings ## Expose Container Port diff --git a/backend/README.md b/backend/README.md index 0af58af48..03724ce54 100644 --- a/backend/README.md +++ b/backend/README.md @@ -19,12 +19,19 @@ Wait a little until your backend is up and running at [http://localhost:4000/](h ## Installation without Docker For the local installation you need a recent version of -[node](https://nodejs.org/en/) (>= `v10.12.0`). We are using -`12.19.0` and therefore we recommend to use the same version +[Node](https://nodejs.org/en/) (>= `v16.19.0`). We are using +`v19.4.0` and therefore we recommend to use the same version ([see](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4082) some known problems with more recent node versions). You can use the -[node version manager](https://github.com/nvm-sh/nvm) to switch -between different local node versions. +[node version manager](https://github.com/nvm-sh/nvm) `nvm` to switch +between different local Node versions: + +```bash +# install Node +$ cd backend +$ nvm install v19.4.0 +$ nvm use v19.4.0 +``` Install node dependencies with [yarn](https://yarnpkg.com/en/): @@ -32,6 +39,10 @@ Install node dependencies with [yarn](https://yarnpkg.com/en/): # in main folder $ cd backend $ yarn install +# or just +$ yarn +# or just later on to use version of ".nvmrc" file +$ nvm use && yarn ``` Copy Environment Variables: @@ -68,9 +79,9 @@ More details about our GraphQL playground and how to use it with ocelot.social c ![GraphQL Playground](../.gitbook/assets/graphql-playground.png) -### Database Indices and Constraints +### Database Indexes and Constraints -Database indices and constraints need to be created when the database and the +Database indexes and constraints need to be created when the database and the backend is running: {% tabs %} @@ -78,7 +89,13 @@ backend is running: ```bash # in main folder while docker-compose is running -$ docker-compose exec backend yarn run db:migrate init +$ docker exec backend yarn run db:migrate init + +# only once: init admin user and create indexes and constraints in Neo4j database +# for development +$ docker compose exec backend yarn prod:migrate init +# in production mode use command +$ docker compose exec backend /bin/sh -c "yarn prod:migrate init" ``` {% endtab %} @@ -105,18 +122,18 @@ In another terminal run: ```bash # in main folder while docker-compose is running -$ docker-compose exec backend yarn run db:seed +$ docker exec backend yarn run db:seed ``` To reset the database run: ```bash # in main folder while docker-compose is running -$ docker-compose exec backend yarn run db:reset +$ docker exec backend yarn run db:reset # you could also wipe out your neo4j database and delete all volumes with: $ docker-compose down -v -# if container is not running, run this command to set up your database indeces and contstraints -$ docker-compose exec backend yarn run db:migrate init +# if container is not running, run this command to set up your database indexes and constraints +$ docker exec backend yarn run db:migrate init ``` {% endtab %} @@ -159,7 +176,7 @@ To run the migration: ```bash # in main folder while docker-compose is running -$ docker-compose exec backend yarn run db:migrate up +$ docker exec backend yarn run db:migrate up ``` {% endtab %} @@ -195,7 +212,7 @@ Run the unit tests: ```bash # in main folder while docker-compose is running -$ docker-compose exec backend yarn run test +$ docker exec backend yarn run test ``` {% endtab %} diff --git a/backend/jest.config.js b/backend/jest.config.js new file mode 100644 index 000000000..aabb59083 --- /dev/null +++ b/backend/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + verbose: true, + collectCoverage: true, + collectCoverageFrom: [ + '**/*.js', + '!**/node_modules/**', + '!**/test/**', + '!**/dist/**', + '!**/src/**/?(*.)+(spec|test).js?(x)' + ], + coverageReporters: ['lcov', 'text'], + testMatch: ['**/src/**/?(*.)+(spec|test).js?(x)'], + setupFilesAfterEnv: ['/test/setup.js'] +} diff --git a/backend/package.json b/backend/package.json index fd285a3b4..3f7098206 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-backend", - "version": "2.2.0", + "version": "2.4.0", "description": "GraphQL Backend for ocelot.social", "repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social", "author": "ocelot.social Community", @@ -15,29 +15,13 @@ "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", - "test": "cross-env NODE_ENV=test NODE_OPTIONS=--max-old-space-size=8192 jest --forceExit --detectOpenHandles --runInBand --coverage --logHeapUsage", + "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: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" }, - "jest": { - "verbose": true, - "collectCoverageFrom": [ - "**/*.js", - "!**/node_modules/**", - "!**/test/**", - "!**/dist/**", - "!**/src/**/?(*.)+(spec|test).js?(x)" - ], - "coverageReporters": [ - "lcov" - ], - "testMatch": [ - "**/src/**/?(*.)+(spec|test).js?(x)" - ] - }, "dependencies": { "@babel/cli": "~7.8.4", "@babel/core": "~7.9.0", @@ -81,22 +65,22 @@ "linkifyjs": "~2.1.8", "lodash": "~4.17.14", "merge-graphql-schemas": "^1.7.8", - "metascraper": "^5.11.8", - "metascraper-audio": "^5.14.26", - "metascraper-author": "^5.14.22", + "metascraper": "^5.33.5", + "metascraper-audio": "^5.33.5", + "metascraper-author": "^5.33.5", "metascraper-clearbit-logo": "^5.3.0", - "metascraper-date": "^5.11.8", - "metascraper-description": "^5.23.1", - "metascraper-image": "^5.11.8", - "metascraper-lang": "^5.23.1", + "metascraper-date": "^5.33.5", + "metascraper-description": "^5.33.5", + "metascraper-image": "^5.33.5", + "metascraper-lang": "^5.33.5", "metascraper-lang-detector": "^4.10.2", - "metascraper-logo": "^5.14.26", - "metascraper-publisher": "^5.23.0", - "metascraper-soundcloud": "^5.23.0", - "metascraper-title": "^5.11.8", - "metascraper-url": "^5.14.26", - "metascraper-video": "^5.11.8", - "metascraper-youtube": "^5.23.0", + "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-video": "^5.33.5", + "metascraper-youtube": "^5.33.5", "migrate": "^1.7.0", "mime-types": "^2.1.26", "minimatch": "^3.0.4", @@ -132,13 +116,15 @@ "eslint-plugin-prettier": "~3.4.1", "eslint-plugin-promise": "~4.3.1", "eslint-plugin-standard": "~4.0.1", - "jest": "~25.3.0", + "jest": "29.4", "nodemon": "~2.0.2", "prettier": "~2.3.2", "rosie": "^2.0.1", "supertest": "~4.0.2" }, "resolutions": { - "fs-capacitor": "6.0.0" + "**/**/fs-capacitor": "^6.2.0", + "**/graphql-upload": "^11.0.0", + "nan": "2.17.0" } } diff --git a/backend/src/activitypub/routes/webfinger.spec.js b/backend/src/activitypub/routes/webfinger.spec.js index 8b0e5ff55..33b4f552f 100644 --- a/backend/src/activitypub/routes/webfinger.spec.js +++ b/backend/src/activitypub/routes/webfinger.spec.js @@ -33,6 +33,7 @@ beforeAll(async () => { 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 diff --git a/backend/src/constants/groups.js b/backend/src/constants/groups.js index e9c941a89..aec19eac5 100644 --- a/backend/src/constants/groups.js +++ b/backend/src/constants/groups.js @@ -1,3 +1,3 @@ // this file is duplicated in `backend/src/constants/group.js` and `webapp/constants/group.js` -export const DESCRIPTION_WITHOUT_HTML_LENGTH_MIN = 100 // with removed HTML tags +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/db/factories.js b/backend/src/db/factories.js index 3e164d51b..ecc792736 100644 --- a/backend/src/db/factories.js +++ b/backend/src/db/factories.js @@ -65,7 +65,6 @@ Factory.define('basicUser') name: faker.name.findName, password: '1234', role: 'user', - about: faker.lorem.paragraph, termsAndConditionsAgreedVersion: '0.0.1', termsAndConditionsAgreedAt: '2019-08-01T10:47:19.212Z', allowEmbedIframes: false, @@ -82,12 +81,28 @@ Factory.define('basicUser') Factory.define('userWithoutEmailAddress') .extend('basicUser') + .option('about', faker.lorem.paragraph) + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('userWithAboutNull') + .extend('basicUser') + .option('about', null) + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('userWithAboutEmpty') + .extend('basicUser') + .option('about', '') .after(async (buildObject, options) => { return neode.create('User', buildObject) }) Factory.define('user') .extend('basicUser') + .option('about', faker.lorem.paragraph) .option('email', faker.internet.exampleEmail) .option('avatar', () => Factory.build('image', { diff --git a/backend/src/db/migrate/store.js b/backend/src/db/migrate/store.js index 57a317b47..ac762647b 100644 --- a/backend/src/db/migrate/store.js +++ b/backend/src/db/migrate/store.js @@ -85,7 +85,7 @@ class Store { await createDefaultAdminUser(session) if (CONFIG.CATEGORIES_ACTIVE) await createCategories(session) const writeTxResultPromise = session.writeTransaction(async (txc) => { - await txc.run('CALL apoc.schema.assert({},{},true)') // drop all indices and contraints + await txc.run('CALL apoc.schema.assert({},{},true)') // drop all indices and constraints return Promise.all( [ 'CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])', diff --git a/backend/src/helpers/jest.js b/backend/src/helpers/jest.js index e3f6a3c84..09744e9f2 100644 --- a/backend/src/helpers/jest.js +++ b/backend/src/helpers/jest.js @@ -1,13 +1,3 @@ -// TODO: can be replaced with: (which is no a fake) -// import gql from 'graphql-tag' -// See issue: https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/5152 - -//* This is a fake ES2015 template string, just to benefit of syntax -// highlighting of `gql` template strings in certain editors. -export function gql(strings) { - return strings.join('') -} - // sometime we have to wait to check a db state by having a look into the db in a certain moment // or we wait a bit to check if we missed to set an await somewhere // see: https://www.sitepoint.com/delay-sleep-pause-wait/ diff --git a/backend/src/helpers/walkRecursive.js b/backend/src/helpers/walkRecursive.js index 85900eeba..26a3a01b2 100644 --- a/backend/src/helpers/walkRecursive.js +++ b/backend/src/helpers/walkRecursive.js @@ -2,24 +2,26 @@ * iterate through all fields and replace it with the callback result * @property data Array * @property fields Array + * @property fieldName String * @property callback Function */ -function walkRecursive(data, fields, 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 - data = callback(data, _key) + const key = _key.split('!') + if (key.length === 1 || key[1] !== fieldName) data = callback(data, key[0]) } else if (data && Array.isArray(data)) { // go into the rabbit hole and dig through that array data.forEach((res, index) => { - data[index] = walkRecursive(data[index], fields, callback, index) + data[index] = walkRecursive(data[index], fields, fieldName, callback, index) }) } else if (data && typeof data === 'object') { // lets get some keys and stir them Object.keys(data).forEach((k) => { - data[k] = walkRecursive(data[k], fields, callback, k) + data[k] = walkRecursive(data[k], fields, fieldName, callback, k) }) } return data diff --git a/backend/src/jwt/decode.spec.js b/backend/src/jwt/decode.spec.js index bb247f028..84caba736 100644 --- a/backend/src/jwt/decode.spec.js +++ b/backend/src/jwt/decode.spec.js @@ -36,6 +36,7 @@ beforeAll(async () => { 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 diff --git a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js index 19f60556f..10d53ab7b 100644 --- a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js +++ b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js @@ -1,4 +1,4 @@ -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { cleanDatabase } from '../../db/factories' import { createTestClient } from 'apollo-server-testing' import { getNeode, getDriver } from '../../db/neo4j' @@ -50,6 +50,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/middleware/helpers/email/templateBuilder.spec.js b/backend/src/middleware/helpers/email/templateBuilder.spec.js index 7b4310483..d5b0edf21 100644 --- a/backend/src/middleware/helpers/email/templateBuilder.spec.js +++ b/backend/src/middleware/helpers/email/templateBuilder.spec.js @@ -80,14 +80,6 @@ const testEmailData = (emailTemplate, templateBuilder, templateData, texts) => { return emailTemplate } -// beforeAll(async () => { -// await cleanDatabase() -// }) - -// afterAll(async () => { -// await cleanDatabase() -// }) - describe('templateBuilder', () => { describe('signupTemplate', () => { describe('multi language', () => { diff --git a/backend/src/middleware/languages/languages.spec.js b/backend/src/middleware/languages/languages.spec.js index b22de9148..f4f57adc4 100644 --- a/backend/src/middleware/languages/languages.spec.js +++ b/backend/src/middleware/languages/languages.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -28,6 +28,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) const createPostMutation = gql` diff --git a/backend/src/middleware/login/loginMiddleware.js b/backend/src/middleware/login/loginMiddleware.js index 3cd2158c2..abf0d0b18 100644 --- a/backend/src/middleware/login/loginMiddleware.js +++ b/backend/src/middleware/login/loginMiddleware.js @@ -10,10 +10,13 @@ const sendSignupMail = async (resolve, root, args, context, resolveInfo) => { const { inviteCode } = args const response = await resolve(root, args, context, resolveInfo) const { email, nonce } = response - if (inviteCode) { - await sendMail(signupTemplate({ email, variables: { nonce, inviteCode } })) - } else { - await sendMail(signupTemplate({ email, variables: { nonce } })) + if (nonce) { + // emails that already exist do not have a nonce + if (inviteCode) { + await sendMail(signupTemplate({ email, variables: { nonce, inviteCode } })) + } else { + await sendMail(signupTemplate({ email, variables: { nonce } })) + } } delete response.nonce return response @@ -30,7 +33,9 @@ const sendPasswordResetMail = async (resolve, root, args, context, resolveInfo) const sendEmailVerificationMail = async (resolve, root, args, context, resolveInfo) => { const response = await resolve(root, args, context, resolveInfo) const { email, nonce, name } = response - await sendMail(emailVerificationTemplate({ email, variables: { nonce, name } })) + if (nonce) { + await sendMail(emailVerificationTemplate({ email, variables: { nonce, name } })) + } delete response.nonce return response } diff --git a/backend/src/middleware/notifications/notificationsMiddleware.spec.js b/backend/src/middleware/notifications/notificationsMiddleware.spec.js index 6c06ac072..a8a5d396b 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.spec.js +++ b/backend/src/middleware/notifications/notificationsMiddleware.spec.js @@ -1,4 +1,4 @@ -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { cleanDatabase } from '../../db/factories' import { createTestClient } from 'apollo-server-testing' import { getNeode, getDriver } from '../../db/neo4j' @@ -56,6 +56,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/middleware/orderByMiddleware.spec.js b/backend/src/middleware/orderByMiddleware.spec.js index cc3cf7a94..7453cf301 100644 --- a/backend/src/middleware/orderByMiddleware.spec.js +++ b/backend/src/middleware/orderByMiddleware.spec.js @@ -1,4 +1,4 @@ -import { gql } from '../helpers/jest' +import gql from 'graphql-tag' import { cleanDatabase } from '../db/factories' import { getNeode, getDriver } from '../db/neo4j' import { createTestClient } from 'apollo-server-testing' @@ -24,6 +24,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/middleware/permissionsMiddleware.spec.js b/backend/src/middleware/permissionsMiddleware.spec.js index 9d71314bb..667e74164 100644 --- a/backend/src/middleware/permissionsMiddleware.spec.js +++ b/backend/src/middleware/permissionsMiddleware.spec.js @@ -1,7 +1,7 @@ import { createTestClient } from 'apollo-server-testing' import createServer from '../server' import Factory, { cleanDatabase } from '../db/factories' -import { gql } from '../helpers/jest' +import gql from 'graphql-tag' import { getDriver, getNeode } from '../db/neo4j' import CONFIG from '../config' @@ -28,6 +28,7 @@ describe('authorization', () => { 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 diff --git a/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.js index cfcd71ab7..b0b2371b2 100644 --- a/backend/src/middleware/slugifyMiddleware.spec.js +++ b/backend/src/middleware/slugifyMiddleware.spec.js @@ -33,6 +33,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { @@ -152,7 +153,7 @@ describe('slugifyMiddleware', () => { }) describe('but if the client specifies a slug', () => { - it('rejects CreateGroup', async (done) => { + it('rejects CreateGroup', async () => { try { await expect( mutate({ @@ -171,7 +172,6 @@ describe('slugifyMiddleware', () => { }, ], }) - done() } catch (error) { throw new Error(` ${error} @@ -258,7 +258,7 @@ describe('slugifyMiddleware', () => { }) describe('setting slug explicitly', () => { - it('rejects UpdateGroup', async (done) => { + it('rejects UpdateGroup', async () => { try { await expect( mutate({ @@ -275,7 +275,6 @@ describe('slugifyMiddleware', () => { }, ], }) - done() } catch (error) { throw new Error(` ${error} @@ -382,7 +381,7 @@ describe('slugifyMiddleware', () => { }) describe('but if the client specifies a slug', () => { - it('rejects CreatePost', async (done) => { + it('rejects CreatePost', async () => { try { await expect( mutate({ @@ -402,7 +401,6 @@ describe('slugifyMiddleware', () => { }, ], }) - done() } catch (error) { throw new Error(` ${error} diff --git a/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js b/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js index a4d32c4a7..88d46a1c7 100644 --- a/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js +++ b/backend/src/middleware/softDelete/softDeleteMiddleware.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -195,6 +195,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('softDeleteMiddleware', () => { diff --git a/backend/src/middleware/userInteractions.spec.js b/backend/src/middleware/userInteractions.spec.js index 3846e1e8e..94d1ff274 100644 --- a/backend/src/middleware/userInteractions.spec.js +++ b/backend/src/middleware/userInteractions.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../db/factories' -import { gql } from '../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../db/neo4j' import createServer from '../server' import { createTestClient } from 'apollo-server-testing' @@ -42,6 +42,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('middleware/userInteractions', () => { diff --git a/backend/src/middleware/validation/validationMiddleware.spec.js b/backend/src/middleware/validation/validationMiddleware.spec.js index b6bcafa9b..2e1cd6fa7 100644 --- a/backend/src/middleware/validation/validationMiddleware.spec.js +++ b/backend/src/middleware/validation/validationMiddleware.spec.js @@ -1,4 +1,4 @@ -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import Factory, { cleanDatabase } from '../../db/factories' import { getNeode, getDriver } from '../../db/neo4j' import { createTestClient } from 'apollo-server-testing' @@ -75,6 +75,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/middleware/xssMiddleware.js b/backend/src/middleware/xssMiddleware.js index 9c528b589..9b15e9712 100644 --- a/backend/src/middleware/xssMiddleware.js +++ b/backend/src/middleware/xssMiddleware.js @@ -1,15 +1,22 @@ import walkRecursive from '../helpers/walkRecursive' import { cleanHtml } from '../middleware/helpers/cleanHtml.js' -const fields = ['content', 'contentExcerpt', 'reasonDescription'] +// exclamation mark separetes field names, that should not be sanitized +const fields = [ + 'content', + 'contentExcerpt', + 'reasonDescription', + 'description!embed', + 'descriptionExcerpt', +] export default { Mutation: async (resolve, root, args, context, info) => { - args = walkRecursive(args, fields, cleanHtml) + args = walkRecursive(args, fields, info.fieldName, cleanHtml) return resolve(root, args, context, info) }, Query: async (resolve, root, args, context, info) => { const result = await resolve(root, args, context, info) - return walkRecursive(result, fields, cleanHtml) + return walkRecursive(result, fields, info.fieldName, cleanHtml) }, } diff --git a/backend/src/models/User.spec.js b/backend/src/models/User.spec.js index c64d1fd37..17f2fe0a9 100644 --- a/backend/src/models/User.spec.js +++ b/backend/src/models/User.spec.js @@ -1,6 +1,7 @@ import { cleanDatabase } from '../db/factories' -import { getNeode } from '../db/neo4j' +import { getNeode, getDriver } from '../db/neo4j' +const driver = getDriver() const neode = getNeode() beforeAll(async () => { @@ -9,6 +10,7 @@ beforeAll(async () => { 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 @@ -37,11 +39,10 @@ describe('slug', () => { ) }) - it('must be unique', async (done) => { + it('must be unique', async () => { await neode.create('User', { slug: 'Matt' }) try { await expect(neode.create('User', { slug: 'Matt' })).rejects.toThrow('already exists') - done() } catch (error) { throw new Error(` ${error} diff --git a/backend/src/schema/index.js b/backend/src/schema/index.js index 06e150c86..07721bceb 100644 --- a/backend/src/schema/index.js +++ b/backend/src/schema/index.js @@ -11,7 +11,7 @@ export default makeAugmentedSchema({ 'Badge', 'Embed', 'EmailAddress', - 'Notfication', + 'Notification', 'Statistics', 'LoggedInUser', 'Location', diff --git a/backend/src/schema/resolvers/Upload.js b/backend/src/schema/resolvers/Upload.js new file mode 100644 index 000000000..2a2525f0f --- /dev/null +++ b/backend/src/schema/resolvers/Upload.js @@ -0,0 +1,7 @@ +import { GraphQLUpload } from 'graphql-upload' + +export default { + // This maps the `Upload` scalar to the implementation provided + // by the `graphql-upload` package. + Upload: GraphQLUpload, +} diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js index 33b33ed3e..b2730dad4 100644 --- a/backend/src/schema/resolvers/comments.spec.js +++ b/backend/src/schema/resolvers/comments.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { createTestClient } from 'apollo-server-testing' import createServer from '../../server' import { getNeode, getDriver } from '../../db/neo4j' @@ -25,6 +25,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/donations.spec.js b/backend/src/schema/resolvers/donations.spec.js index 11df0c67b..9fc010eca 100644 --- a/backend/src/schema/resolvers/donations.spec.js +++ b/backend/src/schema/resolvers/donations.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -37,6 +37,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('donations', () => { diff --git a/backend/src/schema/resolvers/emails.js b/backend/src/schema/resolvers/emails.js index 8f6b1c651..d705781ca 100644 --- a/backend/src/schema/resolvers/emails.js +++ b/backend/src/schema/resolvers/emails.js @@ -40,7 +40,9 @@ export default { } // check email does not belong to anybody - await existingEmailAddress({ args, context }) + const existingEmail = await existingEmailAddress({ args, context }) + if (existingEmail && existingEmail.alreadyExistingEmail && existingEmail.user) + return existingEmail.alreadyExistingEmail const nonce = generateNonce() const { diff --git a/backend/src/schema/resolvers/emails.spec.js b/backend/src/schema/resolvers/emails.spec.js index b527ca3b0..02a631495 100644 --- a/backend/src/schema/resolvers/emails.spec.js +++ b/backend/src/schema/resolvers/emails.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getDriver, getNeode } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -30,6 +30,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { @@ -134,11 +135,17 @@ describe('AddEmailAddress', () => { }) describe('but if another user owns an `EmailAddress` already with that email', () => { - it('throws UserInputError because of unique constraints', async () => { + it('does not throw UserInputError', async () => { await Factory.build('user', {}, { email: 'new-email@example.org' }) await expect(mutate({ mutation, variables })).resolves.toMatchObject({ - data: { AddEmailAddress: null }, - errors: [{ message: 'A user account with this email already exists.' }], + data: { + AddEmailAddress: { + createdAt: expect.any(String), + verifiedAt: null, + email: 'new-email@example.org', + }, + }, + errors: undefined, }) }) }) diff --git a/backend/src/schema/resolvers/embeds.spec.js b/backend/src/schema/resolvers/embeds.spec.js index b7ce7ab63..0f0d41357 100644 --- a/backend/src/schema/resolvers/embeds.spec.js +++ b/backend/src/schema/resolvers/embeds.spec.js @@ -3,7 +3,7 @@ import fs from 'fs' import path from 'path' import { createTestClient } from 'apollo-server-testing' import createServer from '../../server' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' jest.mock('node-fetch') const { Response } = jest.requireActual('node-fetch') @@ -96,7 +96,7 @@ describe('Query', () => { description: null, html: null, image: null, - lang: null, + lang: 'false', publisher: null, sources: ['resource'], title: null, diff --git a/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js index e0b2a277a..0d9d524ff 100644 --- a/backend/src/schema/resolvers/follow.spec.js +++ b/backend/src/schema/resolvers/follow.spec.js @@ -2,7 +2,7 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' import { getDriver, getNeode } from '../../db/neo4j' import createServer from '../../server' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' const driver = getDriver() const neode = getNeode() @@ -71,6 +71,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/groups.spec.js b/backend/src/schema/resolvers/groups.spec.js index e122eeb13..3b84f4b42 100644 --- a/backend/src/schema/resolvers/groups.spec.js +++ b/backend/src/schema/resolvers/groups.spec.js @@ -252,6 +252,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('in mode', () => { diff --git a/backend/src/schema/resolvers/helpers/existingEmailAddress.js b/backend/src/schema/resolvers/helpers/existingEmailAddress.js index 717d0d904..288a14a6d 100644 --- a/backend/src/schema/resolvers/helpers/existingEmailAddress.js +++ b/backend/src/schema/resolvers/helpers/existingEmailAddress.js @@ -1,5 +1,3 @@ -import { UserInputError } from 'apollo-server' - export default async function alreadyExistingMail({ args, context }) { const session = context.driver.session() try { @@ -20,9 +18,11 @@ export default async function alreadyExistingMail({ args, context }) { }) }) const [emailBelongsToUser] = await existingEmailAddressTxPromise - const { alreadyExistingEmail, user } = emailBelongsToUser || {} - if (user) throw new UserInputError('A user account with this email already exists.') - return alreadyExistingEmail + /* + const { alreadyExistingEmail, user } = + if (user) throw new UserInputError('A user account with this email already exists.') + */ + return emailBelongsToUser || {} } finally { session.close() } diff --git a/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.js b/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.js new file mode 100644 index 000000000..a808a5582 --- /dev/null +++ b/backend/src/schema/resolvers/helpers/filterPostsOfMyGroups.js @@ -0,0 +1,40 @@ +import { mergeWith, isArray } from 'lodash' + +const getMyGroupIds = async (context) => { + const { user } = context + if (!(user && user.id)) return [] + const session = context.driver.session() + + const readTxResultPromise = await session.readTransaction(async (transaction) => { + const cypher = ` + MATCH (group:Group)<-[membership:MEMBER_OF]-(:User { id: $userId }) + WHERE membership.role IN ['usual', 'admin', 'owner'] + RETURN collect(group.id) AS myGroupIds` + const getMyGroupIdsResponse = await transaction.run(cypher, { userId: user.id }) + return getMyGroupIdsResponse.records.map((record) => record.get('myGroupIds')) + }) + try { + const [myGroupIds] = readTxResultPromise + return myGroupIds + } finally { + session.close() + } +} + +export const filterPostsOfMyGroups = async (params, context) => { + if (!(params.filter && params.filter.postsInMyGroups)) return params + delete params.filter.postsInMyGroups + const myGroupIds = await getMyGroupIds(context) + params.filter = mergeWith( + params.filter, + { + group: { id_in: myGroupIds }, + }, + (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue) + } + }, + ) + return params +} diff --git a/backend/src/schema/resolvers/images/images.js b/backend/src/schema/resolvers/images/images.js index 656ae114a..180c6d090 100644 --- a/backend/src/schema/resolvers/images/images.js +++ b/backend/src/schema/resolvers/images/images.js @@ -113,10 +113,11 @@ const sanitizeRelationshipType = (relationshipType) => { const localFileUpload = ({ createReadStream, uniqueFilename }) => { const destination = `/uploads/${uniqueFilename}` return new Promise((resolve, reject) => - createReadStream() - .pipe(createWriteStream(`public${destination}`)) - .on('finish', () => resolve(destination)) - .on('error', reject), + createReadStream().pipe( + createWriteStream(`public${destination}`) + .on('finish', () => resolve(destination)) + .on('error', (error) => reject(error)), + ), ) } diff --git a/backend/src/schema/resolvers/images/images.spec.js b/backend/src/schema/resolvers/images/images.spec.js index 5ede151a9..b14c59f28 100644 --- a/backend/src/schema/resolvers/images/images.spec.js +++ b/backend/src/schema/resolvers/images/images.spec.js @@ -15,6 +15,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { @@ -78,7 +79,7 @@ describe('deleteImage', () => { await expect(someString).toEqual('Hello') }) - it('rolls back the transaction in case of errors', async (done) => { + it('rolls back the transaction in case of errors', async () => { await expect(neode.all('Image')).resolves.toHaveLength(1) const session = driver.session() try { @@ -93,7 +94,6 @@ describe('deleteImage', () => { // nothing has been deleted await expect(neode.all('Image')).resolves.toHaveLength(1) // all good - done() } finally { session.close() } @@ -239,7 +239,7 @@ describe('mergeImage', () => { }) }) - it('rolls back the transaction in case of errors', async (done) => { + it('rolls back the transaction in case of errors', async () => { const session = driver.session() try { await session.writeTransaction(async (transaction) => { @@ -254,7 +254,6 @@ describe('mergeImage', () => { // nothing has been created await expect(neode.all('Image')).resolves.toHaveLength(0) // all good - done() } finally { session.close() } diff --git a/backend/src/schema/resolvers/inviteCodes.spec.js b/backend/src/schema/resolvers/inviteCodes.spec.js index 72e2a2492..1df791ba6 100644 --- a/backend/src/schema/resolvers/inviteCodes.spec.js +++ b/backend/src/schema/resolvers/inviteCodes.spec.js @@ -1,6 +1,6 @@ import Factory, { cleanDatabase } from '../../db/factories' import { getDriver } from '../../db/neo4j' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' import CONSTANTS_REGISTRATION from './../../constants/registration' @@ -52,6 +52,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('inviteCodes', () => { diff --git a/backend/src/schema/resolvers/locations.spec.js b/backend/src/schema/resolvers/locations.spec.js index 3742c59c6..82aebd441 100644 --- a/backend/src/schema/resolvers/locations.spec.js +++ b/backend/src/schema/resolvers/locations.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -26,6 +26,7 @@ beforeAll(async () => { 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 diff --git a/backend/src/schema/resolvers/moderation.spec.js b/backend/src/schema/resolvers/moderation.spec.js index 3c2926c14..1665e9446 100644 --- a/backend/src/schema/resolvers/moderation.spec.js +++ b/backend/src/schema/resolvers/moderation.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -70,6 +70,7 @@ describe('moderate resources', () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/notifications.spec.js b/backend/src/schema/resolvers/notifications.spec.js index b4e3f3a37..47134aea6 100644 --- a/backend/src/schema/resolvers/notifications.spec.js +++ b/backend/src/schema/resolvers/notifications.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getDriver } from '../../db/neo4j' import { createTestClient } from 'apollo-server-testing' import createServer from '../.././server' @@ -34,6 +34,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.js index bc2a48bc8..fa5f26e58 100644 --- a/backend/src/schema/resolvers/passwordReset.spec.js +++ b/backend/src/schema/resolvers/passwordReset.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import CONSTANTS_REGISTRATION from './../../constants/registration' import createPasswordReset from './helpers/createPasswordReset' @@ -38,6 +38,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(() => { diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js index 78515e641..d806f3803 100644 --- a/backend/src/schema/resolvers/posts.js +++ b/backend/src/schema/resolvers/posts.js @@ -6,6 +6,7 @@ import { mergeImage, deleteImage } from './images/images' import Resolver from './helpers/Resolver' import { filterForMutedUsers } from './helpers/filterForMutedUsers' import { filterInvisiblePosts } from './helpers/filterInvisiblePosts' +import { filterPostsOfMyGroups } from './helpers/filterPostsOfMyGroups' import CONFIG from '../../config' const maintainPinnedPosts = (params) => { @@ -21,12 +22,14 @@ const maintainPinnedPosts = (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 = await maintainPinnedPosts(params) return neo4jgraphql(object, params, context, resolveInfo) }, profilePagePosts: async (object, params, context, resolveInfo) => { + params = await filterPostsOfMyGroups(params, context) params = await filterInvisiblePosts(params, context) params = await filterForMutedUsers(params, context) return neo4jgraphql(object, params, context, resolveInfo) diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js index 6fc9b5722..9335c1313 100644 --- a/backend/src/schema/resolvers/posts.spec.js +++ b/backend/src/schema/resolvers/posts.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -56,6 +56,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/postsInGroups.spec.js b/backend/src/schema/resolvers/postsInGroups.spec.js index c55076a23..1eaf7a708 100644 --- a/backend/src/schema/resolvers/postsInGroups.spec.js +++ b/backend/src/schema/resolvers/postsInGroups.spec.js @@ -61,6 +61,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('Posts in Groups', () => { @@ -1677,5 +1678,59 @@ describe('Posts in Groups', () => { }) }) }) + + describe('filter posts in my groups', () => { + describe('without any posts in groups', () => { + beforeAll(async () => { + authenticatedUser = await anyUser.toJson() + }) + + it('finds no posts', async () => { + const result = await query({ + query: filterPosts(), + variables: { filter: { postsInMyGroups: true } }, + }) + expect(result.data.Post).toHaveLength(0) + expect(result).toMatchObject({ + data: { + Post: [], + }, + errors: undefined, + }) + }) + }) + + describe('with posts in groups', () => { + beforeAll(async () => { + // member of hidden-group and closed-group + authenticatedUser = await allGroupsUser.toJson() + }) + + it('finds two posts', async () => { + const result = await query({ + query: filterPosts(), + variables: { filter: { postsInMyGroups: true } }, + }) + expect(result.data.Post).toHaveLength(2) + expect(result).toMatchObject({ + data: { + Post: expect.arrayContaining([ + { + id: 'post-to-closed-group', + title: 'A post to a closed group', + content: 'I am posting into a closed group as a member of the group', + }, + { + id: 'post-to-hidden-group', + title: 'A post to a hidden group', + content: 'I am posting into a hidden group as a member of the group', + }, + ]), + }, + errors: undefined, + }) + }) + }) + }) }) }) diff --git a/backend/src/schema/resolvers/registration.js b/backend/src/schema/resolvers/registration.js index 52c92b033..c988acfb2 100644 --- a/backend/src/schema/resolvers/registration.js +++ b/backend/src/schema/resolvers/registration.js @@ -13,7 +13,12 @@ export default { args.nonce = generateNonce() args.email = normalizeEmail(args.email) let emailAddress = await existingEmailAddress({ args, context }) - if (emailAddress) return emailAddress + /* + if (emailAddress.user) { + // what to do? + } + */ + if (emailAddress.alreadyExistingEmail) return emailAddress.alreadyExistingEmail try { emailAddress = await neode.create('EmailAddress', args) return emailAddress.toJson() diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js index ebe36456b..bfc6a5fa6 100644 --- a/backend/src/schema/resolvers/registration.spec.js +++ b/backend/src/schema/resolvers/registration.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getDriver, getNeode } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -29,6 +29,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { @@ -118,9 +119,9 @@ describe('Signup', () => { await emailAddress.relateTo(user, 'belongsTo') }) - it('throws UserInputError error because of unique constraint violation', async () => { + it('does not throw UserInputError error', async () => { await expect(mutate({ mutation, variables })).resolves.toMatchObject({ - errors: [{ message: 'A user account with this email already exists.' }], + data: { Signup: { email: 'someuser@example.org' } }, }) }) }) diff --git a/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.js index 7cf4d9a34..96ef07d03 100644 --- a/backend/src/schema/resolvers/reports.spec.js +++ b/backend/src/schema/resolvers/reports.spec.js @@ -1,7 +1,7 @@ import { createTestClient } from 'apollo-server-testing' import createServer from '../.././server' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getDriver, getNeode } from '../../db/neo4j' const instance = getNeode() @@ -117,6 +117,7 @@ describe('file a report on a resource', () => { 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 diff --git a/backend/src/schema/resolvers/rewards.spec.js b/backend/src/schema/resolvers/rewards.spec.js index f44cf51f6..06fe87ec0 100644 --- a/backend/src/schema/resolvers/rewards.spec.js +++ b/backend/src/schema/resolvers/rewards.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -33,6 +33,7 @@ describe('rewards', () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/searches.spec.js b/backend/src/schema/resolvers/searches.spec.js index 4a8623df5..f889c2ac8 100644 --- a/backend/src/schema/resolvers/searches.spec.js +++ b/backend/src/schema/resolvers/searches.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -26,6 +26,8 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() + neode.close() }) const searchQuery = gql` diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index 087c452da..294a28a76 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -51,6 +51,7 @@ describe('shout and unshout posts', () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(async () => { diff --git a/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.js index fc9ee8f70..8265e8376 100644 --- a/backend/src/schema/resolvers/socialMedia.spec.js +++ b/backend/src/schema/resolvers/socialMedia.spec.js @@ -1,7 +1,7 @@ import { createTestClient } from 'apollo-server-testing' import createServer from '../../server' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getDriver } from '../../db/neo4j' const driver = getDriver() @@ -12,6 +12,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('SocialMedia', () => { diff --git a/backend/src/schema/resolvers/statistics.spec.js b/backend/src/schema/resolvers/statistics.spec.js index b9fdd9196..15aa2d449 100644 --- a/backend/src/schema/resolvers/statistics.spec.js +++ b/backend/src/schema/resolvers/statistics.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -39,6 +39,7 @@ beforeAll(async () => { 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 diff --git a/backend/src/schema/resolvers/userData.spec.js b/backend/src/schema/resolvers/userData.spec.js index 779f090e4..3c521a4f1 100644 --- a/backend/src/schema/resolvers/userData.spec.js +++ b/backend/src/schema/resolvers/userData.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -60,6 +60,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('resolvers/userData', () => { diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js index 66896f485..546c7a748 100644 --- a/backend/src/schema/resolvers/user_management.spec.js +++ b/backend/src/schema/resolvers/user_management.spec.js @@ -1,15 +1,17 @@ import jwt from 'jsonwebtoken' import CONFIG from './../../config' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { loginMutation } from '../../graphql/userManagement' import { createTestClient } from 'apollo-server-testing' import createServer, { context } from '../../server' import encode from '../../jwt/encode' -import { getNeode } from '../../db/neo4j' +import { getNeode, getDriver } from '../../db/neo4j' import { categories } from '../../constants/categories' const neode = getNeode() +const driver = getDriver() + let query, mutate, variables, req, user const disable = async (id) => { @@ -47,6 +49,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(() => { @@ -137,7 +140,12 @@ describe('currentUser', () => { describe('authenticated', () => { describe('and corresponding user in the database', () => { + let avatar + beforeEach(async () => { + avatar = await Factory.build('image', { + url: 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg', + }) await Factory.build( 'user', { @@ -149,9 +157,7 @@ describe('currentUser', () => { }, { email: 'test@example.org', - avatar: Factory.build('image', { - url: 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg', - }), + avatar, }, ) const userBearerToken = encode({ id: 'u3' }) @@ -163,9 +169,11 @@ describe('currentUser', () => { data: { currentUser: { id: 'u3', - avatar: Factory.build('image', { - url: 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg', - }), + avatar: { + url: expect.stringContaining( + 'https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg', + ), + }, email: 'test@example.org', name: 'Matilde Hermiston', slug: 'matilde-hermiston', @@ -243,7 +251,7 @@ describe('login', () => { describe('ask for a `token`', () => { describe('with a valid email/password combination', () => { - it('responds with a JWT bearer token', async (done) => { + it('responds with a JWT bearer token', async () => { const { data: { login: token }, } = await mutate({ mutation: loginMutation, variables }) @@ -252,7 +260,6 @@ describe('login', () => { id: 'acb2d923-f3af-479e-9f00-61b12e864666', }) expect(err).toBeNull() - done() }) }) diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js index 87226ec4d..f256c6363 100644 --- a/backend/src/schema/resolvers/users.spec.js +++ b/backend/src/schema/resolvers/users.spec.js @@ -1,5 +1,5 @@ import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' import { createTestClient } from 'apollo-server-testing' @@ -81,6 +81,7 @@ beforeAll(async () => { 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 diff --git a/backend/src/schema/resolvers/users/location.spec.js b/backend/src/schema/resolvers/users/location.spec.js index c0525ca1c..7097002da 100644 --- a/backend/src/schema/resolvers/users/location.spec.js +++ b/backend/src/schema/resolvers/users/location.spec.js @@ -1,4 +1,4 @@ -import { gql } from '../../../helpers/jest' +import gql from 'graphql-tag' import Factory, { cleanDatabase } from '../../../db/factories' import { getNeode, getDriver } from '../../../db/neo4j' import { createTestClient } from 'apollo-server-testing' @@ -90,6 +90,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(() => { diff --git a/backend/src/schema/resolvers/users/mutedUsers.spec.js b/backend/src/schema/resolvers/users/mutedUsers.spec.js index d8efacfae..20e37f627 100644 --- a/backend/src/schema/resolvers/users/mutedUsers.spec.js +++ b/backend/src/schema/resolvers/users/mutedUsers.spec.js @@ -1,7 +1,7 @@ import { createTestClient } from 'apollo-server-testing' import createServer from '../../../server' import { cleanDatabase } from '../../../db/factories' -import { gql } from '../../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../../db/neo4j' const driver = getDriver() @@ -18,6 +18,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) beforeEach(() => { diff --git a/backend/src/schema/resolvers/viewedTeaserCount.spec.js b/backend/src/schema/resolvers/viewedTeaserCount.spec.js index 7f8e7f102..ee90d1a08 100644 --- a/backend/src/schema/resolvers/viewedTeaserCount.spec.js +++ b/backend/src/schema/resolvers/viewedTeaserCount.spec.js @@ -1,6 +1,6 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' -import { gql } from '../../helpers/jest' +import gql from 'graphql-tag' import { getNeode, getDriver } from '../../db/neo4j' import createServer from '../../server' @@ -28,6 +28,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDatabase() + driver.close() }) describe('count post teaser views', () => { diff --git a/backend/src/schema/types/type/Post.gql b/backend/src/schema/types/type/Post.gql index 9eac00b0b..6fc7a3215 100644 --- a/backend/src/schema/types/type/Post.gql +++ b/backend/src/schema/types/type/Post.gql @@ -82,6 +82,7 @@ input _PostFilter { emotions_single: _PostEMOTEDFilter emotions_every: _PostEMOTEDFilter group: _GroupFilter + postsInMyGroups: Boolean } enum _PostOrdering { diff --git a/backend/src/server.js b/backend/src/server.js index 5a71150f0..bcbd84617 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -12,6 +12,7 @@ import { RedisPubSub } from 'graphql-redis-subscriptions' import { PubSub } from 'graphql-subscriptions' import Redis from 'ioredis' import bodyParser from 'body-parser' +import { graphqlUploadExpress } from 'graphql-upload' export const NOTIFICATION_ADDED = 'NOTIFICATION_ADDED' const { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } = CONFIG @@ -67,6 +68,7 @@ const createServer = (options) => { }, }, debug: !!CONFIG.DEBUG, + uploads: false, tracing: !!CONFIG.DEBUG, formatError: (error) => { if (error.message === 'ERROR_VALIDATION') { @@ -85,6 +87,7 @@ const createServer = (options) => { app.use(express.static('public')) app.use(bodyParser.json({ limit: '10mb' })) app.use(bodyParser.urlencoded({ limit: '10mb', extended: true })) + app.use(graphqlUploadExpress()) server.applyMiddleware({ app, path: '/' }) const httpServer = http.createServer(app) server.installSubscriptionHandlers(httpServer) diff --git a/backend/test/setup.js b/backend/test/setup.js new file mode 100644 index 000000000..4501da899 --- /dev/null +++ b/backend/test/setup.js @@ -0,0 +1,8 @@ +// Polyfill missing encoders in jsdom +// https://stackoverflow.com/questions/68468203/why-am-i-getting-textencoder-is-not-defined-in-jest +import { TextEncoder, TextDecoder } from 'util' +global.TextEncoder = TextEncoder +global.TextDecoder = TextDecoder + +// Metascraper takes longer nowadays, double time +jest.setTimeout(10000) \ No newline at end of file diff --git a/backend/yarn.lock b/backend/yarn.lock index 8283660d5..c2fb0d28c 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@apollo/protobufjs@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.4.tgz#cf01747a55359066341f31b5ce8db17df44244e0" @@ -56,12 +64,17 @@ optionalDependencies: chokidar "^2.1.8" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.8.3" + "@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" @@ -72,7 +85,28 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@~7.9.0": +"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/core@~7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== @@ -94,15 +128,14 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" - integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== +"@babel/generator@^7.20.7", "@babel/generator@^7.7.2", "@babel/generator@^7.9.0": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== dependencies: - "@babel/types" "^7.9.0" + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" @@ -119,6 +152,17 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-compilation-targets@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" @@ -156,6 +200,11 @@ "@babel/types" "^7.8.3" lodash "^4.17.13" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-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" @@ -164,14 +213,13 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.8.3": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/helper-function-name@^7.9.5": version "7.9.5" @@ -183,11 +231,18 @@ "@babel/types" "^7.9.5" "@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + 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.8.3" + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" "@babel/helper-hoist-variables@^7.8.3": version "7.8.3" @@ -196,44 +251,45 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.8.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.20.7" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== +"@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.9.0": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== +"@babel/helper-optimise-call-expression@^7.18.6", "@babel/helper-optimise-call-expression@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@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" @@ -264,34 +320,45 @@ "@babel/types" "^7.8.3" "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== +"@babel/helper-simple-access@^7.20.2", "@babel/helper-simple-access@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.20.2" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.18.6" -"@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== +"@babel/helper-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-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.9.5": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-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-wrap-function@^7.8.3": version "7.8.3" @@ -303,22 +370,22 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== +"@babel/helpers@^7.20.7", "@babel/helpers@^7.9.0": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" "@babel/node@~7.8.7": @@ -335,7 +402,12 @@ resolve "^1.13.1" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.7.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7", "@babel/parser@^7.9.0": + version "7.20.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/parser@^7.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== @@ -444,11 +516,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== + 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.8.3" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.0" @@ -457,6 +529,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz#7f798eb7e8cfd3821388120679d23d530bae6e53" @@ -471,12 +550,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== +"@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.8.3" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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" @@ -492,13 +578,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz#9b37d580d459682364d8602494c69145b394fd4c" @@ -555,6 +648,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-arrow-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" @@ -917,16 +1017,32 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2", "@babel/traverse@^7.9.0": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== @@ -941,7 +1057,16 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": +"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.8.3", "@babel/types@^7.9.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@babel/types@^7.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== @@ -956,9 +1081,9 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: exec-sh "^0.3.2" minimist "^1.2.0" @@ -968,6 +1093,11 @@ resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-5.1.0.tgz#cee1d77ada0d0dbbe77201d18b1ebabf432d9c0f" integrity sha512-0VonSKh7fBCqvY+V2FLN2ZW4pR4ZtWJalWmwSaiaB7yK7y4qp8vDfuaq9QdLjf/cdZGx3M7Wc4Q+x4fZHxI21Q== +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@graphql-toolkit/common@0.10.4": version "0.10.4" resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.10.4.tgz#7785f2a3f14559d0778859c49f4442078c196695" @@ -1069,143 +1199,179 @@ "@hapi/hoek" "^9.0.0" "@istanbuljs/load-nyc-config@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" - integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" find-up "^4.1.0" + get-package-type "^0.1.0" js-yaml "^3.13.1" resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.3.0.tgz#33b56b81238427bf3ebe3f7b3378d2f79cdbd409" - integrity sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ== +"@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== dependencies: - "@jest/source-map" "^25.2.6" - chalk "^3.0.0" - jest-util "^25.3.0" + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.4.2" + jest-util "^29.4.2" slash "^3.0.0" -"@jest/core@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.3.0.tgz#80f97a7a8b59dde741a24f30871cc26d0197d426" - integrity sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw== +"@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== dependencies: - "@jest/console" "^25.3.0" - "@jest/reporters" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" + "@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" + "@types/node" "*" ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.0.0" + ci-info "^3.2.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-changed-files "^25.3.0" - jest-config "^25.3.0" - jest-haste-map "^25.3.0" - jest-message-util "^25.3.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-resolve-dependencies "^25.3.0" - jest-runner "^25.3.0" - jest-runtime "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" - jest-watcher "^25.3.0" - micromatch "^4.0.2" - p-each-series "^2.1.0" - realpath-native "^2.0.0" - rimraf "^3.0.0" + 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" + micromatch "^4.0.4" + pretty-format "^29.4.2" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.3.0.tgz#587f28ddb4b0dfe97404d3d4a4c9dbfa0245fb2e" - integrity sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g== +"@jest/environment@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.2.tgz#ee92c316ee2fbdf0bcd9d2db0ef42d64fea26b56" + integrity sha512-JKs3VUtse0vQfCaFGJRX1bir9yBdtasxziSyu+pIiEllAQOe4oQhdCYIf3+Lx+nGglFktSKToBnRJfD5QKp+NQ== dependencies: - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-mock "^29.4.2" -"@jest/fake-timers@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.3.0.tgz#995aad36d5c8984165ca5db12e740ab8dbf7042a" - integrity sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ== +"@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== dependencies: - "@jest/types" "^25.3.0" - jest-message-util "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" - lolex "^5.0.0" + jest-get-type "^29.4.2" -"@jest/reporters@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.3.0.tgz#7f39f0e6911561cc5112a1b54656de18faee269b" - integrity sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg== +"@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" + "@types/node" "*" + jest-message-util "^29.4.2" + jest-mock "^29.4.2" + jest-util "^29.4.2" + +"@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== + dependencies: + "@jest/environment" "^29.4.2" + "@jest/expect" "^29.4.2" + "@jest/types" "^29.4.2" + jest-mock "^29.4.2" + +"@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== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@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" + "@types/node" "*" + chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^25.3.0" - jest-resolve "^25.3.0" - jest-util "^25.3.0" - jest-worker "^25.2.6" + istanbul-reports "^3.1.3" + jest-message-util "^29.4.2" + jest-util "^29.4.2" + jest-worker "^29.4.2" slash "^3.0.0" - source-map "^0.6.0" - string-length "^3.1.0" - terminal-link "^2.0.0" - v8-to-istanbul "^4.0.1" - optionalDependencies: - node-notifier "^6.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" -"@jest/source-map@^25.2.6": - version "25.2.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c" - integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ== +"@jest/schemas@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.2.tgz#cf7cfe97c5649f518452b176c47ed07486270fc1" + integrity sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g== dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/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.3" - source-map "^0.6.0" + graceful-fs "^4.2.9" -"@jest/test-result@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.3.0.tgz#137fab5e5c6fed36e5d40735d1eb029325e3bf06" - integrity sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw== +"@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== dependencies: - "@jest/console" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/console" "^29.4.2" + "@jest/types" "^29.4.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz#271ad5f2b8f8137d092ccedc87e16a50f8676209" - integrity sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg== +"@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== dependencies: - "@jest/test-result" "^25.3.0" - jest-haste-map "^25.3.0" - jest-runner "^25.3.0" - jest-runtime "^25.3.0" + "@jest/test-result" "^29.4.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + slash "^3.0.0" "@jest/transform@^25.2.6": version "25.2.6" @@ -1229,27 +1395,26 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/transform@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.3.0.tgz#083c5447d5307d9b9494d6968115b647460e71f1" - integrity sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg== +"@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== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^25.3.0" - babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.3" - jest-haste-map "^25.3.0" - jest-regex-util "^25.2.6" - jest-util "^25.3.0" - micromatch "^4.0.2" - pirates "^4.0.1" - realpath-native "^2.0.0" + "@babel/core" "^7.11.6" + "@jest/types" "^29.4.2" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + jest-regex-util "^29.4.2" + jest-util "^29.4.2" + micromatch "^4.0.4" + pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.2" "@jest/types@^25.2.6": version "25.2.6" @@ -1261,15 +1426,72 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jest/types@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.3.0.tgz#88f94b277a1d028fd7117bc1f74451e0fc2131e7" - integrity sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw== +"@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== dependencies: + "@jest/schemas" "^29.4.2" "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@keyvhq/core@^1.6.14": + version "1.6.14" + resolved "https://registry.yarnpkg.com/@keyvhq/core/-/core-1.6.14.tgz#e0c809ac184c761ffae9bccaf4d0b00eb15c053f" + integrity sha512-NQtjFKsZXLYs3SWbeYATdwwJ1fZtzwrV+9YM4Y9JPGGQqLI0q6gyY2sEWI4RvrKBGJ1AXCJPQNXOPr8oAWdEDw== + dependencies: + json-buffer "~3.0.1" + +"@keyvhq/memoize@~1.6.14": + version "1.6.14" + resolved "https://registry.yarnpkg.com/@keyvhq/memoize/-/memoize-1.6.14.tgz#6a347b81e9be7040c678f8fc4b9046186484b6fc" + integrity sha512-bsFPrpOHEjAK1F7O0lzl5RR6KofA/zCaFzIBFMDRmcvDJk4Jkk5yqo66+DqQO5YBKWM74y/nAN63XCdHWmi91w== + dependencies: + "@keyvhq/core" "^1.6.14" + mimic-fn "~3.0.0" "@metascraper/helpers@^4.10.2": version "4.10.2" @@ -1294,31 +1516,32 @@ url-regex "~4.1.1" video-extensions "~1.1.0" -"@metascraper/helpers@^5.11.8", "@metascraper/helpers@^5.14.22", "@metascraper/helpers@^5.14.26", "@metascraper/helpers@^5.23.0", "@metascraper/helpers@^5.23.1": - version "5.23.1" - resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.23.1.tgz#f8fa40dd3e37fa1ac8596e48ed7ea73e2230ba46" - integrity sha512-lOf9RViEqR+aNltjvf2arjxQ2SXvQZ63A9voLwDISAB4l6sOhOEkwRCL6YSS4blkcGe1KN9r/cTxgFEenU2egA== +"@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== dependencies: audio-extensions "0.0.0" - chrono-node "2.3.1" + chrono-node "~2.5.0" condense-whitespace "~2.0.0" - entities "~2.2.0" + entities "~4.4.0" file-extension "~4.0.5" has-values "~2.0.1" image-extensions "~1.1.0" is-relative-url "~3.0.0" - is-uri "~1.2.0" + is-uri "~1.2.4" iso-639-3 "~2.2.0" isostring "0.0.1" - jsdom "~16.6.0" + jsdom "~21.1.0" lodash "~4.17.21" - memoize-one "~5.2.1" + memoize-one "~6.0.0" microsoft-capitalize "~1.0.5" - mime-types "~2.1.31" + mime "~3.0.0" normalize-url "~6.1.0" + re2 "~1.18.0" smartquotes "~2.3.2" - truncate "~2.1.0" - url-regex-safe "~2.0.2" + tldts "~5.7.103" + url-regex-safe "~3.0.0" video-extensions "~1.2.0" "@nodelib/fs.scandir@2.1.3": @@ -1342,10 +1565,18 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" rimraf "^3.0.2" @@ -1482,6 +1713,11 @@ "@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" @@ -1492,13 +1728,20 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== -"@sinonjs/commons@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" - integrity sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@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" @@ -1513,10 +1756,10 @@ 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== "@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" @@ -1536,36 +1779,36 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__core@^7.1.7": - version "7.1.7" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" - integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" @@ -1587,11 +1830,6 @@ "@types/node" "*" "@types/responselike" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/connect@*": version "3.4.33" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" @@ -1657,6 +1895,13 @@ dependencies: "@types/node" "*" +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + "@types/graphql-upload@^8.0.0": version "8.0.3" resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.3.tgz#b371edb5f305a2a1f7b7843a890a2a7adc55c3ec" @@ -1678,25 +1923,32 @@ integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" @@ -1767,10 +2019,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" integrity sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw== -"@types/prettier@^1.19.0": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/qs@*": version "6.9.3" @@ -1797,10 +2049,10 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/ws@^7.0.0": version "7.2.5" @@ -1810,14 +2062,21 @@ "@types/node" "*" "@types/yargs-parser@*": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.0.0.tgz#453743c5bbf9f1bed61d959baab5b06be029b2d0" - integrity sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw== + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^15.0.0": - version "15.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.1.tgz#9266a9d7be68cfcc982568211085a49a277f7c96" - integrity sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg== + version "15.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== dependencies: "@types/yargs-parser" "*" @@ -1866,17 +2125,12 @@ dependencies: tslib "^1.9.3" -abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abbrev@1: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -1889,56 +2143,33 @@ accepts@^1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" + acorn "^8.1.0" + acorn-walk "^8.0.2" acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -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@^6.0.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - -acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4: - version "8.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" - integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.1.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== agent-base@5: version "5.1.1" @@ -1952,10 +2183,10 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agentkeepalive@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== +agentkeepalive@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== dependencies: debug "^4.1.0" depd "^1.1.2" @@ -1977,7 +2208,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.5.5: +ajv@^6.10.0, ajv@^6.10.2: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -1987,6 +2218,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -1995,11 +2236,11 @@ ansi-align@^2.0.0: string-width "^2.0.0" ansi-escapes@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" - integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.5.2" + type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" @@ -2012,14 +2253,14 @@ ansi-regex@^3.0.0: integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + 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.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -2029,13 +2270,17 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -2049,7 +2294,15 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.1: +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== @@ -2357,11 +2610,24 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + arch@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -2385,7 +2651,7 @@ argparse@^1.0.7: arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -2395,12 +2661,7 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-flatten@1.1.1: version "1.1.1" @@ -2423,7 +2684,7 @@ array-union@^2.1.0: array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.2.1: version "1.2.2" @@ -2434,22 +2695,17 @@ array.prototype.flat@^1.2.1: es-abstract "^1.15.0" function-bind "^1.1.1" -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assert@^1.4.1: version "1.5.0" @@ -2476,7 +2732,7 @@ assertion-error@^1.1.0: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== assignment@2.0.0: version "2.0.0" @@ -2513,9 +2769,9 @@ async-retry@^1.2.1: asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -2543,12 +2799,12 @@ aws-sdk@^2.652.0: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== babel-core@~7.0.0-0: version "7.0.0-bridge.0" @@ -2567,17 +2823,17 @@ babel-eslint@~10.1.0: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.3.0.tgz#999d0c19e8427f66b796bf9ea233eedf087b957c" - integrity sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg== +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== dependencies: - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.3.0" - chalk "^3.0.0" + "@jest/transform" "^29.4.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.4.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" slash "^3.0.0" babel-jest@~25.2.6: @@ -2600,22 +2856,34 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== +babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" babel-plugin-jest-hoist@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909" - integrity sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw== + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" + integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^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== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-plugin-transform-runtime@^6.23.0: @@ -2625,14 +2893,15 @@ babel-plugin-transform-runtime@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-preset-current-node-syntax@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" - integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -2640,6 +2909,7 @@ babel-preset-current-node-syntax@^0.1.2: "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" babel-preset-jest@^25.2.6: version "25.2.6" @@ -2650,13 +2920,13 @@ 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@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz#9ab40aee52a19bdc52b8b1ec2403d5914ac3d86b" - integrity sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw== +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== dependencies: - babel-plugin-jest-hoist "^25.2.6" - babel-preset-current-node-syntax "^0.1.2" + babel-plugin-jest-hoist "^29.4.2" + babel-preset-current-node-syntax "^1.0.0" babel-runtime@^6.22.0: version "6.26.0" @@ -2702,7 +2972,7 @@ base@^0.11.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -2747,7 +3017,7 @@ body-parser@1.19.0, body-parser@^1.18.3: raw-body "2.4.0" type-is "~1.6.17" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -2778,6 +3048,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2794,29 +3071,22 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== - -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== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== +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: - resolve "1.1.7" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" browserslist@^4.8.3, browserslist@^4.9.1: version "4.16.6" @@ -2829,10 +3099,10 @@ browserslist@^4.8.3, browserslist@^4.9.1: escalade "^3.1.1" node-releases "^1.1.71" -bser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -2842,9 +3112,9 @@ buffer-equal-constant-time@1.0.1: integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@4.9.1: version "4.9.1" @@ -2875,28 +3145,29 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@^15.0.5: - version "15.2.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" - integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: - "@npmcli/move-file" "^1.0.1" + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" + fs-minipass "^2.1.0" + glob "^8.0.1" infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" + lru-cache "^7.7.1" + minipass "^3.1.6" minipass-collect "^1.0.2" minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" p-map "^4.0.0" promise-inflight "^1.0.1" rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" cache-base@^1.0.1: version "1.0.1" @@ -2931,7 +3202,7 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cacheable-request@^7.0.1: +cacheable-request@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== @@ -2962,11 +3233,16 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + camelize@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -2977,6 +3253,11 @@ caniuse-lite@^1.0.30001219: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== +caniuse-lite@^1.0.30001449: + version "1.0.30001451" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" + integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -2992,7 +3273,7 @@ capture-stack-trace@^1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chai@~4.2.0: version "4.2.0" @@ -3032,6 +3313,19 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3042,10 +3336,30 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -cheerio-advanced-selectors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cheerio-advanced-selectors/-/cheerio-advanced-selectors-2.0.1.tgz#fb5ec70a4599e8cec1cf669c6d9b90a3fa969c48" - integrity sha512-5wHR8bpiD5pdUtaS81A6hnJezzoDzL1TLWfK6bxnLkIgEKPV26BlOdMCcvuj3fTE7JSalsTUeNU7AOD/u6bYhw== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@~1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" cheerio@~1.0.0-rc.3: version "1.0.0-rc.3" @@ -3103,13 +3417,6 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrono-node@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.3.1.tgz#b47f1f6496ee8de676a2153e693856a5c53fe5ea" - integrity sha512-zx/o58qoIKNhZT3eFZyi7wAK4Yn+y7EVrWnYiPXbYWXnZdX1HzoU1u9pTfhHymNV1Rdk/IGjOVgQul54dR8Z0Q== - dependencies: - dayjs "^1.10.0" - chrono-node@~1.3.11: version "1.3.11" resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.11.tgz#b86a26b7e3157edcc4fe3374e1b6f90caedc8e39" @@ -3117,6 +3424,13 @@ 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== + dependencies: + dayjs "^1.10.0" + ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -3127,6 +3441,16 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3137,11 +3461,18 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^2.0.0, clean-stack@~2.2.0: +clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" + integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== + dependencies: + escape-string-regexp "4.0.0" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -3177,14 +3508,14 @@ clipboardy@1.2.2: arch "^2.1.0" execa "^0.8.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" clone-response@^1.0.2: version "1.0.2" @@ -3201,7 +3532,7 @@ cluster-key-slot@^1.1.0: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" @@ -3214,14 +3545,14 @@ collapse-white-space@^1.0.3: integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== collect-v8-coverage@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz#150ee634ac3650b71d9c985eb7f608942334feb1" - integrity sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -3243,13 +3574,18 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colorette@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" @@ -3319,7 +3655,7 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= @@ -3346,13 +3682,23 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.1.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +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" @@ -3376,7 +3722,7 @@ cookiejar@^2.1.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-compat@^3.6.2: version "3.6.3" @@ -3453,7 +3799,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1: +cross-spawn@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== @@ -3462,11 +3808,31 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -3482,28 +3848,26 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + cssfilter@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= -cssom@^0.4.1, 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.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.1.0.tgz#99f50a3aa21d4af16e758ae3e454dcf5940b9122" - integrity sha512-1iwCdymVYhMdQWiZ+9mB7x+urdNLPGTWsIZt6euFk8Yi+dOERK2ccoAUA3Bl8I5vmK5qfz/eLkBRyLbs42ov4A== - dependencies: - cssom "~0.3.6" - cssstyle@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" @@ -3568,7 +3932,7 @@ d@1: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" @@ -3577,23 +3941,14 @@ dasherize@2.0.0: resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" integrity sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg= -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" date-fns@2.22.1: version "2.22.1" @@ -3617,7 +3972,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.1: +debug@4, debug@^4.0.1, debug@~4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3631,20 +3986,22 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" @@ -3660,6 +4017,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -3673,15 +4035,20 @@ deep-extend@^0.6.0: integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@4.2.2, deepmerge@^4.2.2: +deepmerge@4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +deepmerge@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + 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" @@ -3702,14 +4069,14 @@ define-properties@^1.1.2, define-properties@^1.1.3: define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -3724,7 +4091,7 @@ define-property@^2.0.2: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" @@ -3773,10 +4140,10 @@ dicer@0.3.0: dependencies: streamsearch "0.1.2" -diff-sequences@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" - integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diff-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@^4.0.1: version "4.0.1" @@ -3835,6 +4202,15 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-serializer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -3858,19 +4234,17 @@ domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - webidl-conversions "^5.0.0" + webidl-conversions "^7.0.0" domhandler@^2.3.0: version "2.4.2" @@ -3893,6 +4267,13 @@ domhandler@^4.0.0, domhandler@^4.2.0: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -3927,6 +4308,15 @@ domutils@^2.5.2: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + 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" @@ -3970,7 +4360,7 @@ duration@^0.2.1: ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -3992,6 +4382,16 @@ electron-to-chromium@^1.3.723: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9" integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A== +electron-to-chromium@^1.4.284: + version "1.4.295" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" + integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== + +emittery@^0.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" @@ -4007,7 +4407,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.12: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4015,9 +4415,9 @@ encoding@^0.1.12: iconv-lite "^0.6.2" end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -4031,10 +4431,10 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== -entities@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.3.0, entities@^4.4.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== env-paths@^2.2.0: version "2.2.0" @@ -4159,28 +4559,21 @@ 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: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.13.0.tgz#c7adf9bd3f3cc675bb752f202f79a720189cab29" - integrity sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -4381,7 +4774,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -4412,9 +4805,9 @@ events@1.1.1: integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^0.7.0: version "0.7.0" @@ -4455,31 +4848,30 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -4494,17 +4886,16 @@ expect-ct@0.2.0: resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.2.0.tgz#3a54741b6ed34cc7a93305c605f63cd268a54a62" integrity sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g== -expect@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.3.0.tgz#5fd36e51befd05afb7184bc954f8a4792d184c71" - integrity sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg== +expect@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.2.tgz#2ae34eb88de797c64a1541ad0f1e2ea8a7a7b492" + integrity sha512-+JHYg9O3hd3RlICG90OPVjRkPBoiUH7PxvDVMnRiaq1g6JUgZStX514erMl0v2Dc5SkfVbm7ztqbd6qHHPn+mQ== dependencies: - "@jest/types" "^25.3.0" - ansi-styles "^4.0.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-regex-util "^25.2.6" + "@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" express@^4.0.0, express@^4.17.1: version "4.17.1" @@ -4545,14 +4936,14 @@ express@^4.0.0, express@^4.17.1: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -4598,17 +4989,22 @@ extract-files@^8.0.0: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" @@ -4626,7 +5022,7 @@ 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.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -4634,7 +5030,7 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.6.0" @@ -4644,11 +5040,11 @@ fastq@^1.6.0: reusify "^1.0.0" fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: - bser "^2.0.0" + bser "2.1.1" feature-policy@0.3.0: version "0.3.0" @@ -4677,7 +5073,7 @@ file-extension@~4.0.5: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -4757,12 +5153,12 @@ fn-name@~3.0.0: for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^2.3.1: version "2.5.0" @@ -4782,6 +5178,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4804,7 +5209,7 @@ forwarded@~0.1.2: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" @@ -4825,10 +5230,10 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-capacitor@6.0.0, fs-capacitor@^2.0.4: - version "6.0.0" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.0.0.tgz#b4b89e3281d61df1c573e788d9ee6ec4c7c94da4" - integrity sha512-I+jZLV2q+ivQK/+Mu5FIYAECHgjoo8GBYJsBBQbNeU0aW1m25LU4E+MkLNq0kcJBjrp8Z6fhxpSeS8SyJyGkrw== +fs-capacitor@^6.1.0, fs-capacitor@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" + integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== fs-minipass@^1.2.5: version "1.2.6" @@ -4837,7 +5242,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -4852,7 +5257,7 @@ fs-readdir-recursive@^1.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^1.2.7: version "1.2.9" @@ -4862,7 +5267,12 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" -fsevents@^2.1.2, fsevents@~2.1.1: +fsevents@^2.1.2, fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== @@ -4877,6 +5287,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -4891,12 +5315,12 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -4906,10 +5330,10 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-src@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-src/-/get-src-1.0.1.tgz#ca11dbe4a93c7f3aa85cec95fcb0b2dfaa9539ee" - integrity sha1-yhHb5Kk8fzqoXOyV/LCy36qVOe4= +get-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" @@ -4928,29 +5352,32 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -get-video-id@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-video-id/-/get-video-id-3.2.0.tgz#852e153c7e651ac222b3887843ef7b1566c2894a" - integrity sha512-58JnnJD9uRh1pviNaP3lOMjGawYacnjUSpUqQorRB/GiMl+h4vnNye45mGVvSZhKNyq59I8OfyqwrGmvScb9fQ== - dependencies: - get-src "^1.0.1" +get-video-id@~3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/get-video-id/-/get-video-id-3.6.5.tgz#a7bfa1e8602557f2fcbed164d7005fdaa352d572" + integrity sha512-9RPHSQANIeGW5rU3CjWdm1zi+wUHbBWX+m4m+dqQAavrZ9p1P1J7AbxGvVEEHRyGfGrmMf5PqiRWYMyfqM+QYA== getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" @@ -4974,7 +5401,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4986,6 +5413,29 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5017,23 +5467,6 @@ globby@11.0.0: merge2 "^1.3.0" slash "^3.0.0" -got@^11.7.0: - version "11.8.2" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" - integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.1" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -5051,6 +5484,23 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" +got@~11.8.0, got@~11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@~9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -5073,10 +5523,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== -graceful-fs@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== graceful-fs@^4.2.6: version "4.2.6" @@ -5183,14 +5633,15 @@ graphql-tools@^4.0.0, graphql-tools@^4.0.4, graphql-tools@^4.0.5: iterall "^1.1.3" uuid "^3.1.0" -graphql-upload@^8.0.2: - version "8.1.0" - resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.1.0.tgz#6d0ab662db5677a68bfb1f2c870ab2544c14939a" - integrity sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q== +graphql-upload@^11.0.0, graphql-upload@^8.0.2: + version "11.0.0" + resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-11.0.0.tgz#24b245ff18f353bab6715e8a055db9fd73035e10" + integrity sha512-zsrDtu5gCbQFDWsNa5bMB4nf1LpKX9KDgh+f8oL1288ijV4RxeckhVozAjqjXAfRpxOHD1xOESsh6zq8SjdgjA== dependencies: busboy "^0.3.1" - fs-capacitor "^2.0.4" + fs-capacitor "^6.1.0" http-errors "^1.7.3" + isobject "^4.0.0" object-path "^0.11.4" graphql@^14.2.1, graphql@^14.5.3, graphql@^14.6.0: @@ -5200,22 +5651,17 @@ graphql@^14.2.1, graphql@^14.5.3, graphql@^14.6.0: dependencies: iterall "^1.2.2" -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" has-flag@^2.0.0: @@ -5226,7 +5672,7 @@ has-flag@^2.0.0: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -5238,7 +5684,7 @@ has-symbols@^1.0.0, has-symbols@^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-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= @@ -5246,7 +5692,7 @@ has-unicode@^2.0.0: has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -5255,7 +5701,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -5264,12 +5710,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5363,24 +5809,17 @@ hsts@2.2.0: dependencies: depd "2.0.0" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - whatwg-encoding "^1.0.1" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" + whatwg-encoding "^2.0.0" html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-to-text@7.1.1: version "7.1.1" @@ -5424,6 +5863,16 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + http-cache-semantics@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" @@ -5456,19 +5905,19 @@ 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== +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: - "@tootallnate/once" "1" + "@tootallnate/once" "2" agent-base "6" debug "4" http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -5498,10 +5947,18 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== humanize-ms@^1.2.1: version "1.2.1" @@ -5517,7 +5974,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -5580,9 +6037,9 @@ import-lazy@^2.1.0: integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -5590,7 +6047,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^3.2.0: version "3.2.0" @@ -5610,7 +6067,7 @@ infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -5662,10 +6119,10 @@ insane@2.6.1: assignment "2.0.0" he "0.5.0" -install-artifact-from-github@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.2.0.tgz#adcbd123c16a4337ec44ea76d0ebf253cc16b074" - integrity sha512-3OxCPcY55XlVM3kkfIpeCgmoSKnMsz2A3Dbhsq0RXpIknKQmrX1YiznCeW9cD2ItFmDxziA3w6Eg8d80AoL3oA== +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== invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" @@ -5689,25 +6146,20 @@ ioredis@^4.16.1, ioredis@^4.6.3: redis-parser "^3.0.0" standard-as-callback "^2.0.1" +ip-regex@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ip-regex@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip-regex@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== ipaddr.js@1.9.0: version "1.9.0" @@ -5727,7 +6179,7 @@ is-absolute-url@^3.0.0: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" @@ -5781,10 +6233,17 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" @@ -5821,7 +6280,7 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -5897,7 +6356,7 @@ is-npm@^1.0.0: is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" @@ -5925,11 +6384,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-port-reachable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-3.0.0.tgz#edf721e7d354e6e00cbeb0fc174ad89bdf6056b3" - integrity sha512-056IzLiWHdgVd6Eq1F9HtJl+cIkvi5X2MJ/A1fjQtByHkzQE1wGardnPhqrarOGDF88BOW+297X7PDvZ2vcyVg== - is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -5940,20 +6394,6 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-reachable@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-reachable/-/is-reachable-5.0.0.tgz#caa3a4d1c6368fdafb85cdb7d1e219e5b8fded6b" - integrity sha512-frRPbdrQWEqbnF1il9Dyrf52Q40exkHdo4/grWMjHrBn4G1DKC9sbuQihgANkJPNi2eosU4AXBsrITdXmc3IQg== - dependencies: - arrify "^2.0.1" - got "^11.7.0" - is-port-reachable "^3.0.0" - p-any "^3.0.0" - p-timeout "^3.2.0" - prepend-http "^3.0.1" - router-ips "^1.0.0" - url-parse "^1.4.7" - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -5995,12 +6435,12 @@ is-retry-allowed@^1.0.0: is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-symbol@^1.0.2: version "1.0.3" @@ -6012,7 +6452,7 @@ is-symbol@^1.0.2: is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-uri@~1.2.0: version "1.2.0" @@ -6022,16 +6462,19 @@ is-uri@~1.2.0: parse-uri "~1.0.0" punycode2 "~1.0.0" +is-uri@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.4.tgz#d098837e45701eaedce1b53de68b8102465fbd46" + integrity sha512-8sHi5gEARwpMYwJD9uSAkU9Bb7YkSagcM10EYqSe+osqOErXln4VL+EgLSG40e9lVTpcpygpvb9Z6ohZpECDGA== + dependencies: + parse-uri "~1.0.3" + punycode2 "~1.0.0" + is-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.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== - 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" @@ -6040,7 +6483,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== iso-639-3@~1.1.0: version "1.1.0" @@ -6055,14 +6498,19 @@ iso-639-3@~2.2.0: isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== isostring@0.0.1: version "0.0.1" @@ -6072,24 +6520,22 @@ isostring@0.0.1: isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz#53321a7970f076262fd3292c8f9b2e4ac544aae1" - integrity sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ== +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: - "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" + istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-report@^3.0.0: @@ -6102,18 +6548,18 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -6123,114 +6569,129 @@ iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -jest-changed-files@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.3.0.tgz#85d8de6f4bd13dafda9d7f1e3f2565fc0e183c78" - integrity sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew== +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== dependencies: - "@jest/types" "^25.3.0" - execa "^3.2.0" - throat "^5.0.0" + execa "^5.0.0" + p-limit "^3.1.0" -jest-cli@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.3.0.tgz#d9e11f5700cc5946583cf0d01a9bdebceed448d2" - integrity sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw== +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== dependencies: - "@jest/core" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" + "@jest/environment" "^29.4.2" + "@jest/expect" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + 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" + slash "^3.0.0" + stack-utils "^2.0.3" + +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== + dependencies: + "@jest/core" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" + chalk "^4.0.0" exit "^0.1.2" + graceful-fs "^4.2.9" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" + jest-config "^29.4.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" prompts "^2.0.1" - realpath-native "^2.0.0" - yargs "^15.3.1" + yargs "^17.3.1" -jest-config@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.3.0.tgz#112b5e2f2e57dec4501dd2fe979044c06fb1317e" - integrity sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA== +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== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.3.0" - "@jest/types" "^25.3.0" - babel-jest "^25.3.0" - chalk "^3.0.0" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.4.2" + "@jest/types" "^29.4.2" + babel-jest "^29.4.2" + chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" - jest-environment-jsdom "^25.3.0" - jest-environment-node "^25.3.0" - jest-get-type "^25.2.6" - jest-jasmine2 "^25.3.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" - micromatch "^4.0.2" - pretty-format "^25.3.0" - realpath-native "^2.0.0" + glob "^7.1.3" + 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" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.4.2" + slash "^3.0.0" + strip-json-comments "^3.1.1" -jest-diff@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f" - integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w== +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== dependencies: - chalk "^3.0.0" - diff-sequences "^25.2.6" - jest-get-type "^25.2.6" - pretty-format "^25.3.0" + chalk "^4.0.0" + diff-sequences "^29.4.2" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" -jest-docblock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" - integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== +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== dependencies: detect-newline "^3.0.0" -jest-each@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.3.0.tgz#a319eecf1f6076164ab86f99ca166a55b96c0bd4" - integrity sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw== +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== dependencies: - "@jest/types" "^25.3.0" - chalk "^3.0.0" - jest-get-type "^25.2.6" - jest-util "^25.3.0" - pretty-format "^25.3.0" + "@jest/types" "^29.4.2" + chalk "^4.0.0" + jest-get-type "^29.4.2" + jest-util "^29.4.2" + pretty-format "^29.4.2" -jest-environment-jsdom@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz#c493ab8c41f28001520c70ef67dd88b88be6af05" - integrity sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg== +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== dependencies: - "@jest/environment" "^25.3.0" - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" - jsdom "^15.2.1" + "@jest/environment" "^29.4.2" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-mock "^29.4.2" + jest-util "^29.4.2" -jest-environment-node@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.3.0.tgz#9845f0e63991e8498448cb0ae804935689533db9" - integrity sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g== - dependencies: - "@jest/environment" "^25.3.0" - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" - semver "^6.3.0" - -jest-get-type@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" - integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== +jest-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-haste-map@^25.2.6: version "25.2.6" @@ -6251,197 +6712,197 @@ jest-haste-map@^25.2.6: optionalDependencies: fsevents "^2.1.2" -jest-haste-map@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.3.0.tgz#b7683031c9c9ddc0521d311564108b244b11e4c6" - integrity sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A== +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== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^29.4.2" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.3" - jest-serializer "^25.2.6" - jest-util "^25.3.0" - jest-worker "^25.2.6" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - which "^2.0.2" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.2" + jest-util "^29.4.2" + jest-worker "^29.4.2" + micromatch "^4.0.4" + walker "^1.0.8" optionalDependencies: - fsevents "^2.1.2" + fsevents "^2.3.2" -jest-jasmine2@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz#16ae4f68adef65fb45001b26c864bcbcbf972830" - integrity sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ== +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== dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.3.0" - "@jest/source-map" "^25.2.6" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" - co "^4.6.0" - expect "^25.3.0" - is-generator-fn "^2.0.0" - jest-each "^25.3.0" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-runtime "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - pretty-format "^25.3.0" - throat "^5.0.0" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" -jest-leak-detector@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz#5b6bf04903b35be56038915a55f47291771f769f" - integrity sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw== +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== dependencies: - jest-get-type "^25.2.6" - pretty-format "^25.3.0" + chalk "^4.0.0" + jest-diff "^29.4.2" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" -jest-matcher-utils@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz#76765788a26edaa8bc5f0100aea52ae383559648" - integrity sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg== +jest-message-util@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.2.tgz#309a2924eae6ca67cf7f25781a2af1902deee717" + integrity sha512-SElcuN4s6PNKpOEtTInjOAA8QvItu0iugkXqhYyguRvQoXapg5gN+9RQxLAkakChZA7Y26j6yUCsFWN+hlKD6g== dependencies: - chalk "^3.0.0" - jest-diff "^25.3.0" - jest-get-type "^25.2.6" - pretty-format "^25.3.0" - -jest-message-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.3.0.tgz#e3836826fe5ca538a337b87d9bd2648190867f85" - integrity sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^25.3.0" - "@types/stack-utils" "^1.0.1" - chalk "^3.0.0" - micromatch "^4.0.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.4.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.2" slash "^3.0.0" - stack-utils "^1.0.1" + stack-utils "^2.0.3" -jest-mock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.3.0.tgz#d72644509e40987a732a9a2534a1054f4649402c" - integrity sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ== +jest-mock@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.2.tgz#e1054be66fb3e975d26d4528fcde6979e4759de8" + integrity sha512-x1FSd4Gvx2yIahdaIKoBjwji6XpboDunSJ95RpntGrYulI1ByuYQCKN/P7hvk09JB74IonU3IPLdkutEWYt++g== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-util "^29.4.2" -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== -jest-resolve-dependencies@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz#b0e4ae053dd44ddacc18c6ee12b5b7c28e445a90" - integrity sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA== - dependencies: - "@jest/types" "^25.3.0" - jest-regex-util "^25.2.6" - jest-snapshot "^25.3.0" +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-resolve@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.3.0.tgz#cb90a5bbea54a02eccdbbf4126a819595dcf91d6" - integrity sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ== +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== dependencies: - "@jest/types" "^25.3.0" - browser-resolve "^1.11.3" - chalk "^3.0.0" - jest-pnp-resolver "^1.2.1" - realpath-native "^2.0.0" - resolve "^1.15.1" + jest-regex-util "^29.4.2" + jest-snapshot "^29.4.2" -jest-runner@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.3.0.tgz#673ef2ac79d2810eb6b2c1a3f82398375a3d1174" - integrity sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA== +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== dependencies: - "@jest/console" "^25.3.0" - "@jest/environment" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" - chalk "^3.0.0" - exit "^0.1.2" - graceful-fs "^4.2.3" - jest-config "^25.3.0" - jest-docblock "^25.3.0" - jest-haste-map "^25.3.0" - jest-jasmine2 "^25.3.0" - jest-leak-detector "^25.3.0" - jest-message-util "^25.3.0" - jest-resolve "^25.3.0" - jest-runtime "^25.3.0" - jest-util "^25.3.0" - jest-worker "^25.2.6" - source-map-support "^0.5.6" - throat "^5.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + jest-pnp-resolver "^1.2.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" -jest-runtime@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.3.0.tgz#af4d40dbcc590fa5de9910cb6a120a13d131050b" - integrity sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w== +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== dependencies: - "@jest/console" "^25.3.0" - "@jest/environment" "^25.3.0" - "@jest/source-map" "^25.2.6" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" + "@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" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.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-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== + 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" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.3" - jest-config "^25.3.0" - jest-haste-map "^25.3.0" - jest-message-util "^25.3.0" - jest-mock "^25.3.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" - realpath-native "^2.0.0" + 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" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.3.1" jest-serializer@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7" - integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ== - -jest-snapshot@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.3.0.tgz#d4feb457494f4aaedcc83fbbf1ca21808fc3df71" - integrity sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" + integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^25.3.0" - "@types/prettier" "^1.19.0" - chalk "^3.0.0" - expect "^25.3.0" - jest-diff "^25.3.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-resolve "^25.3.0" - make-dir "^3.0.0" + 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== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.4.2" + "@jest/transform" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.4.2" + 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" natural-compare "^1.4.0" - pretty-format "^25.3.0" - semver "^6.3.0" + pretty-format "^29.4.2" + semver "^7.3.5" jest-util@^25.2.6: version "25.2.6" @@ -6453,56 +6914,71 @@ jest-util@^25.2.6: is-ci "^2.0.0" make-dir "^3.0.0" -jest-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.3.0.tgz#e3b0064165818f10d78514696fd25efba82cf049" - integrity sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA== +jest-util@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.2.tgz#3db8580b295df453a97de4a1b42dd2578dabd2c2" + integrity sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g== dependencies: - "@jest/types" "^25.3.0" - chalk "^3.0.0" - is-ci "^2.0.0" - make-dir "^3.0.0" + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -jest-validate@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.3.0.tgz#eb95fdee0039647bcd5d4be641b21e4a142a880c" - integrity sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w== +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== dependencies: - "@jest/types" "^25.3.0" - camelcase "^5.3.1" - chalk "^3.0.0" - jest-get-type "^25.2.6" + "@jest/types" "^29.4.2" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.2" leven "^3.1.0" - pretty-format "^25.3.0" + pretty-format "^29.4.2" -jest-watcher@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.3.0.tgz#fd03fd5ca52f02bd3161ab177466bf1bfdd34e5c" - integrity sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA== +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== dependencies: - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" ansi-escapes "^4.2.1" - chalk "^3.0.0" - jest-util "^25.3.0" - string-length "^3.1.0" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.4.2" + string-length "^4.0.1" jest-worker@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" - integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@~25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.3.0.tgz#7a5e59741d94b8662664c77a9f346246d6bf228b" - integrity sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg== +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== dependencies: - "@jest/core" "^25.3.0" + "@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== + dependencies: + "@jest/core" "^29.4.2" + "@jest/types" "^29.4.2" import-local "^3.0.2" - jest-cli "^25.3.0" + jest-cli "^29.4.2" jmespath@0.15.0: version "0.15.0" @@ -6520,9 +6996,9 @@ jquery@^3.3.1: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -6530,72 +7006,39 @@ js-yaml@^3.13.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== +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== dependencies: - abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.2.0" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" - xml-name-validator "^3.0.0" - -jsdom@~16.6.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" 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" + 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.0" - parse5 "6.0.1" - saxes "^5.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" 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.5" - xml-name-validator "^3.0.0" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" jsesc@^2.5.1: version "2.5.2" @@ -6612,7 +7055,7 @@ json-buffer@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, 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== @@ -6622,15 +7065,20 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" @@ -6640,14 +7088,12 @@ json-stable-stringify-without-jsonify@^1.0.1: json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== - dependencies: - minimist "^1.2.5" +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== jsonwebtoken@^8.3.0, jsonwebtoken@~8.5.1: version "8.5.1" @@ -6666,13 +7112,13 @@ jsonwebtoken@^8.3.0, jsonwebtoken@~8.5.1: semver "^5.6.0" jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" jwa@^1.4.1: @@ -6709,14 +7155,14 @@ keyv@^4.0.0: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" @@ -6726,9 +7172,9 @@ kind-of@^5.0.0: integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" @@ -6769,7 +7215,7 @@ levenary@^1.1.1: levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -6782,6 +7228,11 @@ libphonenumber-js@^1.6.4: 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" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + linkifyjs@~2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.8.tgz#2bee2272674dc196cce3740b8436c43df2162f9c" @@ -6902,7 +7353,7 @@ lodash.once@^4.0.0: lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== lodash.unescape@4.0.1: version "4.0.1" @@ -6914,12 +7365,12 @@ lodash@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.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.11, lodash@~4.17.14, lodash@~4.17.15, lodash@~4.17.20: +lodash@^4.15.0, lodash@^4.17.14, lodash@^4.17.5, 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.7.0, lodash@~4.17.21: +lodash@^4.17.13, lodash@^4.17.15, lodash@~4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6929,13 +7380,6 @@ loglevel@^1.6.7: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== -lolex@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" - long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -6978,7 +7422,7 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@^5.0.0: +lru-cache@^5.0.0, lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== @@ -6992,6 +7436,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.7.1: + version "7.14.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" + integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -7013,49 +7462,50 @@ make-dir@^2.0.0, make-dir@^2.1.0: semver "^5.6.0" make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-fetch-happen@^8.0.14: - version "8.0.14" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" - integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: - agentkeepalive "^4.1.3" - cacache "^15.0.5" + agentkeepalive "^4.2.1" + cacache "^16.1.0" http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" + lru-cache "^7.7.1" + minipass "^3.1.6" minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" + minipass-fetch "^2.0.3" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" + negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^5.0.0" - ssri "^8.0.0" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" @@ -7064,10 +7514,10 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memoize-one@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memoize-one@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== memorystream@^0.3.1: version "0.3.1" @@ -7098,20 +7548,22 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== -metascraper-audio@^5.14.26: - version "5.14.26" - resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.14.26.tgz#04508899aa26c60981ee545bd182533b43882af4" - integrity sha512-lh1EvglE0IzBz2U6ku9rgYERXzyRQ+qgYist1bIK5qpcjPys9Svkmplw68ZdLC5lUpvCKQ2s4p28s/S8pljybw== +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: - "@metascraper/helpers" "^5.14.26" + "@keyvhq/memoize" "~1.6.14" + "@metascraper/helpers" "^5.33.5" + got "~11.8.5" + p-reflect "~2.1.0" -metascraper-author@^5.14.22: - version "5.14.22" - resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.14.22.tgz#71d8f625bb7d077b91c9097dbe96c1606c15d58f" - integrity sha512-93nV2k2GEUL2GQcQRFJiHcJzjyLDf0kkZ3LiiKiJ/W6kICENRgpXCEA56rjcvcFLoNQl2CwDBB2O1pecPLodmQ== +metascraper-author@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.33.5.tgz#ae6fd41c8f9a355e48b851e67308673e1f2fe89c" + integrity sha512-/n4OWwHNQZwb9Z1t3Y58I5+ou885tBHGsTPGhBB7SYdbOBRygr8DuC9HDrPlrmW0aY88lIDTTN3jqTqEoPYgaQ== dependencies: - "@metascraper/helpers" "^5.14.22" - lodash "~4.17.20" + "@metascraper/helpers" "^5.33.5" metascraper-clearbit-logo@^5.3.0: version "5.3.0" @@ -7120,26 +7572,26 @@ metascraper-clearbit-logo@^5.3.0: dependencies: got "~9.6.0" -metascraper-date@^5.11.8: - version "5.11.8" - resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.11.8.tgz#718788b6fd878300cc214f162bc118719a0a08c9" - integrity sha512-BryNhvsDZXtHl4Ef0xeP6zGM5CIEBhgP4YOXFd5+8J4/fgEHUKBhS2hnruY+lZ7VZIvjx6UWGYs/zRPaYVR4Hw== +metascraper-date@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.33.5.tgz#fccd8f7b685e0f3bb152c86aa93ed03a96c3c834" + integrity sha512-NmzizRF52KzJg2qDSPKT6FnPxB8ufvtZS00kci7Sxdt6PFGKrOEK8qaj6Z3XDSZiBWd8WMtdEHi4K7Mf17C7kA== dependencies: - "@metascraper/helpers" "^5.11.8" + "@metascraper/helpers" "^5.33.5" -metascraper-description@^5.23.1: - version "5.23.1" - resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.23.1.tgz#f83df32a7dd095e1403700335bbb7c8025ed6a5f" - integrity sha512-fuZpnWXLf/l8XvCsgXXu5BjXAoryYQANN/qUarBs50O+5ZQWWvd40wb6jxkpD7rUBP7Dz6YFO44oICYz6TwT4g== +metascraper-description@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.33.5.tgz#d6b20e613da6028d6e825162f89f045282d4ce81" + integrity sha512-j+5hY8QPvFbAud6soeoSq7FXvnezPxW3aLgVHtuGTDBfDTSW7TGsfzcajCfgPwi1F3CslBTql/hfoFq1rK+kGw== dependencies: - "@metascraper/helpers" "^5.23.1" + "@metascraper/helpers" "^5.33.5" -metascraper-image@^5.11.8: - version "5.11.8" - resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.11.8.tgz#7b0cc60bf667f4a80c82f8b0e2bd516eb81457cf" - integrity sha512-jr3kMS2ZCoNiRoGSCUycO0HvYZcFIXKpFtOazjC6etfd/4NtjnpwxtfEJzN/AUSQwngsutIQdelOMSLnmPec6w== +metascraper-image@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.33.5.tgz#76e71310cce14fa56232a3802668f07f0d2095bd" + integrity sha512-8IYyjA7FH+laEV+Wg6l+gmMTrLcW9jYkyj8e6R0wuvxKjJNmdZuhLGmteDfyec/kkPHoFQSPFbz+tTsQN8ue9g== dependencies: - "@metascraper/helpers" "^5.11.8" + "@metascraper/helpers" "^5.33.5" metascraper-lang-detector@^4.10.2: version "4.10.2" @@ -7150,78 +7602,79 @@ metascraper-lang-detector@^4.10.2: franc "~4.0.0" iso-639-3 "~1.1.0" -metascraper-lang@^5.23.1: - version "5.23.1" - resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.23.1.tgz#703a5858815f7c647eecd44b1b2f6bf2d291f8f6" - integrity sha512-VFJX9xrxWe0YLW7aDbUAUsOnNTv6RaJ7z/W+BrgtbJTvjIvWENvMBBbpWHh69B58Ih3VE607YTc0+wImGbe0yA== +metascraper-lang@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.33.5.tgz#6299b88ff4e84c81325af13a9978fde452f45c46" + integrity sha512-HZiRpyvBkahuK+ULb1C8mQyREpxe6w4kguEl3l5/4CdTUKeEsbkBE41Tz23nSoMfzDP8IsPN65cd/s1Loa47Yw== dependencies: - "@metascraper/helpers" "^5.23.1" + "@metascraper/helpers" "^5.33.5" -metascraper-logo@^5.14.26: - version "5.14.26" - resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.14.26.tgz#4fe14a0ca292ae99727fcfdc17f78a07c507ce53" - integrity sha512-sKDqBVuF2KuxHOmYo/3I3+PMuFcTgyBBJukuflMF5mv/73CQYeAPnz7842NZBg1z63W46DB9O/c5SrlD3B41+Q== +metascraper-logo@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.33.5.tgz#395a1acc2f630ec92bb7b794cf1cf2999e61a8d9" + integrity sha512-zTaAqGRJ3ZIINuChRcsXSPNW1RceM5N/nCFa/1cN/UY/6TSmZbDGbtIXmypVd/cHMfC72oKoNrVd1TROtofcoQ== dependencies: - "@metascraper/helpers" "^5.14.26" + "@metascraper/helpers" "^5.33.5" + lodash "~4.17.21" -metascraper-publisher@^5.23.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.23.0.tgz#fa5e9e515e15a882dfe7ba399fd1692283989666" - integrity sha512-zV3Q4k03nmqBtXUUbVRD6MuzLhLxGllJd2bTVM5bRaHNqzkL44/DE1cdbbOws8UJ74BNkdE5nKbMMWe9h75yMw== +metascraper-publisher@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.33.5.tgz#381744ebe6e2bedc478f21b101a006cc703bb0b9" + integrity sha512-2M9ZkQPZYUvU4Rz3Mcak6rNtK6/xcLUd77ejOgMB3EVbgm5BGsCp7dPtf4iSSybhu/RsJCvJb4Ndsajzgw9kSQ== dependencies: - "@metascraper/helpers" "^5.23.0" + "@metascraper/helpers" "^5.33.5" -metascraper-soundcloud@^5.23.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.23.0.tgz#85600bfb2dbe700197fd0afb2280ddacfa3bee97" - integrity sha512-l0TgdprmkTp5H7bb+NrNpCkM8GPCwH+3L2Xp8l68vnAqFnbvQIl7h+HXApsr+VjSHzg2I2dXu/ffHrW8EqsMhQ== +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== dependencies: - "@metascraper/helpers" "^5.23.0" - tldts "~5.7.38" + "@metascraper/helpers" "^5.33.5" -metascraper-title@^5.11.8: - version "5.11.8" - resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.11.8.tgz#d490d0e32c9123fd7015fab5ff3deb9de2507ef8" - integrity sha512-KTfxDqw4s/dwZ5bw3SqKogH+prnegc3nhufWpKvIIyz8PjLJw54lKSHzQa1m87O3LFTq+H/BV273MZ9AzGOKuQ== +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== dependencies: - "@metascraper/helpers" "^5.11.8" - lodash "~4.17.15" + "@metascraper/helpers" "^5.33.5" -metascraper-url@^5.14.26: - version "5.14.26" - resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.14.26.tgz#f829cd04d8c413ebd6bb5ae76d47d9827d2979d0" - integrity sha512-oygnebVXypZZJh3rA/nra1jvJCKlTG1INOO0IGAAjdSJrg9H+vUWN5+HfDi4wOSwfS5wB5JF9Nu5OI3wHiPYkA== +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== dependencies: - "@metascraper/helpers" "^5.14.26" + "@metascraper/helpers" "^5.33.5" -metascraper-video@^5.11.8: - version "5.11.8" - resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.11.8.tgz#7d4a10995d5fb50fe2d931ba3129398ea2ffc627" - integrity sha512-Nk15xqA8WCX0ZDt49mohWY9in/UNuSGGKf0gDxHauhM7e9DyRFgkGLCUDsVWq/izlueveTEbT83/aHjAtUGL1g== +metascraper-video@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.33.5.tgz#4231ddee3bb4cb22f6f41c868de61012f7989fa9" + integrity sha512-Fa0u+O/tY6RbRtY0Y+Ox7OJP3+a9o2HwYvK0NjLUdisF/GBZOJ7i1U2puv4kbOvua5un7BS6J6ULiWIF/+EPAg== dependencies: - "@metascraper/helpers" "^5.11.8" - lodash "~4.17.15" + "@keyvhq/memoize" "~1.6.14" + "@metascraper/helpers" "^5.33.5" + got "~11.8.5" + lodash "~4.17.21" + p-reflect "~2.1.0" -metascraper-youtube@^5.23.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.23.0.tgz#b50d99c24a86f00cbba8c4d26ca824621e0fdc5f" - integrity sha512-JbOevB3sZpx5+jN5Afx6zwWbw2uXNFu0I5yB26FhSgG3wuClFGvPBUuldJMWv2DrfIs3xC8RNZzxt7DwULZr/Q== +metascraper-youtube@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.33.5.tgz#7b72d2facdce5fdbf53b8353476ea9115e5061a6" + integrity sha512-jztiBU3PbXnxK6AhFqkfpC2PDYkyOfaF/4wjI8AT/wXYvDMk8pEUx8SNAHThxx4CEHVylCIzXc0o6gKUcCic/w== dependencies: - "@metascraper/helpers" "^5.23.0" - get-video-id "~3.2.0" - is-reachable "~5.0.0" + "@metascraper/helpers" "^5.33.5" + get-video-id "~3.6.5" p-locate "~5.0.0" + reachable-url "~1.7.1" -metascraper@^5.11.8: - version "5.11.8" - resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.11.8.tgz#af8536e1e61436d0c939394a5dc7ad871f289257" - integrity sha512-AltlRzDO+ydsOyeaF78posFAY3YBqmgy57M2NbU+AKaQ0aWjspxmhXjMA7DOLjfHTDeff7B2115WvLhslbsU5A== +metascraper@^5.33.5: + version "5.33.5" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.33.5.tgz#c411cda7c144ec3e9d0dff42da858a2a3925e1c9" + integrity sha512-ey9flNTK8rlJ7GfE0qQ5HvnYF6BMTJZ4EsTLBEB/IMRPCIPjJk6RgV/VpdpnWTBlujjErryay5UWhk13wlXhXQ== dependencies: - "@metascraper/helpers" "^5.11.8" - cheerio "~1.0.0-rc.3" - cheerio-advanced-selectors "~2.0.1" - lodash "~4.17.15" - whoops "~4.1.0" + "@metascraper/helpers" "^5.33.5" + cheerio "~1.0.0-rc.12" + lodash "~4.17.21" + whoops "~4.1.2" methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" @@ -7247,13 +7700,13 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.0.5" + braces "^3.0.2" + picomatch "^2.3.1" microsoft-capitalize@~1.0.5: version "1.0.5" @@ -7279,42 +7732,35 @@ mime-db@1.43.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== - -mime-types@^2.1.12: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.44.0" + mime-db "1.52.0" -mime-types@^2.1.26, mime-types@~2.1.19, mime-types@~2.1.22, mime-types@~2.1.24: +mime-types@^2.1.26, mime-types@~2.1.22, mime-types@~2.1.24: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: mime-db "1.43.0" -mime-types@~2.1.31: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== - dependencies: - mime-db "1.48.0" - mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -7325,6 +7771,11 @@ mimic-fn@~3.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.0.0.tgz#76044cfa8818bbf6999c5c9acadf2d3649b14b4b" integrity sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ== +mimic-fn@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -7342,20 +7793,29 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@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: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -7364,16 +7824,16 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^1.3.2: - version "1.3.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.4.tgz#63f5af868a38746ca7b33b03393ddf8c291244fe" - integrity sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ== +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== dependencies: - minipass "^3.1.0" + minipass "^3.1.6" minipass-sized "^1.0.3" - minizlib "^2.0.0" + minizlib "^2.1.2" optionalDependencies: - encoding "^0.1.12" + encoding "^0.1.13" minipass-flush@^1.0.5: version "1.0.5" @@ -7382,7 +7842,7 @@ minipass-flush@^1.0.5: dependencies: minipass "^3.0.0" -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: +minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== @@ -7404,13 +7864,27 @@ minipass@^2.2.1, minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: +minipass@^3.0.0, minipass@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" +minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" + integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== + dependencies: + yallist "^4.0.0" + minizlib@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" @@ -7418,7 +7892,7 @@ minizlib@^1.2.1: dependencies: minipass "^2.2.1" -minizlib@^2.0.0, minizlib@^2.1.1: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -7459,23 +7933,23 @@ moment@^2.22.2: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mustache@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" @@ -7500,15 +7974,10 @@ n-gram@^1.0.0: resolved "https://registry.yarnpkg.com/n-gram/-/n-gram-1.1.1.tgz#a374dc176a9063a2388d1be18ed7c35828be2a97" integrity sha512-qibRqvUghLIVsq+RTwVuwOzgOxf0l4DDZKVYAK0bMam5sG9ZzaJ6BUSJyG2Td8kTc7c/HcMUtjiN5ShobZA2bA== -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nan@^2.14.2: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nan@2.17.0, nan@^2.12.1, nan@^2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nanomatch@^1.2.9: version "1.2.13" @@ -7530,7 +7999,7 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@^2.2.1: version "2.4.0" @@ -7546,6 +8015,11 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo4j-driver-bolt-connection@^4.4.7: version "4.4.7" resolved "https://registry.yarnpkg.com/neo4j-driver-bolt-connection/-/neo4j-driver-bolt-connection-4.4.7.tgz#0582d54de1f213e60c374209193d1f645ba523ea" @@ -7646,42 +8120,31 @@ 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@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.1.0.tgz#81f43283e922d285c886fb0e0f520a7fd431d8c2" - integrity sha512-o2elh1qt7YUp3lkMwY3/l4KF3j/A3fI/Qt4NH+CQQgPJdqGE9y7qnP84cjIWN27Q0jJkrSAhCVDg+wBVNBYdBg== +node-gyp@^9.3.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" + integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== dependencies: env-paths "^2.2.0" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^8.0.14" - nopt "^5.0.0" - npmlog "^4.1.2" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" rimraf "^3.0.2" semver "^7.3.5" - tar "^6.1.0" + tar "^6.1.2" which "^2.0.2" node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" - integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== - dependencies: - growly "^1.3.0" - is-wsl "^2.1.1" - semver "^6.3.0" - shellwords "^0.1.1" - which "^1.3.1" + integrity sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ== node-pre-gyp@^0.12.0: version "0.12.0" @@ -7704,6 +8167,11 @@ node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + nodemailer-html-to-text@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/nodemailer-html-to-text/-/nodemailer-html-to-text-3.2.0.tgz#91b959491fef8f7d91796047abb728aa86d4a12b" @@ -7740,12 +8208,12 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== dependencies: - abbrev "1" + abbrev "^1.0.0" nopt@~1.0.10: version "1.0.10" @@ -7767,7 +8235,7 @@ normalize-package-data@^2.3.2: normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" @@ -7822,18 +8290,18 @@ npm-run-all@~4.1.5: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7843,6 +8311,23 @@ npmlog@^4.0.2, npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -7860,10 +8345,10 @@ numeral@^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.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== oauth-sign@~0.9.0: version "0.9.0" @@ -7878,7 +8363,7 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -7907,7 +8392,7 @@ object-path@^0.11.4: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" @@ -7940,7 +8425,7 @@ object.getownpropertydescriptors@^2.1.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" @@ -7964,14 +8449,14 @@ on-finished@~2.3.0: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" @@ -8012,14 +8497,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-any@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-any/-/p-any-3.0.0.tgz#79847aeed70b5d3a10ea625296c0c3d2e90a87b9" - integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== - dependencies: - p-cancelable "^2.0.0" - p-some "^5.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" @@ -8030,20 +8507,10 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== -p-each-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" - integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" @@ -8052,14 +8519,21 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -8101,20 +8575,10 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-some@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-some/-/p-some-5.0.0.tgz#8b730c74b4fe5169d7264a240ad010b6ebc686a4" - integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== - dependencies: - aggregate-error "^3.0.0" - p-cancelable "^2.0.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" +p-reflect@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-2.1.0.tgz#5d67c7b3c577c4e780b9451fc9129675bd99fe67" + integrity sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg== p-try@^1.0.0: version "1.0.0" @@ -8165,6 +8629,16 @@ parse-json@^4.0.0: 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" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -8175,15 +8649,18 @@ parse-uri@~1.0.0: resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.0.tgz#2872dcc22f1a797acde1583d8a0ac29552ddac20" integrity sha1-KHLcwi8aeXrN4Vg9igrClVLdrCA= -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse-uri@~1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.7.tgz#287629a09328a97e398468f21b8a00c4a2d9cc73" + integrity sha512-eWuZCMKNlVkXrEoANdXxbmqhu2SQO9jUMCSpdbJDObin0JxISn6e400EWsSRbr/czdKvWKkhZnMKEGUwf/Plmg== -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" parse5@^3.0.1: version "3.0.3" @@ -8192,6 +8669,13 @@ parse5@^3.0.1: dependencies: "@types/node" "*" +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseurl@^1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -8208,7 +8692,7 @@ pascal-case@^3.1.1: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-dirname@^1.0.0: version "1.0.2" @@ -8228,7 +8712,7 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.1: version "1.0.2" @@ -8238,22 +8722,17 @@ path-is-inside@^1.0.1: path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-key@^3.0.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" - integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -8287,12 +8766,17 @@ pathval@^1.1.0: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picomatch@^2.0.4, picomatch@^2.0.5: - version "2.1.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" - integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.3.0: version "0.3.0" @@ -8314,13 +8798,18 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.0, pirates@^4.0.1: +pirates@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: node-modules-regexp "^1.0.0" +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -8342,15 +8831,10 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss@^7.0.27: version "7.0.27" @@ -8364,7 +8848,7 @@ postcss@^7.0.27: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^1.0.1: version "1.0.4" @@ -8376,11 +8860,6 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prepend-http@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-3.0.1.tgz#3e724d58fd5867465b300bb9615009fa2f8ee3b6" - integrity sha512-BLxfZh+m6UiAiCPZFJ4+vYoL7NrRs5XgCTRrjseATAggXhdZKKxn+JUNmuVYWY23bDHgaEHodxw8mnmtVEDtHw== - 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" @@ -8393,15 +8872,14 @@ prettier@~2.3.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== -pretty-format@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.3.0.tgz#d0a4f988ff4a6cd350342fdabbb809aeb4d49ad5" - integrity sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA== +pretty-format@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.2.tgz#64bf5ccc0d718c03027d94ac957bdd32b3fb2401" + integrity sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg== dependencies: - "@jest/types" "^25.3.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" + "@jest/schemas" "^29.4.2" + ansi-styles "^5.0.0" + react-is "^18.0.0" private@^0.1.8: version "0.1.8" @@ -8432,12 +8910,12 @@ promise-retry@^2.0.1: retry "^0.12.0" prompts@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" - integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" - sisteransi "^1.0.3" + sisteransi "^1.0.5" prop-types@^15.6.2: version "15.7.2" @@ -8467,9 +8945,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: - version "1.3.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" - integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== psl@^1.1.33: version "1.8.0" @@ -8500,9 +8978,9 @@ punycode@1.3.2: integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== qs@6.7.0: version "6.7.0" @@ -8515,9 +8993,9 @@ qs@^6.5.1: integrity sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w== qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== querystring@0.2.0: version "0.2.0" @@ -8559,14 +9037,22 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -re2@^1.15.9: - version "1.16.0" - resolved "https://registry.yarnpkg.com/re2/-/re2-1.16.0.tgz#f311eb4865b1296123800ea8e013cec8dab25590" - integrity sha512-eizTZL2ZO0ZseLqfD4t3Qd0M3b3Nr0MBWpX81EbPMIud/1d/CSfUIx2GQK8fWiAeHoSekO5EOeFib2udTZLwYw== +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== dependencies: - install-artifact-from-github "^1.2.0" - nan "^2.14.2" - node-gyp "^8.0.0" + install-artifact-from-github "^1.3.1" + nan "^2.17.0" + node-gyp "^9.3.0" + +reachable-url@~1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/reachable-url/-/reachable-url-1.7.1.tgz#4d56f534d088c084e7d9884dafadf2c43d074c66" + integrity sha512-SCk7V5cwUw246mPhJ7uaqMcxa5iJNlzfztCvcDK1EgqexW2ghLWWrAGZCBNg/lT0ZqjJnLcsKPfGWxmmoABvOw== + dependencies: + got "~11.8.0" + p-reflect "~2.1.0" react-dom@^16.4.2: version "16.9.0" @@ -8578,16 +9064,16 @@ react-dom@^16.4.2: prop-types "^15.6.2" scheduler "^0.15.0" -react-is@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== - react-is@^16.8.1: version "16.9.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== +react-is@^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@^16.4.2: version "16.9.0" resolved "https://registry.yarnpkg.com/react/-/react-16.9.0.tgz#40ba2f9af13bc1a38d75dbf2f4359a5185c4f7aa" @@ -8645,6 +9131,15 @@ readable-stream@^3.1.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -8809,17 +9304,17 @@ regjsparser@^0.6.4: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== request-promise-core@1.1.3: version "1.1.3" @@ -8828,7 +9323,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.7, request-promise-native@^1.0.8: +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== @@ -8866,12 +9361,7 @@ request@^2.88.0, request@~2.88.2: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== requires-port@^1.0.0: version "1.0.0" @@ -8903,20 +9393,29 @@ resolve-from@^5.0.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.3, resolve@^1.5.0: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" +resolve@^1.20.0, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -8968,13 +9467,6 @@ rimraf@^2.6.1: dependencies: glob "^7.1.3" -rimraf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" - integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== - dependencies: - glob "^7.1.3" - rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8987,11 +9479,6 @@ rosie@^2.0.1: resolved "https://registry.yarnpkg.com/rosie/-/rosie-2.0.1.tgz#c250c4787ce450b72aa9eff26509f68589814fa2" integrity sha1-wlDEeHzkULcqqe/yZQn2hYmBT6I= -router-ips@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/router-ips/-/router-ips-1.0.0.tgz#44e00858ebebc0133d58e40b2cd8a1fbb04203f5" - integrity sha1-ROAIWOvrwBM9WOQLLNih+7BCA/U= - rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -9028,12 +9515,12 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -9041,7 +9528,7 @@ safe-buffer@^5.1.2, safe-buffer@~5.2.0: safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" @@ -9091,17 +9578,10 @@ 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@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== - dependencies: - xmlchars "^2.1.1" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" @@ -9214,7 +9694,7 @@ sha.js@^2.4.11: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -9228,7 +9708,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -9240,20 +9720,15 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.1.tgz#3161d969886fb14f9140c65245a5dd19b6f0b06b" integrity sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg== -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sisteransi@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" - integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^2.0.0: version "2.0.0" @@ -9286,10 +9761,10 @@ slug@~6.0.0: resolved "https://registry.yarnpkg.com/slug/-/slug-6.0.0.tgz#39637b32e5a873bc692812a630842880499ed6c9" integrity sha512-0MpNLyCSUSf0G1nAZmp9gY1cvesPP35a1Live25vZ23gWQ5SAopF0N+0hk9KI4ytNuTebJrHGNrgTnxboofcSg== -smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== smartquotes@~2.3.1: version "2.3.1" @@ -9331,35 +9806,43 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== dependencies: agent-base "^6.0.2" - debug "4" - socks "^2.3.3" + debug "^4.3.3" + socks "^2.6.2" -socks@^2.3.3: - version "2.6.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" - integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: - ip "^1.1.5" - smart-buffer "^4.1.0" + ip "^2.0.0" + smart-buffer "^4.2.0" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.6: +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" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== @@ -9368,9 +9851,9 @@ source-map-support@^0.5.16, source-map-support@^0.5.6: source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.5.6: version "0.5.6" @@ -9380,18 +9863,13 @@ source-map@0.5.6: source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -9428,7 +9906,7 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== srcset@^2.0.1: version "2.0.1" @@ -9436,9 +9914,9 @@ srcset@^2.0.1: integrity sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ== sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -9450,10 +9928,10 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== dependencies: minipass "^3.1.1" @@ -9469,10 +9947,12 @@ stack-generator@^2.0.1: dependencies: stackframe "^1.0.4" -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" stackframe@^1.0.4: version "1.0.4" @@ -9504,7 +9984,7 @@ standard-as-callback@^2.0.1: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -9517,7 +9997,7 @@ static-extend@^0.1.1: stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== streamsearch@0.1.2: version "0.1.2" @@ -9529,13 +10009,13 @@ string-argv@^0.3.0: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" string-width@^1.0.1: version "1.0.2" @@ -9554,6 +10034,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -9563,24 +10052,6 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" - integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^5.2.0" - -string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - string.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" @@ -9657,12 +10128,12 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -9677,7 +10148,7 @@ strip-bom@^4.0.0: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" @@ -9689,6 +10160,11 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -9751,26 +10227,30 @@ supports-color@^6.1.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.0.0.tgz#b1b94a159e9df00b0a554b2d5f0e0a89690334b0" - integrity sha512-bFhn0MQ8qefLyJ3K7PpHiPUTuTVPWw6RXfaMeV6xgJLXtBbszyboz1bvGTVv4R0YpQm2DqlXXn0fFHhxUHVE5w== +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" - supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== symbol-observable@^1.0.2, symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.2, symbol-tree@^3.2.4: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -9803,26 +10283,14 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@^6.0.2: - version "6.0.5" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" - integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== +tar@^6.1.11, tar@^6.1.2: + version "6.1.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tar@^6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.2.tgz#1f045a90a6eb23557a603595f41a16c57d47adc6" - integrity sha512-EwKEgqJ7nJoS+s8QfLYVGMDmAsj+StbI2AM/RTHeUSsOw6Z8bwNBRv5z3CY0m7laC5qUAqruLX5AhMuc5deY3Q== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^4.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -9834,14 +10302,6 @@ 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" @@ -9875,11 +10335,6 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -9918,22 +10373,22 @@ tlds@^1.187.0: resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== -tlds@^1.217.0: - version "1.221.1" - resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.221.1.tgz#6cf6bff5eaf30c5618c5801c3f425a6dc61ca0ad" - integrity sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q== +tlds@^1.228.0: + version "1.236.0" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.236.0.tgz#a118eebe33261c577e3a3025144faeabb7dd813c" + integrity sha512-oP2PZ3KeGlgpHgsEfrtva3/K9kzsJUNliQSbCfrJ7JMCWFoCdtG+9YMq/g2AnADQ1v5tVlbtvKJZ4KLpy/P6MA== -tldts-core@^5.7.38: - version "5.7.38" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.38.tgz#779092c90941803fb682c3d7094a88f12aad4508" - integrity sha512-mcL16YTXjpVJ+ekoKC/ddvdjGNMg8HkdWQNp3WNz26WJMV7Z2Hjr1IPwYYr9W3LxGdXV7mmg21Zk2vSstiSsFg== +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@~5.7.38: - version "5.7.38" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.7.38.tgz#ca23b9bfa7e2af9ffeddcedab45a564b0a63bbd5" - integrity sha512-Ji+xTLv8TAWq2y7/+RCC/OpWO7ExpgsZyijA27Q2uHElyaMrNhgjcZVbgvpwX0Imgk5w8jnJqRDLrmeIefma2Q== +tldts@~5.7.103: + version "5.7.104" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.7.104.tgz#c964cf8a194936b086fa4c72994e92d4cd4d2562" + integrity sha512-PlziEIVPH/ogbqOhS35K6MOeD09rd9U5g2NHO5n9NZeMC1PGpXgsjQpoJ1KiRnjhZsWDkzN8EoX3xQZuz5ZyFQ== dependencies: - tldts-core "^5.7.38" + tldts-core "^5.7.104" tmp@^0.0.33: version "0.0.33" @@ -9942,20 +10397,20 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" @@ -9967,7 +10422,7 @@ to-readable-stream@^1.0.0: to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -10014,35 +10469,20 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" @@ -10079,11 +10519,6 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= -truncate@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" - integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== - ts-invariant@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" @@ -10104,19 +10539,19 @@ tslib@^1.10.0, tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -10125,16 +10560,16 @@ 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.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== -type-fest@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -10210,17 +10645,17 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: - unique-slug "^2.0.0" + unique-slug "^3.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: imurmurhash "^0.1.4" @@ -10231,10 +10666,10 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== unixify@1.0.0: version "1.0.0" @@ -10251,7 +10686,7 @@ unpipe@1.0.0, unpipe@~1.0.0: unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -10266,6 +10701,14 @@ 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== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" @@ -10288,16 +10731,16 @@ upper-case@^1.0.3: integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-parse-lax@^1.0.0: version "1.0.0" @@ -10313,22 +10756,21 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" -url-regex-safe@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/url-regex-safe/-/url-regex-safe-2.0.2.tgz#41d02bb7c927d57008389f636de0bd850a40fc7c" - integrity sha512-n5qtPAWvMLTmgYMCX1195CKV9oJE6SkSa5bVsMrHSFA/hnqila9J1KVf6gF2M66lCWwPDhJyQlX1tEXqtzBOPQ== +url-regex-safe@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-regex-safe/-/url-regex-safe-3.0.0.tgz#102a38f74a1a731973fa42690c6a56656fddff12" + integrity sha512-+2U40NrcmtWFVjuxXVt9bGRw6c7/MgkGKN9xIfPrT/2RX0LTkkae6CCEDp93xqUN0UKm/rr821QnHd2dHQmN3A== dependencies: - ip-regex "^4.3.0" - re2 "^1.15.9" - tlds "^1.217.0" + ip-regex "4.3.0" + tlds "^1.228.0" url-regex@~4.1.1: version "4.1.1" @@ -10408,14 +10850,14 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8-to-istanbul@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.0.1.tgz#d6a2a3823b8ff49bdf2167ff2a45d82dff81d02f" - integrity sha512-x0yZvZAkjJwdD3fPiJzYP37aod0ati4LlmD2RmpKjqewjKAov/u/ytZ8ViIZb07cN4cePKzl9ijiUi7C1LQ8hQ== +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" - source-map "^0.7.3" v8flags@^3.1.1: version "3.1.3" @@ -10445,7 +10887,7 @@ vary@^1, vary@~1.1.2: verror@1.10.0, verror@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -10461,35 +10903,12 @@ 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.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: - browser-process-hrtime "^0.1.2" - -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@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.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" + xml-name-validator "^4.0.0" wait-on@~4.0.1: version "4.0.1" @@ -10503,64 +10922,39 @@ wait-on@~4.0.1: request-promise-native "^1.0.8" rxjs "^6.5.4" -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= +walker@^1.0.7, walker@^1.0.8, 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.x" + makeerror "1.0.12" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webidl-conversions@^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== - -whatwg-encoding@^1.0.1, 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-mimetype@^2.2.0, 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-url@^7.0.0: +webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -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-module@^2.0.0: +whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" -which@^1.2.9, which@^1.3.1: +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -10574,13 +10968,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -whoops@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.1.0.tgz#f42e51514c7af19a9491a44cabf2712292c6a8e1" - integrity sha512-42soctqvFs9FaU1r4ZadCy2F6A9dUc4SN3ud+tbDEdmyZDTeYBgKKqtIdo6NiQlnZnJegWRCyKLk2edYH9DsHA== +whoops@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.1.2.tgz#b8bf080b9b4f4ab93f8249734ac1086fb14b4dd9" + integrity sha512-QITkghBnjbKGOtOrJOGrHnupWDX/AHFlcTXL3/A0B5rx2DacLrpuIpcFVmwYb0IOWZ0G3sxYkS8LBSZ4J/ezng== dependencies: - clean-stack "~2.2.0" - mimic-fn "~3.0.0" + clean-stack "~3.0.0" + mimic-fn "~3.1.0" wide-align@^1.1.0: version "1.1.3" @@ -10589,6 +10983,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -10601,10 +11002,10 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" @@ -10613,7 +11014,7 @@ wrap-ansi@^6.2.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^2.0.0: version "2.4.3" @@ -10625,15 +11026,23 @@ write-file-atomic@^2.0.0: signal-exit "^3.0.2" write-file-atomic@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b" - integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" is-typedarray "^1.0.0" signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +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" @@ -10641,7 +11050,7 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.0.0, ws@^7.4.5: +"ws@^5.2.0 || ^6.0.0 || ^7.0.0": version "7.5.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== @@ -10653,6 +11062,11 @@ 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== + 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" @@ -10663,10 +11077,10 @@ xdg-basedir@^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" @@ -10681,7 +11095,7 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= -xmlchars@^2.1.1, xmlchars@^2.2.0: +xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== @@ -10706,10 +11120,10 @@ xtend@^4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" @@ -10731,30 +11145,23 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^18.1.1: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== +yargs@^17.3.1: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" yocto-queue@^0.1.0: version "0.1.0" diff --git a/cypress/cypress.json b/cypress/cypress.json index 3f41ca3e5..dbe8691fa 100644 --- a/cypress/cypress.json +++ b/cypress/cypress.json @@ -1,5 +1,6 @@ { "projectId": "qa7fe2", + "defaultCommandTimeout": 10000, "ignoreTestFiles": "*.js", "chromeWebSecurity": false, "baseUrl": "http://localhost:3000", diff --git a/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js b/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js index ce876a081..3ca39e6e6 100644 --- a/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js +++ b/cypress/integration/Moderation.ReportContent/somebody_reported_the_following_posts.js @@ -1,5 +1,4 @@ import { Given } from "cypress-cucumber-preprocessor/steps"; -import { gql } from '../../../backend/src/helpers/jest' Given('somebody reported the following posts:', table => { table.hashes().forEach(({ submitterEmail, resourceId, reasonCategory, reasonDescription }) => { @@ -10,7 +9,7 @@ Given('somebody reported the following posts:', table => { cy.factory() .build('user', {}, submitter) .authenticateAs(submitter) - .mutate(gql`mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + .mutate(`mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { fileReport(resourceId: $resourceId, reasonCategory: $reasonCategory, reasonDescription: $reasonDescription) { reportId } 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/integration/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js index b9e97a304..ca6b4798b 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/integration/UserProfile.NameDescriptionLocation/I_can_see_my_new_name_{string}_when_I_click_on_my_profile_picture_in_the_top_right.js @@ -1,7 +1,13 @@ import { Then } from "cypress-cucumber-preprocessor/steps"; Then('I can see my new name {string} when I click on my profile picture in the top right', name => { + cy.get(".avatar-menu").then(($menu) => { + if (!$menu.is(':visible')){ + cy.scrollTo("top"); + cy.wait(500); + } + }) cy.get('.avatar-menu').click() // open cy.get('.avatar-menu-popover').contains(name) cy.get('.avatar-menu').click() // close again -}) \ No newline at end of file +}) diff --git a/cypress/integration/UserProfile.SocialMedia.feature b/cypress/integration/UserProfile.SocialMedia.feature index 5ab1feb25..04c227661 100644 --- a/cypress/integration/UserProfile.SocialMedia.feature +++ b/cypress/integration/UserProfile.SocialMedia.feature @@ -13,29 +13,29 @@ Feature: User profile - list social media accounts When I navigate to page "/settings/my-social-media" Then I am on page "/settings/my-social-media" When I add a social media link - Then I see a toaster with "Added social media" + Then I see a toaster with status "success" And the new social media link shows up on the page Scenario: Other users viewing my Social Media - Given I have added a social media link + Given I have added the social media link "https://freeradical.zone/peter-pan" When I navigate to page "/profile/peter-pan" Then they should be able to see my social media links Scenario: Deleting Social Media When I navigate to page "/settings/my-social-media" Then I am on page "/settings/my-social-media" - Given I have added a social media link - When I delete a social media link - Then I see a toaster with "Deleted social media" + Given I have added the social media link "https://freeradical.zone/peter-pan" + When I delete the social media link "https://freeradical.zone/peter-pan" + Then I see a toaster with status "success" Scenario: Editing Social Media When I navigate to page "/settings/my-social-media" Then I am on page "/settings/my-social-media" - Given I have added a social media link + Given I have added the social media link "https://freeradical.zone/peter-pan" When I start editing a social media link Then I can cancel editing When I start editing a social media link And I edit and save the link - Then I see a toaster with "Added social media" + Then I see a toaster with status "success" And the new url is displayed But the old url is not displayed diff --git a/cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js b/cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js index ca2e36818..07c80b30c 100644 --- a/cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js +++ b/cypress/integration/UserProfile.SocialMedia/I_add_a_social_media_link.js @@ -1,12 +1,10 @@ import { When } from "cypress-cucumber-preprocessor/steps"; When('I add a social media link', () => { - cy.get('button') - .contains('Add link') + cy.get('[data-test="add-save-button"]') .click() .get('#editSocialMedia') .type('https://freeradical.zone/peter-pan') - .get('button') - .contains('Save') + .get('[data-test="add-save-button"]') .click() }) \ No newline at end of file diff --git a/cypress/integration/UserProfile.SocialMedia/I_delete_a_social_media_link.js b/cypress/integration/UserProfile.SocialMedia/I_delete_a_social_media_link.js deleted file mode 100644 index 10daffca1..000000000 --- a/cypress/integration/UserProfile.SocialMedia/I_delete_a_social_media_link.js +++ /dev/null @@ -1,6 +0,0 @@ -import { When } from "cypress-cucumber-preprocessor/steps"; - -When('I delete a social media link', () => { - cy.get(".base-button[title='Delete']") - .click() -}) \ No newline at end of file diff --git a/cypress/integration/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js b/cypress/integration/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js new file mode 100644 index 000000000..6b65e361b --- /dev/null +++ b/cypress/integration/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js @@ -0,0 +1,12 @@ +import { When } from "cypress-cucumber-preprocessor/steps"; + +When('I delete the social media link {string}', (link) => { + cy.get('[data-test="delete-button"]') + .click() + cy.get('[data-test="confirm-modal"]') + .should("be.visible") + cy.get('[data-test="confirm-button"]') + .click() + cy.get('.ds-list-item-content > a') + .contains(link).should('not.exist') +}) \ No newline at end of file diff --git a/cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js b/cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js index 714e6b701..54712920d 100644 --- a/cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js +++ b/cypress/integration/UserProfile.SocialMedia/I_edit_and_save_the_link.js @@ -4,7 +4,6 @@ When('I edit and save the link', () => { cy.get('input#editSocialMedia') .clear() .type('https://freeradical.zone/tinkerbell') - .get('button') - .contains('Save') + .get('[data-test="add-save-button"]') .click() }) \ No newline at end of file diff --git a/cypress/integration/UserProfile.SocialMedia/I_have_added_a_social_media_link.js b/cypress/integration/UserProfile.SocialMedia/I_have_added_a_social_media_link.js deleted file mode 100644 index 93e35bf28..000000000 --- a/cypress/integration/UserProfile.SocialMedia/I_have_added_a_social_media_link.js +++ /dev/null @@ -1,13 +0,0 @@ -import { Given } from "cypress-cucumber-preprocessor/steps"; - -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() -}) \ No newline at end of file diff --git a/cypress/integration/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js b/cypress/integration/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js new file mode 100644 index 000000000..78a0191d2 --- /dev/null +++ b/cypress/integration/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js @@ -0,0 +1,13 @@ +import { Given } from "cypress-cucumber-preprocessor/steps"; + +Given('I have added the social media link {string}', (link) => { + cy.visit('/settings/my-social-media') + .get('[data-test="add-save-button"]') + .click() + .get('#editSocialMedia') + .type(link) + .get('[data-test="add-save-button"]') + .click() + cy.get('.ds-list-item-content > a') + .contains(link) +}) \ No newline at end of file diff --git a/cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js b/cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js index 1da05cfa5..e3e5c2a22 100644 --- a/cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js +++ b/cypress/integration/UserProfile.SocialMedia/I_start_editing_a_social_media_link.js @@ -1,6 +1,6 @@ import { When } from "cypress-cucumber-preprocessor/steps"; When('I start editing a social media link', () => { - cy.get(".base-button[title='Edit']") + cy.get('[data-test="edit-button"]') .click() }) \ 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/integration/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js index 249e4f420..89db2bd77 100644 --- a/cypress/integration/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js +++ b/cypress/integration/UserProfile.SocialMedia/they_should_be_able_to_see_my_social_media_links.js @@ -1,8 +1,8 @@ import { Then } from "cypress-cucumber-preprocessor/steps"; Then('they should be able to see my social media links', () => { - cy.get('.base-card') - .contains('Where else can I find Peter Pan?') + 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_log_out.js b/cypress/integration/common/I_log_out.js index 51605f17e..60185bc45 100644 --- a/cypress/integration/common/I_log_out.js +++ b/cypress/integration/common/I_log_out.js @@ -1,9 +1,15 @@ import { When } from "cypress-cucumber-preprocessor/steps"; When("I log out", () => { + cy.get(".avatar-menu").then(($menu) => { + if (!$menu.is(':visible')){ + cy.scrollTo("top"); + cy.wait(500); + } + }) cy.get(".avatar-menu") .click(); cy.get(".avatar-menu-popover") .find('a[href="/logout"]') .click(); -}); \ No newline at end of file +}); diff --git a/cypress/integration/common/I_see_a_toaster_with_status_{string}.js b/cypress/integration/common/I_see_a_toaster_with_status_{string}.js new file mode 100644 index 000000000..aa07d787c --- /dev/null +++ b/cypress/integration/common/I_see_a_toaster_with_status_{string}.js @@ -0,0 +1,9 @@ +import { Then } from "cypress-cucumber-preprocessor/steps"; + +Then("I see a toaster with status {string}", (status) => { + switch (status) { + case "success": + cy.get(".iziToast.iziToast-color-green").should("be.visible"); + break; + } +}) \ No newline at end of file diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 335e00390..7d3738a3d 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -15,11 +15,10 @@ /* globals Cypress cy */ import "cypress-file-upload"; import { GraphQLClient, request } from 'graphql-request' -import { gql } from '../../backend/src/helpers/jest' import config from '../../backend/src/config' const authenticatedHeaders = (variables) => { - const mutation = gql` + const mutation = ` mutation($email: String!, $password: String!) { login(email: $email, password: $password) } diff --git a/deployment/.env.dist b/deployment/.env.dist new file mode 100644 index 000000000..8b8901647 --- /dev/null +++ b/deployment/.env.dist @@ -0,0 +1 @@ +CONFIGURATION=example \ No newline at end of file diff --git a/deployment/Minikube.md b/deployment/Minikube.md new file mode 100644 index 000000000..8e6240a7c --- /dev/null +++ b/deployment/Minikube.md @@ -0,0 +1,25 @@ +# Minikube + +There are many Kubernetes providers, but if you're just getting started, Minikube is a tool that you can use to get your feet wet. + +After you [installed Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) +open your minikube dashboard: + +```text +$ minikube dashboard +``` + +This will give you an overview. Some of the steps below need some timing to make resources available to other dependent deployments. Keeping an eye on the dashboard is a great way to check that. + +Follow the installation instruction for [Kubernetes with Helm](./kubernetes/README.md). + +If all the pods and services have settled and everything looks green in your +minikube dashboard, expose the services you want on your host system. + +For example: + +```text +$ minikube service webapp --namespace=ocelotsocialnetwork +# optionally +$ minikube service backend --namespace=ocelotsocialnetwork +``` \ No newline at end of file diff --git a/deployment/README.deployment.md b/deployment/README.deployment.md new file mode 100644 index 000000000..5335c11ad --- /dev/null +++ b/deployment/README.deployment.md @@ -0,0 +1,23 @@ +# 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 new file mode 100644 index 000000000..030eb8a44 --- /dev/null +++ b/deployment/README.md @@ -0,0 +1,136 @@ +# Ocelot.Social Deploy And Rebranding + +[![Build Status Publish](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/actions/workflows/publish.yml/badge.svg)](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/actions) +[![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/blob/LICENSE.md) +[![Discord Channel](https://img.shields.io/discord/489522408076738561.svg)](https://discord.gg/AJSX9DCSUA) +[![Open Source Helpers](https://www.codetriage.com/ocelot-social-community/ocelot-social-deploy-rebranding/badges/users.svg)](https://www.codetriage.com/ocelot-social-community/ocelot-social-deploy-rebranding) + +This repository is an in use template to rebrand, configure, and deploy [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) networks. +The forked original repository is [Ocelot-Social-Deploy-Rebranding](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding). + + +

+ Ocelot-Social +

+ + +## Live demo + +__Try out our deployed [development environment](https://stage.ocelot.social).__ + +Visit our staging networks: + +- central staging network: [stage.ocelot.social](https://stage.ocelot.social) + + +Logins: + +| email | password | role | +| :--- | :--- | :--- | +| `user@example.org` | 1234 | user | +| `moderator@example.org` | 1234 | moderator | +| `admin@example.org` | 1234 | admin | + +## Usage + +Fork this repository to configure and rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. + +### Package.Json And DockerHub Organisation + +Write your own data into the main configuration file: + +- [package.json](/package.json) + +Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](/package.json) file as your `dockerOrganisation`. + +### Configure And Branding + +The next step is: + +- [Configure And Branding](/branding/README.md) + +### Optional: Locally Testing Configuration And Branding + +Just in case you have Docker installed and run the following, you can check your branding locally: + +```bash +# in main folder +$ docker-compose up +# fill the database with an initial admin +$ docker-compose exec backend yarn run prod:migrate init +``` + +The database is then initialised with the default administrator: + +- E-mail: admin@example.org +- Password: 1234 + +For login or registration have a look in your browser at `http://localhost:3000/`. +For the maintenance page have a look in your browser at `http://localhost:5000/`. + +### Push Changes To GitHub + +Before merging these changes into the "master" branch on your GitHub fork repository, you need to configure the GitHub repository secrets. This is necessary to [publish](/.github/workflows/publish.yml) the Docker images by pushing them via GitHub actions to repositories belonging to your DockerHub organisation. + +First, go to your DockerHub profile under `Account Settings` and click on the `Security` tab. There you create an access token called `-access-token` and copy the token to a safe place. + +Secondly, in your GitHub repository, click on the 'Settings' tab and go to the 'Secrets' tab. There you create two secrets by clicking on `New repository secret`: + +1. Named `DOCKERHUB_TOKEN` with the newly created DockerHub token (only the code, not the token name). +2. Named `DOCKERHUB_USERNAME` with your DockerHub username. + +### Optional: Locally Testing Your DockerHub Images + +Just in case you like to check your pushed Docker images in your organisation's DockerHub repositories locally: + +- rename the file `docker-compose.ocelotsocial-branded.yml` with your network name +- in the file, rename the ocelot.social DockerHub organisation `ocelotsocialnetwork` to your organisations name + +Remove any local Docker images if necessary and do the following: + +```bash +# in main folder +$ docker-compose -f docker-compose.-branded.yml up +# fill the database with an initial admin +$ docker-compose exec backend yarn run prod:migrate init +``` + +See the login details and browser addresses above. + +### Deployment + +Afterwards you can [deploy](/deployment/README.md) it on your server: + +- [Kubernetes with Helm](/deployment/kubernetes/README.md) + +## Developer Chat + +Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat: +Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: +Check out the [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too! + +We give write permissions to every developer who asks for it. Just text us on +[Discord](https://discord.gg/AJSX9DCSUA). + +## Technology Stack + +- [Docker](https://www.docker.com) +- [Kubernetes](https://kubernetes.io) +- [Helm](https://helm.sh) + + + +## License + +See the [LICENSE](/LICENSE.md) file for license rights and limitations (MIT). + + +We need `DOCKER_BUILDKIT=0` for this to work. \ No newline at end of file diff --git a/deployment/TODO-next-update.md b/deployment/TODO-next-update.md new file mode 100644 index 000000000..769fe4d67 --- /dev/null +++ b/deployment/TODO-next-update.md @@ -0,0 +1,86 @@ +# Todo For Next Update + +When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings: + +## Version >= 2.4.0 with 'ocelotDockerVersionTag' 2.4.0-XXX + +### Main Code PR – feat(webapp): map #5843 + +- Create your own [Mapbox](https://mapbox.com/) account at [https://mapbox.com/](https://mapbox.com/) for your organization to get your own Mapbox token. +- You have to add the `MAPBOX_TOKEN` from the `deployment/kubernetes/values.template.yaml` to your `deployment/kubernetes/values.yaml` and set it to your own Mapbox token. + +## Version >= 2.2.0 with 'ocelotDockerVersionTag' 2.2.0-267 + +### Main Code PR – feat: 🍰 Footer And Header Links Configurable To Have External Link Target #5590 + +- You have to add property `target` to all array elements with value `url` to your preferred value in `branding/constants/headerMenu.js` originally in main code file `webapp/constants/headerMenu.js`. +- You have to move value of all `externalLink` to new property `externalLink.url` and set new property `externalLink.target` to your preferred value in `branding/constants/links.js` originally in main code file `webapp/constants/links.js`. + +### Main Code PR – feat: 🍰 Make Donation Progress Bar Color Configurable #5593 + +- You have to set `PROGRESS_BAR_COLOR_TYPE` in `branding/constants/donation.js` originally in main code file `webapp/constants/donation.js` to your preferred value. + +### Main Code PR – feat: 🍰 Header Logo Routing Update #5579 + +- You have to move value of `LOGO_HEADER_CLICK.externalLink` to new property `LOGO_HEADER_CLICK.externalLink.url` and set new property `LOGO_HEADER_CLICK.externalLink.target` to your preferred value in `branding/constants/logos.js` originally in main code file `webapp/constants/logos.js`. + +## Version >= 2.0.0 with 'ocelotDockerVersionTag' 2.0.0-250 + +### Main Code PR – feat: 🍰 Implement LOGO_HEADER_CLICK As Configuration #5525 + +- You have to set `LOGO_HEADER_CLICK` in `branding/constants/logos.js` originally in main code file `webapp/constants/logos.js` to your preferred value. + +### Main Code Issue – 🌟 [EPIC] Release v2.0.0 – Beta Test → Final #5547 + +- You have to set `SHOW_GROUP_BUTTON_IN_HEADER` in `branding/constants/groups.js` originally in main code file `webapp/constants/groups.js` to your preferred value. + +## Version >= 1.1.0 with 'ocelotDockerVersionTag' 1.1.0-205 + +### Deployment/Rebranding PR – chore: 🍰 Release v1.1.0 - Implement Categories Again #63 + +- You have to add the `CATEGORIES_ACTIVE` from the `deployment/kubernetes/values.template.yaml` to your `deployment/kubernetes/values.yaml` and set it to your preferred value. +- Make sure the correct categories are in your Neo4j database on the server. + +## Version >= 1.0.9 with 'ocelotDockerVersionTag' 1.0.9-199 + +### Deployment/Rebranding PR – chore: 🍰 Implement PRODUCTION_DB_CLEAN_ALLOW for Staging Production Environments #56 + +- Copy `PRODUCTION_DB_CLEAN_ALLOW` from `deployment/kubernetes/values.template.yaml` to `values.yaml` and set it to `false` for production environments and only for several stage test servers to `true`. + +### Deployment/Rebranding PR – chore: [WIP] 🍰 Refine docs, first step #46 + +Upgrade the cert-manager, but install CRDs of the version 1.0.0-alpha to actually be able to upgrade ocelot. Then uninstall the legacy CRDs and install the correct ones. + +```bash +# upgrade cert-manager to 1.9.1 +> helm upgrade --set installCRDs=true --version 1.9.1 --namespace cert-manager cert-manager jetstack/cert-manager +# apply legacy CRDs +> kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.0.0-alpha.1/cert-manager.crds.yaml +# upgrade ocelot +> helm upgrade ocelot ./ +# delete legacy CRDs +> kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/v1.0.0-alpha.1/cert-manager.crds.yaml +# apply CRDs for cert-manager 1.9.1 +> kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.crds.yaml +``` + +Background: We had to upgrade cert-manager due to an external dependency - therefore we had to update cert-manager apiVersion `cert-manager.io/v1alpha2` to `cert-manager.io/v1`. + +The error occurring when not doing this is the following: + +```bash +Error: UPGRADE FAILED: unable to build kubernetes objects from current release manifest: [resource mapping not found for name: "letsencrypt-production" namespace: "" from "": no matches for kind "ClusterIssuer" in version "cert-manager.io/v1alpha2" +ensure CRDs are installed first, resource mapping not found for name: "letsencrypt-staging" namespace: "" from "": no matches for kind "ClusterIssuer" in version "cert-manager.io/v1alpha2" +ensure CRDs are installed first] +``` + +## Version >= 1.0.8 with 'ocelotDockerVersionTag' 1.0.8-182 + +### PR – feat: 🍰 Configure Cookie Expire Time #43 + +- You have to add the `COOKIE_EXPIRE_TIME` from the `deployment/kubernetes/values.template.yaml` to your `deployment/kubernetes/values.yaml` and set it to your preferred value. +- Correct `locale` cookie exploration time in data privacy. + +## Version 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 + +- No information. diff --git a/deployment/configurations/.gitignore b/deployment/configurations/.gitignore new file mode 100644 index 000000000..5a7d01850 --- /dev/null +++ b/deployment/configurations/.gitignore @@ -0,0 +1,3 @@ +/* +!/example +!.gitignore \ No newline at end of file diff --git a/deployment/configurations/example/branding/README.md b/deployment/configurations/example/branding/README.md new file mode 100644 index 000000000..dd2a3b1fc --- /dev/null +++ b/deployment/configurations/example/branding/README.md @@ -0,0 +1,5 @@ +# Configure And Branding + +In this folder you will find all configuration files and logo images to customise the configuration and branding of the [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network code to your own needs. + +Please change these and they will be used automatically as part of the [deployment](/deployment/README.md) process. diff --git a/deployment/configurations/example/branding/assets/fonts/.gitkeep b/deployment/configurations/example/branding/assets/fonts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/configurations/example/branding/assets/styles/imports/_branding.scss b/deployment/configurations/example/branding/assets/styles/imports/_branding.scss new file mode 100644 index 000000000..75058595d --- /dev/null +++ b/deployment/configurations/example/branding/assets/styles/imports/_branding.scss @@ -0,0 +1,5 @@ +/* + * + * Here, all SCSS variables and classes can be adapted to your custom design. + * +*/ \ No newline at end of file diff --git a/deployment/configurations/example/branding/constants/donation.js b/deployment/configurations/example/branding/constants/donation.js new file mode 100644 index 000000000..3e36ae9a8 --- /dev/null +++ b/deployment/configurations/example/branding/constants/donation.js @@ -0,0 +1 @@ +export const PROGRESS_BAR_COLOR_TYPE = 'gradient' // 'uni' is the other option diff --git a/deployment/configurations/example/branding/constants/emails.js b/deployment/configurations/example/branding/constants/emails.js new file mode 100644 index 000000000..f5bd9a4a6 --- /dev/null +++ b/deployment/configurations/example/branding/constants/emails.js @@ -0,0 +1,8 @@ +// this file is duplicated in `backend/src/config/` and `webapp/constants/` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ +export default { + SUPPORT_EMAIL: 'hello@ocelot.social', + MODERATION_EMAIL: 'hello@ocelot.social', + // ATTENTION: the following links have to be defined even for internal pages with full URLs as example like 'https://staging.ocelot.social/support', because they are used in e-mails! + ORGANIZATION_LINK: 'https://ocelot.social', + SUPPORT_LINK: 'https://ocelot.social', +} diff --git a/deployment/configurations/example/branding/constants/groups.js b/deployment/configurations/example/branding/constants/groups.js new file mode 100644 index 000000000..1c49d3ff3 --- /dev/null +++ b/deployment/configurations/example/branding/constants/groups.js @@ -0,0 +1,5 @@ +// this file is duplicated in `backend/src/constants/group.js` and `webapp/constants/group.js` +export const NAME_LENGTH_MIN = 3 +export const NAME_LENGTH_MAX = 50 +export const DESCRIPTION_WITHOUT_HTML_LENGTH_MIN = 100 // with removed HTML tags +export const SHOW_GROUP_BUTTON_IN_HEADER = true diff --git a/deployment/configurations/example/branding/constants/headerMenu.js b/deployment/configurations/example/branding/constants/headerMenu.js new file mode 100644 index 000000000..aa87a598c --- /dev/null +++ b/deployment/configurations/example/branding/constants/headerMenu.js @@ -0,0 +1,13 @@ +export default { + MENU: [ + // { + // nameIdent: 'nameIdent', + // path: '/', + // }, + // { + // nameIdent: 'nameIdent', + // url: 'https://ocelot.social', + // target: '_blank', + // }, + ], +} diff --git a/deployment/configurations/example/branding/constants/links.js b/deployment/configurations/example/branding/constants/links.js new file mode 100644 index 000000000..7efac159f --- /dev/null +++ b/deployment/configurations/example/branding/constants/links.js @@ -0,0 +1,152 @@ +// this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ + +import { defaultPageParamsPages } from '~/components/utils/InternalPages.js' + +const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ + // if defined it's dominating + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.made', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.made', // localized string identifier, if undefined default is used + // headlineIdent: 'site.made', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const DONATE = defaultPageParamsPages.DONATE.overwrite({ + // if defined it's dominating + externalLink: { + // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + url: 'https://ocelot-social.herokuapp.com/donations', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.donate', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.donate', // localized string identifier, if undefined default is used + // headlineIdent: 'site.donate', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ + // if defined it's dominating + externalLink: { + // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + url: 'https://ocelot-social.herokuapp.com/imprint', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.imprint', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.imprint', // localized string identifier, if undefined default is used + // headlineIdent: 'site.imprint', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used + // headlineIdent: 'site.termsAndConditions', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used + // headlineIdent: 'site.code-of-conduct', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.data-privacy', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.data-privacy', // localized string identifier, if undefined default is used + // headlineIdent: 'site.data-privacy', // localized string identifier, on null it's hidden, if undefined default is used + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const FAQ = defaultPageParamsPages.FAQ.overwrite({ + // externalLink: null, // if defined it's dominating + + internalPage: { + // footerIdent: 'site.faq', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.faq', // localized string identifier, if undefined default is used + // headlineIdent: 'site.faq', // on null default is used, on empty string it's hidden + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) +const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ + // if defined it's dominating + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, + + internalPage: { + // footerIdent: 'site.support', // localized string identifier, if undefined default is used + // headTitleIdent: 'site.support', // localized string identifier, if undefined default is used + // headlineIdent: 'site.support', // on null default is used, on empty string it's hidden + hasContainer: true, + hasBaseCard: true, + hasLoginInHeader: true, + // in case internal page content is here 'branding/locales/html/' + }, +}) + +export default { + LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization', or external 'https://ocelot.social' + + // you can find and store templates for 👇🏼 at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ + + ORGANIZATION, + DONATE, + IMPRINT, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, + DATA_PRIVACY, + FAQ, + SUPPORT, + + FOOTER_LINK_LIST: [ + ORGANIZATION, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, + DATA_PRIVACY, + FAQ, + DONATE, + IMPRINT, + SUPPORT, + ], +} diff --git a/deployment/configurations/example/branding/constants/logos.js b/deployment/configurations/example/branding/constants/logos.js new file mode 100644 index 000000000..714e78a2c --- /dev/null +++ b/deployment/configurations/example/branding/constants/logos.js @@ -0,0 +1,24 @@ +// this file is duplicated in `backend/src/config/logos.js` and `webapp/constants/logos.js` and replaced on rebranding +// this are the paths in the webapp +export default { + LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', + LOGO_HEADER_WIDTH: '130px', + LOGO_HEADER_CLICK: { + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, + internalPath: { + to: { + name: 'index', + }, + scrollTo: '.main-navigation', + }, + }, + LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', + LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', + LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg', + LOGO_PASSWORD_RESET_PATH: '/img/custom/logo-squared.svg', + LOGO_MAINTENACE_RESET_PATH: '/img/custom/logo-squared.svg', +} diff --git a/deployment/configurations/example/branding/constants/metadata.js b/deployment/configurations/example/branding/constants/metadata.js new file mode 100644 index 000000000..3d09066d5 --- /dev/null +++ b/deployment/configurations/example/branding/constants/metadata.js @@ -0,0 +1,9 @@ +// this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding +export default { + APPLICATION_NAME: 'ocelot.social', + APPLICATION_SHORT_NAME: 'ocelot.social', + APPLICATION_DESCRIPTION: 'Ocelot Social Community', + COOKIE_NAME: 'ocelot-social-token', + ORGANIZATION_NAME: 'busFaktor e.V.', + ORGANIZATION_JURISDICTION: 'Deutschland', +} diff --git a/deployment/configurations/example/branding/email/.gitkeep b/deployment/configurations/example/branding/email/.gitkeep new file mode 100644 index 000000000..afe8c26c9 --- /dev/null +++ b/deployment/configurations/example/branding/email/.gitkeep @@ -0,0 +1 @@ +we can put multilanguage e-mails and a layout.html in here \ No newline at end of file diff --git a/deployment/configurations/example/branding/email/templates/de/.gitkeep b/deployment/configurations/example/branding/email/templates/de/.gitkeep new file mode 100644 index 000000000..5b414a0c8 --- /dev/null +++ b/deployment/configurations/example/branding/email/templates/de/.gitkeep @@ -0,0 +1 @@ +we can put translated e-mails in here \ No newline at end of file diff --git a/deployment/configurations/example/branding/email/templates/en/.gitkeep b/deployment/configurations/example/branding/email/templates/en/.gitkeep new file mode 100644 index 000000000..5b414a0c8 --- /dev/null +++ b/deployment/configurations/example/branding/email/templates/en/.gitkeep @@ -0,0 +1 @@ +we can put translated e-mails in here \ No newline at end of file diff --git a/deployment/configurations/example/branding/locales/de.json b/deployment/configurations/example/branding/locales/de.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/deployment/configurations/example/branding/locales/de.json @@ -0,0 +1,2 @@ +{ +} diff --git a/deployment/configurations/example/branding/locales/en.json b/deployment/configurations/example/branding/locales/en.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/deployment/configurations/example/branding/locales/en.json @@ -0,0 +1,2 @@ +{ +} diff --git a/deployment/configurations/example/branding/locales/html/de/code-of-conduct.html b/deployment/configurations/example/branding/locales/html/de/code-of-conduct.html new file mode 100644 index 000000000..c4538e37d --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/code-of-conduct.html @@ -0,0 +1,60 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Präambel +

+

+ Ich bin der Inhalt vom Verhaltenskodex. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/data-privacy.html b/deployment/configurations/example/branding/locales/html/de/data-privacy.html new file mode 100644 index 000000000..104d18300 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/data-privacy.html @@ -0,0 +1,60 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Information über die Erhebung personenbezogener Daten +

+

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

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/donate.html b/deployment/configurations/example/branding/locales/html/de/donate.html new file mode 100644 index 000000000..71f1027ef --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/donate.html @@ -0,0 +1,60 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Wohin kann ich spenden? +

+

+ Hier steht was zu den Spenden. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/faq.html b/deployment/configurations/example/branding/locales/html/de/faq.html new file mode 100644 index 000000000..15a9d976d --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/faq.html @@ -0,0 +1,67 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Wie bediene ich dieses Netzwerk? +

+

+ Hier findest Du die + Bedienungsanleitung.
+

+

+ Betreiberspezifische FAQs +

+

+ Hier steht was zu den betreiberspezifischen FAQs. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/imprint.html b/deployment/configurations/example/branding/locales/html/de/imprint.html new file mode 100644 index 000000000..ad3c93562 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/imprint.html @@ -0,0 +1,60 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Betreiber +

+

+ Ich bin das Impressum. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/organization.html b/deployment/configurations/example/branding/locales/html/de/organization.html new file mode 100644 index 000000000..089d72fa4 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/organization.html @@ -0,0 +1,60 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Das Entwicklernetzwerk +

+

+ Hier wird das Netzwerk beschrieben. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/support.html b/deployment/configurations/example/branding/locales/html/de/support.html new file mode 100644 index 000000000..f4dcb537e --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/support.html @@ -0,0 +1,60 @@ + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Ansprechpartner +

+

+ Ich bin der Inhalt vom Support. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/de/terms-and-conditions.html b/deployment/configurations/example/branding/locales/html/de/terms-and-conditions.html new file mode 100644 index 000000000..74057ada1 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/de/terms-and-conditions.html @@ -0,0 +1,61 @@ + + + + +
+

+ Für das soziale Netzwerk Ocelot.Social Staging +

+

+ Nutzung und Lizenz +

+

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

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/code-of-conduct.html b/deployment/configurations/example/branding/locales/html/en/code-of-conduct.html new file mode 100644 index 000000000..714cad330 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/code-of-conduct.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ Präambel +

+

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

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/data-privacy.html b/deployment/configurations/example/branding/locales/html/en/data-privacy.html new file mode 100644 index 000000000..c4b718fe0 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/data-privacy.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ Information about the collection of personal data +

+

+ This would be our data privacy section. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/donate.html b/deployment/configurations/example/branding/locales/html/en/donate.html new file mode 100644 index 000000000..d25e9f419 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/donate.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ Where can I donate? +

+

+ Here's what it says about donations. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/faq.html b/deployment/configurations/example/branding/locales/html/en/faq.html new file mode 100644 index 000000000..a5998db78 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/faq.html @@ -0,0 +1,67 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ How do I operate this network? +

+

+ Here you can find the + user manual.
+

+

+ Operator-Specific FAQs +

+

+ Here are the operator-specific FAQs. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/imprint.html b/deployment/configurations/example/branding/locales/html/en/imprint.html new file mode 100644 index 000000000..6a7489a06 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/imprint.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ Operator +

+

+ I am the imprint. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/organization.html b/deployment/configurations/example/branding/locales/html/en/organization.html new file mode 100644 index 000000000..e5a6d0f93 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/organization.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ The Developers Network +

+

+ Here the network is described. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/support.html b/deployment/configurations/example/branding/locales/html/en/support.html new file mode 100644 index 000000000..118328b06 --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/support.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ Contact +

+

+ I am the content of the support. +

+
+ + diff --git a/deployment/configurations/example/branding/locales/html/en/terms-and-conditions.html b/deployment/configurations/example/branding/locales/html/en/terms-and-conditions.html new file mode 100644 index 000000000..44e3fe3cd --- /dev/null +++ b/deployment/configurations/example/branding/locales/html/en/terms-and-conditions.html @@ -0,0 +1,60 @@ + + + +
+

+ For the social network Ocelot.Social Staging +

+

+ Use and License +

+

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

+
+ + diff --git a/deployment/configurations/example/branding/static/favicon.ico b/deployment/configurations/example/branding/static/favicon.ico new file mode 100644 index 000000000..430cef437 Binary files /dev/null and b/deployment/configurations/example/branding/static/favicon.ico differ diff --git a/deployment/configurations/example/branding/static/icon.png b/deployment/configurations/example/branding/static/icon.png new file mode 100644 index 000000000..1c81fa5fc Binary files /dev/null and b/deployment/configurations/example/branding/static/icon.png differ diff --git a/deployment/configurations/example/branding/static/img/custom/logo-horizontal.svg b/deployment/configurations/example/branding/static/img/custom/logo-horizontal.svg new file mode 100644 index 000000000..d821c8329 --- /dev/null +++ b/deployment/configurations/example/branding/static/img/custom/logo-horizontal.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deployment/configurations/example/branding/static/img/custom/logo-squared.svg b/deployment/configurations/example/branding/static/img/custom/logo-squared.svg new file mode 100644 index 000000000..15f420c79 --- /dev/null +++ b/deployment/configurations/example/branding/static/img/custom/logo-squared.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deployment/configurations/example/branding/templates/locales/html/general/de/faq.html b/deployment/configurations/example/branding/templates/locales/html/general/de/faq.html new file mode 100644 index 000000000..b06c7e039 --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/general/de/faq.html @@ -0,0 +1,62 @@ + + + + +
+

+ Für das soziale Netzwerk {{ organization }} +

+

+ Wie bediene ich dieses Netzwerk? +

+

+ Hier findest Du die + Bedienungsanleitung.
+

+
+ + diff --git a/deployment/configurations/example/branding/templates/locales/html/general/en/faq.html b/deployment/configurations/example/branding/templates/locales/html/general/en/faq.html new file mode 100644 index 000000000..4a01a4540 --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/general/en/faq.html @@ -0,0 +1,62 @@ + + + + +
+

+ For the social network of {{ organization }} +

+

+ How do I operate this network? +

+

+ Here you can find the + user manual.
+

+
+ + diff --git a/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html new file mode 100644 index 000000000..f0fd19a4f --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html @@ -0,0 +1,163 @@ + + + + +
+

+ Für das soziale Netzwerk {{ organization }} +

+

+ Präambel +

+

+ {{ networkName}} ist ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk der nächsten Generation. + Von Menschen – für Menschen. + Free-Software, Open-Source, fair und transparent. + Für positiven lokalen und globalen Wandel in allen Lebensbereichen. + Wir gestalten den öffentlichen Austausch von Wissen, Ideen und Projekten völlig neu. + Die Funktionen von {{ networkName }} bringen die Menschen zusammen – offline und online – so dass wir die Welt zu einem besseren Ort machen können.
+

+

+ Zweck +

+

+ Mit diesen Verhaltensregeln regeln wir die wesentlichen Grundsätze für das Verhalten in unserem Sozialen Netzwerk. + Dabei ist die Menschenrechtscharta der Vereinten Nationen unsere Orientierung und bildet das Herz unseres Werteverständnisses. + Die Verhaltensregeln dienen als Leitsätze für den persönlichen Auftritt und den Umgang untereinander. + Wer als Nutzer im {{ networkName }} Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an.
+

+

+ Erwartetes Verhalten +

+

+ Die folgenden Verhaltensweisen werden von allen Community-Mitgliedern erwartet und gefordert:
+

+
    +
  • + Sei rücksichtsvoll und respektvoll, bei dem, was Du schreibst und tust. +
  • +
  • + Versuche auf andere zuzugehen, bevor ein Konflikt entsteht. +
  • +
  • + Vermeide erniedrigende, diskriminierende oder belästigende Verhaltensweisen und Ausdrücke. +
  • +
  • + Achte Dein Umfeld und Deine Mitmenschen. Warne die Verantwortlichen der Community, falls Du eine gefährliche Situation, jemanden in Not oder Verstöße gegen diesen Verhaltenskodex bemerkst, auch wenn diese unbedeutend erscheinen. +
  • +
+

+ Nichtakzeptables Verhalten +

+

+ Die folgenden Verhaltensweisen sind in unserer Community inakzeptabel:
+

+
    +
  • + Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen, insbesondere solche, die sich auf Geschlecht, sexuelle Orientierung, Rasse, Religion, politische oder weltanschauliche Ausrichtung oder Behinderung beziehen +
  • +
  • + Das Senden oder Verlinken eindeutig pornografischen Materials +
  • +
  • + Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten +
  • +
  • + Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen („Doxing“) +
  • +
  • + Absichtliche Einschüchterung, Stalking oder Verfolgung +
  • +
  • + Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht +
  • +
  • + Strafbares Verhalten bzw. Verstoß gegen deutsches Recht +
  • +
  • + Befürworten oder Ermutigen zu diesen Verhaltensweisen +
  • +
+

+ Konsequenzen inakzeptablen Verhaltens +

+

+ Wenn ein Gemeinschaftsmitglied inakzeptables Verhalten an den Tag legt, können die verantwortlichen Betreiber, Moderatoren und Administratoren des Netzwerks angemessene Maßnahmen ergreifen, u.a.:
+

+
    +
  • + Auffordern zum sofortigen Abstellen des inakzeptablen Verhaltens +
  • +
  • + Sperren oder Löschen von Kommentaren +
  • +
  • + Vorübergehender Ausschluss aus dem jeweiligen Beitrag +
  • +
  • + Sperren bzw. Löschen von Inhalten +
  • +
  • + Vorübergehender Entzug von Schreibrechten +
  • +
  • + Vorübergehender Ausschluss aus dem Netzwerk +
  • +
  • + Endgültiger Ausschluss aus dem Netzwerk +
  • +
  • + Verstöße gegen deutsches Recht können zur Anzeige gebracht werden. +
  • +
+

+ Wenn Du einem inakzeptablen Verhalten ausgesetzt bist, es miterlebst oder andere Bedenken hast, melde bitte so schnell wie möglich den oder die entsprechenden Inhalte an die Moderatoren. + Bitte klicke beim Beitrag, Kommentar oder Benutzer auf die drei Punkte und melde ihn über das aufgeklappte Menü.
+

+
+ + diff --git a/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/data-privacy.html b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/data-privacy.html new file mode 100644 index 000000000..9109840fd --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/data-privacy.html @@ -0,0 +1,1010 @@ + + + + +
+

+ Für das soziale Netzwerk {{ organization }} +

+

+ Information über die Erhebung personenbezogener Daten +

+

+ Wir freuen uns, dass Du unsere Website besuchst und bedanken uns für Dein Interesse. + Im Folgenden informieren wir Dich über den Umgang mit Deinen personenbezogenen Daten bei Nutzung unserer Website, unsere Netzwerkes oder der Uhr des Wandels. + Diese Website nutzt aus Sicherheitsgründen und zum Schutz der Übertragung personenbezogene Daten und anderer vertraulicher Inhalte (z.B. Bestellungen oder Anfragen an den Verantwortlichen) eine SSL-bzw. TLS-Verschlüsselung. + Du kannst eine verschlüsselte Verbindung an der Zeichenfolge „https://“ und dem Schloss-Symbol in Deiner Browserzeile erkennen.
+

+

+ Kontaktdaten des Verantwortlichen +

+

+ Verantwortlich für die Datenverarbeitung auf dieser Website im Sinne der Datenschutz-Grundverordnung (DSGVO) ist
+

+

+ {{ organization }}
+ Musterstraße 11
+ 53487 Musterort
+ Deutschland
+

+

+ Tel.: +49 151 / 43 80 42 22
+ E-Mail: info@example.org
+

+

+ Datenschutzbeauftragter +

+

+ Unser Datenschutzbeauftragter ist erreichbar unter folgender E-Mail-Adresse: datenschutz@@example.org
+

+

+ Diese Website nutzt aus Sicherheitsgründen und zum Schutz der Übertragung personenbezogene Daten und anderer vertraulicher Inhalte (z.B. Bestellungen oder Anfragen an den Verantwortlichen) eine SSL-bzw. TLS-Verschlüsselung. Du kannst eine verschlüsselte Verbindung an der Zeichenfolge „https://“ und dem Schloss-Symbol in Deiner Browserzeile erkennen.
+

+

+ Datenerfassung beim Besuch unserer Website +

+

+ Bei der bloß informatorischen Nutzung unserer Website, also wenn Du Dich nicht registrierst oder uns anderweitig Informationen übermittelst, erheben wir nur solche Daten, die Dein Browser an unseren Server übermittelt (sog. „Server-Logfiles“). Wenn Du unsere Website aufrufst, erheben wir die folgenden Daten, die für uns technisch erforderlich sind, um Dir die Website anzuzeigen:
+

+
    +
  • + unsere besuchte Website +
  • +
  • + Datum und Uhrzeit zum Zeitpunkt des Zugriffes +
  • +
  • + Menge der gesendeten Daten in Byte +
  • +
  • + Quelle/Verweis, von welchem Du auf die Seite gelangst +
  • +
  • + verwendeter Browser +
  • +
  • + verwendetes Betriebssystem +
  • +
  • + verwendete IP-Adresse (ggf.: in anonymisierter Form) +
  • +
+

+ Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. f DSGVO auf Basis unseres berechtigten Interesses an der Verbesserung der Stabilität und Funktionalität unserer Website. Empfänger dieser Daten sind nur wir und unser Provider Netcup, mit welchem wir einen Auftragsverarbeitungsvertrag haben, um Deine Rechte schützen zu können. + Eine Weitergabe oder anderweitige Verwendung der Daten findet nicht statt. + Wir behalten uns allerdings vor, die Server-Logfiles nachträglich zu überprüfen, sollten konkrete Anhaltspunkte auf eine rechtswidrige Nutzung hinweisen.
+

+

+ Dauer der Speicherung personenbezogener Daten +

+

+ Die Dauer der Speicherung von personenbezogenen Daten bemisst sich anhand der jeweiligen gesetzlichen Aufbewahrungsfrist (z.B. handels- und steuerrechtliche Aufbewahrungsfristen). Nach Ablauf der Frist werden die entsprechenden Daten routinemäßig gelöscht, sofern sie nicht mehr zur Vertragserfüllung oder Vertragsanbahnung erforderlich sind und/oder unsererseits kein berechtigtes Interesse an der Weiterspeicherung fortbesteht.
+

+

+ Cookies +

+

+ Um den Besuch unserer Website attraktiv zu gestalten und die Nutzung bestimmter Funktionen zu ermöglichen, verwenden wir auf verschiedenen Seiten sogenannte Cookies. Hierbei handelt es sich um kleine Textdateien, die auf Deinem Endgerät abgelegt werden. Einige der von uns verwendeten Cookies werden nach dem Ende der Browser-Sitzung, also nach Schließen Deines Browsers, wieder gelöscht (sog. Sitzungs-Cookies). Andere Cookies verbleiben auf Deinem Endgerät und ermöglichen uns oder unseren Partnerunternehmen (Cookies von Drittanbietern), Deinen Browser beim nächsten Besuch wiederzuerkennen (persistente Cookies). Werden Cookies gesetzt, erheben und verarbeiten diese im individuellen Umfang bestimmte Nutzerinformationen wie Browser- und Standortdaten sowie IP-Adresswerte. Persistente Cookies werden automatisiert nach einer vorgegebenen Dauer gelöscht, die sich je nach Cookie unterscheiden kann.
+

+

+ Sofern durch einzelne von uns implementierte Cookies auch personenbezogene Daten verarbeitet werden, erfolgt die Verarbeitung gemäß Art. 6 Abs. 1 lit. f DSGVO zur Wahrung unserer berechtigten Interessen an der bestmöglichen Funktionalität der Website sowie einer kundenfreundlichen und effektiven Ausgestaltung des Seitenbesuchs.
+

+

+ Wir arbeiten unter Umständen mit Werbepartnern zusammen, die uns helfen, unser Internetangebot interessanter zu gestalten. Zu diesem Zweck werden für diesen Fall bei Deinem Besuch unserer Website auch Cookies von Partnerunternehmen in Deinem Browser gespeichert (Cookies von Drittanbietern). Wenn wir mit vorbenannten Werbepartnern zusammenarbeiten, wirst Du über den Einsatz derartiger Cookies und den Umfang der jeweils erhobenen Informationen innerhalb der nachstehenden Absätze individuell und gesondert informiert.
+

+

+ Bitte beachte, dass Du Deinen Browser so einstellen kannst, dass Du über das Setzen von Cookies informiert wirst und einzeln über deren Annahme entscheiden oder die Annahme von Cookies für bestimmte Fälle oder generell ausschließen kannst. Jeder Browser unterscheidet sich in der Art, wie er die Cookie-Einstellungen verwaltet. Diese ist in dem Hilfemenü jedes Browsers beschrieben, welches Dir erläutert, wie Du Deine Cookie-Einstellungen ändern kannst. Diese findest Du für die jeweiligen Browser unter den folgenden Links:
+

+ +

+ Bitte beachte auch, dass bei Nichtannahme von Cookies die Funktionalität unserer Website eingeschränkt sein kann.
+

+

+ Spendenformular +

+

+ Wenn Du unsere Fundraisingbox (Spendenformular) auf unserer Webseite nutzt, dann benötigen wir von Dir folgende personenbezogene Daten: + Deinen Vor- und Nachnamen, Deine E-Mail-Adresse und Deine Bankverbindung mit Kontoinhaber, IBAN und BIC. Solltest Du uns durch eine einfache Überweisung spenden, bekommen wir alle diese Daten auch, bis auf die E-Mail-Adresse. + Wenn Du uns diese in der Überweisung mitteilst, wäre das gut. + Gleichzeitig speichern wir folgende, von Dir eingegebene Daten (Name, E-Mail, Anschrift und Betrag) zur Ausstellung einer Spendenbescheinigung.
+

+

+ Deine E-Mail-Adresse und die Höhe deiner Spende wird ebenfalls von uns gespeichert, um später die Möglichkeit zu schaffen, Deine Unterstützung durch eine Spende über eine sogenannte Badge-Anzeige in unserem Netzwerk öffentlich zu honorieren. + Solltest Du uns nicht nur finanziell unterstützen, sondern auch Nutzer unseres Netzwerkes sein, wirst Du nach dem Go-Live unseres Netzwerkes selber entscheiden können, ob diese Badges angezeigt werden sollen, oder nicht. + Dieser Punkt wird, sobald vollständig implementiert, näher in den Datenschutzbedingungen unseres Netzwerkes beschrieben sein.
+

+

+ Als gemeinnützige Organisation haben wir ein berechtigtes Interesse gem. Art. 6 Abs. 1 lit. f) DSGVO, unseren Spendern eine einfache und sichere Zahlungsmöglichkeit zu bieten, welches die Rechtsgrundlage für diese Verarbeitung ist. + Der Zweck ist die finanzielle Unterstützung unserer gemeinnützigen Organisation.
+

+

+ Die Speicherdauer Deiner Daten beträgt aus steuerrechtlichen Gründen 10 Jahre. + Wir löschen diese Daten spätestens 12 Monate danach.
+

+

+ Für unser Spendenformular auf der Webseite nutzen wir den Finanzdienstleister Fundraisingbox, mit welchem wir einen entsprechenden Auftragsdatenverarbeitungsvertrag abgeschlossen haben, um Deine Rechte, wie unten angegegeben, im Zusammenhang mit Deiner Spende auch durchsetzen zu können. + FundraisingBox und wir sind Empfänger dieser Daten.
+

+

+ Alle weiteren Finanzdienstleister bzw. Banken, die Du angeben kannst, arbeiten nicht im Auftrag von uns bzw. nach unseren Vorgaben, sondern eigenverantwortlich. + Diese sind, je nachdem, auf welchem Weg Du spendest, die GLS Bank, Paypal, VISA, Klarna, Stripe und Deine Bank, von der Du spendest. + FundraisingBox selber liefert dabei keine personenbezogenen Daten in ein Drittland. + Bei von Dir angegebenen bzw. genutzten Finanzdienstleistern kann dies unter Umständen der Fall sein. + Von den oben angegebenen sind hier die Datenschutzinformationen noch einmal gesondert aufgeführt:
+

+ +

+ Das Spendenformular ist auf unserer Webseite über einen sogenannten iFrame eingebunden und die Inhalte werden verschlüsselt zu FundraisingBox übertragen. + Dies bedeutet, dass niemand außer Dir und FundraisingBox bei dieser Übertragung Daten zu sehen bekommt. + Zu Fundraisingbox werden entsprechend Daten übertragen, die Dein Webbrowser liefert, also Deine IP-Adresse und, je nachdem, welchen Browser Du nutzt und wie er eingestellt ist, in der Regel Dein Betriebssystem, die Browserversion und einige andere Daten. + Zum Datenschutz von Fundraisingbox kannst Du hier die Details lesen: https://www.fundraisingbox.com/datensicherheit/.
+

+

+ Support +

+

+ Zweck +

+

+ Wir stellen Dir zum Zweck der Problemlösung einen Support zur Verfügung, wenn Du Probleme mit unserem Netzwerk, unserer Webseite oder der Clock-of-Change hast oder generell etwas von und mit uns geklärt haben willst. + Ebenso kannst Du den Support über das Senden einer E-Mail erreichen. + Optional kannst Du, wenn Du Dich bei uns registriert hast, Deine vergangenen Support-Tickets betrachten.
+

+

+ Personenbezogene Daten: + Um Dir kommunizieren zu können, benötigen wir von Dir Deine E-Mail-Adresse und einen Namen oder ein Pseudonym, damit wir Dich ansprechen können. + Optional kannst Du uns eine Telefonnummer angeben, unter welcher wir Dich erreichen können, wenn Du das möchtest. + Weitere personenbezogene Daten können im Text Deiner Support-Anfrage enthalten sein.
+

+

+ Ebenfalls werden bei Deiner Anfrage, wenn sie über unsere Support-Website stattfindet, Deine IP-Adresse und weitere Daten übertragen, die Dein Browser uns liefert. + Diese Daten werden von uns nicht gespeichert (kein Logging).
+

+

+ Speicherdauer +

+

+ Wir speichern Deine Supportanfragen für Dich, bis Du deinen Account löscht oder uns Bescheid gibst, dass Du sie gelöscht haben möchtest. + Wir löschen allerdings jede Supportanfrage spätestens nach 12 Monaten, nachdem sie geschlossen wurde.
+

+

+ Rechtsgrundlage +

+

+ Als gemeinnützige Organisation haben wir ein berechtigtes Interesse gem. Art. 6 Abs. 1 lit. f) DSGVO, unseren Spendern eine einfache und sichere Support-Möglichkeit für die von uns zur Verfügung gestellten Dienste und damit zusammenhängenden Fragen zu bieten. + Nutzer sind unter Umständen mit Herausforderungen oder Fragestellungen konfrontiert, die sie nicht alleine lösen können. + Mit dem Support bieten wir dafür eine notwendige Kommunikationsschnittstelle, die auch für den Nutzer transparent einsehbar ist.
+

+

+ Empfänger +

+

+ Deine personenbezogenen Daten können nur wir sehen und prinzipiell auch unser Provider, mit welchem wir einen Auftragsdatenverarbeitungsvertrag haben, der unsere Durchgriffsmöglichkeiten und Verantwortlichkeiten regelt.
+

+

+ Drittlandtransfer +

+

+ Unsere Support-Daten werden nicht in einem Drittland gespeichert oder verarbeitet.
+

+

+ Nutzung deiner Daten zur Direktwerbung +

+

+ Anmeldung zu unserem E-Mail-Newsletter +

+

+ Wenn Du Dich zu unserem E-Mail Newsletter anmeldest, übersenden wir Dir regelmäßig Informationen zu unseren Angeboten. + Pflichtangabe für die Übersendung des Newsletters ist allein Deine E-Mail-Adresse. + Die Angabe weiterer evtl. Daten ist freiwillig und wird verwendet, um Dich persönlich ansprechen zu können. + Für den Versand des Newsletters verwenden wir das sog. Double Opt-in Verfahren. + Dies bedeutet, dass wir Dir erst dann einen E-Mail-Newsletter übermitteln werden, wenn Du uns ausdrücklich bestätigt hast, dass Du dem Versand des Newsletters einwilligst. + Wir schicken Dir dann eine Bestätigungsmail, mit der Du gebeten wirst, durch Anklicken eines entsprechenden Links zu bestätigen, dass Du künftig unseren Newsletter erhalten willst.
+

+

+ Mit der Aktivierung des Bestätigungslinks erteilst Du uns Deine Einwilligung für die Nutzung Deiner personenbezogenen Daten gemäß Art. 6 Abs. 1 lit. a DSGVO. + Bei der Anmeldung zum Newsletter speichern wir Deine vom Internet Service-Provider (ISP) eingetragene IP-Adresse sowie das Datum und die Uhrzeit der Anmeldung, um einen möglichen Missbrauch Deiner E-Mailadresse zu einem späteren Zeitpunkt nachvollziehen zu können. + Die von uns bei der Anmeldung zum Newsletter erhobenen Daten werden ausschließlich für Zwecke der werblichen Ansprache im Wege des Newsletters benutzt. + Du kannst den Newsletter jederzeit über den dafür vorgesehenen Link im Newsletter selbst oder durch entsprechende Nachricht an den Support (siehe Formular) abbestellen. + Nach erfolgter Abmeldung wird Deine E-Mailadresse unverzüglich in unserem Newsletter-Verteiler gelöscht, soweit Du nicht ausdrücklich zu einer weiteren Nutzung Deiner Daten eingewilligt hast oder wir uns eine darüberhinausgehende Datenverwendung vorbehalten, die gesetzlich erlaubt ist und über die wir Dich in dieser Erklärung informieren.
+

+

+ Verwendung von Videos +

+

+ Verwendung von Youtube-Videos +

+

+ Diese Website nutzt die Youtube-Einbettungsfunktion zur Anzeige und Wiedergabe von Videos des Anbieters „Youtube“, der zu der Google LLC., 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA („Google“) gehört.
+

+

+ Hierbei wird der erweiterte Datenschutzmodus verwendet, der nach Anbieterangaben eine Speicherung von Nutzerinformationen erst bei Wiedergabe des/der Videos in Gang setzt. + Wird die Wiedergabe eingebetteter Youtube-Videos gestartet, setzt der Anbieter „Youtube“ Cookies ein, um Informationen über das Nutzerverhalten zu sammeln. + Hinweisen von „Youtube“ zufolge dienen diese unter anderem dazu, Videostatistiken zu erfassen, die Nutzerfreundlichkeit zu verbessern und missbräuchliche Handlungsweisen zu unterbinden. + Wenn Du bei Google eingeloggt bist, werden Deine Daten direkt Deinem Konto zugeordnet, wenn Du ein Video anklickst. + Wenn Du die Zuordnung zu Deinen Profil bei YouTube nicht wünscht, muss Du Dich vor Aktivierung des Buttons ausloggen. + Google speichert Deine Daten (selbst für nicht eingeloggte Nutzer) als Nutzungsprofile und wertet diese aus. + Eine solche Auswertung erfolgt insbesondere gemäß Art. 6 Abs. 1 lit.f DSGVO auf Basis der berechtigten Interessen von Google an der Einblendung personalisierter Werbung, Marktforschung und/oder bedarfsgerechten Gestaltung seiner Website. + Dir steht ein Widerspruchsrecht gegen die Bildung dieser Nutzerprofile zu, wobei Du Dich zur Ausübung dessen an YouTube richten musst.
+

+

+ Unabhängig von einer Wiedergabe der eingebetteten Videos wird bei jedem Aufruf dieser Website eine Verbindung zum Google-Netzwerk „DoubleClick“ aufgenommen, was ohne unseren Einfluss weitere Datenverarbeitungsvorgänge auslösen kann.
+

+

+ Google LLC mit Sitz in den USA ist für das us-europäische Datenschutzübereinkommen „Privacy Shield“ zertifiziert, welches die Einhaltung des in der EU geltenden Datenschutzniveaus gewährleistet.
+

+

+ Weitere Informationen zum Datenschutz bei „YouTube“ findest Du in der Datenschutzerklärung des Anbieters unter: https://www.google.de/intl/de/policies/privacy.
+

+

+ Netzwerk +

+

+ Wir betreiben ein gemeinnütziges soziales Wissens- und Aktionsnetzwerks, um den Herausforderungen unserer Zeit gemeinsam zu begegnen, die Würde des Menschen zu wahren und eine lebenswerte Zukunft für alle Menschen und zukünftigen Generationen zu schaffen.
+

+

+ Im Folgenden sind die Einzelnen Datenverarbeitungen aufgeführt, die im Rahmen des Betriebs unseres Netzwerkes notwendig sind.
+

+

+ Anmeldedaten +

+

+ Zweck +

+

+ Die Anmeldedaten werden für die Anmeldung am Netzwerk benötigt.
+

+

+ Personenbezogene Daten +

+

+ Im Sinne der Datenminimierung registrierst Du Dich für unser Netzwerk einzig mit Deiner E-Mail-Adresse. + Weitere personenbezogene Daten sind für die Registrierung nicht nötig. + Über diese E-Mail-Adresse stellen wir Deine Identität fest.
+

+

+ In der Kommunikation mit uns spielt die von Dir verwendete E-Mail-Adresse also eine zentrale Rolle. + Daher werden wir alle von Dir ausgeübten Rechte und ggf. Wünsche, die Du an uns richtest, immer über Deine E-Mail-Adresse verifizieren. + Niemals werden wir auf Basis eines Anrufes oder einer sonstigen Information an Deinem Account etwas ändern, ihn z.B. löschen oder stillegen, ohne diese Verifizierung – außer, wir sind durch ein Gesetz dazu gezwungen. + Gesichert ist Dein Account in unserem Netzwerk über ein Passwort, was von Dir selbst vergeben werden muss und jederzeit geändert werden kann.
+

+

+ Speicherdauer +

+

+ Wir speichern Deine Anmeldedaten, bis Du deinen Account löschst oder uns via E-Mail Bescheid gibst, dass Du sie gelöscht haben möchtest.
+

+

+ Rechtsgrundlage +

+

+ Die Einwilligung durch Registrierung am Netzwerk gem. Art. 6 Abs. 1 lit. a) DSGVO. + Die Einwilligung kann jederzeit durch Löschen des Accounts samt aller Daten Widerrufen werden. + Beim Löschen ist da Löschen der Beiträge und Kommentare vorgegeben, aber optional. + Sollen Beiträge und Kommentare nicht gelöscht werden, werden diese anonymisiert. + Dadurch sind sie nicht mehr zuordenbar, weswegen auch anschließend kein Recht auf Löschung mehr geltend gemacht werden kann.
+

+

+ Die E-Mail-Adresse kann jederzeit selber geändert werden. + Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt.
+

+

+ Empfänger +

+

+ Deine personenbezogenen Daten können nur wir und unser Provider einsehen, mit welchem wir einen Auftragsdatenverarbeitungsvertrag haben, der unsere Durchgriffsmöglichkeiten und Verantwortlichkeiten regelt.
+

+

+ Weitergabe an Dritte +

+

+ Die Anmeldedaten werden nicht an Dritte weitergegeben, außer ein Gesetz zwingt uns dazu.
+

+

+ Drittlandtransfer +

+

+ Die Daten werden nicht in einem Drittland gespeichert.
+

+

+ Profildaten +

+

+ Zweck +

+

+ Die Profildaten ermöglichen es Nutzern, freiwillig weitere Informationen über sich weltweit und frei abrufbar zu veröffentlichen.
+

+

+ Personenbezogene Daten +

+

+ Angaben, wie Dein Pseudonym, ein Avatar-Bildchen oder weitere Angaben, die ggf. auch personenbezogene Daten sein können, vergibst Du selbst.
+

+

+ Speicherdauer +

+

+ Wir speichern Deine Profildaten, bis Du sie löscht. Da die Daten öffentlich sind, können sie von Dritten kopiert worden sein und sind daher ggf. nicht zurückholbar.
+

+

+ Rechtsgrundlage +

+

+ Die Einwilligung gem. Art. 6 Abs. 1 lit. a), diese Profildaten öffentlich zu machen. + Die Veröffentlichung geschieht mit der Eingabe. + Die Einwilligung kann jederzeit durch Löschen der Daten widerrufen werden. + Die Profildaten können jederzeit selber geändert werden.
+

+

+ Empfänger +

+

+ Deine Profildaten sind öffentlich und können weltweit von jedem, der zugreift, gesehen werden.
+

+

+ Dritte +

+

+ Deine Profildaten sind öffentlich und können weltweit von jedem, der zugreift, gesehen werden.
+

+

+ Drittlandtransfer +

+

+ Die Daten werden von uns nicht in einem Drittland gespeichert oder an ein solches übertragen.
+

+

+ Session-Daten +

+

+ Zweck +

+

+ Speicherung der Anmeldung im Browser, damit nicht jeder Seitenaufruf eine neue Anmeldung erfordert.
+

+

+ Personenbezogene Daten +

+

+ Ein Session-Cookie, der in Deinem Webbrowser gespeichert wird.
+

+

+ Speicherdauer +

+

+ Wir speichern Diesen Cookie einen Tag lang.
+

+

+ Cookies +

+

+ Dieser Cookie wird gespeichert:
+

+ + + + + + + + + + + + + + + + + +
+ Name + + Zweck + + Speicherdauer + + Typ +
+ ocelot-social-token + + Merken der Anmeldung am Netzwerk. + Mit diesem Cookie bleibst Du bis zu einem Tag in unserem Netzwerk angemeldet. + + 730 Tage, ca. 2 Jahre + + HTTP-Cookie +
+

+ Rechtsgrundlage +

+

+ Das berechtigtes Interesse gem. Art. 6 Abs. 1 lit. f), unseren Nutzern das Login auf unser Netzwerk technisch zu ermöglichen.
+

+

+ Empfänger +

+

+ Deine personenbezogenen Daten können nur wir und unser Provider, mit welchem wir einen Auftragsdatenverarbeitungsvertrag haben, der unsere Durchgriffsmöglichkeiten und Verantwortlichkeiten regelt.
+

+

+ Drittlandtransfer +

+

+ Die Daten werden nicht in einem Drittland gespeichert.
+

+

+ Browser-Zugriffsdaten +

+

+ Zweck +

+

+ Technische Funktionsfähigkeit der Webanwendung inkl. korrekter Darstellung in der jeweiligen Landessprache.
+

+

+ Personenbezogene Daten +

+

+ Übertragen werden u.a., je nach verwendetem Browser und dessen Einstellungen: + Datum und Uhrzeit des Zugriffes, Menge der gesendeten Daten in Byte, ggf. Quelle/Verweis, von welcher Seite Du auf unsere jeweilige gelangst, verwendeter Browser, verwendetes Betriebssystem, Sprachinformation, Größe des Browserfensters, verwendete IP-Adresse.
+

+

+ Speicherdauer +

+

+ Diese Daten werden von uns nicht gespeichert, sondern nur zur Beantwortung der konkreten Anfrage verwendet.
+

+

+ Rechtsgrundlage +

+

+ Das berechtigtes Interesse gem. Art. 6 Abs. 1 lit. f), unseren Nutzern die Nutzung unseres netzwerkes technisch zu ermöglichen.
+

+

+ Empfänger +

+

+ Deine personenbezogenen Daten können nur wir und unser Provider, mit welchem wir einen Auftragsdatenverarbeitungsvertrag haben, der unsere Durchgriffsmöglichkeiten und Verantwortlichkeiten regelt.
+

+

+ Drittlandtransfer +

+

+ Die Daten werden nicht in einem Drittland gespeichert.
+

+

+ Inhalte +

+

+ Zweck +

+

+ Veröffentlichung von Inhalten in unserem weltweit offenen sozialen Wissens- und Aktionsnetzwerk.
+

+

+ Personenbezogene Daten +

+

+ Alle Beiträge und Kommentare
+

+

+ Speicherdauer +

+

+ Wir speichern Deine Beiträge und Kommentare, bis Du sie löscht. + Da die Daten öffentlich sind, können sie von Dritten kopiert worden sein und sind daher ggf. nicht zurückholbar.
+

+

+ Rechtsgrundlage +

+

+ Die Einwilligung zur Veröffentlichung gem. Art. 6 Abs. 1 lit. a). Die Veröffentlichung geschieht mit der Eingabe. + Die Einwilligung kann jederzeit durch Löschen der Beiträge und Kommentare widerrufen werden. + Die Beiträge und Kommentare können jederzeit selber geändert werden. + Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt.
+

+

+ Empfänger +

+

+ Deine Beiträge und Kommentare sind öffentlich und können weltweit von jedem, der zugreift, gesehen werden.
+

+

+ Dritte +

+

+ Deine Beiträge und Kommentare sind öffentlich und können weltweit von jedem, der zugreift, gesehen werden.
+

+

+ Drittlandtransfer +

+

+ Die Daten werden von uns nicht in einem Drittland gespeichert oder an ein solches übertragen.
+

+

+ Einbettung von Inhalten von Drittanbietern +

+

+ Der Nutzer kann einwilligen, dass Inhalte von Drittanbietern, wie Facebook, Twitter oder Vimeo nicht als Link dargestellt werden, sondern optional in der Webseite angezeigt bzw. abgespielt werden. + Wir empfehlen, darauf zu verzichten. + Die Grundeinstellung in unserem Netzwerk ist, dass Inhalte von Drittanbietern nicht eingebunden werden.
+

+

+ Zweck +

+

+ Darstellung der Inhalte von Drittanbietern, wie Facebook, Twitter im Kontext des jeweiligen Artikels oder Beitrags im Browser des Nutzers.
+

+

+ Personenbezogene Daten, Speicherdauer, Empfänger und Drittlandtransfer +

+

+ Man kann prinzipiell davon ausgehen, dass Dienste von Drittanbietern durch das Sammeln von Daten über Dich bzw. den damit möglichen Gewinnen finanziert werden. + Daher raten wir davon ab, das Einbinden von Drittanbieterinhalten einzuschalten.
+

+

+ Die von den Drittanbietern gesammelten personenbezogenen Daten und deren Verwendung können wir letztendlich nicht kontrollieren. + Sie sind auch keine Auftragsverarbeiter von uns oder funktionaler Bestandteil unseres Netzwerkes, sondern eigenständig Verantwortliche. + Ein Nutzer kann sich entscheiden, von anderen Nutzern eingestellte Links bzw. deren Inhalte Inhalte eingebettet anzuzeigen. + Die dabei preisgegebenen personenbezogenen daten entsprechen im Großen und Ganzen denen eines Aufrufes des jeweiligen Links. + Dies sind, abhängig vom jeweiligen Browser des Nutzers und seiner Einstellung zum Beispiel:
+

+
    +
  • + unsere besuchte Website +
  • +
  • + Datum und Uhrzeit zum Zeitpunkt des Zugriffes +
  • +
  • + Menge der gesendeten Daten in Byte +
  • +
  • + Quelle/Verweis, von welchem Du auf die Seite gelangst +
  • +
  • + verwendeter Browser +
  • +
  • + verwendetes Betriebssystem +
  • +
  • + verwendete IP-Adresse (ggf.: in anonymisierter Form) +
  • +
+

+ Ebenso können Cookies von Drittanbietern gesetzt und gespeichert werden, wenn Du dies in Deinem Browser zugelassen hast.
+

+

+ Drittanbieter ändern ihre Geschäftsbedingungen in der Regel häufiger. + Daher sind hier die jeweiligen Nutzungsbedingungen und Datenschutzbestimmungen mit genauen und stets aktuellen Details verlinkt:
+

+ +

+ Rechtsgrundlage +

+

+ Einwilligung des Nutzers gem. Art. 6 Abs. 1 lit. a) durch Freischalten der Einbettung in den Benutzereinstellungen. + Die Einwilligung kann jederzeit in den Benutzereinstellungen widerrufen werden. + Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt.
+

+

+ Youtube-Videos +

+

+ Zweck +

+

+ Freiwillige Einbettung von Youtube-Videos auf unserer Webseite um Videos in der Webseite und nicht in einem neuen Browserfenster darzustellen.
+

+

+ Marketing-Cookies werden von Google genutzt, um Nutzer zu tracken. Der Hintergrund ist die Anzeige von personalisierter Werbung, wofür entsprechende Daten gesammelt werden. + Wir empfehlen das Netzwerk in den Benutzereinstellungen so zu konfigurieren, dass eingebettete Objekte nicht verwendet werden. + Die Inhalte werden dann nicht dargestellt und keine Cookies gespeichert und personenbezogene Daten übertragen.
+

+

+ Hier die aktuellsten mitgeltenden Google-Datenschutzbestimmungen.
+

+

+ Personenbezogene Daten +

+

+ Oben angegebene Daten zum Browserzugriff und die hier folgenden Cookie-Daten mit Details:
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Zweck + + Speicherdauer + + Typ +
+ GPS + + Registriert eine eindeutige ID auf mobilen Geräten, um Tracking basierend auf dem geografischen GPS-Standort zu ermöglichen. + + 30 Minuten + + HTTP-Cookie +
+ PREF + + Registriert eine eindeutige ID, die von Google verwendet wird, um Statistiken dazu, wie der Besucher YouTube-Videos auf verschiedenen Websites nutzt, zu behalten. + + 8 Monate + + HTTP-Cookie +
+ VISITOR_INFO1_LIVE + + Versucht, die Benutzerbandbreite auf Seiten mit integrierten YouTube-Videos zu schätzen. + + 6 Monate + + HTTP-Cookie +
+ YSC + + Registriert eine eindeutige ID, die das Gerät eines wiederkehrenden Benutzers identifiziert. Die ID wird für gezielte Werbung genutzt. + + Sitzungsende + + HTTP-Cookie +
+ yt-player-bandwith + + Wird verwendet, um die optimale Videoqualität basierend auf den Geräte- und Netzwerkeinstellungen des Besuchers zu bestimmen. + + Dauerhaft + + Local Storage +
+ yt-player-headers-readable + + Sammelt Daten zur Besucherinteraktion mit dem Video-Inhalt der Webseite – Diese Daten werden verwendet, um den Video-Inhalt der Webseite für den Besucher relevanter zu machen. + + Dauerhaft + + Local Storage +
+ yt-remote-connected-devices + + Speichert die Benutzereinstellungen beim Abruf eines auf anderen Webseiten integrierten Youtube-Videos. + + Dauerhaft + + Local Storage +
+ yt-remote-device-id + + Speichert die Benutzereinstellungen beim Abruf eines auf anderen Webseiten integrierten Youtube-Videos. + + Dauerhaft + + Local Storage +
+ yt-remote-fast-check-period + + Speichert die Benutzereinstellungen beim Abruf eines auf anderen Webseiten integrierten Youtube-Videos. + + Sitzungsende + + Session Storage +
+ yt-remote-session-app + + Speichert die Benutzereinstellungen beim Abruf eines auf anderen Webseiten integrierten Youtube-Videos. + + Sitzungsende + + Session Storage +
+ yt-remote-session-name + + Speichert die Benutzereinstellungen beim Abruf eines auf anderen Webseiten integrierten Youtube-Videos. + + Sitzungsende + + Session Storage +
+

+ Speicherdauer +

+

+ Datails siehe oben.
+

+

+ Rechtsgrundlage +

+

+ Die Einwilligung gem. Art. 6 Abs. 1 lit. a) durch Freischalten der Einbettung in den Benutzereinstellungen. + Die Einwilligung kann jederzeit in den Benutzereinstellungen widerrufen werden. + Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt.
+

+

+ Empfänger +

+

+ Der Drittanbieter „Youtube“, der zu der Google LLC., 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA („Google“) gehört.
+

+

+ Drittlandtransfer +

+

+ Die Daten werden nicht in einem Drittland gespeichert.
+

+

+ Rechte des Betroffenen +

+

+ Das geltende Datenschutzrecht gewährt Dir gegenüber dem Verantwortlichen hinsichtlich der Verarbeitung Deiner personenbezogenen Daten umfassende Betroffenenrechte (Auskunfts- und Interventionsrechte), über die wir Dich nachstehend informieren:
+

+

+ Auskunftsrecht gemäß Art. 15 DSGVO: +

+

+ Du hast insbesondere ein Recht auf Auskunft über Deine von uns verarbeiteten personenbezogenen Daten, die Verarbeitungszwecke, die Kategorien der verarbeiteten personenbezogenen Daten, die Empfänger oder Kategorien von Empfängern, gegenüber denen Deine Daten offengelegt wurden oder werden, die geplante Speicherdauer bzw. die Kriterien für die Festlegung der Speicherdauer, das Bestehen eines Rechts auf Berichtigung, Löschung, Einschränkung der Verarbeitung, Widerspruch gegen die Verarbeitung, Beschwerde bei einer Aufsichtsbehörde, die Herkunft Deiner Daten, wenn diese nicht durch uns bei Dir erhoben wurden, das Bestehen einer automatisierten Entscheidungsfindung einschließlich Profiling und ggf. aussagekräftige Informationen über die involvierte Logik und die Dich betreffende Tragweite und die angestrebten Auswirkungen einer solchen Verarbeitung, sowie Dein Recht auf Unterrichtung, welche Garantien gemäß Art. 46 DSGVO bei Weiterleitung Deiner Daten in Drittländer bestehen;
+

+

+ Recht auf Berichtigung gemäß Art. 16 DSGVO: +

+

+ Du hast ein Recht auf unverzügliche Berichtigung Dich betreffender unrichtiger Daten und/oder Vervollständigung Deiner bei uns gespeicherten unvollständigen Daten;
+

+

+ Recht auf Löschung gemäß Art. 17 DSGVO: +

+

+ Du hast das Recht, die Löschung Deiner personenbezogenen Daten bei Vorliegen der Voraussetzungen des Art. 17 Abs. 1 DSGVO zu verlangen. + Dieses Recht besteht jedoch insbesondere dann nicht, wenn die Verarbeitung zur Ausübung des Rechts auf freie Meinungsäußerung und Information, zur Erfüllung einer rechtlichen Verpflichtung, aus Gründen des öffentlichen Interesses oder zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich ist.
+

+

+ Recht auf Einschränkung der Verarbeitung gemäß Art. 18 DSGVO: +

+

+ Du hast das Recht, die Einschränkung der Verarbeitung Deiner personenbezogenen Daten zu verlangen, solange die von Dir bestrittene Richtigkeit Deiner Daten überprüft wird, wenn Du eine Löschung Deiner Daten wegen unzulässiger Datenverarbeitung ablehnst und stattdessen die Einschränkung der Verarbeitung Deiner Daten verlangst, wenn Du Deine Daten zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen benötigst, nachdem wir diese Daten nach Zweckerreichung nicht mehr benötigen oder wenn Du Widerspruch aus Gründen Deiner besonderen Situation eingelegt habst, solange noch nicht feststeht, ob unsere berechtigten Gründe überwiegen.
+

+

+ Recht auf Unterrichtung gemäß Art. 19 DSGVO: +

+

+ Hast Du das Recht auf Berichtigung, Löschung oder Einschränkung der Verarbeitung gegenüber dem Verantwortlichen geltend gemacht, ist dieser verpflichtet, allen Empfängern, denen die Dich betreffenden personenbezogenen Daten offengelegt wurden, diese Berichtigung oder Löschung der Daten oder Einschränkung der Verarbeitung mitzuteilen, es sei denn, dies erweist sich als unmöglich oder ist mit einem unverhältnismäßigen Aufwand verbunden. + Dir steht das Recht zu, über diese Empfänger unterrichtet zu werden.
+

+

+ Recht auf Datenübertragbarkeit gemäß Art. 20 DSGVO: +

+

+ Du hast das Recht, Deine personenbezogenen Daten, die Du uns bereitgestellt habst, in einem strukturierten, gängigen und maschinenlesebaren Format zu erhalten oder die Übermittlung an einen anderen Verantwortlichen zu verlangen, soweit dies technisch machbar is.
+

+

+ Recht auf Widerruf erteilter Einwilligungen gemäß Art. 7 Abs. 3 DSGVO: +

+

+ Du hast das Recht, eine einmal erteilte Einwilligung in die Verarbeitung von Daten jederzeit mit Wirkung für die Zukunft zu widerrufen. + Im Falle des Widerrufs werden wir die betroffenen Daten unverzüglich löschen, sofern eine weitere Verarbeitung nicht auf eine Rechtsgrundlage zur einwilligungslosen Verarbeitung gestützt werden kann. + Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt.
+

+

+ Recht auf Beschwerde gemäß Art. 77 DSGVO: +

+

+ Wenn Du der Ansicht bist, dass die Verarbeitung der Dich betreffenden personenbezogenen Daten gegen die DSGVO verstößt, hast Du – unbeschadet eines anderweitigen verwaltungsrechtlichen oder gerichtlichen Rechtsbehelfs – das Recht auf Beschwerde bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat Deines Aufenthaltsortes, Deines Arbeitsplatzes oder des Ortes des mutmaßlichen Verstoßes.
+

+

+ WIDERSPRUCHSRECHT +

+

+ WENN WIR IM RAHMEN EINER INTERESSENABWÄGUNG IHRE PERSONENBEZOGENEN DATEN AUFGRUND UNSERES ÜBERWIEGENDEN BERECHTIGTEN INTERESSES VERARBEITEN, HAST DU DAS JEDERZEITIGE RECHT, AUS GRÜNDEN, DIE SICH AUS DEINER BESONDEREN SITUATION ERGEBEN, GEGEN DIESE VERARBEITUNG WIDERSPRUCH MIT WIRKUNG FÜR DIE ZUKUNFT EINZULEGEN.
+ MACHST DU VON DEINEM WIDERSPRUCHSRECHT GEBRAUCH, BEENDEN WIR DIE VERARBEITUNG DER BETROFFENEN DATEN. + EINE WEITERVERARBEITUNG BLEIBT ABER VORBEHALTEN, WENN WIR ZWINGENDE SCHUTZWÜRDIGE GRÜNDE FÜR DIE VERARBEITUNG NACHWEISEN KÖNNEN, DIE DEINE INTERESSEN, GRUNDRECHTE UND GRUNDFREIHEITEN ÜBERWIEGEN, ODER WENN DIE VERARBEITUNG DER GELTENDMACHUNG, AUSÜBUNG ODER VERTEIDIGUNG VON RECHTSANSPRÜCHEN DIENT.
+

+

+ WERDEN DEINE PERSONENBEZOGENEN DATEN VON UNS VERARBEITET, UM DIREKTWERBUNG ZU BETREIBEN, HAST DU DAS RECHT, JEDERZEIT WIDERSPRUCH GEGEN DIE VERARBEITUNG SIE BETREFFENDER PERSONENBEZOGENER DATEN ZUM ZWECKE DERARTIGER WERBUNG EINZULEGEN. + DU KANNST DEN WIDERSPRUCH WIE OBEN BESCHRIEBEN AUSÜBEN.
+

+

+ MACHST DU VON DEINEM WIDERSPRUCHSRECHT GEBRAUCH, BEENDEN WIR DIE VERARBEITUNG DER BETROFFENEN DATEN ZU DIREKTWERBEZWECKEN.
+

+
+ + diff --git a/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html new file mode 100644 index 000000000..fe02cdab5 --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html @@ -0,0 +1,136 @@ + + + + +
+

+ Für das soziale Netzwerk {{ organization }} +

+

+ Nutzungsbedingungen +

+

+ Die folgenden Nutzungsbedingungen sind Basis für die Nutzung unseres {{ networkName }} Netzwerkes. + Beim Registrieren musst Du diese anerkennen und wir werden Dich auch später über ggf. stattfindende Änderungen informieren. + Unser Netzwerk wird in der {{ organizationLocation }} betrieben und unterliegt daher {{ organizationLocation2 }} Recht. + Gerichtsstand ist {{ legacyLocation }}. + Zu Details schau in unser Impressum: https://{{ networkURL }}/imprint/.
+

+

+ Nutzung und Lizenz +

+

+ Sind Inhalte, die Du bei uns einstellst, durch Rechte am geistigen Eigentum geschützt, erteilst Du uns eine nicht-exklusive, übertragbare, unterlizenzierbare und weltweite Lizenz für die Nutzung dieser Inhalte für die Bereitstellung in unserem Netzwerk. + Diese Lizenz endet, sobald Du Deine Inhalte oder Deinen ganzen Account löscht. + Bedenke, dass andere Deine Inhalte weiter teilen können und wir diese nicht löschen können.
+

+

+ Datenschutz +

+

+ Unser Netzwerk ist ein soziales Wissens- und Aktionsnetzwerk. + Daher ist es uns besonders wichtig, dass möglichst viele Inhalte öffentlich zugänglich sind. + Im Laufe der Entwicklung unseres Netzwerkes wird es mehr und mehr die Möglichkeit geben, über die Sichtbarkeit der selbst angegebenen bzw. persönlichen Daten zu entscheiden. + Über diese neuen Funktionen werden wir Euch informieren. + Ansonsten gilt, dass Du immer darüber nachdenken solltest, welche persönlichen Daten Du über Dich (oder andere) preisgibst. + Dies gilt insbesondere für Inhalte von Beiträgen und Kommentaren, da diese einen weitgehend öffentlichen Charakter haben. + Später wird es Möglichkeiten geben, die Sichtbarkeit Deines Profils einzuschränken. + Teil der Nutzungsbedingungen ist unsere Datenschutzerklärung, die Dich über die einzelnen Datenverarbeitungen in unserem Netzwerk informiert: https://{{ networkURL }}/data-privacy. + Unsere Datenschutzerklärung ist an die Gesetzeslage und die Charakteristika unseres Netzwerks angepasst und gilt immer in der aktuellsten Version.
+

+

+ Verhaltenscodex +

+

+ Unser Verhaltenskodex dient als Leitfaden für das persönliche Auftreten und den Umgang miteinander. + Wer als Nutzer im {{ networkName }} Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an. https://{{ networkURL }}/code-of-conduct
+

+

+ Moderation +

+

+ Bis unsere finanziellen Möglichkeiten uns erlauben, das Community-Moderationssystem zu implementieren, moderieren wir mit einem vereinfachten System und eigenen bzw. ggf. ehrenamtlichen Mitarbeitern. + Wir schulen diese Moderatoren und aus diesem Grund treffen auch nur diese entsprechende Entscheidungen. + Diese Moderatoren führen Ihre Tätigkeit anonym aus. + Du kannst uns Beiträge, Kommentare und auch Nutzer melden (wenn diese zum Beispiel in ihrem Profil Angaben machen oder Bilder haben, die diese Nutzungsbedingungen verletzen). + Wenn Du uns etwas meldest, kannst Du einen Meldegrund angeben und noch eine kurze Erläuterung mitgeben. + Wir schauen uns dann das Gemeldete an und sanktionieren ggf., z.B. indem wir Beiträge, Kommentare oder Nutzer sperren. + Du und auch der Betroffene erhalten derzeitig von uns leider noch keine Rückmeldung, das ist aber in Planung. + Unabhängig davon behalten wir uns prinzipiell Sanktionen vor aus Gründen, die unter Umständen nicht oder noch nicht in unserem Verhaltenscodex oder diesen Nutzungsbedingungen aufgeführt sind.
+

+

+ Fehler und Rückmeldungen +

+

+ Wir sind sehr bemüht, unser Netzwerk und unsere Daten sicher und abrufbar zu erhalten. + Jede neue Version der Software durchläuft sowohl automatisierte als auch manuelle Tests. + Es können jedoch unvorhergesehene Fehler auftreten. + Deshalb sind wir dankbar für jeden gemeldeten Fehler. + Du kannst gerne jeden von Dir entdeckten Fehler dem Support/der Hilfe-Assistenz mitteilen: https://{{ networkURL }}/support.
+

+

+ Keine kommerzielle Nutzung +

+

+ Die Nutzung des {{ networkName }} Netzwerkes ist nicht für kommerzielle Zwecke gestattet. + Darunter fällt unter anderem das Bewerben von Produkten mit kommerzieller Absicht, das Einstellen von Affiliate-Links (Geschäftspartner-Links), direkter Aufruf zu Spenden oder finanzieller Unterstützung für Zwecke, die steuerlich nicht als gemeinnützig anerkannt sind.
+

+

+ Keine politische Nutzung +

+

+ Nutzerkonten von politischen Parteien oder offizielle Nutzerkonten eines politischen Vertreters sind unzulässig.
+

+

+ Hilfe und Fragen +

+

+ Für Hilfe und Fragen haben wir Dir eine umfassende Sammlung an häufig gestellten Fragen und Antworten (FAQ) zusammengestellt; Du findest diese auf https://{{ networkURL }}/faq.
+

+
+ + diff --git a/deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html new file mode 100644 index 000000000..682b8d491 --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html @@ -0,0 +1,163 @@ + + + + +
+

+ For the social network of {{ organization }} +

+

+ Präambel +

+

+ {{ networkName }} is a non-profit social knowledge and action network of the next generation. + By people - for people. Free software, open source, fair and transparent. + For positive local and global change in all areas of life. + We completely redesign the public exchange of knowledge, ideas and projects. + The functions of {{ networkName }} bring people together - offline and online - so that we can make the world a better place.
+

+

+ Purpose +

+

+ With these code of conduct we regulate the essential principles for behavior in our social network. + The United Nations Charter of Human Rights is our orientation and forms the heart of our understanding of values. + The code of conduct serves as guiding principles for our personal appearance and interaction with one another. + Anyone who is active as a user in the {{ networkName }} Network, writes articles, comments or contacts other users, including those outside the network,acknowledges these rules of conduct as binding.
+

+

+ Expected Behaviour +

+

+ The following behaviors are expected and requested of all community members:
+

+
    +
  • + Exercise consideration and respect in your speech and actions. +
  • +
  • + Attempt collaboration before conflict. +
  • +
  • + Refrain from demeaning, discriminatory, or harassing behavior and speech. +
  • +
  • + Be mindful of your surroundings and of your fellow participants. + Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. +
  • +
+

+ Unacceptable Behavior +

+

+ The following behaviors are unacceptable within our community:
+

+
    +
  • + Discriminatory posts, comments, utterances or insults, particularly those relating to gender, sexual orientation, race, religion, political or philosophical orientation or disability. +
  • +
  • + Posting or linking of clearly pornographic material. +
  • +
  • + Glorification or trivialization of cruel or inhuman acts of violence. +
  • +
  • + The disclosure of others' personal information without their consent or threat there of ("doxing"). +
  • +
  • + Intentional intimidation, stalking or persecution. +
  • +
  • + Advertising products and services with commercial intent. +
  • +
  • + Criminal behavior or violation of German law. +
  • +
  • + Endorse or encourage such conduct. +
  • +
+

+ Consequences of Unacceptable Behavior +

+

+ If a community member exhibits unacceptable behaviour, the responsible operators, moderators and administrators of the network may take appropriate measures, including but not limited to:
+

+
    +
  • + Request for immediate cessation of unacceptable conduct +
  • +
  • + Locking or deleting comments +
  • +
  • + Temporary exclusion from the respective post or contribution +
  • +
  • + Blocking or deleting of content +
  • +
  • + Temporary withdrawal of write permissions +
  • +
  • + Temporary exclusion from the network +
  • +
  • + Final exclusion from the network +
  • +
  • + Violations of German law can be reported. +
  • +
+

+ If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible and link or refer to the corresponding content. + Please click on the three dots on the post, comment or user and report it using the drop-down menu.
+

+
+ + diff --git a/deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html new file mode 100644 index 000000000..4687b8c45 --- /dev/null +++ b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html @@ -0,0 +1,135 @@ + + + + +
+

+ For the social network of {{ organization }} +

+

+ Terms of Service +

+

+ The following terms of use form the basis for the use of our network. + When you register, you must accept them and we will inform you later about any changes that may take place. + The {{ networkName }} Network is operated in Germany and is therefore subject to German law. + Place of jurisdiction is {{ organizationLocation }}. + For details see our imprint: https://{{ networkURL }}/imprint/
+

+

+ Use and License +

+

+ If any content you post to us is protected by intellectual property rights, you grant us a non-exclusive, transferable, sublicensable, worldwide license to use such content for posting to our network. + This license expires when you delete your content or your entire account. + Remember that others may share your content and we cannot delete it.
+

+

+ Privacy Statement +

+

+ Our network is a social knowledge and action network. + It is therefore particularly important to us that as much content as possible is publicly accessible. + In the course of the development of our network there will be more and more the possibility to decide about the visibility of the personal data. + We will inform you about these new features. + Otherwise, you should always think about which personal data you disclose about yourself (or others). + This applies in particular to the content of posts and comments, as these have a largely public character. + Later there will be possibilities to limit the visibility of your profile. + Part of the terms of service is our privacy statement, which informs you about the individual data processing operations in our network: https://{{ networkURL }}/data-privacy. + Our privacy statement is adapted to the legal situation and characteristics of our network and is always valid in the most current version.
+

+

+ Code of Conduct +

+

+ Our code of conduct serves as a handbook for personal appearance and interaction with each other. + Whoever is active as a user in the {{ networkName }} network, writes articles, comments or makes contact with other users, even outside the network, acknowledges these rules of conduct as binding. https://{{ networkURL }}/code-of-conduct
+

+

+ Moderation +

+

+ Until our financial possibilities allow us to implement the community moderation system, we moderate with a simplified system and with our own or possibly volunteer staff. + We train these moderators and for this reason only they make the appropriate decisions. + These moderators carry out their work anonymously. + You can report posts, comments and users to us (for example, if they provide information in their profile or have images that violate these Terms of Use). + If you report something to us, you can give us a reason and a short explanation. + We will then take a look at what you have reported and sanction you if necessary, e.g. by blocking contributions, comments or users. + Unfortunately, you and the person concerned will not receive any feedback from us at this time, but this is in the planning stage. + Irrespective of this, we reserve the right to impose sanctions in principle for reasons that may not or not yet be listed in our Code of Conduct or these terms of service.
+

+

+ Errors and Feedback +

+

+ We make every effort to keep our network and data secure and available. + Each new release of the software goes through both automated and manual testing. + However, unforeseen errors may occur. Therefore, we are grateful for any reported bugs. + You are welcome to report any bugs you discover by emailing Support at https://{{ networkURL }}/support
+

+

+ No Commercial Use +

+

+ The use of the {{ networkName }} Network is not permitted for commercial purposes. + This includes, but is not limited to, advertising products with commercial intent, posting affiliate links, directly soliciting donations, or providing financial support for purposes that are not recognized as charitable for tax purposes.
+

+

+ No Political Use +

+

+ User accounts of political parties or official user accounts of a political representative are not permitted.
+

+

+ Help and Questions +

+

+ For help and questions we have compiled a comprehensive collection of frequently asked questions and answers (FAQ) for you. You can find them here: https://{{ networkURL }}/faq
+

+
+ + diff --git a/deployment/configurations/example/kubernetes/values.template.yaml b/deployment/configurations/example/kubernetes/values.template.yaml new file mode 100644 index 000000000..86c02310c --- /dev/null +++ b/deployment/configurations/example/kubernetes/values.template.yaml @@ -0,0 +1,120 @@ +# please duplicate template file and rename to "values.yaml" and fill in your value + +# change all the below if needed +MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" +PRODUCTION_DB_CLEAN_ALLOW: false # only true for production environments on staging servers +PUBLIC_REGISTRATION: false +INVITE_REGISTRATION: false +COOKIE_EXPIRE_TIME: 730 # days (730 days, two years is the default in main code) +CATEGORIES_ACTIVE: false + +BACKEND: + # change all the below if needed + # DOCKER_IMAGE_REPO - change that to your branded docker image + # label is appended based on .Chart.appVersion + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/backend-branded" + CLIENT_URI: "https://staging.ocelot.social" + # create a new one for your network + JWT_SECRET: "b/&&7b78BF&fv/Vd" + PRIVATE_KEY_PASSPHRASE: "a7dsf78sadg87ad87sfagsadg78" + # ocelot.social mail dummy + EMAIL_DEFAULT_SENDER: "devops@ocelot.social" + SMTP_HOST: "mail.ocelot.social" + SMTP_USERNAME: "devops@ocelot.social" + SMTP_PASSWORD: "devops@ocelot.social" + SMTP_PORT: "587" + SMTP_IGNORE_TLS: 'false' + SMTP_SECURE: 'false' # true for 465, false for other ports + # or + # SMTP_PORT: "465" + # SMTP_IGNORE_TLS: 'true' + # SMTP_SECURE: 'true' # true for 465, false for other ports + + # most likely you don't need to change this + MIN_READY_SECONDS: "15" + PROGRESS_DEADLINE_SECONDS: "60" + REVISIONS_HISTORY_LIMIT: "25" + CONTAINER_RESTART_POLICY: "Always" + CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30" + DOCKER_IMAGE_PULL_POLICY: "Always" + STORAGE_UPLOADS: "25Gi" + +WEBAPP: + # change all the below if needed + # DOCKER_IMAGE_REPO - change that to your branded docker image + # label is appended based on .Chart.appVersion + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp-branded" + WEBSOCKETS_URI: "wss://staging.ocelot.social/api/graphql" + + # Most likely you don't need to change this + REPLICAS: "2" + MIN_READY_SECONDS: "15" + PROGRESS_DEADLINE_SECONDS: "60" + REVISIONS_HISTORY_LIMIT: "25" + CONTAINER_RESTART_POLICY: "Always" + CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30" + DOCKER_IMAGE_PULL_POLICY: "Always" + +NEO4J: + # most likely you don't need to change this + REVISIONS_HISTORY_LIMIT: "25" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j-community-branded" + DOCKER_IMAGE_PULL_POLICY: "Always" + CONTAINER_RESTART_POLICY: "Always" + CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30" + STORAGE: "5Gi" + # RESOURCE_REQUESTS_MEMORY configures the memory available for requests. + RESOURCE_REQUESTS_MEMORY: "2G" + # RESOURCE_LIMITS_MEMORY configures the memory limits available. + RESOURCE_LIMITS_MEMORY: "4G" + # required for Neo4j Enterprice version + #ACCEPT_LICENSE_AGREEMENT: "yes" + ACCEPT_LICENSE_AGREEMENT: "no" + AUTH: "none" + #DBMS_CONNECTOR_BOLT_THREAD_POOL_MAX_SIZE: "10000" # hc value + DBMS_CONNECTOR_BOLT_THREAD_POOL_MAX_SIZE: "400" # default value + #DBMS_MEMORY_HEAP_INITIAL_SIZE: "500MB" # HC value + DBMS_MEMORY_HEAP_INITIAL_SIZE: "" # default + #DBMS_MEMORY_HEAP_MAX_SIZE: "500MB" # HC value + DBMS_MEMORY_HEAP_MAX_SIZE: "" # default + #DBMS_MEMORY_PAGECACHE_SIZE: "490M" # HC value + DBMS_MEMORY_PAGECACHE_SIZE: "" # default + #APOC_IMPORT_FILE_ENABLED: "true" # HC value + APOC_IMPORT_FILE_ENABLED: "false" # default + DBMS_SECURITY_PROCEDURES_UNRESTRICTED: "algo.*,apoc.*" + +MAINTENANCE: + # change all the below if needed + # DOCKER_IMAGE_REPO - change that to your branded docker image + # label is appended based on .Chart.appVersion + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance-branded" + + # Most likely you don't need to change this + REVISIONS_HISTORY_LIMIT: "25" + CONTAINER_RESTART_POLICY: "Always" + CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30" + DOCKER_IMAGE_PULL_POLICY: "Always" + +LETSENCRYPT: + # change all the below if needed + # ISSUER is used by cert-manager to set up certificates with the given provider. + # change it to "letsencrypt-production" once you are ready to have valid cetrificates. + # Be aware that the is an issuing limit with letsencrypt, so a dry run with staging might be wise + ISSUER: "letsencrypt-staging" + EMAIL: "devops@ocelot.social" + DOMAINS: + - "staging.ocelot.social" + - "www.staging.ocelot.social" + +NGINX: + # most likely you don't need to change this + PROXY_BODY_SIZE: "10m" + +STORAGE: + # change all the below if needed + PROVISIONER: "dobs.csi.digitalocean.com" + + # most likely you don't need to change this + RECLAIM_POLICY: "Retain" + VOLUME_BINDING_MODE: "Immediate" + ALLOW_VOLUME_EXPANSION: true \ No newline at end of file diff --git a/deployment/docker-compose.ocelotsocial-branded.yml b/deployment/docker-compose.ocelotsocial-branded.yml new file mode 100644 index 000000000..0c42d6273 --- /dev/null +++ b/deployment/docker-compose.ocelotsocial-branded.yml @@ -0,0 +1,103 @@ +# This docker-compose file is just here for testing +version: "3.4" + +services: + + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/webapp-branded:latest + ports: + - 3000:3000 + networks: + - test-network + depends_on: + - backend + environment: + - HOST=0.0.0.0 + - GRAPHQL_URI=http://backend:4000 + - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + # - WEBSOCKETS_URI=ws://backend:4000/graphql # is not working and not given in Docker YAML in main repo + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/backend-branded:latest + networks: + - test-network + depends_on: + - neo4j + ports: + - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads + environment: + - NEO4J_URI=bolt://neo4j:7687 + - GRAPHQL_URI=http://backend:4000 + - CLIENT_URI=http://localhost:3000 + - JWT_SECRET=b/&&7b78BF&fv/Vd + - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - EMAIL_SUPPORT=support@wir.social + - EMAIL_DEFAULT_SENDER=info@wir.social + # - PRODUCTION_DB_CLEAN_ALLOW=false # only true for production environments on staging servers + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/maintenance-branded:latest + networks: + - test-network + ports: + - 3001:80 + + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + # name the image to match our image to be tested from our DockerHub repository so that it can be pulled from there, otherwise it will be created locally from the 'dockerfile' + image: ocelotsocialnetwork/neo4j-community-branded:latest + networks: + - test-network + environment: + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + ports: + - 7687:7687 + volumes: + - neo4j_data:/data + + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - test-network + +networks: + test-network: + +volumes: + backend_uploads: + neo4j_data: diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml new file mode 100644 index 000000000..a0dda4dc0 --- /dev/null +++ b/deployment/docker-compose.yml @@ -0,0 +1,172 @@ +# This docker-compose file is just here for testing +version: "3.4" +services: + webapp-base: + image: ocelotsocialnetwork/webapp:local-base + build: + dockerfile: ../webapp/Dockerfile + context: ../webapp + target: base + command: sleep 0 + + webapp-code: + image: ocelotsocialnetwork/webapp:local-code + build: + dockerfile: ../webapp/Dockerfile + context: ../webapp + target: code + command: sleep 0 + + webapp: + image: ocelotsocialnetwork/webapp-branded:local-${CONFIGURATION} + container_name: webapp-branded + build: + dockerfile: src/docker/webapp.Dockerfile + target: branded + context: . + args: + - CONFIGURATION=$CONFIGURATION + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code + ports: + - 3000:3000 + networks: + - test-network + depends_on: + - backend + - webapp-base + - webapp-code + env_file: + - .env + environment: + - HOST=0.0.0.0 + - GRAPHQL_URI=http://backend:4000 + - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + # - WEBSOCKETS_URI=ws://backend:4000/graphql # is not working and not given in Docker YAML in main repo + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + + backend-base: + image: ocelotsocialnetwork/backend:local-base + build: + dockerfile: ../backend/Dockerfile + context: ../backend + target: base + command: sleep 0 + + backend-code: + image: ocelotsocialnetwork/backend:local-code + build: + dockerfile: ../backend/Dockerfile + context: ../backend + target: code + command: sleep 0 + + backend: + image: ocelotsocialnetwork/backend-branded:local-${CONFIGURATION} + container_name: backend + build: + dockerfile: src/docker/backend.Dockerfile + target: branded-branded + context: . + args: + - CONFIGURATION=$CONFIGURATION + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code + networks: + - test-network + depends_on: + - neo4j + - backend-base + - backend-code + ports: + - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads + environment: + - NEO4J_URI=bolt://neo4j:7687 + - GRAPHQL_URI=http://backend:4000 + - CLIENT_URI=http://localhost:3000 + - JWT_SECRET=b/&&7b78BF&fv/Vd + - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - EMAIL_SUPPORT=support@wir.social + - EMAIL_DEFAULT_SENDER=info@wir.social + - PUBLIC_REGISTRATION=true + - INVITE_REGISTRATION=true + - CATEGORIES_ACTIVE=true + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + #- PRODUCTION_DB_CLEAN_ALLOW=true + - NODE_ENV=development + + maintenance-base: + image: ocelotsocialnetwork/maintenance:local-base + build: + dockerfile: ../webapp/Dockerfile.maintenance + context: ../webapp + target: base + command: sleep 0 + + maintenance-code: + image: ocelotsocialnetwork/maintenance:local-code + build: + dockerfile: ../webapp/Dockerfile.maintenance + context: ../webapp + target: code + command: sleep 0 + + maintenance: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/maintenance-branded:local-${CONFIGURATION} + container_name: maintenance-branded + build: + # TODO: Separate from webapp, this must be independent + dockerfile: src/docker/maintenance.Dockerfile + target: branded + context: . + args: + - CONFIGURATION=$CONFIGURATION + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code + networks: + - test-network + depends_on: + - maintenance-base + - maintenance-code + ports: + - 3001:80 + + neo4j: + image: ocelotsocialnetwork/neo4j-community:latest + container_name: neo4j + networks: + - test-network + volumes: + - neo4j_data:/data + environment: + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + ports: + - 7687:7687 + - 7474:7474 + + mailserver: + image: djfarrelly/maildev + container_name: mailserver-branded + ports: + - 1080:80 + networks: + - test-network + +networks: + test-network: + +volumes: + backend_uploads: + neo4j_data: diff --git a/deployment/scripts/branded-images.build.sh b/deployment/scripts/branded-images.build.sh new file mode 100755 index 000000000..099ba460a --- /dev/null +++ b/deployment/scripts/branded-images.build.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# for a branded version you should pass the following env variables: +# CONFIGURATION - your configuration folder name +# DOCKERHUB_ORGANISATION - your dockerhub organisation +# OCELOT_VERSION - specify the specific tag to build upon e.g. 2.4.0-300 + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +CONFIGURATION=${CONFIGURATION:-"example"} +DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"} +OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../../package.json').version")} +BRANDED_VERSION=${BRANDED_VERSION:-${GITHUB_RUN_NUMBER:-"local"}} +BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')} +BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION} +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:${BUILD_VERSION}" \ + -f "${SCRIPT_DIR}/../src/docker/backend.Dockerfile" \ + --build-arg "CONFIGURATION=${CONFIGURATION}" \ + --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_VERSION}-code" \ + --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_VERSION}-base" \ + "${SCRIPT_DIR}/../." + +# webapp +docker build --target branded \ + -t "${DOCKERHUB_ORGANISATION}/webapp-branded:latest" \ + -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION}" \ + -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION}" \ + -f "${SCRIPT_DIR}/../src/docker/webapp.Dockerfile" \ + --build-arg "CONFIGURATION=${CONFIGURATION}" \ + --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_VERSION}-code" \ + --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_VERSION}-base" \ + "${SCRIPT_DIR}/../." + +# mainteance +docker build --target branded \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:latest" \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION}" \ + -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" \ + -f "${SCRIPT_DIR}/../src/docker/maintenance.Dockerfile" \ + --build-arg "CONFIGURATION=${CONFIGURATION}" \ + --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_VERSION}-code" \ + --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_VERSION}-base" \ + "${SCRIPT_DIR}/../." diff --git a/deployment/scripts/branded-images.upload.sh b/deployment/scripts/branded-images.upload.sh new file mode 100755 index 000000000..3891fe474 --- /dev/null +++ b/deployment/scripts/branded-images.upload.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# for a branded version you should pass the following env variables: +# DOCKERHUB_ORGANISATION - your dockerhub organisation +# OCELOT_VERSION - specify the specific tag to build upon e.g. 2.4.0-300 +# DOCKERHUB_USERNAME - your dockerhub username +# DOCKERHUB_TOKEN - your dockerhub access token + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"} +OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../../package.json').version")} +BRANDED_VERSION=${BRANDED_VERSION:-${GITHUB_RUN_NUMBER:-"local"}} +BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION} + +# login to dockerhub +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:${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:${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:${BUILD_VERSION} \ No newline at end of file diff --git a/deployment/scripts/cluster.backup.sh b/deployment/scripts/cluster.backup.sh new file mode 100755 index 000000000..b83bab198 --- /dev/null +++ b/deployment/scripts/cluster.backup.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +CONFIGURATION=${CONFIGURATION:-"example"} +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} +BACKUP_DATE=$(date "+%F_%H-%M-%S") +BACKUP_FOLDER=${BACKUP_FOLDER:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/backup/${BACKUP_DATE}} + +# create backup fodler +mkdir -p ${BACKUP_FOLDER} + +# maintenance mode on +${SCRIPT_DIR}/cluster.maintenance.sh on + +# shutdown database +kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ + | jq '.spec.template.spec.containers[] += {"command": ["tail", "-f", "/dev/null"]}' \ + | kubectl --kubeconfig=${KUBECONFIG} apply -f - + +# wait for the container to restart +sleep 60 + +# database backup +kubectl --kubeconfig=${KUBECONFIG} -n default exec -it \ + $(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') \ + -- neo4j-admin dump --to=/var/lib/neo4j/$BACKUP_DATE-neo4j-dump +# copy neo4j backup to local drive +kubectl --kubeconfig=${KUBECONFIG} cp \ + default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j |awk '{ print $1 }'):/var/lib/neo4j/$BACKUP_DATE-neo4j-dump $BACKUP_FOLDER/neo4j-dump +# copy image data +kubectl --kubeconfig=${KUBECONFIG} cp \ + default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-backend |awk '{ print $1 }'):/app/public/uploads $BACKUP_FOLDER/public-uploads + +# restart database +kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ + | jq 'del(.spec.template.spec.containers[].command)' \ + | kubectl --kubeconfig=${KUBECONFIG} apply -f - + +# wait for the container to restart +sleep 60 + +# maintenance mode off +${SCRIPT_DIR}/cluster.maintenance.sh off \ No newline at end of file diff --git a/deployment/scripts/cluster.maintenance.sh b/deployment/scripts/cluster.maintenance.sh new file mode 100755 index 000000000..3a558d7bb --- /dev/null +++ b/deployment/scripts/cluster.maintenance.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +CONFIGURATION=${CONFIGURATION:-"example"} +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} + +case $1 in + on) + kubectl --kubeconfig=${KUBECONFIG} patch ingress ingress-ocelot-webapp --type merge --patch-file ${SCRIPT_DIR}/../src/kubernetes/patches/patch.ingress.maintenance.on.yaml + ;; + off) + kubectl --kubeconfig=${KUBECONFIG} patch ingress ingress-ocelot-webapp --type merge --patch-file ${SCRIPT_DIR}/../src/kubernetes/patches/patch.ingress.maintenance.off.yaml + ;; + *) + echo -e "Run this script with first argument either 'on' or 'off'" + exit + ;; +esac diff --git a/deployment/scripts/cluster.upgrade.sh b/deployment/scripts/cluster.upgrade.sh new file mode 100755 index 000000000..2502a778a --- /dev/null +++ b/deployment/scripts/cluster.upgrade.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +CONFIGURATION=${CONFIGURATION:-"example"} +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} +VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml + +# upgrade with helm +helm --kubeconfig=${KUBECONFIG} upgrade ocelot --values ${VALUES} ${SCRIPT_DIR}/../src/kubernetes/ --debug --timeout 10m \ No newline at end of file diff --git a/deployment/src/docker/backend.Dockerfile b/deployment/src/docker/backend.Dockerfile new file mode 100644 index 000000000..6d458c9d7 --- /dev/null +++ b/deployment/src/docker/backend.Dockerfile @@ -0,0 +1,46 @@ +ARG APP_IMAGE=ocelotsocialnetwork/backend +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + +################################################################################## +# CODE (branded) ################################################################# +################################################################################## +FROM $APP_IMAGE_CODE as code + +ARG CONFIGURATION=example + +# copy public constants and email templates into the Docker image to brand it +COPY configurations/${CONFIGURATION}/branding/constants/emails.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/email/ src/middleware/helpers/email/ + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# BRANDED (Does contain only "binary"- and static-files to reduce image size) #### +################################################################################## +FROM $APP_IMAGE_BASE as branded + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/dist ./dist +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 package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/deployment/src/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile new file mode 100644 index 000000000..b699e7f20 --- /dev/null +++ b/deployment/src/docker/maintenance.Dockerfile @@ -0,0 +1,43 @@ +ARG APP_IMAGE=ocelotsocialnetwork/maintenance +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + +################################################################################## +# CODE (branded) ################################################################# +################################################################################## +FROM $APP_IMAGE_CODE as code + +ARG CONFIGURATION=example + +# copy public constants into the Docker image to brand it +COPY configurations/${CONFIGURATION}/branding/static/ static/ +COPY configurations/${CONFIGURATION}/branding/constants/ constants/ + +# locales +COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ +COPY src/tools/ tools/ +RUN apk add --no-cache bash jq +RUN tools/merge-locales.sh + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +## unnicely done in $APP_IMAGE_CODE at the moment, see main repo +# RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn generate +RUN yarn run generate + +################################################################################## +# BRANDED ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO #### +################################################################################## +# FROM $APP_IMAGE_BASE as branded +FROM nginx:alpine as branded + +COPY --from=build ./app/dist/ /usr/share/nginx/html/ +RUN rm /etc/nginx/conf.d/default.conf +COPY --from=code ./app/maintenance/nginx/custom.conf /etc/nginx/conf.d/ diff --git a/deployment/src/docker/webapp.Dockerfile b/deployment/src/docker/webapp.Dockerfile new file mode 100644 index 000000000..f0c75e392 --- /dev/null +++ b/deployment/src/docker/webapp.Dockerfile @@ -0,0 +1,60 @@ +ARG APP_IMAGE=ocelotsocialnetwork/webapp +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + +################################################################################## +# CODE (branded) ################################################################# +################################################################################## +FROM $APP_IMAGE_CODE as code + +ARG CONFIGURATION=example + +# copy public constants into the Docker image to brand it +COPY configurations/${CONFIGURATION}/branding/static/ static/ +COPY configurations/${CONFIGURATION}/branding/constants/ constants/ +COPY configurations/${CONFIGURATION}/branding/locales/html/ locales/html/ +COPY configurations/${CONFIGURATION}/branding/assets/styles/imports/ assets/styles/imports/ +COPY configurations/${CONFIGURATION}/branding/assets/fonts/ assets/fonts/ + +# locales +COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ +COPY src/tools/ tools/ +RUN apk add --no-cache bash jq +RUN tools/merge-locales.sh + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# BRANDED (Does contain only "binary"- and static-files to reduce image size) #### +################################################################################## +FROM $APP_IMAGE_BASE as branded + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js +# Copy static files +# TODO - this seems not be needed anymore for the new rebranding +# TODO - this should be one Folder containign all stuff needed to be copied +COPY --from=build ${DOCKER_WORKDIR}/config/ ./config/ +COPY --from=build ${DOCKER_WORKDIR}/constants ./constants +COPY --from=build ${DOCKER_WORKDIR}/static ./static +COPY --from=build ${DOCKER_WORKDIR}/locales ./locales +COPY --from=build ${DOCKER_WORKDIR}/assets/styles/imports ./assets/styles/imports +COPY --from=build ${DOCKER_WORKDIR}/assets/fonts ./assets/fonts +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/deployment/src/kubernetes/.gitignore b/deployment/src/kubernetes/.gitignore new file mode 100644 index 000000000..e0473b0fd --- /dev/null +++ b/deployment/src/kubernetes/.gitignore @@ -0,0 +1,3 @@ +/dns.values.yaml +/nginx.values.yaml +/values.yaml diff --git a/deployment/src/kubernetes/Backup.md b/deployment/src/kubernetes/Backup.md new file mode 100644 index 000000000..227b5765f --- /dev/null +++ b/deployment/src/kubernetes/Backup.md @@ -0,0 +1,305 @@ +# Kubernetes Backup Of Ocelot.Social + +One of the most important tasks in managing a running [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network is backing up the data, e.g. the Neo4j database and the stored image files. + +## Manual Offline Backup + +To prepare, [kubectl](https://kubernetes.io/docs/tasks/tools/) must be installed and ready to use so that you have access to Kubernetes on your server. + +Check if the correct context is used by running the following commands: + +```bash +# check context and set the correct one +$ kubectl config get-contexts +# if the wrong context is chosen use it +$ kubectl config use-context +# if you like check additionally if all pods are running well +$ kubectl -n default get pods -o wide +``` + +The very first step is to put the website into **maintenance mode**. + +### Set Maintenance Mode + +There are two ways to put the network into maintenance mode: + +- via Kubernetes Dashboard +- via `kubectl` + +#### Maintenance Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Ingresses` from the left side menu under `Service`. + +After that, in the list that appears, you will find the entry `ingress-ocelot-webapp`, which has three dots on the right, where you can click to edit the entry. + +You can scroll to the end of the YAML file, where you will find one or more `host` entries under `rules`, one for each domain of the network. + +In all entries, change the value of the `serviceName` entry from ***ocelot-webapp*** to `ocelot-maintenance` and the value of the `servicePort` entry from ***3000*** to `80`. + +First, check if your website is still online. +After you click `Update`, the new settings will be applied and you will find your website in maintenance mode. + +#### Maintenance Mode Via `kubectl` + +To put the network into maintenance mode, run the following commands in the terminal: + +```bash +# list ingresses +$ kubectl get ingress -n default +# edit ingress +$ kubectl -n default edit ingress ingress-ocelot-webapp +``` + +Change the content of the YAML file for all domains to: + +```yaml + spec: + rules: + - host: network-domain.social + http: + paths: + - backend: + # serviceName: ocelot-webapp + # servicePort: 3000 + serviceName: ocelot-maintenance + servicePort: 80 +``` + +First, check if your website is still online. +After you save the file, the new settings will be applied and you will find your website in maintenance mode. + +### Neo4j Database Offline Backup + +Before we can back up the database, we need to put it into **sleep mode**. + +#### Set Neo4j To Sleep Mode + +Again there are two ways to put the network into sleep mode: + +- via Kubernetes Dashboard +- via `kubectl` + +##### Sleep Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Deployments` from the left side menu under `Workloads`. + +After that, in the list that appears, you will find the entry `ocelot-neo4j`, which has three dots on the right, where you can click to edit the entry. + +Scroll to the end of the YAML file where you will find the `spec.template.spec.containers` entry. Here you can insert the `command` entry directly after `imagePullPolicy` in a new line. + +```yaml + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + imagePullPolicy: Always + command: ["tail", "-f", "/dev/null"] +``` + +After clicking `Update`, the new settings will be applied and you should check in the `Pods` menu item on the left side if the `ocelot-neo4j-` pod restarts. + +##### Sleep Mode Via `kubectl` + +To put Neo4j into sleep mode, run the following commands in the terminal: + +```bash +# list deployments +$ kubectl get deployments -n default +# edit deployment +$ kubectl -n default edit deployment ocelot-neo4j +``` + +Scroll to the `spec.template.spec.containers` entry. Here you can insert the `command` entry directly after `imagePullPolicy` in a new line. + +```yaml + image: /neo4j-community-branded:latest + imagePullPolicy: Always + command: ["tail", "-f", "/dev/null"] +``` + +After pressing enter, the new settings will be applied and you should check if the `ocelot-neo4j-` pod restarts. +Use command: + +```bash +# check if the old pod restarts +$ kubectl -n default get pods -o wide +``` + +#### Generate Offline Backup + +The offline backup is generated via `kubectl`: + +```bash +# check for the Neo4j pod +$ kubectl -n default get pods -o wide + +# ls: see wish backup dumps are already there +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- ls + +# bash: enter bash of Neo4j +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- bash +# generate Dump +neo4j% neo4j-admin dump --to=/var/lib/neo4j/$(date +%F)-neo4j-dump +# exit bash +neo4j% exit + +# ls: see if the new backup dump is there +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- ls +``` + +Lets copy the dump backup + +```bash +# copy dump onto backup volume direct +$ kubectl cp default/$(kubectl -n default get pods | grep ocelot-neo4j |awk '{ print $1 }'):/var/lib/neo4j/$(date +%F)-neo4j-dump /Volumes//$(date +%F)-neo4j-dump + +``` + +#### Remove Sleep Mode From Neo4j + +Again there are two ways to put the network into working mode: + +- via Kubernetes Dashboard +- via `kubectl` + +##### Remove Sleep Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Deployments` from the left side menu under `Workloads`. + +After that, in the list that appears, you will find the entry `ocelot-neo4j`, which has three dots on the right, where you can click to edit the entry. + +Scroll to the `spec.template.spec.containers.command` entry and remove the whole `command` entry like: + +```yaml + containers: + - name: container-ocelot-neo4j + image: 'senderfm/neo4j-community-branded:latest' + command: + - tail + - '-f' + - /dev/null + ports: + - containerPort: 7687 + protocol: TCP +``` + +And get: + +```yaml + containers: + - name: container-ocelot-neo4j + image: 'senderfm/neo4j-community-branded:latest' + ports: + - containerPort: 7687 + protocol: TCP +``` + +After clicking `Update`, the new settings will be applied and you should check in the `Pods` menu item on the left side if the `ocelot-neo4j-` pod restarts. + +##### Remove Sleep Mode Via `kubectl` + +To put Neo4j into working mode, run the following commands in the terminal: + +```bash +# list deployments +$ kubectl get deployments -n default +# edit deployment +$ kubectl -n default edit deployment ocelot-neo4j +``` + +Scroll to the `spec.template.spec.containers.command` entry and remove the whole `command` entry like: + +```yaml + spec: + containers: + - command: + - tail + - -f + - /dev/null + envFrom: + - configMapRef: + name: configmap-ocelot-neo4j +``` + +And get: + +```yaml + spec: + containers: + - envFrom: + - configMapRef: + name: configmap-ocelot-neo4j +``` + +After pressing enter, the new settings will be applied and you should check if the `ocelot-neo4j-` pod restarts. +Use command: + +```bash +# check if the old pod restarts +$ kubectl -n default get pods -o wide +``` + +### Backend Backup + +To back up the images from the backend volume, run commands: + +```bash +# ls: backend/public/uploads +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- ls public/uploads + +# copy all images from upload to backup volume direct +$ kubectl cp default/$(kubectl -n default get pods | grep ocelot-backend |awk '{ print $1 }'):/app/public/uploads /Volumes//$(date +%F)-public-uploads +``` + +### Remove Maintenance Mode + +There are two ways to put the network into working mode: + +- via Kubernetes Dashboard +- via `kubectl` + +#### Remove Maintenance Mode Via Kubernetes Dashboard + +In the Kubernetes Dashboard, you can select `Ingresses` from the left side menu under `Service`. + +After that, in the list that appears, you will find the entry `ingress-ocelot-webapp`, which has three dots on the right, where you can click to edit the entry. + +You can scroll to the end of the YAML file, where you will find one or more `host` entries under `rules`, one for each domain of the network. + +In all entries, change the value of the `serviceName` entry from ***ocelot-maintenance*** to `ocelot-webapp` and the value of the `servicePort` entry from ***80*** to `3000`. + +First, check if your website is still in maintenance mode. +After you click `Update`, the new settings will be applied and you will find your website online again. + +#### Remove Maintenance Mode Via `kubectl` + +To put the network into working mode, run the following commands in the terminal: + +```bash +# list ingresses +$ kubectl get ingress -n default +# edit ingress +$ kubectl -n default edit ingress ingress-ocelot-webapp +``` + +Change the content of the YAML file for all domains to: + +```yaml + spec: + rules: + - host: network-domain.social + http: + paths: + - backend: + serviceName: ocelot-webapp + servicePort: 3000 + # serviceName: ocelot-maintenance + # servicePort: 80 +``` + +First, check if your website is still in maintenance mode. +After you save the file, the new settings will be applied and you will find your website online again. + +XXX + +```bash +# Dump: Create a Backup in Kubernetes: https://docs.human-connection.org/human-connection/deployment/volumes/neo4j-offline-backup#create-a-backup-in-kubernetes +``` diff --git a/deployment/src/kubernetes/Chart.yaml b/deployment/src/kubernetes/Chart.yaml new file mode 100644 index 000000000..5b953e3e7 --- /dev/null +++ b/deployment/src/kubernetes/Chart.yaml @@ -0,0 +1,39 @@ +type: application +apiVersion: v2 +name: ocelot-social +version: "1.0.0" +# The appVersion defines which docker image is pulled. +# Having it set to latest will pull the latest build on dockerhub. +# You are free to define a specific version here tho. +# e.g. appVersion: "latest" or "1.0.2-3-ocelot.social1.0.2-79" +# Be aware that this requires all your apps to have the same docker image version available. +appVersion: "latest" +description: The Helm chart for ocelot.social +home: https://ocelot.social +sources: + - https://github.com/Ocelot-Social-Community/ + - https://github.com/Ocelot-Social-Community/Ocelot-Social + - https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding +maintainers: + - name: Ulf Gebhardt + email: ulf.gebhardt@webcraft-media.de + url: https://www.webcraft-media.de/#!ulf_gebhardt +icon: https://github.com/Ocelot-Social-Community/Ocelot-Social/raw/master/webapp/static/img/custom/welcome.svg +deprecated: false + +# Unused Fields +#dependencies: # A list of the chart requirements (optional) +# - name: ingress-nginx +# version: v1.10.0 +# repository: https://kubernetes.github.io/ingress-nginx +# condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled ) +# tags: # (optional) +# - Tags can be used to group charts for enabling/disabling together +# import-values: # (optional) +# - ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items. +# alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times +#kubeVersion: A SemVer range of compatible Kubernetes versions (optional) +#keywords: +# - A list of keywords about this project (optional) +#annotations: +# example: A list of annotations keyed by name (optional). \ No newline at end of file diff --git a/deployment/src/kubernetes/DigitalOcean.md b/deployment/src/kubernetes/DigitalOcean.md new file mode 100644 index 000000000..2c919d5f2 --- /dev/null +++ b/deployment/src/kubernetes/DigitalOcean.md @@ -0,0 +1,84 @@ +# DigitalOcean + +If you want to set up a [Kubernetes](https://kubernetes.io) cluster on [DigitalOcean](https://www.digitalocean.com), follow this guide. + +## Create Account + +Create an account with DigitalOcean. + +## Add Project + +On the left side you will see a menu. Click on `New Project`. Enter a name and click `Create Project`. +Skip moving resources, probably. + +## Create Kubernetes Cluster + +On the right top you find the button `Create`. Click on it and choose `Kubernetes - Create Kubernetes Cluster`. + +- use the latest Kubernetes version +- choose your datacenter region +- name your node pool: e.g. `pool-` +- `2 Basic nodes` with `2.5 GB RAM (total of 4 GB)`, `2 shared CPUs`, and `80 GB Disk` each is optimal for the beginning +- set your cluster name: e.g. `cluster-` +- select your project +- no tags necessary + +## Getting Started + +After your cluster is set up – see progress bar above – click on `Getting started`. Please install the following management tools: + +- [kubectl v1.24.1](https://kubernetes.io/docs/tasks/tools/) +- [doctl v1.78.0](https://github.com/digitalocean/doctl) + +Install the tools as described on the tab or see the links here. + +After the installation, click on `Continue`. + +### Download Configuration File + +Follow the steps to download the configuration file. + +You can skip this step if necessary, as you can download the file later. You can then do this by clicking on `Kubernetes` in the left menu. In the menu to the right of the cluster name in the cluster list, click on `More` and select `Download Config`. + +### Patch & Minor Version Upgrades + +Skip `Patch & Minor Version Upgrades` for now. + +### Install 1-Click Apps + +You don't need a 1-click app. Our helmet script will install the required NGINXs. +Therefore, skip this step as well. + +## DNS Configuration + +There are the following two ways to set up the DNS. + +### Manage DNS With A Different Domain Provider + +If you have registered your domain or subdomain with another domain provider, add an `A` record there with one of the IP addresses from one of the cluster droplets in the DNS. + +To find the correct IP address to set in the DNS `A` record, click `Droplets` in the left main menu. +A list of all your droplets will be displayed. +Take one of the IPs of perhaps two or more droplets in your cluster from the list and enter it into the `A` record. + +### Manage DNS With DigitalOcean + +***TODO:** How to configure the DigitalOcean DNS management service …* + +To understand what makes sense to do when managing your DNS with DigitalOcean, you need to know how DNS works: + +DNS means `Domain Name System`. It resolves domains like `example.com` into an IP like `123.123.123.123`. +DigitalOcean is not a domain registrar, but provides a DNS management service. If you use DigitalOcean's DNS management service, you can configure [your cluster](/deployment/kubernetes/README.md#dns) to always resolve the domain to the correct IP and automatically update it for that. +The IPs of the DigitalOcean machines are not necessarily stable, so the cluster's DNS service will update the DNS records managed by DigitalOcean to the new IP as needed. + +***CAUTION:** If you are using an external DNS, you currently have to do this manually, which can cause downtime.* + +## Deploy + +Yeah, you're done here. Back to [Deployment with Helm for Kubernetes](/deployment/kubernetes/README.md). + +## Backups On DigitalOcean + +You can and should do [backups](/deployment/kubernetes/Backup.md) with Kubernetes for sure. + +Additional to backup and copying the Neo4j database dump and the backend images you can do a volume snapshot on DigitalOcean at the moment you have the database in sleep mode. diff --git a/deployment/src/kubernetes/README.md b/deployment/src/kubernetes/README.md new file mode 100644 index 000000000..0f7ecd20f --- /dev/null +++ b/deployment/src/kubernetes/README.md @@ -0,0 +1,299 @@ +# Kubernetes Helm Installation Of Ocelot.Social + +Deploying [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) with [Helm](https://helm.sh) for [Kubernetes](https://kubernetes.io) is very straight forward. All you have to do is to change certain parameters, like domain names and API keys, then you just install our provided Helm chart to your cluster. + +## Kubernetes Cloud Hosting + +There are various ways to set up your own or a managed Kubernetes cluster. We will extend the following lists over time. +Please contact us if you are interested in options not listed below. + +Managed Kubernetes: + +- [DigitalOcean](/deployment/kubernetes/DigitalOcean.md) + +## Configuration + +You can customize the network server with your configuration by duplicate the `values.template.yaml` to a new `values.yaml` file and change it to your need. All included variables will be available as environment variables in your deployed kubernetes pods. + +Besides the `values.template.yaml` file we provide a `nginx.values.template.yaml` and `dns.values.template.yaml` for a similar procedure. The new `nginx.values.yaml` is the configuration for the ingress-nginx Helm chart, while the `dns.values.yaml` file is for automatically updating the dns values on DigitalOcean and therefore optional. + +## Installation + +Due to the many limitations of Helm you still have to do several manual steps. +Those occur before you run the actual *ocelot.social* Helm chart. +Obviously it is expected of you to have `helm` and `kubectl` installed. +For the cert-manager you may need `cmctl`, see below. +For DigitalOcean you may also need `doctl`. + +Install: + +- [kubectl v1.24.1](https://kubernetes.io/docs/tasks/tools/) +- [doctl v1.78.0](https://docs.digitalocean.com/reference/doctl/how-to/install/) +- [cmctl v1.8.2](https://cert-manager.io/docs/usage/cmctl/#installation) +- [helm v3.9.0](https://helm.sh/docs/intro/install/) + + +### Cert Manager (https) + +Please refer to [cert-manager.io docs](https://cert-manager.io/docs/installation/) for more details. + +***ATTENTION:*** *Be with the Terminal in your repository in the folder of this README.* + +We have three ways to install the cert-manager, purely via `kubectl`, via `cmctl`, or with `helm`. + +We recommend using `helm` because then we do not mix the installation methods. +Please have a look here: + +- [Installing with Helm](https://cert-manager.io/docs/installation/helm/#installing-with-helm) + +Our Helm installation is optimized for cert-manager version `v1.9.1` and `kubectl` version `"v1.24.2`. + +Please search here for cert-manager versions that are compatible with your `kubectl` version on the cluster and on the client: [cert-manager Supported Releases](https://cert-manager.io/docs/installation/supported-releases/#supported-releases). + +***ATTENTION:*** *When uninstalling cert-manager, be sure to use the same method as for installation! Otherwise, we could end up in a broken state, see [Uninstall](https://cert-manager.io/docs/installation/kubectl/#uninstalling).* + + + +### Ingress-Nginx + +#### 1. Add Helm repository for `ingress-nginx` and update + +```bash +$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +$ helm repo update +``` + +#### 2. Install ingress-nginx + +```bash +# kubeconfig.yaml set globaly +$ helm install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +``` + +### DigitalOcean Firewall + +This is only necessary if you run DigitalOcean without load balancer ([see here for more info](https://stackoverflow.com/questions/54119399/expose-port-80-on-digital-oceans-managed-kubernetes-without-a-load-balancer/55968709)) . + +#### 1. Authenticate towards DO with your local `doctl` + +You will need a DO token for that. + +```bash +# without doctl context +$ doctl auth init +# with doctl new context to be filled in +$ doctl auth init --context +``` + +You will need an API token, which you can generate in the control panel at . + +#### 2. Generate DO firewall + + Get the `CLUSTER_UUID` value from the dashboard or from the ID column via `doctl kubernetes cluster list`: + +```bash +# need to apply access token by `doctl auth init` before +$ doctl kubernetes cluster list +``` + +Fill in the `CLUSTER_UUID` and `your-domain`. The latter with hyphens `-` instead of dots `.`: + +```bash +# without doctl context +$ doctl compute firewall create \ +--inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \ +--tag-names=k8s: \ +--name=-http-https +# with doctl context to be filled in +$ doctl compute firewall create \ +--inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \ +--tag-names=k8s: \ +--name=-http-https --context +``` + +To get informations about your success use this command. (Fill in the `ID` you got at creation.): + +```bash +# without doctl context +$ doctl compute firewall get +# with doctl context to be filled in +$ doctl compute firewall get --context +``` + +### DNS + +***TODO:** I thought this is necessary if we use the DigitalOcean DNS management service? See [Manage DNS With DigitalOcean](/deployment/kubernetes/DigitalOcean.md#manage-dns-with-digitalocean)* + +This chart is only necessary (recommended is more precise) if you run DigitalOcean without load balancer. +You need to generate an access token with read + write for the `dns.values.yaml` at and fill it in. + +#### 1. Add Helm repository for `binami` and update + +```bash +$ helm repo add bitnami https://charts.bitnami.com/bitnami +$ helm repo update +``` + +#### 2. Install DNS + +```bash +# kubeconfig.yaml set globaly +$ helm install dns bitnami/external-dns -f dns.values.yaml +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns.values.yaml +``` + +### Ocelot.Social + +***Attention:** Before installing your own ocelot.social network, you need to create a DockerHub (account and) organization, put its name in the `package.json` file, and push your deployment and rebranding code to GitHub so that GitHub Actions can push your Docker images to DockerHub. This is because Kubernetes will pull these images to create PODs from them.* + +All commands for ocelot need to be executed in the kubernetes folder. Therefore `cd deployment/kubernetes/` is expected to be run before every command. Furthermore the given commands will install ocelot into the default namespace. This can be modified to by attaching `--namespace not.default`. + +#### Install + +Only run once for the first time of installation: + +```bash +# kubeconfig.yaml set globaly +$ helm install ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ +``` + +#### Upgrade & Update + +Run for all upgrades and updates: + +```bash +# kubeconfig.yaml set globaly +$ helm upgrade ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml upgrade ocelot ./ +``` + +#### Rollback + +Run for a rollback, in case something went wrong: + +```bash +# kubeconfig.yaml set globaly +$ helm rollback ocelot +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml rollback ocelot +``` + +#### Uninstall + +Be aware that if you uninstall ocelot the formerly bound volumes become unbound. Those volumes contain all data from uploads and database. You have to manually free their reference in order to bind them again when reinstalling. Once unbound from their former container references they should automatically be rebound (considering the sizes did not change) + +```bash +# kubeconfig.yaml set globaly +$ helm uninstall ocelot +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot +``` + +## Backups + +You can and should do [backups](/deployment/kubernetes/Backup.md) with Kubernetes for sure. + +## Error Reporting + +We use [Sentry](https://github.com/getsentry/sentry) for error reporting in both +our backend and web frontend. You can either use a hosted or a self-hosted +instance. Just set the two `DSN` in your +[configmap](../templates/configmap.template.yaml) and update the `COMMIT` +during a deployment with your commit or the version of your release. + +### Self-hosted Sentry + +For data privacy it is recommended to set up your own instance of sentry. +If you are lucky enough to have a kubernetes cluster with the required hardware +support, try this [helm chart](https://github.com/helm/charts/tree/master/stable/sentry). + +On our kubernetes cluster we get "mult-attach" errors for persistent volumes. +Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements. + +## Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster + +### Deploy A Version + +```bash +# !!! be aware of the correct kube context !!! +$ kubectl config get-contexts + +# deploy version '$BUILD_VERSION' +# !!! 'latest' is not recommended on production !!! + +# for easyness set env +$ export BUILD_VERSION=1.0.8-48-ocelot.social1.0.8-184 # example +# check this with +$ echo $BUILD_VERSION +1.0.8-48-ocelot.social1.0.8-184 + +# deploy actual version '$BUILD_VERSION' to Kubernetes cluster +$ kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-webapp +$ kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-backend +$ kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-maintenance +$ kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION +$ kubectl -n default rollout restart deployment/ocelot-neo4j +# verify deployment and wait for the pods of each deployment to get ready for cleaning and seeding of the database +$ kubectl -n default rollout status deployment/ocelot-webapp --timeout=240s +$ kubectl -n default rollout status deployment/ocelot-maintenance --timeout=240s +$ kubectl -n default rollout status deployment/ocelot-backend --timeout=240s +$ kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s +``` + +### Staging – Clean And Seed Neo4j Database + +***ATTENTION:*** Cleaning and seeding of our Neo4j database is only possible in production if env `PRODUCTION_DB_CLEAN_ALLOW=true` is set in our deployment. + +```bash +# !!! be aware of the correct kube context !!! +$ kubectl config get-contexts + +# reset and seed Neo4j database via backend for staging +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node --experimental-repl-await dist/db/clean.js && node --experimental-repl-await dist/db/seed.js" + + +``` diff --git a/deployment/src/kubernetes/charts/.gitkeep b/deployment/src/kubernetes/charts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/kubernetes/crds/.gitkeep b/deployment/src/kubernetes/crds/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/kubernetes/dns.values.template.yaml b/deployment/src/kubernetes/dns.values.template.yaml new file mode 100644 index 000000000..09539e37e --- /dev/null +++ b/deployment/src/kubernetes/dns.values.template.yaml @@ -0,0 +1,12 @@ +# please duplicate template file and rename to "dns.values.yaml" and fill in your value + +provider: digitalocean +digitalocean: + # create the API token at https://cloud.digitalocean.com/account/api/tokens + # needs read + write + apiToken: "TODO" +domainFilters: + # domains you want external-dns to be able to edit + - TODO.TODO +rbac: + create: true \ No newline at end of file diff --git a/deployment/src/kubernetes/nginx.values.template.yaml b/deployment/src/kubernetes/nginx.values.template.yaml new file mode 100644 index 000000000..8035104d2 --- /dev/null +++ b/deployment/src/kubernetes/nginx.values.template.yaml @@ -0,0 +1,13 @@ +# please duplicate template file and rename to "nginx.values.yaml" and fill in your value + +controller: + kind: DaemonSet + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + ingressClass: nginx + daemonset: + useHostPort: true + service: + type: ClusterIP +rbac: + create: true \ No newline at end of file diff --git a/deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml b/deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml new file mode 100644 index 000000000..c01745d0a --- /dev/null +++ b/deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml @@ -0,0 +1,12 @@ +spec: + rules: + - host: + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: ocelot-webapp + port: + number: 3000 \ No newline at end of file diff --git a/deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml b/deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml new file mode 100644 index 000000000..8a2c5d45f --- /dev/null +++ b/deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml @@ -0,0 +1,12 @@ +spec: + rules: + - host: + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: ocelot-maintenance + port: + number: 80 \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/NOTES.txt b/deployment/src/kubernetes/templates/NOTES.txt new file mode 100644 index 000000000..3db4648ca --- /dev/null +++ b/deployment/src/kubernetes/templates/NOTES.txt @@ -0,0 +1 @@ +You installed ocelot-social! Congrats <3 \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/backend/ConfigMap.yml b/deployment/src/kubernetes/templates/backend/ConfigMap.yml new file mode 100644 index 000000000..1222b0da0 --- /dev/null +++ b/deployment/src/kubernetes/templates/backend/ConfigMap.yml @@ -0,0 +1,29 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + PRODUCTION_DB_CLEAN_ALLOW: "{{ .Values.PRODUCTION_DB_CLEAN_ALLOW }}" + PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" + CATEGORIES_ACTIVE: "{{ .Values.CATEGORIES_ACTIVE }}" + CLIENT_URI: "{{ .Values.BACKEND.CLIENT_URI }}" + EMAIL_DEFAULT_SENDER: "{{ .Values.BACKEND.EMAIL_DEFAULT_SENDER }}" + SMTP_HOST: "{{ .Values.BACKEND.SMTP_HOST }}" + SMTP_PORT: "{{ .Values.BACKEND.SMTP_PORT }}" + SMTP_IGNORE_TLS: "{{ .Values.BACKEND.SMTP_IGNORE_TLS }}" + SMTP_SECURE: "{{ .Values.BACKEND.SMTP_SECURE }}" + GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000" + NEO4J_URI: "bolt://{{ .Release.Name }}-neo4j:7687" + #REDIS_DOMAIN: ---toBeSet(IP)--- + #REDIS_PORT: "6379" + #SENTRY_DSN_WEBAPP: "---toBeSet---" + #SENTRY_DSN_BACKEND: "---toBeSet---" \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/backend/Deployment.yaml b/deployment/src/kubernetes/templates/backend/Deployment.yaml new file mode 100644 index 000000000..f475a0173 --- /dev/null +++ b/deployment/src/kubernetes/templates/backend/Deployment.yaml @@ -0,0 +1,57 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: 1 + minReadySeconds: {{ .Values.BACKEND.MIN_READY_SECONDS }} + progressDeadlineSeconds: {{ .Values.BACKEND.PROGRESS_DEADLINE_SECONDS }} + revisionHistoryLimit: {{ .Values.BACKEND.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-backend + template: + metadata: + annotations: + backup.velero.io/backup-volumes: uploads + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + labels: + app: {{ .Release.Name }}-backend + spec: + containers: + - name: container-{{ .Release.Name }}-backend + image: "{{ .Values.BACKEND.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.BACKEND.DOCKER_IMAGE_PULL_POLICY }} + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-backend + - secretRef: + name: secret-{{ .Release.Name }}-backend + ports: + - containerPort: 4000 + protocol: TCP + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /app/public/uploads + name: uploads + dnsPolicy: ClusterFirst + schedulerName: default-scheduler + restartPolicy: {{ .Values.BACKEND.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.BACKEND.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} + volumes: + - name: uploads + persistentVolumeClaim: + claimName: volume-claim-{{ .Release.Name }}-uploads \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml b/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml new file mode 100644 index 000000000..758e9e18c --- /dev/null +++ b/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml @@ -0,0 +1,24 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: volume-claim-{{ .Release.Name }}-uploads + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "volume-claim-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + #dataSource: + # name: uploads-snapshot + # kind: VolumeSnapshot + # apiGroup: snapshot.storage.k8s.io + storageClassName: storage-{{ .Release.Name }}-persistent + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.BACKEND.STORAGE_UPLOADS }} + diff --git a/deployment/src/kubernetes/templates/backend/Secret.yaml b/deployment/src/kubernetes/templates/backend/Secret.yaml new file mode 100644 index 000000000..512505694 --- /dev/null +++ b/deployment/src/kubernetes/templates/backend/Secret.yaml @@ -0,0 +1,21 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: + JWT_SECRET: "{{ .Values.BACKEND.JWT_SECRET }}" + MAPBOX_TOKEN: "{{ .Values.MAPBOX_TOKEN }}" + PRIVATE_KEY_PASSPHRASE: "{{ .Values.BACKEND.PRIVATE_KEY_PASSPHRASE }}" + SMTP_USERNAME: "{{ .Values.BACKEND.SMTP_USERNAME }}" + SMTP_PASSWORD: "{{ .Values.BACKEND.SMTP_PASSWORD }}" + #NEO4J_USERNAME: "" + #NEO4J_PASSWORD: "" + #REDIS_PASSWORD: ---toBeSet--- diff --git a/deployment/src/kubernetes/templates/backend/Service.yaml b/deployment/src/kubernetes/templates/backend/Service.yaml new file mode 100644 index 000000000..9029be586 --- /dev/null +++ b/deployment/src/kubernetes/templates/backend/Service.yaml @@ -0,0 +1,20 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-backend + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-backend" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-graphql + port: 4000 + targetPort: 4000 + protocol: TCP + selector: + app: {{ .Release.Name }}-backend diff --git a/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml new file mode 100644 index 000000000..6f82f3686 --- /dev/null +++ b/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml @@ -0,0 +1,22 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-production + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "letsencrypt-production" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: {{ .Values.LETSENCRYPT.EMAIL }} + privateKeySecretRef: + name: letsencrypt-production + solvers: + - http01: + ingress: + class: nginx diff --git a/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml new file mode 100644 index 000000000..e488d9335 --- /dev/null +++ b/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml @@ -0,0 +1,22 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-staging + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "letsencrypt-staging" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + acme: + server: https://acme-staging-v02.api.letsencrypt.org/directory + email: {{ .Values.LETSENCRYPT.EMAIL }} + privateKeySecretRef: + name: letsencrypt-staging + solvers: + - http01: + ingress: + class: nginx diff --git a/deployment/src/kubernetes/templates/jobs/job-db-init.yaml b/deployment/src/kubernetes/templates/jobs/job-db-init.yaml new file mode 100644 index 000000000..f207bd8c1 --- /dev/null +++ b/deployment/src/kubernetes/templates/jobs/job-db-init.yaml @@ -0,0 +1,29 @@ +kind: Job +apiVersion: batch/v1 +metadata: + name: job-{{ .Release.Name }}-db-init + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "job-db-init" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": hook-succeeded, hook-failed + "helm.sh/hook-weight": "0" +spec: + template: + spec: + restartPolicy: Never + containers: + - name: job-{{ .Release.Name }}-db-init + image: "{{ .Values.BACKEND.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + command: ["/bin/sh", "-c", "yarn prod:migrate init"] + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-backend + - secretRef: + name: secret-{{ .Release.Name }}-backend \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml b/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml new file mode 100644 index 000000000..950793db4 --- /dev/null +++ b/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml @@ -0,0 +1,29 @@ +kind: Job +apiVersion: batch/v1 +metadata: + name: job-{{ .Release.Name }}-db-migrate + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "job-db-migrate" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, hook-failed + "helm.sh/hook-weight": "5" +spec: + template: + spec: + restartPolicy: Never + containers: + - name: job-{{ .Release.Name }}-db-migrations + image: "{{ .Values.BACKEND.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + command: ["/bin/sh", "-c", "yarn prod:migrate up"] + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-backend + - secretRef: + name: secret-{{ .Release.Name }}-backend \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml b/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml new file mode 100644 index 000000000..fe29afbfe --- /dev/null +++ b/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml @@ -0,0 +1,14 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + HOST: "0.0.0.0" \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/maintenance/Deployment.yaml b/deployment/src/kubernetes/templates/maintenance/Deployment.yaml new file mode 100644 index 000000000..fd1aa311a --- /dev/null +++ b/deployment/src/kubernetes/templates/maintenance/Deployment.yaml @@ -0,0 +1,40 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + revisionHistoryLimit: {{ .Values.MAINTENANCE.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-maintenance + template: + metadata: + labels: + app: {{ .Release.Name }}-maintenance + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + spec: + containers: + - name: container-{{ .Release.Name }}-maintenance + image: "{{ .Values.MAINTENANCE.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.MAINTENANCE.DOCKER_IMAGE_PULL_POLICY }} + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-webapp + - secretRef: + name: secret-{{ .Release.Name }}-webapp + ports: + - containerPort: 80 + restartPolicy: {{ .Values.MAINTENANCE.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.MAINTENANCE.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} diff --git a/deployment/src/kubernetes/templates/maintenance/Secret.yaml b/deployment/src/kubernetes/templates/maintenance/Secret.yaml new file mode 100644 index 000000000..b4752e552 --- /dev/null +++ b/deployment/src/kubernetes/templates/maintenance/Secret.yaml @@ -0,0 +1,13 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: diff --git a/deployment/src/kubernetes/templates/maintenance/Service.yaml b/deployment/src/kubernetes/templates/maintenance/Service.yaml new file mode 100644 index 000000000..95f042df5 --- /dev/null +++ b/deployment/src/kubernetes/templates/maintenance/Service.yaml @@ -0,0 +1,20 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-maintenance + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-maintenance" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-http + port: 80 + targetPort: 80 + protocol: TCP + selector: + app: {{ .Release.Name }}-maintenance diff --git a/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml new file mode 100644 index 000000000..9f0aa4bee --- /dev/null +++ b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml @@ -0,0 +1,21 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + NEO4J_ACCEPT_LICENSE_AGREEMENT: "{{ .Values.NEO4J.ACCEPT_LICENSE_AGREEMENT }}" + NEO4J_AUTH: "{{ .Values.NEO4J.AUTH }}" + NEO4J_dbms_connector_bolt_thread__pool__max__size: "{{ .Values.NEO4J.DBMS_CONNECTOR_BOLT_THREAD_POOL_MAX_SIZE }}" + NEO4J_dbms_memory_heap_initial__size: "{{ .Values.NEO4J.DBMS_MEMORY_HEAP_INITIAL_SIZE }}" + NEO4J_dbms_memory_heap_max__size: "{{ .Values.NEO4J.DBMS_MEMORY_HEAP_MAX_SIZE }}" + NEO4J_dbms_memory_pagecache_size: "{{ .Values.NEO4J.DBMS_MEMORY_PAGECACHE_SIZE }}" + NEO4J_dbms_security_procedures_unrestricted: "{{ .Values.NEO4J.DBMS_SECURITY_PROCEDURES_UNRESTRICTED }}" + NEO4J_apoc_import_file_enabled: "{{ .Values.NEO4J.APOC_IMPORT_FILE_ENABLED }}" \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/neo4j/Deployment.yaml b/deployment/src/kubernetes/templates/neo4j/Deployment.yaml new file mode 100644 index 000000000..96867dbb5 --- /dev/null +++ b/deployment/src/kubernetes/templates/neo4j/Deployment.yaml @@ -0,0 +1,57 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: 1 + revisionHistoryLimit: {{ .Values.NEO4J.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-neo4j + template: + metadata: + name: neo4j + annotations: + backup.velero.io/backup-volumes: neo4j-data + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + labels: + app: {{ .Release.Name }}-neo4j + spec: + containers: + - name: container-{{ .Release.Name }}-neo4j + image: "{{ .Values.NEO4J.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.NEO4J.DOCKER_IMAGE_PULL_POLICY }} + ports: + - containerPort: 7687 + - containerPort: 7474 + resources: + requests: + memory: {{ .Values.NEO4J.RESOURCE_REQUESTS_MEMORY | default "1G" | quote }} + limits: + memory: {{ .Values.NEO4J.RESOURCE_LIMITS_MEMORY | default "1G" | quote }} + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-neo4j + - secretRef: + name: secret-{{ .Release.Name }}-neo4j + volumeMounts: + - mountPath: /data/ + name: neo4j-data + volumes: + - name: neo4j-data + persistentVolumeClaim: + claimName: volume-claim-{{ .Release.Name }}-neo4j + restartPolicy: {{ .Values.NEO4J.CONTAINER_RESTART_POLICY }} + terminationGracePeriodSeconds: {{ .Values.NEO4J.CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS }} diff --git a/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml b/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml new file mode 100644 index 000000000..3aab02d9f --- /dev/null +++ b/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml @@ -0,0 +1,19 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: volume-claim-{{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "volume-claim-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + storageClassName: storage-{{ .Release.Name }}-persistent + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.NEO4J.STORAGE }} \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/neo4j/Secret.yaml b/deployment/src/kubernetes/templates/neo4j/Secret.yaml new file mode 100644 index 000000000..d8b1c17db --- /dev/null +++ b/deployment/src/kubernetes/templates/neo4j/Secret.yaml @@ -0,0 +1,15 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: + NEO4J_USERNAME: "" + NEO4J_PASSWORD: "" \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/neo4j/Service.yaml b/deployment/src/kubernetes/templates/neo4j/Service.yaml new file mode 100644 index 000000000..4ed56bd3f --- /dev/null +++ b/deployment/src/kubernetes/templates/neo4j/Service.yaml @@ -0,0 +1,23 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-neo4j + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-neo4j" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-bolt + port: 7687 + targetPort: 7687 + protocol: TCP + #- name: {{ .Release.Name }}-http + # port: 7474 + # targetPort: 7474 + selector: + app: {{ .Release.Name }}-neo4j diff --git a/deployment/src/kubernetes/templates/storage/persistent.yml b/deployment/src/kubernetes/templates/storage/persistent.yml new file mode 100644 index 000000000..2ac07c5de --- /dev/null +++ b/deployment/src/kubernetes/templates/storage/persistent.yml @@ -0,0 +1,16 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: storage-{{ .Release.Name }}-persistent + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "storage-persistent" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +provisioner: {{ .Values.STORAGE.PROVISIONER }} +reclaimPolicy: {{ .Values.STORAGE.RECLAIM_POLICY }} +volumeBindingMode: {{ .Values.STORAGE.VOLUME_BINDING_MODE }} +allowVolumeExpansion: {{ .Values.STORAGE.ALLOW_VOLUME_EXPANSION }} \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/webapp/ConfigMap.yml b/deployment/src/kubernetes/templates/webapp/ConfigMap.yml new file mode 100644 index 000000000..762b355cc --- /dev/null +++ b/deployment/src/kubernetes/templates/webapp/ConfigMap.yml @@ -0,0 +1,20 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: configmap-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "configmap-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +data: + HOST: "0.0.0.0" + PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" + CATEGORIES_ACTIVE: "{{ .Values.CATEGORIES_ACTIVE }}" + COOKIE_EXPIRE_TIME: "{{ .Values.COOKIE_EXPIRE_TIME }}" + WEBSOCKETS_URI: "{{ .Values.WEBAPP.WEBSOCKETS_URI }}" + GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000" \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/webapp/Deployment.yaml b/deployment/src/kubernetes/templates/webapp/Deployment.yaml new file mode 100644 index 000000000..a334738ec --- /dev/null +++ b/deployment/src/kubernetes/templates/webapp/Deployment.yaml @@ -0,0 +1,44 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "deployment-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: {{ .Values.WEBAPP.REPLICAS }} + minReadySeconds: {{ .Values.WEBAPP.MIN_READY_SECONDS }} + progressDeadlineSeconds: {{ .Values.WEBAPP.PROGRESS_DEADLINE_SECONDS }} + revisionHistoryLimit: {{ .Values.WEBAPP.REVISIONS_HISTORY_LIMIT }} + strategy: + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-webapp + template: + metadata: + annotations: + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} + labels: + app: {{ .Release.Name }}-webapp + spec: + containers: + - name: container-{{ .Release.Name }}-webapp + image: "{{ .Values.WEBAPP.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.WEBAPP.DOCKER_IMAGE_PULL_POLICY }} + ports: + - containerPort: 3000 + envFrom: + - configMapRef: + name: configmap-{{ .Release.Name }}-webapp + - secretRef: + name: secret-{{ .Release.Name }}-webapp + 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/kubernetes/templates/webapp/Ingress.yaml b/deployment/src/kubernetes/templates/webapp/Ingress.yaml new file mode 100644 index 000000000..d7b12bdc8 --- /dev/null +++ b/deployment/src/kubernetes/templates/webapp/Ingress.yaml @@ -0,0 +1,36 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: ingress-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "ingress-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + kubernetes.io/ingress.class: "nginx" + cert-manager.io/cluster-issuer: {{ .Values.LETSENCRYPT.ISSUER }} + nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.NGINX.PROXY_BODY_SIZE }} +spec: + tls: + - hosts: + {{- range .Values.LETSENCRYPT.DOMAINS }} + - {{ . }} + {{- end }} + secretName: tls + rules: + {{- range .Values.LETSENCRYPT.DOMAINS }} + - host: {{ . }} + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: {{ $.Release.Name }}-webapp + port: + number: 3000 + {{- end }} \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/webapp/Secret.yaml b/deployment/src/kubernetes/templates/webapp/Secret.yaml new file mode 100644 index 000000000..8c0fd9d39 --- /dev/null +++ b/deployment/src/kubernetes/templates/webapp/Secret.yaml @@ -0,0 +1,14 @@ +kind: Secret +apiVersion: v1 +metadata: + name: secret-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "secret-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +stringData: + MAPBOX_TOKEN: "{{ .Values.MAPBOX_TOKEN }}" \ No newline at end of file diff --git a/deployment/src/kubernetes/templates/webapp/Service.yaml b/deployment/src/kubernetes/templates/webapp/Service.yaml new file mode 100644 index 000000000..0c3112e77 --- /dev/null +++ b/deployment/src/kubernetes/templates/webapp/Service.yaml @@ -0,0 +1,20 @@ +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "service-webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: {{ .Release.Name }}-http + port: 3000 + targetPort: 3000 + protocol: TCP + selector: + app: {{ .Release.Name }}-webapp diff --git a/deployment/src/old/Maintenance.md b/deployment/src/old/Maintenance.md new file mode 100644 index 000000000..08a177e65 --- /dev/null +++ b/deployment/src/old/Maintenance.md @@ -0,0 +1,45 @@ +# Maintenance mode + +> Despite our best efforts, systems sometimes require downtime for a variety of reasons. + +Quote from [here](https://www.nrmitchi.com/2017/11/easy-maintenance-mode-in-kubernetes/) + +We use our maintenance mode for manual database backup and restore. Also we +bring the database into maintenance mode for manual database migrations. + +## Deploy the service + +We prepared sample configuration, so you can simply run: + +```sh +# in folder deployment/ +$ kubectl apply -f ./ocelot-social/maintenance/ +``` + +This will fire up a maintenance service. + +## Bring application into maintenance mode + +Now if you want to have a controlled downtime and you want to bring your +application into maintenance mode, you can edit your global ingress server. + +E.g. copy file [`deployment/digital-ocean/https/templates/ingress.template.yaml`](../../digital-ocean/https/templates/ingress.template.yaml) to new file `deployment/digital-ocean/https/ingress.yaml` and change the following: + +```yaml +... + + - host: develop-k8s.ocelot.social + http: + paths: + - path: / + backend: + # serviceName: web + serviceName: maintenance + # servicePort: 3000 + servicePort: 80 +``` + +Then run `$ kubectl apply -f deployment/digital-ocean/https/ingress.yaml`. If you +want to deactivate the maintenance server, just undo the edit and apply the +configuration again. + diff --git a/deployment/src/old/digital-ocean/README.md b/deployment/src/old/digital-ocean/README.md new file mode 100644 index 000000000..c5893f645 --- /dev/null +++ b/deployment/src/old/digital-ocean/README.md @@ -0,0 +1,39 @@ +# DigitalOcean + +As a start, read the [introduction into Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) by the folks at DigitalOcean. The following section should enable you to deploy ocelot.social to your Kubernetes cluster. + +## Connect to your local cluster + +1. Create a cluster at [DigitalOcean](https://www.digitalocean.com/). +2. Download the `***-kubeconfig.yaml` from the Web UI. +3. Move the file to the default location where kubectl expects it to be: `mv ***-kubeconfig.yaml ~/.kube/config`. Alternatively you can set the config on every command: `--kubeconfig ***-kubeconfig.yaml` +4. Now check if you can connect to the cluster and if its your newly created one by running: `kubectl get nodes` + +The output should look about like this: + +```sh +$ kubectl get nodes +NAME STATUS ROLES AGE VERSION +nifty-driscoll-uu1w Ready 69d v1.13.2 +nifty-driscoll-uuiw Ready 69d v1.13.2 +nifty-driscoll-uusn Ready 69d v1.13.2 +``` + +If you got the steps right above and see your nodes you can continue. + +DigitalOcean Kubernetes clusters don't have a graphical interface, so I suggest +to setup the [Kubernetes dashboard](./dashboard/README.md) as a next step. +Configuring [HTTPS](./https/README.md) is bit tricky and therefore I suggest to +do this as a last step. + +## Spaces + +We are storing our images in the s3-compatible [DigitalOcean Spaces](https://www.digitalocean.com/docs/spaces/). + +We still want to take backups of our images in case something happens to the images in the cloud. See these [instructions](https://www.digitalocean.com/docs/spaces/resources/s3cmd-usage/) about getting set up with `s3cmd` to take a copy of all images in a `Spaces` namespace, i.e. `ocelot-social-uploads`. + +After configuring `s3cmd` with your credentials, etc. you should be able to make a backup with this command. + +```sh +s3cmg get --recursive --skip-existing s3://ocelot-social-uploads +``` diff --git a/deployment/src/old/digital-ocean/dashboard/README.md b/deployment/src/old/digital-ocean/dashboard/README.md new file mode 100644 index 000000000..5f66afe0b --- /dev/null +++ b/deployment/src/old/digital-ocean/dashboard/README.md @@ -0,0 +1,55 @@ +# Install Kubernetes Dashboard + +The kubernetes dashboard is optional but very helpful for debugging. If you want to install it, you have to do so only **once** per cluster: + +```bash +# in folder deployment/digital-ocean/ +$ kubectl apply -f dashboard/ +$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml +``` + +### Login to your dashboard + +Proxy the remote kubernetes dashboard to localhost: + +```bash +$ kubectl proxy +``` + +Visit: + +[http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/](http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/) + +You should see a login screen. + +To get your token for the dashboard you can run this command: + +```bash +$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') +``` + +It should print something like: + +```text +Name: admin-user-token-6gl6l +Namespace: kube-system +Labels: +Annotations: kubernetes.io/service-account.name=admin-user + kubernetes.io/service-account.uid=b16afba9-dfec-11e7-bbb9-901b0e532516 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1025 bytes +namespace: 11 bytes +token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTZnbDZsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMTZhZmJhOS1kZmVjLTExZTctYmJiOS05MDFiMGU1MzI1MTYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.M70CU3lbu3PP4OjhFms8PVL5pQKj-jj4RNSLA4YmQfTXpPUuxqXjiTf094_Rzr0fgN_IVX6gC4fiNUL5ynx9KU-lkPfk0HnX8scxfJNzypL039mpGt0bbe1IXKSIRaq_9VW59Xz-yBUhycYcKPO9RM2Qa1Ax29nqNVko4vLn1_1wPqJ6XSq3GYI8anTzV8Fku4jasUwjrws6Cn6_sPEGmL54sq5R4Z5afUtv-mItTmqZZdxnkRqcJLlg2Y8WbCPogErbsaCDJoABQ7ppaqHetwfM_0yMun6ABOQbIwwl8pspJhpplKwyo700OSpvTT9zlBsu-b35lzXGBRHzv5g_RA +``` + +Grab the token from above and paste it into the [login screen](http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/) + +When you are logged in, you should see sth. like: + +![Dashboard](./dashboard-screenshot.png) + +Feel free to save the login token from above in your password manager. Unlike the `kubeconfig` file, this token does not expire. diff --git a/deployment/src/old/digital-ocean/dashboard/admin-user.yaml b/deployment/src/old/digital-ocean/dashboard/admin-user.yaml new file mode 100644 index 000000000..27b6bb802 --- /dev/null +++ b/deployment/src/old/digital-ocean/dashboard/admin-user.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: admin-user + namespace: kube-system diff --git a/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png b/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png new file mode 100644 index 000000000..6aefb5414 Binary files /dev/null and b/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png differ diff --git a/deployment/src/old/digital-ocean/dashboard/role-binding.yaml b/deployment/src/old/digital-ocean/dashboard/role-binding.yaml new file mode 100644 index 000000000..faa8927a2 --- /dev/null +++ b/deployment/src/old/digital-ocean/dashboard/role-binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: admin-user +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: admin-user + namespace: kube-system diff --git a/deployment/src/old/digital-ocean/https/README.md b/deployment/src/old/digital-ocean/https/README.md new file mode 100644 index 000000000..8cfaabde4 --- /dev/null +++ b/deployment/src/old/digital-ocean/https/README.md @@ -0,0 +1,126 @@ +## Create Letsencrypt Issuers and Ingress Services + +Copy the configuration templates and change the file according to your needs. + +```bash +# in folder deployment/digital-ocean/https/ +cp templates/issuer.template.yaml ./issuer.yaml +cp templates/ingress.template.yaml ./ingress.yaml +``` + +At least, **change email addresses** in `issuer.yaml`. For sure you also want +to _change the domain name_ in `ingress.yaml`. + +Once you are done, apply the configuration: + +```bash +# in folder deployment/digital-ocean/https/ +$ kubectl apply -f . +``` + +{% hint style="info" %} +CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore. +And to create a load balancer costs money. Please refine the following documentation if required. +{% endhint %} + +{% tabs %} +{% tab title="Without Load Balancer" %} + +A solution without a load balance you can find [here](../no-loadbalancer/README.md). + +{% endtab %} +{% tab title="With DigitalOcean Load Balancer" %} + +{% hint style="info" %} +CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore. +Please refine the following documentation if required. +{% endhint %} + +In earlier days by now, your cluster should have a load balancer assigned with an external IP +address. On DigitalOcean, this is how it should look like: + +![Screenshot of DigitalOcean dashboard showing external ip address](./ip-address.png) + +If the load balancer isn't created automatically you have to create it your self on DigitalOcean under Networks. +In case you don't need a DigitalOcean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`. + +{% endtab %} +{% endtabs %} + +Check the ingress server is working correctly: + +```bash +$ curl -kivL -H 'Host: ' 'https://' + +``` + +If the response looks good, configure your domain registrar for the new IP address and the domain. + +Now let's get a valid HTTPS certificate. According to the tutorial above, check your tls certificate for staging: + +```bash +$ kubectl -n ocelot-social describe certificate tls +< +... +Spec: + ... + Issuer Ref: + Group: cert-manager.io + Kind: ClusterIssuer + Name: letsencrypt-staging +... +Events: + +> +$ kubectl -n ocelot-social describe secret tls +< +... +Annotations: ... + cert-manager.io/issuer-kind: ClusterIssuer + cert-manager.io/issuer-name: letsencrypt-staging +... +> +``` + +If everything looks good, update the cluster-issuer of your ingress. Change the annotation `cert-manager.io/cluster-issuer` from `letsencrypt-staging` (for testing by getting a dummy certificate – no blocking by letsencrypt, because of to many request cycles) to `letsencrypt-prod` (for production with a real certificate – possible blocking by letsencrypt for several days, because of to many request cycles) in your ingress configuration in `ingress.yaml`. + +```bash +# in folder deployment/digital-ocean/https/ +$ kubectl apply -f ingress.yaml +``` + +Take a minute and have a look if the certificate is now newly generated by `letsencrypt-prod`, the cluster-issuer for production: + +```bash +$ kubectl -n ocelot-social describe certificate tls +< +... +Spec: + ... + Issuer Ref: + Group: cert-manager.io + Kind: ClusterIssuer + Name: letsencrypt-prod +... +Events: + +> +$ kubectl -n ocelot-social describe secret tls +< +... +Annotations: ... + cert-manager.io/issuer-kind: ClusterIssuer + cert-manager.io/issuer-name: letsencrypt-prod +... +> +``` + +In case the certificate is not newly created delete the former secret to force a refresh: + +```bash +$ kubectl -n ocelot-social delete secret tls +``` + +Now, HTTPS should be configured on your domain. Congrats! + +For troubleshooting have a look at the cert-manager's [Troubleshooting](https://cert-manager.io/docs/faq/troubleshooting/) or [Troubleshooting Issuing ACME Certificates](https://cert-manager.io/docs/faq/acme/). diff --git a/deployment/src/old/digital-ocean/https/ip-address.png b/deployment/src/old/digital-ocean/https/ip-address.png new file mode 100644 index 000000000..db523156a Binary files /dev/null and b/deployment/src/old/digital-ocean/https/ip-address.png differ diff --git a/deployment/src/old/legacy-migration/README.md b/deployment/src/old/legacy-migration/README.md new file mode 100644 index 000000000..66100a3c8 --- /dev/null +++ b/deployment/src/old/legacy-migration/README.md @@ -0,0 +1,85 @@ +# Legacy data migration + +This setup is **completely optional** and only required if you have data on a +server which is running our legacy code and you want to import that data. It +will import the uploads folder and migrate a dump of the legacy Mongo database +into our new Neo4J graph database. + +## Configure Maintenance-Worker Pod + +Create a configmap with the specific connection data of your legacy server: + +```bash +$ kubectl create configmap maintenance-worker \ + -n ocelot-social \ + --from-literal=SSH_USERNAME=someuser \ + --from-literal=SSH_HOST=yourhost \ + --from-literal=MONGODB_USERNAME=hc-api \ + --from-literal=MONGODB_PASSWORD=secretpassword \ + --from-literal=MONGODB_AUTH_DB=hc_api \ + --from-literal=MONGODB_DATABASE=hc_api \ + --from-literal=UPLOADS_DIRECTORY=/var/www/api/uploads +``` + +Create a secret with your public and private ssh keys. As the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/secret/#use-case-pod-with-ssh-keys) points out, you should be careful with your ssh keys. Anyone with access to your cluster will have access to your ssh keys. Better create a new pair with `ssh-keygen` and copy the public key to your legacy server with `ssh-copy-id`: + +```bash +$ kubectl create secret generic ssh-keys \ + -n ocelot-social \ + --from-file=id_rsa=/path/to/.ssh/id_rsa \ + --from-file=id_rsa.pub=/path/to/.ssh/id_rsa.pub \ + --from-file=known_hosts=/path/to/.ssh/known_hosts +``` + +## Deploy a Temporary Maintenance-Worker Pod + +Bring the application into maintenance mode. + +{% hint style="info" %} TODO: implement maintenance mode {% endhint %} + + +Then temporarily delete backend and database deployments + +```bash +$ kubectl -n ocelot-social get deployments +NAME READY UP-TO-DATE AVAILABLE AGE +backend 1/1 1 1 3d11h +neo4j 1/1 1 1 3d11h +webapp 2/2 2 2 73d +$ kubectl -n ocelot-social delete deployment neo4j +deployment.extensions "neo4j" deleted +$ kubectl -n ocelot-social delete deployment backend +deployment.extensions "backend" deleted +``` + +Deploy one-time develop-maintenance-worker pod: + +```bash +# in deployment/legacy-migration/ +$ kubectl apply -f maintenance-worker.yaml +pod/develop-maintenance-worker created +``` + +Import legacy database and uploads: + +```bash +$ kubectl -n ocelot-social exec -it develop-maintenance-worker bash +$ import_legacy_db +$ import_legacy_uploads +$ exit +``` + +Delete the pod when you're done: + +```bash +$ kubectl -n ocelot-social delete pod develop-maintenance-worker +``` + +Oh, and of course you have to get those deleted deployments back. One way of +doing it would be: + +```bash +# in folder deployment/ +$ kubectl apply -f human-connection/deployment-backend.yaml -f human-connection/deployment-neo4j.yaml +``` + diff --git a/deployment/src/old/legacy-migration/maintenance-worker.yaml b/deployment/src/old/legacy-migration/maintenance-worker.yaml new file mode 100644 index 000000000..d8b118b67 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker.yaml @@ -0,0 +1,40 @@ +--- + kind: Pod + apiVersion: v1 + metadata: + name: develop-maintenance-worker + namespace: ocelot-social + spec: + containers: + - name: develop-maintenance-worker + image: ocelotsocialnetwork/develop-maintenance-worker:latest + imagePullPolicy: Always + resources: + requests: + memory: "2G" + limits: + memory: "8G" + envFrom: + - configMapRef: + name: maintenance-worker + - configMapRef: + name: configmap + volumeMounts: + - name: secret-volume + readOnly: false + mountPath: /root/.ssh + - name: uploads + mountPath: /uploads + - name: neo4j-data + mountPath: /data/ + volumes: + - name: secret-volume + secret: + secretName: ssh-keys + defaultMode: 0400 + - name: uploads + persistentVolumeClaim: + claimName: uploads-claim + - name: neo4j-data + persistentVolumeClaim: + claimName: neo4j-data-claim diff --git a/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore b/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore new file mode 100644 index 000000000..59ba63a8b --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore @@ -0,0 +1 @@ +.ssh/ diff --git a/deployment/src/old/legacy-migration/maintenance-worker/.gitignore b/deployment/src/old/legacy-migration/maintenance-worker/.gitignore new file mode 100644 index 000000000..485bc00e6 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/.gitignore @@ -0,0 +1,2 @@ +.ssh/ +ssh/ \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile b/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile new file mode 100644 index 000000000..760cc06c8 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile @@ -0,0 +1,21 @@ +FROM ocelotsocialnetwork/develop-neo4j:latest + +ENV NODE_ENV=maintenance +EXPOSE 7687 7474 + +ENV BUILD_DEPS="gettext" \ + RUNTIME_DEPS="libintl" + +RUN set -x && \ + apk add --update $RUNTIME_DEPS && \ + apk add --virtual build_deps $BUILD_DEPS && \ + cp /usr/bin/envsubst /usr/local/bin/envsubst && \ + apk del build_deps + + +RUN apk upgrade --update +RUN apk add --no-cache mongodb-tools openssh nodejs yarn rsync + +COPY known_hosts /root/.ssh/known_hosts +COPY migration /migration +COPY ./binaries/* /usr/local/bin/ diff --git a/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle b/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle new file mode 100755 index 000000000..f5b1b2454 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +tail -f /dev/null diff --git a/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db b/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db new file mode 100755 index 000000000..6ffdf8e3f --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e +for var in "SSH_USERNAME" "SSH_HOST" "MONGODB_USERNAME" "MONGODB_PASSWORD" "MONGODB_DATABASE" "MONGODB_AUTH_DB" +do + if [[ -z "${!var}" ]]; then + echo "${var} is undefined" + exit 1 + fi +done + +/migration/mongo/export.sh +/migration/neo4j/import.sh diff --git a/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads b/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads new file mode 100755 index 000000000..5c0b67d74 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -e + +# import .env config +set -o allexport +source $(dirname "$0")/.env +set +o allexport + +for var in "SSH_USERNAME" "SSH_HOST" "UPLOADS_DIRECTORY" +do + if [[ -z "${!var}" ]]; then + echo "${var} is undefined" + exit 1 + fi +done + +rsync --archive --update --verbose ${SSH_USERNAME}@${SSH_HOST}:${UPLOADS_DIRECTORY}/ ${OUTPUT_DIRECTORY} diff --git a/deployment/src/old/legacy-migration/maintenance-worker/known_hosts b/deployment/src/old/legacy-migration/maintenance-worker/known_hosts new file mode 100644 index 000000000..947840cb2 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/known_hosts @@ -0,0 +1,3 @@ +|1|GuOYlVEhTowidPs18zj9p5F2j3o=|sDHJYLz9Ftv11oXeGEjs7SpVyg0= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBM5N29bI5CeKu1/RBPyM2fwyf7fuajOO+tyhKe1+CC2sZ1XNB5Ff6t6MtCLNRv2mUuvzTbW/HkisDiA5tuXUHOk= +|1|2KP9NV+Q5g2MrtjAeFSVcs8YeOI=|nf3h4wWVwC4xbBS1kzgzE2tBldk= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhRK6BeIEUxXlS0z/pOfkUkSPfn33g4J1U3L+MyUQYHm+7agT08799ANJhnvELKE1tt4Vx80I9UR81oxzZcy3E= +|1|HonYIRNhKyroUHPKU1HSZw0+Qzs=|5T1btfwFBz2vNSldhqAIfTbfIgQ= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhRK6BeIEUxXlS0z/pOfkUkSPfn33g4J1U3L+MyUQYHm+7agT08799ANJhnvELKE1tt4Vx80I9UR81oxzZcy3E= diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh b/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh new file mode 100755 index 000000000..b56ace87a --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +set -e + +# import .env config +set -o allexport +source $(dirname "$0")/.env +set +o allexport + +# Export collection function defintion +function export_collection () { + "${EXPORT_MONGOEXPORT_BIN}" --db ${MONGODB_DATABASE} --host localhost -d ${MONGODB_DATABASE} --port 27018 --username ${MONGODB_USERNAME} --password ${MONGODB_PASSWORD} --authenticationDatabase ${MONGODB_AUTH_DB} --collection $1 --out "${EXPORT_PATH}$1.json" + mkdir -p ${EXPORT_PATH}splits/$1/ + split -l ${MONGO_EXPORT_SPLIT_SIZE} -a 3 ${EXPORT_PATH}$1.json ${EXPORT_PATH}splits/$1/ +} + +# Export collection with query function defintion +function export_collection_query () { + "${EXPORT_MONGOEXPORT_BIN}" --db ${MONGODB_DATABASE} --host localhost -d ${MONGODB_DATABASE} --port 27018 --username ${MONGODB_USERNAME} --password ${MONGODB_PASSWORD} --authenticationDatabase ${MONGODB_AUTH_DB} --collection $1 --out "${EXPORT_PATH}$1_$3.json" --query "$2" + mkdir -p ${EXPORT_PATH}splits/$1_$3/ + split -l ${MONGO_EXPORT_SPLIT_SIZE} -a 3 ${EXPORT_PATH}$1_$3.json ${EXPORT_PATH}splits/$1_$3/ +} + +# Delete old export & ensure directory +rm -rf ${EXPORT_PATH}* +mkdir -p ${EXPORT_PATH} + +# Open SSH Tunnel +ssh -4 -M -S my-ctrl-socket -fnNT -L 27018:localhost:27017 -l ${SSH_USERNAME} ${SSH_HOST} + +# Export all Data from the Alpha to json and split them up +export_collection "badges" +export_collection "categories" +export_collection "comments" +export_collection_query "contributions" '{"type": "DELETED"}' "DELETED" +export_collection_query "contributions" '{"type": "post"}' "post" +# export_collection_query "contributions" '{"type": "cando"}' "cando" +export_collection "emotions" +# export_collection_query "follows" '{"foreignService": "organizations"}' "organizations" +export_collection_query "follows" '{"foreignService": "users"}' "users" +# export_collection "invites" +# export_collection "organizations" +# export_collection "pages" +# export_collection "projects" +# export_collection "settings" +export_collection "shouts" +# export_collection "status" +export_collection_query "users" '{"isVerified": true }' "verified" +# export_collection "userscandos" +# export_collection "usersettings" + +# Close SSH Tunnel +ssh -S my-ctrl-socket -O check -l ${SSH_USERNAME} ${SSH_HOST} +ssh -S my-ctrl-socket -O exit -l ${SSH_USERNAME} ${SSH_HOST} diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql new file mode 100644 index 000000000..adf63dc1f --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql @@ -0,0 +1,52 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] image: { +[?] path: { // Path is incorrect in Nitro - is icon the correct name for this field? +[X] type: String, +[X] required: true + }, +[ ] alt: { // If we use an image - should we not have an alt? +[ ] type: String, +[ ] required: true + } + }, +[?] status: { +[X] type: String, +[X] enum: ['permanent', 'temporary'], +[ ] default: 'permanent', // Default value is missing in Nitro +[X] required: true + }, +[?] type: { +[?] type: String, // in nitro this is a defined enum - seems good for now +[X] required: true + }, +[X] id: { +[X] type: String, +[X] required: true + }, +[?] createdAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as badge +MERGE(b:Badge {id: badge._id["$oid"]}) +ON CREATE SET +b.id = badge.key, +b.type = badge.type, +b.icon = replace(badge.image.path, 'https://api-alpha.human-connection.org', ''), +b.status = badge.status, +b.createdAt = badge.createdAt.`$date`, +b.updatedAt = badge.updatedAt.`$date` +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql new file mode 100644 index 000000000..2a6f8c244 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql @@ -0,0 +1 @@ +MATCH (n:Badge) DETACH DELETE n; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql new file mode 100644 index 000000000..5d4958876 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql @@ -0,0 +1,129 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[X] title: { +[X] type: String, +[X] required: true + }, +[?] slug: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[ ] unique: true // Unique value is not enforced in Nitro? + }, +[?] icon: { // Nitro adds required: true +[X] type: String, +[ ] unique: true // Unique value is not enforced in Nitro? + }, +[?] createdAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as category +MERGE(c:Category {id: category._id["$oid"]}) +ON CREATE SET +c.name = category.title, +c.slug = category.slug, +c.icon = category.icon, +c.createdAt = category.createdAt.`$date`, +c.updatedAt = category.updatedAt.`$date` +; + +// Transform icon names +MATCH (c:Category) +WHERE (c.icon = "categories-justforfun") +SET c.icon = 'smile' +SET c.slug = 'just-for-fun' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-luck") +SET c.icon = 'heart-o' +SET c.slug = 'happiness-values' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-health") +SET c.icon = 'medkit' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-environment") +SET c.icon = 'tree' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-animal-justice") +SET c.icon = 'paw' +SET c.slug = 'animal-protection' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-human-rights") +SET c.icon = 'balance-scale' +SET c.slug = 'human-rights-justice' + +; + +MATCH (c:Category) +WHERE (c.icon = "categories-education") +SET c.icon = 'graduation-cap' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-cooperation") +SET c.icon = 'users' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-politics") +SET c.icon = 'university' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-economy") +SET c.icon = 'money' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-technology") +SET c.icon = 'flash' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-internet") +SET c.icon = 'mouse-pointer' +SET c.slug = 'it-internet-data-privacy' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-art") +SET c.icon = 'paint-brush' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-freedom-of-speech") +SET c.icon = 'bullhorn' +SET c.slug = 'freedom-of-speech' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-sustainability") +SET c.icon = 'shopping-cart' +; + +MATCH (c:Category) +WHERE (c.icon = "categories-peace") +SET c.icon = 'angellist' +SET c.slug = 'global-peace-nonviolence' +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql new file mode 100644 index 000000000..c06b5ef2b --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql @@ -0,0 +1 @@ +MATCH (n:Category) DETACH DELETE n; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql new file mode 100644 index 000000000..083f9f762 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql @@ -0,0 +1,67 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] userId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[?] contributionId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[X] content: { +[X] type: String, +[X] required: true + }, +[?] contentExcerpt: { // Generated from content +[X] type: String, +[ ] required: true // Not required in Nitro + }, +[ ] hasMore: { type: Boolean }, +[ ] upvotes: { +[ ] type: Array, +[ ] default: [] + }, +[ ] upvoteCount: { +[ ] type: Number, +[ ] default: 0 + }, +[?] deleted: { +[X] type: Boolean, +[ ] default: false, // Default value is missing in Nitro +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as comment +MERGE (c:Comment {id: comment._id["$oid"]}) +ON CREATE SET +c.content = comment.content, +c.contentExcerpt = comment.contentExcerpt, +c.deleted = comment.deleted, +c.createdAt = comment.createdAt.`$date`, +c.updatedAt = comment.updatedAt.`$date`, +c.disabled = false +WITH c, comment, comment.contributionId as postId +MATCH (post:Post {id: postId}) +WITH c, post, comment.userId as userId +MATCH (author:User {id: userId}) +MERGE (c)-[:COMMENTS]->(post) +MERGE (author)-[:WROTE]->(c) +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql new file mode 100644 index 000000000..c4a7961c5 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql @@ -0,0 +1 @@ +MATCH (n:Comment) DETACH DELETE n; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql new file mode 100644 index 000000000..f09b5ad71 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql @@ -0,0 +1,156 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro +[?] { //Modeled incorrect as Post +[?] userId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[ ] organizationId: { +[ ] type: String, +[-] index: true + }, +[X] categoryIds: { +[X] type: Array, +[-] index: true + }, +[X] title: { +[X] type: String, +[X] required: true + }, +[?] slug: { // Generated from title +[X] type: String, +[ ] required: true, // Not required in Nitro +[?] unique: true, // Unique value is not enforced in Nitro? +[-] index: true + }, +[ ] type: { // db.getCollection('contributions').distinct('type') -> 'DELETED', 'cando', 'post' +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] cando: { +[ ] difficulty: { +[ ] type: String, +[ ] enum: ['easy', 'medium', 'hard'] + }, +[ ] reasonTitle: { type: String }, +[ ] reason: { type: String } + }, +[X] content: { +[X] type: String, +[X] required: true + }, +[?] contentExcerpt: { // Generated from content +[X] type: String, +[?] required: true // Not required in Nitro + }, +[ ] hasMore: { type: Boolean }, +[X] teaserImg: { type: String }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] shoutCount: { +[ ] type: Number, +[ ] default: 0, +[-] index: true + }, +[ ] meta: { +[ ] hasVideo: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] embedds: { +[ ] type: Object, +[ ] default: {} + } + }, +[?] visibility: { +[X] type: String, +[X] enum: ['public', 'friends', 'private'], +[ ] default: 'public', // Default value is missing in Nitro +[-] index: true + }, +[?] isEnabled: { +[X] type: Boolean, +[ ] default: true, // Default value is missing in Nitro +[-] index: true + }, +[?] tags: { type: Array }, // ensure this is working properly +[ ] emotions: { +[ ] type: Object, +[-] index: true, +[ ] default: { +[ ] angry: { +[ ] count: 0, +[ ] percent: 0 +[ ] }, +[ ] cry: { +[ ] count: 0, +[ ] percent: 0 +[ ] }, +[ ] surprised: { +[ ] count: 0, +[ ] percent: 0 + }, +[ ] happy: { +[ ] count: 0, +[ ] percent: 0 + }, +[ ] funny: { +[ ] count: 0, +[ ] percent: 0 + } + } + }, +[?] deleted: { // THis field is not always present in the alpha-data +[?] type: Boolean, +[ ] default: false, // Default value is missing in Nitro +[-] index: true + }, +[?] createdAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Type is modeled as string in Nitro which is incorrect +[ ] default: Date.now // Default value is missing in Nitro + }, +[ ] wasSeeded: { type: Boolean } + } +*/ +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as post +MERGE (p:Post {id: post._id["$oid"]}) +ON CREATE SET +p.title = post.title, +p.slug = post.slug, +p.image = replace(post.teaserImg, 'https://api-alpha.human-connection.org', ''), +p.content = post.content, +p.contentExcerpt = post.contentExcerpt, +p.visibility = toLower(post.visibility), +p.createdAt = post.createdAt.`$date`, +p.updatedAt = post.updatedAt.`$date`, +p.deleted = COALESCE(post.deleted, false), +p.disabled = COALESCE(NOT post.isEnabled, false) +WITH p, post +MATCH (u:User {id: post.userId}) +MERGE (u)-[:WROTE]->(p) +WITH p, post, post.categoryIds as categoryIds +UNWIND categoryIds AS categoryId +MATCH (c:Category {id: categoryId}) +MERGE (p)-[:CATEGORIZED]->(c) +WITH p, post.tags AS tags +UNWIND tags AS tag +WITH apoc.text.replace(tag, '[^\\p{L}0-9]', '') as tagNoSpacesAllowed +CALL apoc.when(tagNoSpacesAllowed =~ '^((\\p{L}+[\\p{L}0-9]*)|([0-9]+\\p{L}+[\\p{L}0-9]*))$', 'RETURN tagNoSpacesAllowed', '', {tagNoSpacesAllowed: tagNoSpacesAllowed}) +YIELD value as validated +WHERE validated.tagNoSpacesAllowed IS NOT NULL +MERGE (t:Tag { id: validated.tagNoSpacesAllowed, disabled: false, deleted: false }) +MERGE (p)-[:TAGGED]->(t) +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql new file mode 100644 index 000000000..70adad664 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql @@ -0,0 +1,2 @@ +MATCH (n:Post) DETACH DELETE n; +MATCH (n:Tag) DETACH DELETE n; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql new file mode 100644 index 000000000..d01871300 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql @@ -0,0 +1 @@ +MATCH (n) DETACH DELETE n; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql new file mode 100644 index 000000000..18fb6699f --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql @@ -0,0 +1 @@ +MATCH (u:User)-[e:EMOTED]->(c:Post) DETACH DELETE e; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql new file mode 100644 index 000000000..06341f277 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql @@ -0,0 +1,58 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[X] userId: { +[X] type: String, +[X] required: true, +[-] index: true + }, +[X] contributionId: { +[X] type: String, +[X] required: true, +[-] index: true + }, +[?] rated: { +[X] type: String, +[ ] required: true, +[?] enum: ['funny', 'happy', 'surprised', 'cry', 'angry'] + }, +[X] createdAt: { +[X] type: Date, +[X] default: Date.now + }, +[X] updatedAt: { +[X] type: Date, +[X] default: Date.now + }, +[-] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as emotion +MATCH (u:User {id: emotion.userId}), + (c:Post {id: emotion.contributionId}) +MERGE (u)-[e:EMOTED { + id: emotion._id["$oid"], + emotion: emotion.rated, + createdAt: datetime(emotion.createdAt.`$date`), + updatedAt: datetime(emotion.updatedAt.`$date`) + }]->(c) +RETURN e; +/* + // Queries + // user sets an emotion emotion: + // MERGE (u)-[e:EMOTED {id: ..., emotion: "funny", createdAt: ..., updatedAt: ...}]->(c) + // user removes emotion + // MATCH (u)-[e:EMOTED]->(c) DELETE e + // contribution distributions over every `emotion` property value for one post + // MATCH (u:User)-[e:EMOTED]->(c:Post {id: "5a70bbc8508f5b000b443b1a"}) RETURN e.emotion,COUNT(e.emotion) + // contribution distributions over every `emotion` property value for one user (advanced - "whats the primary emotion used by the user?") + // MATCH (u:User{id:"5a663b1ac64291000bf302a1"})-[e:EMOTED]->(c:Post) RETURN e.emotion,COUNT(e.emotion) + // contribution distributions over every `emotion` property value for all posts created by one user (advanced - "how do others react to my contributions?") + // MATCH (u:User)-[e:EMOTED]->(c:Post)<-[w:WROTE]-(a:User{id:"5a663b1ac64291000bf302a1"}) RETURN e.emotion,COUNT(e.emotion) + // if we can filter the above an a variable timescale that would be great (should be possible on createdAt and updatedAt fields) +*/ \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql new file mode 100644 index 000000000..3de01f8ea --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql @@ -0,0 +1 @@ +MATCH (u1:User)-[f:FOLLOWS]->(u2:User) DETACH DELETE f; \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql new file mode 100644 index 000000000..fac858a9a --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql @@ -0,0 +1,36 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] userId: { +[-] type: String, +[ ] required: true, +[-] index: true + }, +[?] foreignId: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[?] foreignService: { // db.getCollection('follows').distinct('foreignService') returns 'organizations' and 'users' +[ ] type: String, +[ ] required: true, +[ ] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[?] { userId: 1, foreignId: 1, foreignService: 1 },{ unique: true } // is the unique constrain modeled? +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as follow +MATCH (u1:User {id: follow.userId}), (u2:User {id: follow.foreignId}) +MERGE (u1)-[:FOLLOWS]->(u2) +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh new file mode 100755 index 000000000..ccb22dafb --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh @@ -0,0 +1,108 @@ +#!/usr/bin/env bash +set -e + +# import .env config +set -o allexport +source $(dirname "$0")/.env +set +o allexport + +# Delete collection function defintion +function delete_collection () { + # Delete from Database + echo "Delete $2" + "${IMPORT_CYPHERSHELL_BIN}" < $(dirname "$0")/$1/delete.cql > /dev/null + # Delete index file + rm -f "${IMPORT_PATH}splits/$2.index" +} + +# Import collection function defintion +function import_collection () { + # index file of those chunks we have already imported + INDEX_FILE="${IMPORT_PATH}splits/$1.index" + # load index file + if [ -f "$INDEX_FILE" ]; then + readarray -t IMPORT_INDEX <$INDEX_FILE + else + declare -a IMPORT_INDEX + fi + # for each chunk import data + for chunk in ${IMPORT_PATH}splits/$1/* + do + CHUNK_FILE_NAME=$(basename "${chunk}") + # does the index not contain the chunk file name? + if [[ ! " ${IMPORT_INDEX[@]} " =~ " ${CHUNK_FILE_NAME} " ]]; then + # calculate the path of the chunk + export IMPORT_CHUNK_PATH_CQL_FILE="${IMPORT_CHUNK_PATH_CQL}$1/${CHUNK_FILE_NAME}" + # load the neo4j command and replace file variable with actual path + NEO4J_COMMAND="$(envsubst '${IMPORT_CHUNK_PATH_CQL_FILE}' < $(dirname "$0")/$2)" + # run the import of the chunk + echo "Import $1 ${CHUNK_FILE_NAME} (${chunk})" + echo "${NEO4J_COMMAND}" | "${IMPORT_CYPHERSHELL_BIN}" > /dev/null + # add file to array and file + IMPORT_INDEX+=("${CHUNK_FILE_NAME}") + echo "${CHUNK_FILE_NAME}" >> ${INDEX_FILE} + else + echo "Skipping $1 ${CHUNK_FILE_NAME} (${chunk})" + fi + done +} + +# Time variable +SECONDS=0 + +# Delete all Neo4J Database content +echo "Deleting Database Contents" +delete_collection "badges" "badges" +delete_collection "categories" "categories" +delete_collection "users" "users" +delete_collection "follows" "follows_users" +delete_collection "contributions" "contributions_post" +delete_collection "contributions" "contributions_cando" +delete_collection "shouts" "shouts" +delete_collection "comments" "comments" +delete_collection "emotions" "emotions" + +#delete_collection "invites" +#delete_collection "notifications" +#delete_collection "organizations" +#delete_collection "pages" +#delete_collection "projects" +#delete_collection "settings" +#delete_collection "status" +#delete_collection "systemnotifications" +#delete_collection "userscandos" +#delete_collection "usersettings" +echo "DONE" + +# Import Data +echo "Start Importing Data" +import_collection "badges" "badges/badges.cql" +import_collection "categories" "categories/categories.cql" +import_collection "users_verified" "users/users.cql" +import_collection "follows_users" "follows/follows.cql" +#import_collection "follows_organizations" "follows/follows.cql" +import_collection "contributions_post" "contributions/contributions.cql" +#import_collection "contributions_cando" "contributions/contributions.cql" +#import_collection "contributions_DELETED" "contributions/contributions.cql" +import_collection "shouts" "shouts/shouts.cql" +import_collection "comments" "comments/comments.cql" +import_collection "emotions" "emotions/emotions.cql" + +# import_collection "invites" +# import_collection "notifications" +# import_collection "organizations" +# import_collection "pages" +# import_collection "systemnotifications" +# import_collection "userscandos" +# import_collection "usersettings" + +# does only contain dummy data +# import_collection "projects" + +# does only contain alpha specifc data +# import_collection "status +# import_collection "settings"" + +echo "DONE" + +echo "Time elapsed: $SECONDS seconds" diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql new file mode 100644 index 000000000..f4a5bf006 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql @@ -0,0 +1,39 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] email: { +[ ] type: String, +[ ] required: true, +[-] index: true, +[ ] unique: true + }, +[ ] code: { +[ ] type: String, +[-] index: true, +[ ] required: true + }, +[ ] role: { +[ ] type: String, +[ ] enum: ['admin', 'moderator', 'manager', 'editor', 'user'], +[ ] default: 'user' + }, +[ ] invitedByUserId: { type: String }, +[ ] language: { type: String }, +[ ] badgeIds: [], +[ ] wasUsed: { +[ ] type: Boolean, +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as invite; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql new file mode 100644 index 000000000..aa6ac8eb9 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql @@ -0,0 +1,48 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] userId: { // User this notification is sent to +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] type: { +[ ] type: String, +[ ] required: true, +[ ] enum: ['comment','comment-mention','contribution-mention','following-contribution'] + }, +[ ] relatedUserId: { +[ ] type: String, +[-] index: true + }, +[ ] relatedContributionId: { +[ ] type: String, +[-] index: true + }, +[ ] relatedOrganizationId: { +[ ] type: String, +[-] index: true + }, +[ ] relatedCommentId: {type: String }, +[ ] unseen: { +[ ] type: Boolean, +[ ] default: true, +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as notification; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql new file mode 100644 index 000000000..e473e697c --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql @@ -0,0 +1,137 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] name: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] slug: { +[ ] type: String, +[ ] required: true, +[ ] unique: true, +[-] index: true + }, +[ ] followersCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] followingCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] categoryIds: { +[ ] type: Array, +[ ] required: true, +[-] index: true + }, +[ ] logo: { type: String }, +[ ] coverImg: { type: String }, +[ ] userId: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] description: { +[ ] type: String, +[ ] required: true + }, +[ ] descriptionExcerpt: { type: String }, // will be generated automatically +[ ] publicEmail: { type: String }, +[ ] url: { type: String }, +[ ] type: { +[ ] type: String, +[-] index: true, +[ ] enum: ['ngo', 'npo', 'goodpurpose', 'ev', 'eva'] + }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[ ] default: 'de', +[-] index: true + }, +[ ] addresses: { +[ ] type: [{ +[ ] street: { +[ ] type: String, +[ ] required: true + }, +[ ] zipCode: { +[ ] type: String, +[ ] required: true + }, +[ ] city: { +[ ] type: String, +[ ] required: true + }, +[ ] country: { +[ ] type: String, +[ ] required: true + }, +[ ] lat: { +[ ] type: Number, +[ ] required: true + }, +[ ] lng: { +[ ] type: Number, +[ ] required: true + } + }], +[ ] default: [] + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] isEnabled: { +[ ] type: Boolean, +[ ] default: false, +[-] index: true + }, +[ ] reviewedBy: { +[ ] type: String, +[ ] default: null, +[-] index: true + }, +[ ] tags: { +[ ] type: Array, +[-] index: true + }, +[ ] deleted: { +[ ] type: Boolean, +[ ] default: false, +[-] index: true + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as organisation; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql new file mode 100644 index 000000000..18223136b --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql @@ -0,0 +1,55 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] title: { +[ ] type: String, +[ ] required: true + }, +[ ] slug: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] type: { +[ ] type: String, +[ ] required: true, +[ ] default: 'page' + }, +[ ] key: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] content: { +[ ] type: String, +[ ] required: true + }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] active: { +[ ] type: Boolean, +[ ] default: true, +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[ ] { slug: 1, language: 1 },{ unique: true } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as page; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql new file mode 100644 index 000000000..ed859c157 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql @@ -0,0 +1,44 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] name: { +[ ] type: String, +[ ] required: true + }, +[ ] slug: { type: String }, +[ ] followerIds: [], +[ ] categoryIds: { type: Array }, +[ ] logo: { type: String }, +[ ] userId: { +[ ] type: String, +[ ] required: true + }, +[ ] description: { +[ ] type: String, +[ ] required: true + }, +[ ] content: { +[ ] type: String, +[ ] required: true + }, +[ ] addresses: { +[ ] type: Array, +[ ] default: [] + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as project; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql new file mode 100644 index 000000000..1d557d30c --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql @@ -0,0 +1,36 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] key: { +[ ] type: String, +[ ] default: 'system', +[-] index: true, +[ ] unique: true + }, +[ ] invites: { +[ ] userCanInvite: { +[ ] type: Boolean, +[ ] required: true, +[ ] default: false + }, +[ ] maxInvitesByUser: { +[ ] type: Number, +[ ] required: true, +[ ] default: 1 + }, +[ ] onlyUserWithBadgesCanInvite: { +[ ] type: Array, +[ ] default: [] + } + }, +[ ] maintenance: false + }, { +[ ] timestamps: true + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as setting; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql new file mode 100644 index 000000000..21c2e1f90 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql @@ -0,0 +1 @@ +// this is just a relation between users and contributions - no need to delete \ No newline at end of file diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql new file mode 100644 index 000000000..d370b4b4a --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql @@ -0,0 +1,36 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] userId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[?] foreignId: { +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[?] foreignService: { // db.getCollection('shots').distinct('foreignService') returns 'contributions' +[X] type: String, +[ ] required: true, // Not required in Nitro +[-] index: true + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[?] { userId: 1, foreignId: 1 },{ unique: true } // is the unique constrain modeled? +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as shout +MATCH (u:User {id: shout.userId}), (p:Post {id: shout.foreignId}) +MERGE (u)-[:SHOUTED]->(p) +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql new file mode 100644 index 000000000..010c2ca09 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql @@ -0,0 +1,19 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] maintenance: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as status; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql new file mode 100644 index 000000000..4bd33eb7c --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql @@ -0,0 +1,61 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] type: { +[ ] type: String, +[ ] default: 'info', +[ ] required: true, +[-] index: true + }, +[ ] title: { +[ ] type: String, +[ ] required: true + }, +[ ] content: { +[ ] type: String, +[ ] required: true + }, +[ ] slot: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] language: { +[ ] type: String, +[ ] required: true, +[-] index: true + }, +[ ] permanent: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] requireConfirmation: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] active: { +[ ] type: Boolean, +[ ] default: true, +[-] index: true + }, +[ ] totalCount: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as systemnotification; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql new file mode 100644 index 000000000..32679f6c8 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql @@ -0,0 +1,2 @@ +MATCH (n:User) DETACH DELETE n; +MATCH (e:EmailAddress) DETACH DELETE e; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql new file mode 100644 index 000000000..02dff089f --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql @@ -0,0 +1,124 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[?] email: { +[X] type: String, +[-] index: true, +[X] required: true, +[?] unique: true //unique constrain missing in Nitro + }, +[?] password: { // Not required in Alpha -> verify if always present +[X] type: String + }, +[X] name: { type: String }, +[X] slug: { +[X] type: String, +[-] index: true + }, +[ ] gender: { type: String }, +[ ] followersCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] followingCounts: { +[ ] users: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] organizations: { +[ ] type: Number, +[ ] default: 0 + }, +[ ] projects: { +[ ] type: Number, +[ ] default: 0 + } + }, +[ ] timezone: { type: String }, +[X] avatar: { type: String }, +[X] coverImg: { type: String }, +[ ] doiToken: { type: String }, +[ ] confirmedAt: { type: Date }, +[?] badgeIds: [], // Verify this is working properly +[?] deletedAt: { type: Date }, // The Date of deletion is not saved in Nitro +[?] createdAt: { +[?] type: Date, // Modeled as String in Nitro +[ ] default: Date.now // Default value is missing in Nitro + }, +[?] updatedAt: { +[?] type: Date, // Modeled as String in Nitro +[ ] default: Date.now // Default value is missing in Nitro + }, +[ ] lastActiveAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] isVerified: { type: Boolean }, +[?] role: { +[X] type: String, +[-] index: true, +[?] enum: ['admin', 'moderator', 'manager', 'editor', 'user'], // missing roles manager & editor in Nitro +[ ] default: 'user' // Default value is missing in Nitro + }, +[ ] verifyToken: { type: String }, +[ ] verifyShortToken: { type: String }, +[ ] verifyExpires: { type: Date }, +[ ] verifyChanges: { type: Object }, +[ ] resetToken: { type: String }, +[ ] resetShortToken: { type: String }, +[ ] resetExpires: { type: Date }, +[X] wasSeeded: { type: Boolean }, +[X] wasInvited: { type: Boolean }, +[ ] language: { +[ ] type: String, +[ ] default: 'en' + }, +[ ] termsAndConditionsAccepted: { type: Date }, // we display the terms and conditions on registration +[ ] systemNotificationsSeen: { +[ ] type: Array, +[ ] default: [] + } + } +*/ +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as user +MERGE(u:User {id: user._id["$oid"]}) +ON CREATE SET +u.name = user.name, +u.slug = COALESCE(user.slug, apoc.text.random(20, "[A-Za-z]")), +u.email = user.email, +u.encryptedPassword = user.password, +u.avatar = replace(user.avatar, 'https://api-alpha.human-connection.org', ''), +u.coverImg = replace(user.coverImg, 'https://api-alpha.human-connection.org', ''), +u.wasInvited = user.wasInvited, +u.wasSeeded = user.wasSeeded, +u.role = toLower(user.role), +u.createdAt = user.createdAt.`$date`, +u.updatedAt = user.updatedAt.`$date`, +u.deleted = user.deletedAt IS NOT NULL, +u.disabled = false +MERGE (e:EmailAddress { + email: user.email, + createdAt: toString(datetime()), + verifiedAt: toString(datetime()) +}) +MERGE (e)-[:BELONGS_TO]->(u) +MERGE (u)-[:PRIMARY_EMAIL]->(e) +WITH u, user, user.badgeIds AS badgeIds +UNWIND badgeIds AS badgeId +MATCH (b:Badge {id: badgeId}) +MERGE (b)-[:REWARDED]->(u) +; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql new file mode 100644 index 000000000..55f58f171 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql @@ -0,0 +1,35 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] userId: { +[ ] type: String, +[ ] required: true + }, +[ ] contributionId: { +[ ] type: String, +[ ] required: true + }, +[ ] done: { +[ ] type: Boolean, +[ ] default: false + }, +[ ] doneAt: { type: Date }, +[ ] createdAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + }, +[ ] wasSeeded: { type: Boolean } + } + index: +[ ] { userId: 1, contributionId: 1 },{ unique: true } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as usercando; diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql new file mode 100644 index 000000000..722625944 --- /dev/null +++ b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql @@ -0,0 +1,43 @@ +/* +// Alpha Model +// [ ] Not modeled in Nitro +// [X] Modeled in Nitro +// [-] Omitted in Nitro +// [?] Unclear / has work to be done for Nitro + { +[ ] userId: { +[ ] type: String, +[ ] required: true, +[ ] unique: true + }, +[ ] blacklist: { +[ ] type: Array, +[ ] default: [] + }, +[ ] uiLanguage: { +[ ] type: String, +[ ] required: true + }, +[ ] contentLanguages: { +[ ] type: Array, +[ ] default: [] + }, +[ ] filter: { +[ ] categoryIds: { +[ ] type: Array, +[ ] index: true + }, +[ ] emotions: { +[ ] type: Array, +[ ] index: true + } + }, +[ ] hideUsersWithoutTermsOfUseSigniture: {type: Boolean}, +[ ] updatedAt: { +[ ] type: Date, +[ ] default: Date.now + } + } +*/ + +CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as usersetting; diff --git a/deployment/src/old/mailserver/Deployment.yaml b/deployment/src/old/mailserver/Deployment.yaml new file mode 100644 index 000000000..a36e1652e --- /dev/null +++ b/deployment/src/old/mailserver/Deployment.yaml @@ -0,0 +1,40 @@ +{{- if .Values.developmentMailserverDomain }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-mailserver + labels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/name: ocelot-social + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + replicas: 1 + minReadySeconds: 15 + progressDeadlineSeconds: 60 + selector: + matchLabels: + ocelot.social/selector: deployment-mailserver + template: + metadata: + labels: + ocelot.social/selector: deployment-mailserver + name: mailserver + spec: + containers: + - name: mailserver + image: djfarrelly/maildev + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 80 + - containerPort: 25 + envFrom: + - configMapRef: + name: {{ .Release.Name }}-configmap + - secretRef: + name: {{ .Release.Name }}-secrets + restartPolicy: Always + terminationGracePeriodSeconds: 30 +status: {} +{{- end}} \ No newline at end of file diff --git a/deployment/src/old/mailserver/README.md b/deployment/src/old/mailserver/README.md new file mode 100644 index 000000000..ed9292d5c --- /dev/null +++ b/deployment/src/old/mailserver/README.md @@ -0,0 +1,18 @@ +# Development Mail Server + +You can deploy a fake smtp server which captures all send mails and displays +them in a web interface. The [sample configuration](../templates/configmap.template.yaml) +is assuming such a dummy server in the `SMTP_HOST` configuration and points to +a cluster-internal SMTP server. + +To deploy the SMTP server just uncomment the relevant code in the +[ingress server configuration](../../https/templates/ingress.template.yaml) and +run the following: + +```bash +# in folder deployment/ocelot-social +$ kubectl apply -f mailserver/ +``` + +You might need to refresh the TLS secret to enable HTTPS on the publicly +available web interface. diff --git a/deployment/src/old/mailserver/Service.yaml b/deployment/src/old/mailserver/Service.yaml new file mode 100644 index 000000000..bba734967 --- /dev/null +++ b/deployment/src/old/mailserver/Service.yaml @@ -0,0 +1,22 @@ +{{- if .Values.developmentMailserverDomain }} +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-mailserver + labels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/name: ocelot-social + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" +spec: + ports: + - name: web + port: 80 + targetPort: 80 + - name: smtp + port: 25 + targetPort: 25 + selector: + ocelot.social/selector: deployment-mailserver +{{- end}} \ No newline at end of file diff --git a/deployment/src/old/mailserver/ingress.yaml b/deployment/src/old/mailserver/ingress.yaml new file mode 100644 index 000000000..1ea9c58be --- /dev/null +++ b/deployment/src/old/mailserver/ingress.yaml @@ -0,0 +1,42 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: ingress-{{ .Release.Name }}-webapp + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "ingress webapp" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + annotations: + kubernetes.io/ingress.class: "nginx" + cert-manager.io/cluster-issuer: {{ .Values.LETSENCRYPT.ISSUER }} + nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.NGINX.PROXY_BODY_SIZE }} +spec: + tls: + - hosts: + - {{ .Values.LETSENCRYPT.DOMAIN }} + secretName: tls + rules: + - host: {{ .Values.LETSENCRYPT.DOMAIN }} + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: {{ .Release.Name }}-webapp + port: + number: 3000 + +#{{- if .Values.developmentMailserverDomain }} +# - host: {{ .Values.developmentMailserverDomain }} +# http: +# paths: +# - path: / +# backend: +# serviceName: {{ .Release.Name }}-mailserver +# servicePort: 80 +#{{- end }} diff --git a/deployment/src/old/monitoring/README.md b/deployment/src/old/monitoring/README.md new file mode 100644 index 000000000..46dfb0301 --- /dev/null +++ b/deployment/src/old/monitoring/README.md @@ -0,0 +1,43 @@ +# Metrics + +You can optionally setup [prometheus](https://prometheus.io/) and +[grafana](https://grafana.com/) for metrics. + +We follow this tutorial [here](https://medium.com/@chris_linguine/how-to-monitor-your-kubernetes-cluster-with-prometheus-and-grafana-2d5704187fc8): + +```bash +kubectl proxy # proxy to your kubernetes dashboard + +helm repo list +# If using helm v3, the stable repository is not set, so you need to manually add it. +helm repo add stable https://kubernetes-charts.storage.googleapis.com +# Create a monitoring namespace for your cluster +kubectl create namespace monitoring +helm --namespace monitoring install prometheus stable/prometheus +kubectl -n monitoring get pods # look for 'server' +kubectl port-forward -n monitoring 9090 +# You can now see your prometheus server on: http://localhost:9090 + +# Make sure you are in folder `deployment/` +kubectl apply -f monitoring/grafana/config.yml +helm --namespace monitoring install grafana stable/grafana -f monitoring/grafana/values.yml +# Get the admin password for grafana from your kubernetes dashboard. +kubectl --namespace monitoring port-forward 3000 +# You can now see your grafana dashboard on: http://localhost:3000 +# Login with user 'admin' and the password you just looked up. +# In your dashboard import this dashboard: +# https://grafana.com/grafana/dashboards/1860 +# Enter ID 180 and choose "Prometheus" as datasource. +# You got metrics! +``` + +Now you should see something like this: + +![Grafana dashboard](./grafana/metrics.png) + +You can set up a grafana dashboard, by visiting https://grafana.com/dashboards, finding one that is suitable and copying it's id. +You then go to the left hand menu in localhost, choose `Dashboard` > `Manage` > `Import` +Paste in the id, click `Load`, select `Prometheus` for the data source, and click `Import` + +When you just installed prometheus and grafana, the data will not be available +immediately, so wait for a couple of minutes and reload. diff --git a/deployment/src/old/monitoring/grafana/config.yml b/deployment/src/old/monitoring/grafana/config.yml new file mode 100644 index 000000000..a338e3480 --- /dev/null +++ b/deployment/src/old/monitoring/grafana/config.yml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: prometheus-grafana-datasource + namespace: monitoring + labels: + grafana_datasource: '1' +data: + datasource.yaml: |- + apiVersion: 1 + datasources: + - name: Prometheus + type: prometheus + access: proxy + orgId: 1 + url: http://prometheus-server.monitoring.svc.cluster.local diff --git a/deployment/src/old/monitoring/grafana/metrics.png b/deployment/src/old/monitoring/grafana/metrics.png new file mode 100644 index 000000000..cc68f1bad Binary files /dev/null and b/deployment/src/old/monitoring/grafana/metrics.png differ diff --git a/deployment/src/old/monitoring/grafana/values.yml b/deployment/src/old/monitoring/grafana/values.yml new file mode 100644 index 000000000..02004cc1c --- /dev/null +++ b/deployment/src/old/monitoring/grafana/values.yml @@ -0,0 +1,4 @@ +sidecar: + datasources: + enabled: true + label: grafana_datasource diff --git a/deployment/src/old/volumes/README.md b/deployment/src/old/volumes/README.md new file mode 100644 index 000000000..00619d33a --- /dev/null +++ b/deployment/src/old/volumes/README.md @@ -0,0 +1,37 @@ +# Persistent Volumes + +At the moment, the application needs two persistent volumes: + +* The `/data/` folder where `neo4j` stores its database and +* the folder `/develop-backend/public/uploads` where the backend stores uploads, in case you don't use DigitalOcean Spaces (an AWS S3 bucket) for this purpose. + +As a matter of precaution, the persistent volume claims that setup these volumes +live in a separate folder. You don't want to accidently loose all your data in +your database by running + +```sh +kubectl delete -f ocelot-social/ +``` + +or do you? + +## Create Persistent Volume Claims + +Run the following: + +```sh +# in folder deployments/ +$ kubectl apply -f volumes +persistentvolumeclaim/neo4j-data-claim created +persistentvolumeclaim/uploads-claim created +``` + +## Backup And Restore + +We tested a couple of options how to do disaster recovery in kubernetes. First, +there is the [offline backup strategy](./neo4j-offline-backup/README.md) of the +community edition of Neo4J, which you can also run on a local installation. +Kubernetes also offers so-called [volume snapshots](./volume-snapshots/README.md). +Changing the [reclaim policy](./reclaim-policy/README.md) of your persistent +volumes might be an additional safety measure. Finally, there is also a +kubernetes specific disaster recovery tool called [Velero](./velero/README.md). diff --git a/deployment/src/old/volumes/neo4j-offline-backup/README.md b/deployment/src/old/volumes/neo4j-offline-backup/README.md new file mode 100644 index 000000000..7c34aa764 --- /dev/null +++ b/deployment/src/old/volumes/neo4j-offline-backup/README.md @@ -0,0 +1,88 @@ +# Backup (offline) + +This tutorial explains how to carry out an offline backup of your Neo4J +database in a kubernetes cluster. + +An offline backup requires the Neo4J database to be stopped. Read +[the docs](https://neo4j.com/docs/operations-manual/current/tools/dump-load/). +Neo4J also offers online backups but this is available in enterprise edition +only. + +The tricky part is to stop the Neo4J database *without* stopping the container. +Neo4J's docker container image starts `neo4j` by default, so we have to override +this command with sth. that keeps the container spinning but does not terminate +it. + +## Stop and Restart Neo4J Database in Kubernetes + +[This tutorial](http://bigdatums.net/2017/11/07/how-to-keep-docker-containers-running/) +explains how to keep a docker container running. For kubernetes, the way to +override the docker image `CMD` is explained [here](https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#define-a-command-and-arguments-when-you-create-a-pod). + +So, all we have to do is edit the kubernetes deployment of our Neo4J database +and set a custom `command` every time we have to carry out tasks like backup, +restore, seed etc. + +First bring the application into [maintenance mode](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/deployment/ocelot-social/maintenance/README.md) to ensure there are no +database connections left and nobody can access the application. + +Run the following: + +```sh +$ kubectl -n ocelot-social edit deployment develop-neo4j +``` + +Add the following to `spec.template.spec.containers`: + +```sh +["tail", "-f", "/dev/null"] +``` + +and write the file which will update the deployment. + +The command `tail -f /dev/null` is the equivalent of *sleep forever*. It is a +hack to keep the container busy and to prevent its shutdown. It will also +override the default `neo4j` command and the kubernetes pod will not start the +database. + +Now perform your tasks! + +When you're done, edit the deployment again and remove the `command`. Write the +file and trigger an update of the deployment. + +## Create a Backup in Kubernetes + +First stop your Neo4J database, see above. Then: + +```sh +$ kubectl -n ocelot-social get pods +# Copy the ID of the pod running Neo4J. +$ kubectl -n ocelot-social exec -it bash +# Once you're in the pod, dump the db to a file e.g. `/root/neo4j-backup`. +> neo4j-admin dump --to=/root/neo4j-backup +> exit +# Download the file from the pod to your computer. +$ kubectl cp human-connection/:/root/neo4j-backup ./neo4j-backup +``` + +Revert your changes to deployment `develop-neo4j` which will restart the database. + +## Restore a Backup in Kubernetes + +First stop your Neo4J database. Then: + +```sh +$ kubectl -n ocelot-social get pods +# Copy the ID of the pod running Neo4J. +# Then upload your local backup to the pod. Note that once the pod gets deleted +# e.g. if you change the deployment, the backup file is gone with it. +$ kubectl cp ./neo4j-backup human-connection/:/root/ +$ kubectl -n ocelot-social exec -it bash +# Once you're in the pod restore the backup and overwrite the default database +# called `graph.db` with `--force`. +# This will delete all existing data in database `graph.db`! +> neo4j-admin load --from=/root/neo4j-backup --force +> exit +``` + +Revert your changes to deployment `develop-neo4j` which will restart the database. diff --git a/deployment/src/old/volumes/neo4j-online-backup/README.md b/deployment/src/old/volumes/neo4j-online-backup/README.md new file mode 100644 index 000000000..602bbd577 --- /dev/null +++ b/deployment/src/old/volumes/neo4j-online-backup/README.md @@ -0,0 +1,59 @@ +# Backup (online) + +## Online backups are only avaible with a Neo4j Enterprise and a license, see https://neo4j.com/licensing/ for the different licenses available + +This tutorial explains how to carry out an online backup of your Neo4J +database in a kubernetes cluster. + +One of the benefits of doing an online backup is that the Neo4j database does not need to be stopped, so there is no downtime. Read [the docs](https://neo4j.com/docs/operations-manual/current/backup/performing/) + +To use Neo4j Enterprise you must add this line to your configmap, if using, or your deployment `develop-neo4j` env. + +```sh +NEO4J_ACCEPT_LICENSE_AGREEMENT: "yes" +``` + +## Create a Backup in Kubernetes + +```sh +# Backup the database with one command, this will get the develop-neo4j pod, ssh into it, and run the backup command +$ kubectl -n=human-connection exec -it $(kubectl -n=human-connection get pods | grep develop-neo4j | awk '{ print $1 }') -- neo4j-admin backup --backup-dir=/var/lib/neo4j --name=neo4j-backup +# Download the file from the pod to your computer. +$ kubectl cp human-connection/$(kubectl -n=human-connection get pods | grep develop-neo4j | awk '{ print $1 }'):/var/lib/neo4j/neo4j-backup ./neo4j-backup/ +``` + +You should now have a backup of the database locally. If you want, you can simulate disaster recovery by sshing into the develop-neo4j pod, deleting all data and restoring from backup + +## Disaster where database data is gone somehow + +```sh +$ kubectl -n=human-connection exec -it $(kubectl -n=human-connection get pods | grep develop-neo4j |awk '{ print $1 }') bash +# Enter cypher-shell +$ cypher-shell +# Delete all data +> MATCH (n) DETACH DELETE (n); + +> exit +``` + +## Restore a backup in Kubernetes + +Restoration must be done while the database is not running, see [our docs](https://docs.human-connection.org/human-connection/deployment/volumes/neo4j-offline-backup#stop-and-restart-neo-4-j-database-in-kubernetes) for how to stop the database, but keep the container running + +After, you have stopped the database, and have the pod running, you can restore the database by running these commands: + +```sh +$ kubectl -n ocelot-social get pods +# Copy the ID of the pod running Neo4J. +# Then upload your local backup to the pod. Note that once the pod gets deleted +# e.g. if you change the deployment, the backup file is gone with it. +$ kubectl cp ./neo4j-backup/ human-connection/:/root/ +$ kubectl -n ocelot-social exec -it bash +# Once you're in the pod restore the backup and overwrite the default database +# called `graph.db` with `--force`. +# This will delete all existing data in database `graph.db`! +> neo4j-admin restore --from=/root/neo4j-backup --force +> exit +``` + +Revert your changes to deployment `develop-neo4j` which will restart the database. diff --git a/deployment/src/old/volumes/uploads.yaml b/deployment/src/old/volumes/uploads.yaml new file mode 100644 index 000000000..45e1292a8 --- /dev/null +++ b/deployment/src/old/volumes/uploads.yaml @@ -0,0 +1,12 @@ +--- + kind: PersistentVolumeClaim + apiVersion: v1 + metadata: + name: uploads-claim + namespace: ocelot-social + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "10Gi" diff --git a/deployment/src/old/volumes/velero/README.md b/deployment/src/old/volumes/velero/README.md new file mode 100644 index 000000000..bf63f13c8 --- /dev/null +++ b/deployment/src/old/volumes/velero/README.md @@ -0,0 +1,112 @@ +# Velero + +{% hint style="danger" %} +I tried Velero and it did not work reliably all the time. Sometimes the +kubernetes cluster crashes during recovery or data is not fully recovered. + +Feel free to test it out and update this documentation once you feel that it's +working reliably. It is very likely that DigitalOcean had some bugs when I +tried out the steps below. +{% endhint %} + +We use [velero](https://github.com/heptio/velero) for on premise backups, we +tested on version `v0.11.0`, you can find their +documentation [here](https://heptio.github.io/velero/v0.11.0/). + +Our kubernets configurations adds some annotations to pods. The annotations +define the important persistent volumes that need to be backed up. Velero will +pick them up and store the volumes in the same cluster but in another namespace +`velero`. + +## Prequisites + +You have to install the binary `velero` on your computer and get a tarball of +the latest release. We use `v0.11.0` so visit the +[release](https://github.com/heptio/velero/releases/tag/v0.11.0) page and +download and extract e.g. [velero-v0.11.0-linux-arm64.tar.gz](https://github.com/heptio/velero/releases/download/v0.11.0/velero-v0.11.0-linux-amd64.tar.gz). + + +## Setup Velero Namespace + +Follow their [getting started](https://heptio.github.io/velero/v0.11.0/get-started) +instructions to setup the Velero namespace. We use +[Minio](https://docs.min.io/docs/deploy-minio-on-kubernetes) and +[restic](https://github.com/restic/restic), so check out Velero's instructions +how to setup [restic](https://heptio.github.io/velero/v0.11.0/restic): + +```sh +# run from the extracted folder of the tarball +$ kubectl apply -f config/common/00-prereqs.yaml +$ kubectl apply -f config/minio/ +``` + +Once completed, you should see the namespace in your kubernetes dashboard. + +## Manually Create an On-Premise Backup + +When you create your deployments for Human Connection the required annotations +should already be in place. So when you create a backup of namespace +`human-connection`: + +```sh +$ velero backup create hc-backup --include-namespaces=human-connection +``` + +That should backup your persistent volumes, too. When you enter: + +```sh +$ velero backup describe hc-backup --details +``` + +You should see the persistent volumes at the end of the log: + +```sh +.... + +Restic Backups: + Completed: + human-connection/develop-backend-5b6dd96d6b-q77n6: uploads + human-connection/develop-neo4j-686d768598-z2vhh: neo4j-data +``` + +## Simulate a Disaster + +Feel free to try out if you loose any data when you simulate a disaster and try +to restore the namespace from the backup: + +```sh +$ kubectl delete namespace human-connection +``` + +Wait until the wrongdoing has completed, then: +```sh +$ velero restore create --from-backup hc-backup +``` + +Now, I keep my fingers crossed that everything comes back again. If not, I feel +very sorry for you. + + +## Schedule a Regular Backup + +Check out the [docs](https://heptio.github.io/velero/v0.11.0/get-started). You +can create a regular schedule e.g. with: + +```sh +$ velero schedule create hc-weekly-backup --schedule="@weekly" --include-namespaces=human-connection +``` + +Inspect the created backups: + +```sh +$ velero schedule get +NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR +hc-weekly-backup Enabled 2019-05-08 17:51:31 +0200 CEST @weekly 720h0m0s 6s ago + +$ velero backup get +NAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR +hc-weekly-backup-20190508155132 Completed 2019-05-08 17:51:32 +0200 CEST 29d default + +$ velero backup describe hc-weekly-backup-20190508155132 --details +# see if the persistent volumes are backed up +``` diff --git a/deployment/src/old/volumes/volume-snapshots/README.md b/deployment/src/old/volumes/volume-snapshots/README.md new file mode 100644 index 000000000..010cfc636 --- /dev/null +++ b/deployment/src/old/volumes/volume-snapshots/README.md @@ -0,0 +1,49 @@ +# Kubernetes Volume Snapshots + +It is possible to backup persistent volumes through volume snapshots. This is especially handy if you don't want to stop the database to create an [offline backup](../neo4j-offline-backup/README.md) thus having a downtime. + +Kubernetes announced this feature in a [blog post](https://kubernetes.io/blog/2018/10/09/introducing-volume-snapshot-alpha-for-kubernetes/). Please make yourself familiar with it before you continue. + +## Create a Volume Snapshot + +There is an example in this folder how you can e.g. create a volume snapshot for the persistent volume claim of the database `volume-claim-ocelot-neo4j`, or for the uploads of the backend `volume-claim-ocelot-uploads`. + +Replace `YYYY-MM-DD` in the `metadata.name` entry in the yaml files with the actual date before you enter the following commands: + +```bash +# in folder deployment/volumes/volume-snapshots/ +kubectl apply -f neo4j-data-snapshot.yaml +# in case the images are stored on backend and not in S3 storage +kubectl apply -f backen-uploads-snapshot.yaml +``` + +If you are on DigitalOcean the volume snapshot should show up in the Web UI: + +![DigitalOcean Web UI showing a volume snapshot](./digital-ocean-volume-snapshots.png) + +## Provision a Volume based on a Snapshot + +Edit your persistent volume claim configuration and add a `dataSource` pointing +to your volume snapshot. [The blog post](https://kubernetes.io/blog/2018/10/09/introducing-volume-snapshot-alpha-for-kubernetes/) has an example in section "Provision a new volume from a snapshot with +Kubernetes". + +There is also an example in this folder how the configuration could look like. If you apply the configuration new persistent volume claim will be provisioned with the data from the volume snapshot: + +```bash +# in folder deployment/volumes/volume-snapshots/ +kubectl apply -f neo4j-data-provision-snapshot.yaml +``` + +## Data Consistency Warning + +Note that volume snapshots do not guarantee data consistency. Quote from the +[blog post](https://kubernetes.io/blog/2018/10/09/introducing-volume-snapshot-alpha-for-kubernetes/): + +> Please note that the alpha release of Kubernetes Snapshot does not provide +> any consistency guarantees. You have to prepare your application (pause +> application, freeze filesystem etc.) before taking the snapshot for data +> consistency. + +In case of Neo4J this probably means that enterprise edition is required which +supports [online backups](https://neo4j.com/docs/operations-manual/current/backup/). + diff --git a/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml new file mode 100644 index 000000000..697346c82 --- /dev/null +++ b/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: snapshot.storage.k8s.io/v1beta1 +kind: VolumeSnapshot +metadata: + name: YYYY-MM-DD-uploads-snapshot +spec: + source: + persistentVolumeClaimName: volume-claim-ocelot-uploads diff --git a/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png b/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png new file mode 100644 index 000000000..cb6599616 Binary files /dev/null and b/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png differ diff --git a/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml new file mode 100644 index 000000000..cd8552bda --- /dev/null +++ b/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml @@ -0,0 +1,18 @@ +--- + kind: PersistentVolumeClaim + apiVersion: v1 + metadata: + name: neo4j-data-claim + namespace: ocelot-social + labels: + app: ocelot-social + spec: + dataSource: + name: neo4j-data-snapshot + kind: VolumeSnapshot + apiGroup: snapshot.storage.k8s.io + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml new file mode 100644 index 000000000..6ac15cc05 --- /dev/null +++ b/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: snapshot.storage.k8s.io/v1beta1 +kind: VolumeSnapshot +metadata: + name: YYYY-MM-DD-neo4j-data-snapshot +spec: + source: + persistentVolumeClaimName: volume-claim-ocelot-neo4j \ No newline at end of file diff --git a/deployment/src/tools/merge-locales.sh b/deployment/src/tools/merge-locales.sh new file mode 100755 index 000000000..21d263265 --- /dev/null +++ b/deployment/src/tools/merge-locales.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +for locale in `ls locales/*.json`; +do + file=$(basename $locale); + if [ -f locales/tmp/$file ]; then + jq -s '.[0] * .[1]' $locale locales/tmp/$file > locales/tmp/tmp.json; + mv locales/tmp/tmp.json $locale; + fi; +done; + +rm -r locales/tmp/ diff --git a/docker-compose.apple-m1.override.yml b/docker-compose.apple-m1.override.yml deleted file mode 100644 index cbb041c51..000000000 --- a/docker-compose.apple-m1.override.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: "3.4" - -services: - - ######################################################## - # WEBAPP ############################################### - ######################################################## - webapp: - platform: linux/amd64 - - ######################################################## - # BACKEND ############################################## - ######################################################## - backend: - platform: linux/amd64 - - ######################################################## - # MAINTENANCE ########################################## - ######################################################## - maintenance: - platform: linux/amd64 - - ######################################################## - # NEO4J ################################################ - ######################################################## - neo4j: - platform: linux/amd64 - - ######################################################## - # MAILSERVER TO FAKE SMTP ############################## - ######################################################## - # commented out, because otherwise override of production would error. and it seems unnecessary - # mailserver: - # platform: linux/amd64 diff --git a/docker-compose.maintenance.yml b/docker-compose.maintenance.yml index 831bb3f4a..b006713ec 100644 --- a/docker-compose.maintenance.yml +++ b/docker-compose.maintenance.yml @@ -20,7 +20,6 @@ services: - GRAPHQL_URI=http://localhost:4000 - CLIENT_URI=http://localhost:3000 - JWT_SECRET=b/&&7b78BF&fv/Vd - - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 - NEO4J_apoc_import_file_enabled=true - "SSH_USERNAME=${SSH_USERNAME}" diff --git a/docker-compose.override.yml b/docker-compose.override.yml index d8a3edc06..52bf57896 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -64,6 +64,7 @@ services: ######################################################## mailserver: image: djfarrelly/maildev + container_name: mailserver ports: - 1080:80 networks: diff --git a/docker-compose.yml b/docker-compose.yml index 154a8fd4c..aeb26e4fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,7 @@ services: webapp: # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/webapp:local-production + container_name: webapp build: context: ./webapp target: production @@ -44,6 +45,7 @@ services: backend: # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/backend:local-production + container_name: backend build: context: ./backend target: production @@ -78,6 +80,7 @@ services: maintenance: # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/maintenance:local-production + container_name: maintenance build: # TODO: Separate from webapp, this must be independent context: ./webapp @@ -93,6 +96,7 @@ services: neo4j: # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/neo4j-community:local-production + container_name: neo4j build: context: ./neo4j # community edition 👆🏼, because we have no enterprise licence 👇🏼 at the moment diff --git a/neo4j/Dockerfile b/neo4j/Dockerfile index 4bdc4ef1f..dc5a912f0 100644 --- a/neo4j/Dockerfile +++ b/neo4j/Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # COMMUNITY ###################################################################### ################################################################################## -FROM neo4j:3.5.14 as community +FROM amd64/neo4j:3.5.14 as community # ENVs ## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 diff --git a/package.json b/package.json index f7b97c4a1..ba1e67eec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social", - "version": "2.2.0", + "version": "2.4.0", "description": "Free and open source software program code available to run social networks.", "author": "ocelot.social Community", "license": "MIT", @@ -48,7 +48,8 @@ "slug": "^6.0.0" }, "resolutions": { - "set-value": "^2.0.1" + "set-value": "^2.0.1", + "nan": "2.17.0" }, "dependencies": {} } diff --git a/webapp/.env.template b/webapp/.env.template index 9776fcea2..76bc502f9 100644 --- a/webapp/.env.template +++ b/webapp/.env.template @@ -1,7 +1,8 @@ SENTRY_DSN_WEBAPP= COMMIT= -PUBLIC_REGISTRATION=false -INVITE_REGISTRATION=true WEBSOCKETS_URI=ws://localhost:3000/api/graphql GRAPHQL_URI=http://localhost:4000/ +MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" +PUBLIC_REGISTRATION=false +INVITE_REGISTRATION=true CATEGORIES_ACTIVE=false diff --git a/webapp/.nvmrc b/webapp/.nvmrc index e4ab7d287..cb77acbfe 100644 --- a/webapp/.nvmrc +++ b/webapp/.nvmrc @@ -1 +1 @@ -v12.19.0 \ No newline at end of file +v19.4.0 \ No newline at end of file diff --git a/webapp/Dockerfile b/webapp/Dockerfile index a086a4b2a..7952d02c1 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BASE (Is pushed to DockerHub for rebranding) ################################### ################################################################################## -FROM node:12.19.0-alpine3.10 as base +FROM node:19.4.0-alpine3.17 as base # ENVs ## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame @@ -35,7 +35,7 @@ LABEL maintainer="devops@ocelot.social" # Install Additional Software ## install: git -RUN apk --no-cache add git +RUN apk --no-cache add git python3 make g++ # Settings ## Expose Container Port diff --git a/webapp/Dockerfile.maintenance b/webapp/Dockerfile.maintenance index d9fa6fe43..e148da555 100644 --- a/webapp/Dockerfile.maintenance +++ b/webapp/Dockerfile.maintenance @@ -1,7 +1,7 @@ ################################################################################## # BASE ########################################################################### ################################################################################## -FROM node:12.19.0-alpine3.10 as base +FROM node:19.4.0-alpine3.17 as base # ENVs ## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame @@ -35,7 +35,7 @@ LABEL maintainer="devops@ocelot.social" # Install Additional Software ## install: git -RUN apk --no-cache add git +RUN apk --no-cache add git python3 make g++ # Settings ## Expose Container Port diff --git a/webapp/README.md b/webapp/README.md index 955d9ba3d..4c56dcc75 100644 --- a/webapp/README.md +++ b/webapp/README.md @@ -4,18 +4,32 @@ ## Installation +For preparation we need Node and recommend to use [node version manager](https://github.com/nvm-sh/nvm) `nvm` to switch +between different local Node versions: + +```bash +# install Node +$ cd webapp +$ nvm install v19.4.0 +$ nvm use v19.4.0 +``` + +Install node dependencies with [yarn](https://yarnpkg.com/en/): + ```bash # install all dependencies -$ cd webapp/ +$ cd webapp $ yarn install # or just $ yarn +# or just later on to use version of ".nvmrc" file +$ nvm use && yarn ``` Copy: ```text -# in webapp/ +# in webapp cp .env.template .env ``` diff --git a/webapp/assets/_new/icons/svgs/angle-up.svg b/webapp/assets/_new/icons/svgs/angle-up.svg new file mode 100644 index 000000000..af58a3f27 --- /dev/null +++ b/webapp/assets/_new/icons/svgs/angle-up.svg @@ -0,0 +1,5 @@ + + +angle-up + + diff --git a/webapp/assets/_new/icons/svgs/globe-detailed.svg b/webapp/assets/_new/icons/svgs/globe-detailed.svg new file mode 100644 index 000000000..64b5b1573 --- /dev/null +++ b/webapp/assets/_new/icons/svgs/globe-detailed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/webapp/assets/_new/styles/tokens.scss b/webapp/assets/_new/styles/tokens.scss index 180f9c820..66bd03ecc 100644 --- a/webapp/assets/_new/styles/tokens.scss +++ b/webapp/assets/_new/styles/tokens.scss @@ -3,28 +3,28 @@ * @presenter Color */ - $color-primary: rgb(23, 181, 63); - $color-primary-light: rgb(96, 214, 98); - $color-primary-dark: rgb(25, 122, 49); - $color-primary-active: rgb(25, 194, 67); - $color-primary-inverse: rgb(241, 253, 244); - $color-secondary: rgb(0, 142, 230); - $color-secondary-active: rgb(10, 161, 255); - $color-secondary-inverse: rgb(240, 249, 255); - $color-success: rgb(23, 181, 63); - $color-success-active: rgb(26, 203, 71); - $color-success-inverse: rgb(241, 253, 244); - $color-danger: rgb(219, 57, 36); - $color-danger-light: rgb(242, 97, 65); - $color-danger-dark: rgb(158, 43, 28); - $color-danger-active: rgb(224, 81, 62); - $color-danger-inverse: rgb(253, 243, 242); - $color-warning: rgb(230, 121, 25); - $color-warning-active: rgb(233, 137, 53); - $color-warning-inverse: rgb(253, 247, 241); - $color-yellow: rgb(245, 196, 0); - $color-yellow-active: rgb(255, 206, 10); - $color-yellow-inverse: rgb(255, 252, 240); +$color-primary: rgb(23, 181, 63); +$color-primary-light: rgb(96, 214, 98); +$color-primary-dark: rgb(25, 122, 49); +$color-primary-active: rgb(25, 194, 67); +$color-primary-inverse: rgb(241, 253, 244); +$color-secondary: rgb(0, 142, 230); +$color-secondary-active: rgb(10, 161, 255); +$color-secondary-inverse: rgb(240, 249, 255); +$color-success: rgb(23, 181, 63); +$color-success-active: rgb(26, 203, 71); +$color-success-inverse: rgb(241, 253, 244); +$color-danger: rgb(219, 57, 36); +$color-danger-light: rgb(242, 97, 65); +$color-danger-dark: rgb(158, 43, 28); +$color-danger-active: rgb(224, 81, 62); +$color-danger-inverse: rgb(253, 243, 242); +$color-warning: rgb(230, 121, 25); +$color-warning-active: rgb(233, 137, 53); +$color-warning-inverse: rgb(253, 247, 241); +$color-yellow: rgb(245, 196, 0); +$color-yellow-active: rgb(255, 206, 10); +$color-yellow-inverse: rgb(255, 252, 240); /** * @tokens Color Neutral @@ -375,4 +375,21 @@ $color-footer-link: $color-primary; * @tokens Locale Menu Color */ -$color-locale-menu: $text-color-soft; \ No newline at end of file +$color-locale-menu: $text-color-soft; + +/** + * @tokens Donation Bar Color + */ + +$color-donation-bar: $color-primary; +$color-donation-bar-light: $color-primary-light; + +/** + * @tokens Toast Color + */ + +$color-toast-red: $color-danger; +$color-toast-orange: $color-warning; +$color-toast-yellow: $color-yellow; +$color-toast-blue: $color-secondary; +$color-toast-green: $color-success; diff --git a/webapp/assets/styles/imports/_toast.scss b/webapp/assets/styles/imports/_toast.scss index 0ef81a5b2..eb593dd6a 100644 --- a/webapp/assets/styles/imports/_toast.scss +++ b/webapp/assets/styles/imports/_toast.scss @@ -11,22 +11,22 @@ } .iziToast.iziToast-color-red { - background: $color-danger !important; - border-color: $color-danger !important; + background: $color-toast-red !important; + border-color: $color-toast-red !important; } .iziToast.iziToast-color-orange { - background: $color-warning !important; - border-color: $color-warning !important; + background: $color-toast-orange !important; + border-color: $color-toast-orange !important; } .iziToast.iziToast-color-yellow { - background: $color-yellow !important; - border-color: $color-yellow !important; + background: $color-toast-yellow !important; + border-color: $color-toast-yellow !important; } .iziToast.iziToast-color-blue { - background: $color-secondary !important; - border-color: $color-secondary !important; + background: $color-toast-blue !important; + border-color: $color-toast-blue !important; } .iziToast.iziToast-color-green { - background: $color-success !important; - border-color: $color-success !important; + background: $color-toast-green !important; + border-color: $color-toast-green !important; } diff --git a/webapp/components/AvatarMenu/AvatarMenu.spec.js b/webapp/components/AvatarMenu/AvatarMenu.spec.js index 5495c9ae6..be34c1804 100644 --- a/webapp/components/AvatarMenu/AvatarMenu.spec.js +++ b/webapp/components/AvatarMenu/AvatarMenu.spec.js @@ -1,11 +1,13 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import AvatarMenu from './AvatarMenu.vue' const localVue = global.localVue -config.stubs['nuxt-link'] = '' -config.stubs['router-link'] = '' +const stubs = { + 'nuxt-link': true, + 'router-link': true, +} describe('AvatarMenu.vue', () => { let propsData, getters, wrapper, mocks @@ -34,7 +36,7 @@ describe('AvatarMenu.vue', () => { const store = new Vuex.Store({ getters, }) - return mount(AvatarMenu, { propsData, localVue, store, mocks }) + return mount(AvatarMenu, { propsData, localVue, store, mocks, stubs }) } describe('mount', () => { diff --git a/webapp/components/AvatarMenu/AvatarMenu.vue b/webapp/components/AvatarMenu/AvatarMenu.vue index a5b56ba43..5ec031e61 100644 --- a/webapp/components/AvatarMenu/AvatarMenu.vue +++ b/webapp/components/AvatarMenu/AvatarMenu.vue @@ -31,7 +31,10 @@ slot-scope="item" :route="item.route" :parents="item.parents" - @click.native="closeMenu(false)" + @click.native=" + closeMenu(false) + $emit('toggle-Mobile-Menu-view') + " > {{ item.route.name }} diff --git a/webapp/components/Badges.spec.js b/webapp/components/Badges.spec.js index f81eaafb1..d19c2beb2 100644 --- a/webapp/components/Badges.spec.js +++ b/webapp/components/Badges.spec.js @@ -14,7 +14,7 @@ describe('Badges.vue', () => { } it('has class "hc-badges"', () => { - expect(Wrapper().contains('.hc-badges')).toBe(true) + expect(Wrapper().find('.hc-badges').exists()).toBe(true) }) describe('given a badge', () => { @@ -23,7 +23,7 @@ describe('Badges.vue', () => { }) it('proxies badge icon, which is just a URL without metadata', () => { - expect(Wrapper().contains('img[src="/api/path/to/some/icon"]')).toBe(true) + expect(Wrapper().find('img[src="/api/path/to/some/icon"]').exists()).toBe(true) }) }) }) diff --git a/webapp/components/CategoriesSelect/CategoriesSelect.vue b/webapp/components/CategoriesSelect/CategoriesSelect.vue index 7fc9bcf1c..4f7a555a3 100644 --- a/webapp/components/CategoriesSelect/CategoriesSelect.vue +++ b/webapp/components/CategoriesSelect/CategoriesSelect.vue @@ -23,6 +23,7 @@ import CategoryQuery from '~/graphql/CategoryQuery' import { CATEGORIES_MAX } from '~/constants/categories.js' import xor from 'lodash/xor' +import SortCategories from '~/mixins/sortCategoriesMixin.js' export default { inject: { @@ -30,6 +31,7 @@ export default { default: null, }, }, + mixins: [SortCategories], props: { existingCategoryIds: { type: Array, default: () => [] }, model: { type: String, required: true }, @@ -72,7 +74,7 @@ export default { return CategoryQuery() }, result({ data: { Category } }) { - this.categories = Category + this.categories = this.sortCategories(Category) }, }, }, diff --git a/webapp/components/Category/index.spec.js b/webapp/components/Category/index.spec.js index 9abb8a11d..22a85f6f1 100644 --- a/webapp/components/Category/index.spec.js +++ b/webapp/components/Category/index.spec.js @@ -1,4 +1,4 @@ -import { shallowMount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Category from './index' @@ -9,7 +9,7 @@ describe('Category', () => { let name const Wrapper = () => { - return shallowMount(Category, { + return mount(Category, { localVue, propsData: { icon, @@ -27,8 +27,9 @@ describe('Category', () => { it('shows Name', () => { expect(Wrapper().text()).toContain('Peter') }) - it('shows Icon Svg', () => { - expect(Wrapper().contains('svg')) + + it('shows base icon', () => { + expect(Wrapper().find('.base-icon').exists()).toBe(true) }) }) }) diff --git a/webapp/components/Category/index.vue b/webapp/components/Category/index.vue index 91ec7613c..8e4014086 100644 --- a/webapp/components/Category/index.vue +++ b/webapp/components/Category/index.vue @@ -1,5 +1,5 @@ @@ -28,12 +37,14 @@ export default { computed: { ...mapGetters({ filteredByUsersFollowed: 'posts/filteredByUsersFollowed', + filteredByPostsInMyGroups: 'posts/filteredByPostsInMyGroups', currentUser: 'auth/user', }), }, methods: { ...mapMutations({ toggleFilteredByFollowed: 'posts/TOGGLE_FILTER_BY_FOLLOWED', + toggleFilteredByMyGroups: 'posts/TOGGLE_FILTER_BY_MY_GROUPS', }), }, } diff --git a/webapp/components/Group/AddGroupMember.vue b/webapp/components/Group/AddGroupMember.vue new file mode 100644 index 000000000..ff049ca4d --- /dev/null +++ b/webapp/components/Group/AddGroupMember.vue @@ -0,0 +1,179 @@ + + + diff --git a/webapp/components/Group/GroupButton.vue b/webapp/components/Group/GroupButton.vue index db72467ef..10275dcca 100644 --- a/webapp/components/Group/GroupButton.vue +++ b/webapp/components/Group/GroupButton.vue @@ -1,5 +1,19 @@ + + diff --git a/webapp/components/Group/GroupForm.spec.js b/webapp/components/Group/GroupForm.spec.js index 0300bacd0..0eb503856 100644 --- a/webapp/components/Group/GroupForm.spec.js +++ b/webapp/components/Group/GroupForm.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import GroupForm from './GroupForm.vue' const localVue = global.localVue -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} const propsData = { update: false, @@ -25,7 +27,7 @@ describe('GroupForm', () => { describe('mount', () => { const Wrapper = () => { - return mount(GroupForm, { propsData, mocks, localVue }) + return mount(GroupForm, { propsData, mocks, localVue, stubs }) } beforeEach(() => { diff --git a/webapp/components/Group/GroupForm.vue b/webapp/components/Group/GroupForm.vue index 7b0f7840c..cb407a3d9 100644 --- a/webapp/components/Group/GroupForm.vue +++ b/webapp/components/Group/GroupForm.vue @@ -48,7 +48,7 @@ @change="changeGroupType($event)" > + + {{ $t('settings.data.labelCityHint') }} + - - - {{ formData.categoryIds.length }} / 3 - - +
+ + {{ $t('group.categoriesTitle') }} + + + + {{ formData.categoryIds.length }} / 3 + + +
@@ -436,5 +439,9 @@ export default { align-self: flex-end; margin-top: $space-base; } + + > .location-hint { + margin-top: -$space-base + $space-xxx-small; + } } diff --git a/webapp/components/Group/GroupMember.vue b/webapp/components/Group/GroupMember.vue index 830318767..bacd0259d 100644 --- a/webapp/components/Group/GroupMember.vue +++ b/webapp/components/Group/GroupMember.vue @@ -1,41 +1,7 @@ diff --git a/webapp/components/Hashtag/Hashtag.spec.js b/webapp/components/Hashtag/Hashtag.spec.js index 4a420d7d8..873919e20 100644 --- a/webapp/components/Hashtag/Hashtag.spec.js +++ b/webapp/components/Hashtag/Hashtag.spec.js @@ -1,10 +1,12 @@ -import { config, shallowMount } from '@vue/test-utils' +import { shallowMount } from '@vue/test-utils' import Hashtag from './Hashtag' const localVue = global.localVue -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} describe('Hashtag', () => { let id @@ -15,6 +17,7 @@ describe('Hashtag', () => { propsData: { id, }, + stubs, }) } diff --git a/webapp/components/HashtagsFilter/HashtagsFilter.spec.js b/webapp/components/HashtagsFilter/HashtagsFilter.spec.js index 3318ed7c0..07496c9fc 100644 --- a/webapp/components/HashtagsFilter/HashtagsFilter.spec.js +++ b/webapp/components/HashtagsFilter/HashtagsFilter.spec.js @@ -29,7 +29,7 @@ describe('HashtagsFilter.vue', () => { it('renders a card', () => { wrapper = Wrapper() - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) describe('click clear search button', () => { diff --git a/webapp/components/HeaderMenu/HeaderMenu.vue b/webapp/components/HeaderMenu/HeaderMenu.vue index 7f24eeb81..b5622d7ed 100644 --- a/webapp/components/HeaderMenu/HeaderMenu.vue +++ b/webapp/components/HeaderMenu/HeaderMenu.vue @@ -1,5 +1,9 @@ + diff --git a/webapp/pages/login.spec.js b/webapp/pages/login.spec.js index 09c1b066e..a65fc79a0 100644 --- a/webapp/pages/login.spec.js +++ b/webapp/pages/login.spec.js @@ -1,11 +1,13 @@ import Vuex from 'vuex' -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import login from './login.vue' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} describe('Login.vue', () => { let store @@ -50,6 +52,7 @@ describe('Login.vue', () => { store, mocks, localVue, + stubs, }) } diff --git a/webapp/pages/logout.spec.js b/webapp/pages/logout.spec.js index 4ec777bf6..460d321aa 100644 --- a/webapp/pages/logout.spec.js +++ b/webapp/pages/logout.spec.js @@ -32,7 +32,7 @@ describe('logout.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) it('logs out and redirects to login', () => { diff --git a/webapp/pages/map.spec.js b/webapp/pages/map.spec.js new file mode 100644 index 000000000..a9e21c876 --- /dev/null +++ b/webapp/pages/map.spec.js @@ -0,0 +1,170 @@ +// eslint-disable-next-line no-unused-vars +import mapboxgl from 'mapbox-gl' +import { mount } from '@vue/test-utils' +import VueMeta from 'vue-meta' +import Vuex from 'vuex' +import Map from './map' +import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder' + +jest.mock('@mapbox/mapbox-gl-geocoder', () => { + return jest.fn().mockImplementation(jest.fn()) +}) + +jest.mock('mapbox-gl', () => { + return { + GeolocateControl: jest.fn(), + Map: jest.fn(() => ({ + addControl: jest.fn(), + on: jest.fn(), + remove: jest.fn(), + })), + NavigationControl: jest.fn(), + Popup: jest.fn(() => { + return { + isOpen: jest.fn(), + setLngLat: jest.fn(() => { + return { + setHTML: jest.fn(() => { + return { + addTo: jest.fn(), + } + }), + } + }), + } + }), + } +}) + +const localVue = global.localVue +localVue.use(VueMeta, { keyName: 'head' }) + +const onEventMocks = {} + +const mapOnMock = jest.fn((key, ...args) => { + onEventMocks[key] = args[args.length - 1] +}) +const mapAddControlMock = jest.fn() + +const mapMock = { + on: mapOnMock, + addControl: mapAddControlMock, + loadImage: jest.fn(), + getCanvas: jest.fn(() => { + return { + style: { + cursor: 'pointer', + }, + } + }), +} + +const stubs = { + 'client-only': true, + 'mgl-map': true, + MglFullscreenControl: true, + MglNavigationControl: true, + MglGeolocateControl: true, + MglScaleControl: true, +} + +describe('map', () => { + let wrapper + let mocks + + beforeEach(() => { + MapboxGeocoder.mockClear() + mocks = { + $t: (t) => t, + $env: { + MAPBOX_TOKEN: 'MY_MAPBOX_TOKEN', + }, + $toast: { + error: jest.fn(), + }, + } + }) + + describe('mount', () => { + const Wrapper = () => { + const store = new Vuex.Store({ getters: { 'auth/user': () => false } }) + return mount(Map, { + mocks, + localVue, + stubs, + store, + }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders', () => { + expect(wrapper.element.tagName).toBe('DIV') + }) + + it('has correct content', () => { + expect(wrapper.vm.$metaInfo.title).toBe('map.pageTitle') + }) + + describe('trigger map load', () => { + beforeEach(async () => { + await wrapper.find('mgl-map-stub').vm.$emit('load', { map: mapMock }) + }) + + it('initializes on style load', () => { + expect(mapOnMock).toBeCalledWith('style.load', expect.any(Function)) + }) + + it('initializes on mouseenter', () => { + expect(mapOnMock).toBeCalledWith('mouseenter', 'markers', expect.any(Function)) + }) + + it('initializes on mouseleave', () => { + expect(mapOnMock).toBeCalledWith('mouseleave', 'markers', expect.any(Function)) + }) + + it('calls add map control', () => { + expect(mapAddControlMock).toBeCalled() + }) + + describe('trigger style load event', () => { + let spy + beforeEach(() => { + spy = jest.spyOn(wrapper.vm, 'loadMarkersIconsAndAddMarkers') + onEventMocks['style.load']() + }) + + it('calls loadMarkersIconsAndAddMarkers', () => { + expect(spy).toBeCalled() + }) + }) + + describe('trigger mouse enter event', () => { + beforeEach(() => { + onEventMocks.mouseenter({ + features: [ + { + geometry: { + coordinates: [100, 200], + }, + properties: { + type: 'user', + }, + }, + ], + lngLat: { + lng: 100, + lat: 200, + }, + }) + }) + + it('works without errors and warnings', () => { + expect(true).toBe(true) + }) + }) + }) + }) +}) diff --git a/webapp/pages/map.vue b/webapp/pages/map.vue new file mode 100644 index 000000000..1a34cbda1 --- /dev/null +++ b/webapp/pages/map.vue @@ -0,0 +1,499 @@ + + + + + + diff --git a/webapp/pages/moderation.spec.js b/webapp/pages/moderation.spec.js index 2eeae9f7c..8cdf755e9 100644 --- a/webapp/pages/moderation.spec.js +++ b/webapp/pages/moderation.spec.js @@ -1,7 +1,9 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import moderation from './moderation.vue' -config.stubs['nuxt-child'] = '' +const stubs = { + 'nuxt-child': true, +} const localVue = global.localVue @@ -20,6 +22,7 @@ describe('moderation.vue', () => { return mount(moderation, { mocks, localVue, + stubs, }) } @@ -28,7 +31,7 @@ describe('moderation.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) }) }) diff --git a/webapp/pages/moderation/index.spec.js b/webapp/pages/moderation/index.spec.js index 249752aa3..d5329e3b5 100644 --- a/webapp/pages/moderation/index.spec.js +++ b/webapp/pages/moderation/index.spec.js @@ -1,8 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Moderation from './index.vue' const localVue = global.localVue -config.stubs['client-only'] = '' + +const stubs = { + 'client-only': true, +} describe('moderation/index.vue', () => { let wrapper @@ -16,7 +19,7 @@ describe('moderation/index.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(Moderation, { mocks, localVue }) + return mount(Moderation, { mocks, localVue, stubs }) } beforeEach(() => { @@ -24,7 +27,7 @@ describe('moderation/index.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/notifications/index.spec.js b/webapp/pages/notifications/index.spec.js index 0afbbb325..75ec01be1 100644 --- a/webapp/pages/notifications/index.spec.js +++ b/webapp/pages/notifications/index.spec.js @@ -1,4 +1,4 @@ -import { config, shallowMount, mount } from '@vue/test-utils' +import { shallowMount, mount } from '@vue/test-utils' import NotificationsPage from './index.vue' import DropdownFilter from '~/components/DropdownFilter/DropdownFilter' @@ -8,7 +8,9 @@ import PaginationButtons from '~/components/_new/generic/PaginationButtons/Pagin import { markAsReadMutation, markAllAsReadMutation } from '~/graphql/User' const localVue = global.localVue -config.stubs['client-only'] = '' +const stubs = { + 'client-only': true, +} describe('PostIndex', () => { let wrapper, Wrapper, mocks, propsData, markAllAsReadButton @@ -43,6 +45,7 @@ describe('PostIndex', () => { mocks, localVue, propsData, + stubs, }) } wrapper = Wrapper() @@ -68,6 +71,7 @@ describe('PostIndex', () => { mocks, localVue, propsData, + stubs, }) } }) @@ -80,10 +84,9 @@ describe('PostIndex', () => { { label: 'Unread', value: false }, ] wrapper = Wrapper() - wrapper.find(DropdownFilter).vm.$emit('filter', propsData.filterOptions[1]) - markAllAsReadButton = wrapper.find('[data-test="markAllAsRead-button"]') expect(markAllAsReadButton).toBeTruthy() + wrapper.findComponent(DropdownFilter).vm.$emit('filter', propsData.filterOptions[1]) }) it('sets `notificationRead` to value of received option', () => { @@ -108,7 +111,9 @@ describe('PostIndex', () => { let expectedParams beforeEach(() => { wrapper = Wrapper() - wrapper.find(NotificationsTable).vm.$emit('markAllAsRead', 'notificationSourceId') + wrapper + .findComponentComponent(NotificationsTable) + .vm.$emit('markNotificationAsRead', 'notificationSourceId') }) it('calls markAllAsRead mutation', () => { @@ -123,7 +128,7 @@ describe('PostIndex', () => { beforeEach(() => { mocks.$apollo.mutate = jest.fn().mockRejectedValueOnce({ message: 'Some error message' }) wrapper = Wrapper() - wrapper.find(NotificationsTable).vm.$emit('markAllAsRead', 'notificationSourceId') + wrapper.findComponent(NotificationsTable).vm.$emit('markAllAsRead', 'notificationSourceId') }) it('shows an error message if there is an error', () => { @@ -156,7 +161,10 @@ describe('PostIndex', () => { mocks.$apollo.mutate = jest.fn().mockRejectedValueOnce({ message: 'Some error message' }) wrapper = Wrapper() // FIXME Should I remove next line? - wrapper.find(NotificationsTable).vm.$emit('markAllAsRead', 'notificationSourceId') + wrapper.findComponent(NotificationsTable).vm.$emit('markAllAsRead', 'notificationSourceId') + wrapper + .findComponent(NotificationsTable) + .vm.$emit('markNotificationAsRead', 'notificationSourceId') }) it('shows an error message if there is an error', () => { @@ -172,7 +180,7 @@ describe('PostIndex', () => { describe('next: given a user is on the first page', () => { it('adds offset to pageSize to skip first x notifications and display next page', () => { - wrapper.find(PaginationButtons).vm.$emit('next') + wrapper.findComponent(PaginationButtons).vm.$emit('next') expect(wrapper.vm.offset).toEqual(12) }) }) @@ -180,7 +188,7 @@ describe('PostIndex', () => { describe('back: given a user is on the third page', () => { it('sets offset when back is emitted', () => { wrapper.setData({ offset: 24 }) - wrapper.find(PaginationButtons).vm.$emit('back') + wrapper.findComponent(PaginationButtons).vm.$emit('back') expect(wrapper.vm.offset).toEqual(12) }) }) diff --git a/webapp/pages/organization.spec.js b/webapp/pages/organization.spec.js index 0d0946461..1829ac065 100644 --- a/webapp/pages/organization.spec.js +++ b/webapp/pages/organization.spec.js @@ -10,6 +10,10 @@ const assignMock = jest.fn() delete window.location window.location = { assign: assignMock } +const openMock = jest.fn() +delete window.open +window.open = openMock + describe('organization.vue', () => { let wrapper let mocks @@ -33,7 +37,7 @@ describe('organization.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/pages/password-reset.spec.js b/webapp/pages/password-reset.spec.js index 01052e89c..9337d1d59 100644 --- a/webapp/pages/password-reset.spec.js +++ b/webapp/pages/password-reset.spec.js @@ -1,11 +1,13 @@ import Vuex from 'vuex' -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import PasswordReset from './password-reset.vue' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['nuxt-child'] = '' +const stubs = { + 'client-only': true, + 'nuxt-child': true, +} describe('password-reset.vue', () => { let wrapper @@ -47,12 +49,13 @@ describe('password-reset.vue', () => { return mount(PasswordReset, { mocks, localVue, + stubs, }) } it('renders', async () => { wrapper = await Wrapper() - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) it('renders with asyncData and not loggedIn', async () => { diff --git a/webapp/pages/password-reset/enter-nonce.spec.js b/webapp/pages/password-reset/enter-nonce.spec.js index 664e1f7ca..2835fac4c 100644 --- a/webapp/pages/password-reset/enter-nonce.spec.js +++ b/webapp/pages/password-reset/enter-nonce.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import enterNonce from './enter-nonce.vue' const localVue = global.localVue -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} describe('enter-nonce.vue', () => { let wrapper @@ -20,7 +22,7 @@ describe('enter-nonce.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(enterNonce, { mocks, localVue }) + return mount(enterNonce, { mocks, localVue, stubs }) } beforeEach(() => { diff --git a/webapp/pages/password-reset/request.spec.js b/webapp/pages/password-reset/request.spec.js index f9bcefd79..622f377ee 100644 --- a/webapp/pages/password-reset/request.spec.js +++ b/webapp/pages/password-reset/request.spec.js @@ -1,10 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import request from './request.vue' const localVue = global.localVue -// config.stubs['sweetalert-icon'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} describe('request.vue', () => { let wrapper @@ -29,7 +30,7 @@ describe('request.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(request, { mocks, localVue }) + return mount(request, { mocks, localVue, stubs }) } beforeEach(() => { diff --git a/webapp/pages/post/_id/_slug/index.spec.js b/webapp/pages/post/_id/_slug/index.spec.js index 2dd4522b2..4528e64ee 100644 --- a/webapp/pages/post/_id/_slug/index.spec.js +++ b/webapp/pages/post/_id/_slug/index.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import Vue from 'vue' import PostSlug from './index.vue' @@ -6,10 +6,6 @@ import CommentList from '~/components/CommentList/CommentList' import HcHashtag from '~/components/Hashtag/Hashtag' import VueMeta from 'vue-meta' -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' -config.stubs['router-link'] = '' - const localVue = global.localVue localVue.directive('scrollTo', jest.fn()) localVue.use(VueMeta, { keyName: 'head' }) @@ -81,6 +77,9 @@ describe('PostSlug', () => { }, } stubs = { + 'client-only': true, + 'nuxt-link': true, + 'router-link': true, HcEditor: { render: () => {}, methods: { insertReply: jest.fn(() => null) } }, ContentViewer: true, } @@ -148,7 +147,7 @@ describe('PostSlug', () => { describe('reply method called when emitted reply received', () => { it('CommentList', async () => { wrapper = await Wrapper() - wrapper.find(CommentList).vm.$emit('reply', { + wrapper.findComponent(CommentList).vm.$emit('reply', { id: 'commentAuthorId', slug: 'ogerly', }) @@ -176,12 +175,12 @@ describe('PostSlug', () => { it('are present', async () => { // Get length from backendData and compare against number of tags present in component. - expect(wrapper.findAll(HcHashtag).length).toBe(backendData.post.tags.length) + expect(wrapper.findAllComponents(HcHashtag).length).toBe(backendData.post.tags.length) }) it('are alphabetically ordered', async () => { // Get all HcHastag components - const wrappers = wrapper.findAll(HcHashtag).wrappers + const wrappers = wrapper.findAllComponents(HcHashtag).wrappers // Exctract ID properties (tag names) from component. const ids = [] wrappers.forEach((x) => { diff --git a/webapp/pages/post/_id/_slug/index.vue b/webapp/pages/post/_id/_slug/index.vue index 2366eb072..6e104bc53 100644 --- a/webapp/pages/post/_id/_slug/index.vue +++ b/webapp/pages/post/_id/_slug/index.vue @@ -61,7 +61,7 @@ { let wrapper @@ -19,6 +21,7 @@ describe('Profile _id.vue', () => { return mount(_id, { mocks, localVue, + stubs, }) } @@ -27,7 +30,7 @@ describe('Profile _id.vue', () => { }) it('renders', () => { - expect(wrapper.findAll('.nuxt-child')).toHaveLength(1) + expect(wrapper.findComponent({ name: 'nuxt-child' }).exists()).toBe(true) }) }) }) diff --git a/webapp/pages/profile/_id/_slug.spec.js b/webapp/pages/profile/_id/_slug.spec.js index 477174485..5ab87ad3a 100644 --- a/webapp/pages/profile/_id/_slug.spec.js +++ b/webapp/pages/profile/_id/_slug.spec.js @@ -1,15 +1,18 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import ProfileSlug from './_slug.vue' const localVue = global.localVue localVue.filter('date', (d) => d) -config.stubs['client-only'] = '' -config.stubs['v-popover'] = '' -config.stubs['nuxt-link'] = '' -config.stubs['infinite-loading'] = '' -config.stubs['follow-list'] = '' +const stubs = { + 'client-only': true, + 'v-popover': true, + 'nuxt-link': true, + 'infinite-loading': true, + 'follow-list': true, + 'router-link': true, +} describe('ProfileSlug', () => { let wrapper @@ -51,6 +54,7 @@ describe('ProfileSlug', () => { return mount(ProfileSlug, { mocks, localVue, + stubs, }) } diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue index e97b4cc9e..a2b959b6d 100644 --- a/webapp/pages/profile/_id/_slug.vue +++ b/webapp/pages/profile/_id/_slug.vue @@ -83,7 +83,9 @@ @@ -184,8 +186,7 @@ import MasonryGrid from '~/components/MasonryGrid/MasonryGrid.vue' import MasonryGridItem from '~/components/MasonryGrid/MasonryGridItem.vue' import TabNavigation from '~/components/_new/generic/TabNavigation/TabNavigation' import { profilePagePosts } from '~/graphql/PostQuery' -import UserQuery from '~/graphql/User' -import { updateUserMutation } from '~/graphql/User.js' +import { profileUserQuery, updateUserMutation } from '~/graphql/User' import { muteUser, unmuteUser } from '~/graphql/settings/MutedUsers' import { blockUser, unblockUser } from '~/graphql/settings/BlockedUsers' import UpdateQuery from '~/components/utils/UpdateQuery' @@ -408,7 +409,7 @@ export default { }, User: { query() { - return UserQuery(this.$i18n) + return profileUserQuery(this.$i18n) }, variables() { return { diff --git a/webapp/pages/registration.spec.js b/webapp/pages/registration.spec.js index 3e17619a8..a276c2b8b 100644 --- a/webapp/pages/registration.spec.js +++ b/webapp/pages/registration.spec.js @@ -1,14 +1,16 @@ import Vuex from 'vuex' -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Registration from './registration.vue' import Vue from 'vue' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['router-link'] = '' -config.stubs['nuxt-link'] = '' -config.stubs['infinite-loading'] = '' +const stubs = { + 'client-only': true, + 'router-link': true, + 'nuxt-link': true, + 'infinite-loading': true, +} describe('Registration', () => { let wrapper @@ -73,6 +75,7 @@ describe('Registration', () => { return mount(Registration, { mocks, localVue, + stubs, }) } @@ -310,7 +313,7 @@ describe('Registration', () => { it('renders', async () => { wrapper = await Wrapper() - expect(wrapper.is('.registration-slider')).toBe(true) + expect(wrapper.classes('registration-slider')).toBe(true) }) // The asyncTests must go last diff --git a/webapp/pages/search/search-results.spec.js b/webapp/pages/search/search-results.spec.js index c594f3e56..083e8a9e9 100644 --- a/webapp/pages/search/search-results.spec.js +++ b/webapp/pages/search/search-results.spec.js @@ -1,11 +1,13 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import searchResults from './search-results.vue' import VueMeta from 'vue-meta' const localVue = global.localVue localVue.use(VueMeta, { keyName: 'head' }) -config.stubs['client-only'] = '' +const stubs = { + 'client-only': true, +} describe('search-results.vue', () => { let wrapper @@ -32,7 +34,7 @@ describe('search-results.vue', () => { return { ...data, ...aData } } } - return mount(searchResults, { mocks, localVue }) + return mount(searchResults, { mocks, localVue, stubs }) } it('renders', async () => { diff --git a/webapp/pages/settings.spec.js b/webapp/pages/settings.spec.js index 353f1e6b8..0f3c6e22c 100644 --- a/webapp/pages/settings.spec.js +++ b/webapp/pages/settings.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import settings from './settings.vue' const localVue = global.localVue -config.stubs['nuxt-child'] = '' +const stubs = { + 'nuxt-child': true, +} describe('settings.vue', () => { let wrapper @@ -20,6 +22,7 @@ describe('settings.vue', () => { return mount(settings, { mocks, localVue, + stubs, }) } @@ -28,7 +31,7 @@ describe('settings.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) }) }) diff --git a/webapp/pages/settings/blocked-users.spec.js b/webapp/pages/settings/blocked-users.spec.js index 8c657392d..ee4348d0e 100644 --- a/webapp/pages/settings/blocked-users.spec.js +++ b/webapp/pages/settings/blocked-users.spec.js @@ -1,4 +1,4 @@ -import { config, mount, createLocalVue } from '@vue/test-utils' +import { mount, createLocalVue } from '@vue/test-utils' import BlockedUsers from './blocked-users.vue' import Styleguide from '@human-connection/styleguide' import Filters from '~/plugins/vue-filters' @@ -9,7 +9,9 @@ const localVue = createLocalVue() localVue.use(Styleguide) localVue.use(Filters) -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} describe('blocked-users.vue', () => { let wrapper @@ -35,7 +37,7 @@ describe('blocked-users.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(BlockedUsers, { mocks, localVue }) + return mount(BlockedUsers, { mocks, localVue, stubs }) } beforeEach(() => { @@ -43,7 +45,7 @@ describe('blocked-users.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) describe('given a list of blocked users', () => { diff --git a/webapp/pages/settings/data-download.spec.js b/webapp/pages/settings/data-download.spec.js index b50c8d046..7a71ef3f1 100644 --- a/webapp/pages/settings/data-download.spec.js +++ b/webapp/pages/settings/data-download.spec.js @@ -26,7 +26,7 @@ describe('data-download.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/settings/delete-account.spec.js b/webapp/pages/settings/delete-account.spec.js index aa8ffd954..c55e6bf83 100644 --- a/webapp/pages/settings/delete-account.spec.js +++ b/webapp/pages/settings/delete-account.spec.js @@ -36,7 +36,7 @@ describe('delete-account.vue', () => { }) it('renders', () => { - expect(wrapper.is('.delete-data')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/settings/embeds.spec.js b/webapp/pages/settings/embeds.spec.js index 75247ddf0..aa79d1787 100644 --- a/webapp/pages/settings/embeds.spec.js +++ b/webapp/pages/settings/embeds.spec.js @@ -36,7 +36,7 @@ describe('embeds.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/settings/index.spec.js b/webapp/pages/settings/index.spec.js index 01d68e029..0de675840 100644 --- a/webapp/pages/settings/index.spec.js +++ b/webapp/pages/settings/index.spec.js @@ -87,7 +87,7 @@ describe('index.vue', () => { }) it('renders', () => { - expect(Wrapper().contains('div')).toBe(true) + expect(Wrapper().element.tagName).toBe('FORM') }) describe('given form validation errors', () => { diff --git a/webapp/pages/settings/index.vue b/webapp/pages/settings/index.vue index b060e1327..6cae7e44c 100644 --- a/webapp/pages/settings/index.vue +++ b/webapp/pages/settings/index.vue @@ -1,5 +1,5 @@