From 0eb108a2b2aefc048e1d566c985ac1c1774163ad Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 13:42:57 +0200 Subject: [PATCH 001/344] Add fyphe_O repository as sumbodule --- .gitmodules | 3 +++ fyphe_O | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 fyphe_O diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..24044b129 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "fyphe_O"] + path = fyphe_O + url = https://github.com/The-Schools-in-Motion-Network/fyphe_O.git diff --git a/fyphe_O b/fyphe_O new file mode 160000 index 000000000..c9dc7d9b5 --- /dev/null +++ b/fyphe_O @@ -0,0 +1 @@ +Subproject commit c9dc7d9b5ea014821c64c1f56e36e7e8698b37b7 From f26f83d5ef1572f052507e969a2528e375de04e9 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 13:43:13 +0200 Subject: [PATCH 002/344] Build neo4j docker image on Github --- .github/workflows/cd.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/cd.yml diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 000000000..ed3cfcbf2 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,19 @@ +name: Continuous deployment + +on: + push: + branches: [ master ] + +jobs: + build: + name: Build and push docker image + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + submodules: recursive + - name: Build and push Docker images + uses: docker/build-push-action@v1.1.0 + with: + path: fyphe_O/neo4j/ From b4dc46e0c9de8d91e6b30fa1c46a67d9199fb888 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 14:47:01 +0200 Subject: [PATCH 003/344] Push docker images --- .github/workflows/cd.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index ed3cfcbf2..2543a2c17 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -1,4 +1,4 @@ -name: Continuous deployment +name: CD on: push: @@ -6,14 +6,28 @@ on: jobs: build: - name: Build and push docker image + name: Build and push docker images runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 with: submodules: recursive - - name: Build and push Docker images + - name: Build neo4j uses: docker/build-push-action@v1.1.0 with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} path: fyphe_O/neo4j/ + - name: Build backend + uses: docker/build-push-action@v1.1.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + path: fyphe_O/backend/ + - name: Build webapp + uses: docker/build-push-action@v1.1.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + path: fyphe_O/webapp/ From 81631f0bd52add006bb54bfd09adf023bf436f01 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 14:52:03 +0200 Subject: [PATCH 004/344] Add missing repositories --- .github/workflows/cd.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 2543a2c17..fc12edc54 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -16,18 +16,21 @@ jobs: - name: Build neo4j uses: docker/build-push-action@v1.1.0 with: + repository: schoolsinmotion/neo4j username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} path: fyphe_O/neo4j/ - name: Build backend uses: docker/build-push-action@v1.1.0 with: + repository: schoolsinmotion/backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} path: fyphe_O/backend/ - name: Build webapp uses: docker/build-push-action@v1.1.0 with: + repository: schoolsinmotion/webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} path: fyphe_O/webapp/ From df6a8bd78f50474940fc8a3bfc2cf7d6ead5323c Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 14:58:09 +0200 Subject: [PATCH 005/344] Add tag `latest` --- .github/workflows/cd.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index fc12edc54..5fde8369a 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -19,6 +19,7 @@ jobs: repository: schoolsinmotion/neo4j username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + tag: latest path: fyphe_O/neo4j/ - name: Build backend uses: docker/build-push-action@v1.1.0 @@ -26,6 +27,7 @@ jobs: repository: schoolsinmotion/backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + tag: latest path: fyphe_O/backend/ - name: Build webapp uses: docker/build-push-action@v1.1.0 @@ -33,4 +35,5 @@ jobs: repository: schoolsinmotion/webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + tag: latest path: fyphe_O/webapp/ From d804c7233e60ff350f707fae50a572011635d04b Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 15:04:32 +0200 Subject: [PATCH 006/344] Explicitly set push to true --- .github/workflows/cd.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 5fde8369a..a20888131 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -21,6 +21,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tag: latest path: fyphe_O/neo4j/ + push: true - name: Build backend uses: docker/build-push-action@v1.1.0 with: @@ -29,6 +30,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tag: latest path: fyphe_O/backend/ + push: true - name: Build webapp uses: docker/build-push-action@v1.1.0 with: @@ -36,4 +38,5 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tag: latest + push: true path: fyphe_O/webapp/ From 1a8ccfa2c1bc80c23b8295baf9df362155490e9c Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 15:09:15 +0200 Subject: [PATCH 007/344] Just ran into https://github.com/docker/build-push-action/issues/48 --- .github/workflows/cd.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index a20888131..ed09a3dbe 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -19,24 +19,21 @@ jobs: repository: schoolsinmotion/neo4j username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - tag: latest + tags: latest path: fyphe_O/neo4j/ - push: true - name: Build backend uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - tag: latest + tags: latest path: fyphe_O/backend/ - push: true - name: Build webapp uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - tag: latest - push: true + tags: latest path: fyphe_O/webapp/ From 3fff866a55d4c9f06d28b16a0b44568b61ebd06c Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 21:19:05 +0200 Subject: [PATCH 008/344] Rebrand step proof of concept --- .github/workflows/cd.yml | 2 + webapp/static/favicon.ico | 105 ++++++++++++++++++++++++++++++++++++++ webapp/static/icon.png | Bin 0 -> 11162 bytes webapp/static/icon.svg | 105 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 212 insertions(+) create mode 100644 webapp/static/favicon.ico create mode 100644 webapp/static/icon.png create mode 100644 webapp/static/icon.svg diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index ed09a3dbe..9a458fef9 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -13,6 +13,8 @@ jobs: uses: actions/checkout@v2 with: submodules: recursive + - name: Rebrand + run: cp webapp/* fyphe_O/webapp/ - name: Build neo4j uses: docker/build-push-action@v1.1.0 with: diff --git a/webapp/static/favicon.ico b/webapp/static/favicon.ico new file mode 100644 index 000000000..8be72e739 --- /dev/null +++ b/webapp/static/favicon.ico @@ -0,0 +1,105 @@ + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Whale + 2008-10-24T04:19:54 + Cartoon diagram of a whale + http://openclipart.org/detail/19703/whale-by-stumbles + + + stumbles + + + + + animal + clip art + clipart + fish + image + mammal + media + png + public domain + svg + whale + + + + + + + + + + + diff --git a/webapp/static/icon.png b/webapp/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a119207eda609b3060f7b2327d751caa1a2f71 GIT binary patch literal 11162 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 + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Whale + 2008-10-24T04:19:54 + Cartoon diagram of a whale + http://openclipart.org/detail/19703/whale-by-stumbles + + + stumbles + + + + + animal + clip art + clipart + fish + image + mammal + media + png + public domain + svg + whale + + + + + + + + + + + From c2d52f19d1b286b7c40f86e6d7a864be7015b50f Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 21:30:11 +0200 Subject: [PATCH 009/344] More files --- webapp/static/img/sign-up/alpha-invite.png | Bin 0 -> 15154 bytes webapp/static/img/sign-up/alpha-invite2x.png | Bin 0 -> 15154 bytes webapp/static/img/sign-up/humanconnection.png | Bin 0 -> 15154 bytes webapp/static/img/sign-up/nicetomeetyou.png | Bin 0 -> 15154 bytes webapp/static/img/sign-up/nicetomeetyou.svg | 1 + webapp/static/img/sign-up/onourjourney.png | Bin 0 -> 15154 bytes webapp/static/img/sign-up/onourjourney.svg | 1 + webapp/static/img/sign-up/robots.png | Bin 0 -> 15154 bytes webapp/static/img/sign-up/robots.svg | 1 + 9 files changed, 3 insertions(+) create mode 100644 webapp/static/img/sign-up/alpha-invite.png create mode 100644 webapp/static/img/sign-up/alpha-invite2x.png create mode 100644 webapp/static/img/sign-up/humanconnection.png create mode 100644 webapp/static/img/sign-up/nicetomeetyou.png create mode 100644 webapp/static/img/sign-up/nicetomeetyou.svg create mode 100644 webapp/static/img/sign-up/onourjourney.png create mode 100644 webapp/static/img/sign-up/onourjourney.svg create mode 100644 webapp/static/img/sign-up/robots.png create mode 100644 webapp/static/img/sign-up/robots.svg diff --git a/webapp/static/img/sign-up/alpha-invite.png b/webapp/static/img/sign-up/alpha-invite.png new file mode 100644 index 0000000000000000000000000000000000000000..f368f9985169206b44c3496d326fcc34ff5c304b GIT binary patch literal 15154 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 \ No newline at end of file diff --git a/webapp/static/img/sign-up/onourjourney.png b/webapp/static/img/sign-up/onourjourney.png new file mode 100644 index 0000000000000000000000000000000000000000..f368f9985169206b44c3496d326fcc34ff5c304b GIT binary patch literal 15154 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 \ No newline at end of file diff --git a/webapp/static/img/sign-up/robots.png b/webapp/static/img/sign-up/robots.png new file mode 100644 index 0000000000000000000000000000000000000000..f368f9985169206b44c3496d326fcc34ff5c304b GIT binary patch literal 15154 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 \ No newline at end of file From edfdcb6bc672865ea1856b6fbfd27f630fbe8ab6 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Thu, 4 Jun 2020 21:43:30 +0200 Subject: [PATCH 010/344] Recursive copy --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 9a458fef9..fdb6c4006 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -14,7 +14,7 @@ jobs: with: submodules: recursive - name: Rebrand - run: cp webapp/* fyphe_O/webapp/ + run: cp -r webapp/* fyphe_O/webapp/ - name: Build neo4j uses: docker/build-push-action@v1.1.0 with: From 4a2d4317a5a53252b0d813eaba35b35ca140081a Mon Sep 17 00:00:00 2001 From: roschaefer Date: Fri, 5 Jun 2020 00:14:17 +0200 Subject: [PATCH 011/344] Replace logo on login page --- webapp/static/img/sign-up/humanconnection.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 webapp/static/img/sign-up/humanconnection.svg diff --git a/webapp/static/img/sign-up/humanconnection.svg b/webapp/static/img/sign-up/humanconnection.svg new file mode 100644 index 000000000..44765d64b --- /dev/null +++ b/webapp/static/img/sign-up/humanconnection.svg @@ -0,0 +1 @@ + \ No newline at end of file From ab7d88501764d1d2cc6a667f2e6605333107fc94 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 09:19:32 +0200 Subject: [PATCH 012/344] Set submodule to rebranding --- fyphe_O | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fyphe_O b/fyphe_O index c9dc7d9b5..36679da84 160000 --- a/fyphe_O +++ b/fyphe_O @@ -1 +1 @@ -Subproject commit c9dc7d9b5ea014821c64c1f56e36e7e8698b37b7 +Subproject commit 36679da84dd59b60fa26e2de2be369cbc134cd1a From 3c698e107c5f722aff4eb2561581af8f0e381623 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 10:43:10 +0200 Subject: [PATCH 013/344] Fix paths --- .../humanconnection.svg => custom/logout.svg} | 0 .../password-reset.svg} | 0 .../onourjourney.svg => custom/sign-up.svg} | 0 .../robots.svg => custom/under-maintenance.svg} | 0 webapp/static/img/custom/welcome.svg | 1 + webapp/static/img/sign-up/alpha-invite.png | Bin 15154 -> 0 bytes webapp/static/img/sign-up/alpha-invite2x.png | Bin 15154 -> 0 bytes webapp/static/img/sign-up/humanconnection.png | Bin 15154 -> 0 bytes webapp/static/img/sign-up/nicetomeetyou.png | Bin 15154 -> 0 bytes webapp/static/img/sign-up/onourjourney.png | Bin 15154 -> 0 bytes webapp/static/img/sign-up/robots.png | Bin 15154 -> 0 bytes 11 files changed, 1 insertion(+) rename webapp/static/img/{sign-up/humanconnection.svg => custom/logout.svg} (100%) rename webapp/static/img/{sign-up/nicetomeetyou.svg => custom/password-reset.svg} (100%) rename webapp/static/img/{sign-up/onourjourney.svg => custom/sign-up.svg} (100%) rename webapp/static/img/{sign-up/robots.svg => custom/under-maintenance.svg} (100%) create mode 100644 webapp/static/img/custom/welcome.svg delete mode 100644 webapp/static/img/sign-up/alpha-invite.png delete mode 100644 webapp/static/img/sign-up/alpha-invite2x.png delete mode 100644 webapp/static/img/sign-up/humanconnection.png delete mode 100644 webapp/static/img/sign-up/nicetomeetyou.png delete mode 100644 webapp/static/img/sign-up/onourjourney.png delete mode 100644 webapp/static/img/sign-up/robots.png diff --git a/webapp/static/img/sign-up/humanconnection.svg b/webapp/static/img/custom/logout.svg similarity index 100% rename from webapp/static/img/sign-up/humanconnection.svg rename to webapp/static/img/custom/logout.svg diff --git a/webapp/static/img/sign-up/nicetomeetyou.svg b/webapp/static/img/custom/password-reset.svg similarity index 100% rename from webapp/static/img/sign-up/nicetomeetyou.svg rename to webapp/static/img/custom/password-reset.svg diff --git a/webapp/static/img/sign-up/onourjourney.svg b/webapp/static/img/custom/sign-up.svg similarity index 100% rename from webapp/static/img/sign-up/onourjourney.svg rename to webapp/static/img/custom/sign-up.svg diff --git a/webapp/static/img/sign-up/robots.svg b/webapp/static/img/custom/under-maintenance.svg similarity index 100% rename from webapp/static/img/sign-up/robots.svg rename to webapp/static/img/custom/under-maintenance.svg diff --git a/webapp/static/img/custom/welcome.svg b/webapp/static/img/custom/welcome.svg new file mode 100644 index 000000000..44765d64b --- /dev/null +++ b/webapp/static/img/custom/welcome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/webapp/static/img/sign-up/alpha-invite.png b/webapp/static/img/sign-up/alpha-invite.png deleted file mode 100644 index f368f9985169206b44c3496d326fcc34ff5c304b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15154 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 Date: Mon, 8 Jun 2020 11:56:43 +0200 Subject: [PATCH 014/344] Common base image strategy --- backend/Dockerfile | 1 + docker-compose.yml | 69 ++++++++++++++++++++++++++++++++++++++++++++++ fyphe_O | 2 +- neo4j/Dockerfile | 1 + webapp/Dockerfile | 2 ++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 backend/Dockerfile create mode 100644 docker-compose.yml create mode 100644 neo4j/Dockerfile create mode 100644 webapp/Dockerfile diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 000000000..e2bd079d5 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1 @@ +FROM humanconnection/backend:build-and-test diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..2beb1990e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,69 @@ +version: "3.4" + +services: + webapp: + image: schoolsinmotion/webapp:latest + build: + context: webapp + ports: + - 3000:3000 + - 3002:3002 + networks: + - hc-network + depends_on: + - backend + volumes: + - webapp_node_modules:/webapp/node_modules + environment: + - HOST=0.0.0.0 + - GRAPHQL_URI=http://backend:4000 + - MAPBOX_TOKEN="pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.bZ8KK9l70omjXbEkkbHGsQ" + - PUBLIC_REGISTRATION=true + command: yarn run dev + backend: + image: schoolsinmotion/backend:latest + build: + context: backend + networks: + - hc-network + depends_on: + - neo4j + ports: + - 4000:4000 + volumes: + - backend_node_modules:/backend/node_modules + - uploads:/backend/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.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.KZ8KK9l70omjXbEkkbHGsQ + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - "DEBUG=${DEBUG}" + - EMAIL_SUPPORT=support@human-connection.org + - EMAIL_DEFAULT_SENDER=info@human-connection.org + - PUBLIC_REGISTRATION=true + command: yarn run dev + neo4j: + image: schoolsinmotion/neo4j:latest + build: + context: neo4j + networks: + - hc-network + environment: + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + ports: + - 7687:7687 + - 7474:7474 + volumes: + - neo4j_data:/data +networks: + hc-network: +volumes: + webapp_node_modules: + backend_node_modules: + neo4j_data: + uploads: diff --git a/fyphe_O b/fyphe_O index 36679da84..fc26c00c2 160000 --- a/fyphe_O +++ b/fyphe_O @@ -1 +1 @@ -Subproject commit 36679da84dd59b60fa26e2de2be369cbc134cd1a +Subproject commit fc26c00c259b8e5a0b640233bf4b0b14c112de68 diff --git a/neo4j/Dockerfile b/neo4j/Dockerfile new file mode 100644 index 000000000..9e455d3ac --- /dev/null +++ b/neo4j/Dockerfile @@ -0,0 +1 @@ +FROM humanconnection/neo4j:latest diff --git a/webapp/Dockerfile b/webapp/Dockerfile new file mode 100644 index 000000000..f638beb6a --- /dev/null +++ b/webapp/Dockerfile @@ -0,0 +1,2 @@ +FROM humanconnection/webapp:build-and-test +COPY static/ static/ From 178e8fe1bb50e9780d1b23281ea0319a681d26c2 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 13:50:50 +0200 Subject: [PATCH 015/344] Delete fyphe_O submodule --- .gitmodules | 3 --- fyphe_O | 1 - 2 files changed, 4 deletions(-) delete mode 160000 fyphe_O diff --git a/.gitmodules b/.gitmodules index 24044b129..e69de29bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "fyphe_O"] - path = fyphe_O - url = https://github.com/The-Schools-in-Motion-Network/fyphe_O.git diff --git a/fyphe_O b/fyphe_O deleted file mode 160000 index fc26c00c2..000000000 --- a/fyphe_O +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fc26c00c259b8e5a0b640233bf4b0b14c112de68 From 0a6c222a95cddb92f04c6c0dce093be58ddd8063 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 14:17:47 +0200 Subject: [PATCH 016/344] Configure Github actions to build base images --- .github/workflows/cd.yml | 40 ++++++++++++++++++++++++++++++++-------- .gitmodules | 3 +++ Human-Connection | 1 + docker-compose.yml | 18 ------------------ 4 files changed, 36 insertions(+), 26 deletions(-) create mode 160000 Human-Connection diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index fdb6c4006..1e130916f 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -13,29 +13,53 @@ jobs: uses: actions/checkout@v2 with: submodules: recursive - - name: Rebrand - run: cp -r webapp/* fyphe_O/webapp/ - - name: Build neo4j + + - name: Build neo4j base image + uses: docker/build-push-action@v1.1.0 + with: + repository: humanconnection/neo4j + tags: latest + path: Human-Connection/neo4j/ + push: false + - name: Build backend base image + uses: docker/build-push-action@v1.1.0 + with: + repository: humanconnection/backend + tags: latest + path: Human-Connection/backend/ + push: false + - name: Build webapp base image + uses: docker/build-push-action@v1.1.0 + with: + repository: humanconnection/webapp + tags: latest + path: Human-Connection/webapp/ + push: false + + - name: Build neo4j customized image uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/neo4j username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest - path: fyphe_O/neo4j/ - - name: Build backend + path: neo4j/ + push: true + - name: Build backend customized image uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest - path: fyphe_O/backend/ - - name: Build webapp + path: backend/ + push: true + - name: Build webapp customized image uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest - path: fyphe_O/webapp/ + path: webapp/ + push: true diff --git a/.gitmodules b/.gitmodules index e69de29bb..518958a09 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Human-Connection"] + path = Human-Connection + url = https://github.com/The-Schools-in-Motion-Network/fyphe_O.git diff --git a/Human-Connection b/Human-Connection new file mode 160000 index 000000000..73c1f3c88 --- /dev/null +++ b/Human-Connection @@ -0,0 +1 @@ +Subproject commit 73c1f3c88bd13ecfd520b76bb396e4ec460f9d79 diff --git a/docker-compose.yml b/docker-compose.yml index 2beb1990e..7aaffeb63 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,6 @@ version: "3.4" services: webapp: image: schoolsinmotion/webapp:latest - build: - context: webapp ports: - 3000:3000 - 3002:3002 @@ -12,8 +10,6 @@ services: - hc-network depends_on: - backend - volumes: - - webapp_node_modules:/webapp/node_modules environment: - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 @@ -22,17 +18,12 @@ services: command: yarn run dev backend: image: schoolsinmotion/backend:latest - build: - context: backend networks: - hc-network depends_on: - neo4j ports: - 4000:4000 - volumes: - - backend_node_modules:/backend/node_modules - - uploads:/backend/public/uploads environment: - NEO4J_URI=bolt://neo4j:7687 - GRAPHQL_URI=http://backend:4000 @@ -47,8 +38,6 @@ services: command: yarn run dev neo4j: image: schoolsinmotion/neo4j:latest - build: - context: neo4j networks: - hc-network environment: @@ -58,12 +47,5 @@ services: ports: - 7687:7687 - 7474:7474 - volumes: - - neo4j_data:/data networks: hc-network: -volumes: - webapp_node_modules: - backend_node_modules: - neo4j_data: - uploads: From 7ec4d886760a5213150c2b1dcfb7e5d68d23d16b Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 14:27:55 +0200 Subject: [PATCH 017/344] Random try to fix strange error Backend and Neo4j base images are built fine but Github fails to build `humanconnection/webapp` docker image. Is a request made to dockerhub to see if the repository exists? Even if the resulting image is not being pushed to dockerhub? What really bugs me is that `humanconnection/backend` does not exist anymore and yet the Github actions runs fine building that image. --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1e130916f..c4d7061ad 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -31,7 +31,7 @@ jobs: - name: Build webapp base image uses: docker/build-push-action@v1.1.0 with: - repository: humanconnection/webapp + repository: humanconnection/nitro-web tags: latest path: Human-Connection/webapp/ push: false From d3664ee17843242226d6776bece3e7b35783f300 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 14:32:20 +0200 Subject: [PATCH 018/344] WTF OK, let's add obsolete dockerhub repositories --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index c4d7061ad..7cf83670d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,7 +24,7 @@ jobs: - name: Build backend base image uses: docker/build-push-action@v1.1.0 with: - repository: humanconnection/backend + repository: humanconnection/nitro-backend tags: latest path: Human-Connection/backend/ push: false From 722b7bf6872dbe9cce92971d16624fc083df466f Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 14:51:54 +0200 Subject: [PATCH 019/344] Addding cache_from changes anything? --- .github/workflows/cd.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 7cf83670d..13968688b 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -44,7 +44,8 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: neo4j/ - push: true + cache_from: humanconnection/neo4j:latest + push: false - name: Build backend customized image uses: docker/build-push-action@v1.1.0 with: @@ -53,7 +54,8 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: backend/ - push: true + cache_from: humanconnection/backend:build-and-test + push: false - name: Build webapp customized image uses: docker/build-push-action@v1.1.0 with: @@ -62,4 +64,5 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: webapp/ - push: true + cache_from: humanconnection/webapp:build-and-test + push: false From b93489fe14f018ab2470a9fbea73cc5936b7e780 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 15:19:12 +0200 Subject: [PATCH 020/344] Remove all humanconnection dockerhub repos I'm experiencing non-determinstic behaviour when I configure a repsitory which does not exist on dockerhub or is not part of the schoolsinmotion organization. Therefore I'm going to use a tag `bare` for the base images. --- .github/workflows/cd.yml | 21 +++++++++------------ backend/Dockerfile | 2 +- docker-compose.yml | 3 --- neo4j/Dockerfile | 2 +- webapp/Dockerfile | 3 ++- webapp/constants/emails.js | 4 ++++ webapp/constants/links.js | 7 +++++++ webapp/constants/manifest.js | 7 +++++++ 8 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 webapp/constants/emails.js create mode 100644 webapp/constants/links.js create mode 100644 webapp/constants/manifest.js diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 13968688b..c3e04aae5 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -17,22 +17,22 @@ jobs: - name: Build neo4j base image uses: docker/build-push-action@v1.1.0 with: - repository: humanconnection/neo4j - tags: latest + repository: schoolsinmotion/neo4j + tags: bare path: Human-Connection/neo4j/ push: false - name: Build backend base image uses: docker/build-push-action@v1.1.0 with: - repository: humanconnection/nitro-backend - tags: latest + repository: schoolsinmotion/nitro-backend + tags: bare path: Human-Connection/backend/ push: false - name: Build webapp base image uses: docker/build-push-action@v1.1.0 with: - repository: humanconnection/nitro-web - tags: latest + repository: schoolsinmotion/nitro-web + tags: bare path: Human-Connection/webapp/ push: false @@ -44,8 +44,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: neo4j/ - cache_from: humanconnection/neo4j:latest - push: false + push: true - name: Build backend customized image uses: docker/build-push-action@v1.1.0 with: @@ -54,8 +53,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: backend/ - cache_from: humanconnection/backend:build-and-test - push: false + push: true - name: Build webapp customized image uses: docker/build-push-action@v1.1.0 with: @@ -64,5 +62,4 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: webapp/ - cache_from: humanconnection/webapp:build-and-test - push: false + push: true diff --git a/backend/Dockerfile b/backend/Dockerfile index e2bd079d5..860cb5255 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1 +1 @@ -FROM humanconnection/backend:build-and-test +FROM schoolsinmotion/backend:bare diff --git a/docker-compose.yml b/docker-compose.yml index 7aaffeb63..b69da643c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,6 @@ services: image: schoolsinmotion/webapp:latest ports: - 3000:3000 - - 3002:3002 networks: - hc-network depends_on: @@ -31,7 +30,6 @@ services: - JWT_SECRET=b/&&7b78BF&fv/Vd - MAPBOX_TOKEN=pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.KZ8KK9l70omjXbEkkbHGsQ - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 - - "DEBUG=${DEBUG}" - EMAIL_SUPPORT=support@human-connection.org - EMAIL_DEFAULT_SENDER=info@human-connection.org - PUBLIC_REGISTRATION=true @@ -46,6 +44,5 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 - - 7474:7474 networks: hc-network: diff --git a/neo4j/Dockerfile b/neo4j/Dockerfile index 9e455d3ac..bb20ebc6c 100644 --- a/neo4j/Dockerfile +++ b/neo4j/Dockerfile @@ -1 +1 @@ -FROM humanconnection/neo4j:latest +FROM schoolsinmotion/neo4j:bare diff --git a/webapp/Dockerfile b/webapp/Dockerfile index f638beb6a..d3cd59181 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,2 +1,3 @@ -FROM humanconnection/webapp:build-and-test +FROM schoolsinmotion/webapp:bare COPY static/ static/ +COPY constants/ constants/ diff --git a/webapp/constants/emails.js b/webapp/constants/emails.js new file mode 100644 index 000000000..5a69681ce --- /dev/null +++ b/webapp/constants/emails.js @@ -0,0 +1,4 @@ +export default { + SUPPORT: 'support-schools-in-motion@roschaefer.de', + MODERATION: 'moderation-schools-in-motion@roschaefer.de', +} diff --git a/webapp/constants/links.js b/webapp/constants/links.js new file mode 100644 index 000000000..36ee42370 --- /dev/null +++ b/webapp/constants/links.js @@ -0,0 +1,7 @@ +export default { + ORGANIZATION: 'https://www.youth-and-arts.nrw/', + DONATE: 'https://www.youth-and-arts.nrw/de/kontakt', + IMPRINT: 'https://www.youth-and-arts.nrw/de/impressum', + DATA_PRIVACY: 'https://www.youth-and-arts.nrw/de/datenschutzerklaerung', + FAQ: 'https://www.youth-and-arts.nrw/de/kontakt', +} diff --git a/webapp/constants/manifest.js b/webapp/constants/manifest.js new file mode 100644 index 000000000..95a9dea30 --- /dev/null +++ b/webapp/constants/manifest.js @@ -0,0 +1,7 @@ +export default { + name: 'fyphe_O', + short_name: 'fO', + description: 'The schools in motion network', + theme_color: '#17b53f', + lang: 'en', +} From aa7e30f2871ad534e2072945fa63865cf12f2762 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 15:46:29 +0200 Subject: [PATCH 021/344] Push bare image tag to make build server happy --- .github/workflows/cd.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index c3e04aae5..922279e6e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -18,23 +18,26 @@ jobs: uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/neo4j + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} tags: bare path: Human-Connection/neo4j/ - push: false - name: Build backend base image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/nitro-backend + repository: schoolsinmotion/backend + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} tags: bare path: Human-Connection/backend/ - push: false - name: Build webapp base image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/nitro-web + repository: schoolsinmotion/webapp + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} tags: bare path: Human-Connection/webapp/ - push: false - name: Build neo4j customized image uses: docker/build-push-action@v1.1.0 @@ -44,7 +47,6 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: neo4j/ - push: true - name: Build backend customized image uses: docker/build-push-action@v1.1.0 with: @@ -53,7 +55,6 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: backend/ - push: true - name: Build webapp customized image uses: docker/build-push-action@v1.1.0 with: @@ -62,4 +63,3 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: latest path: webapp/ - push: true From 05cb9bd6ec8cb982a0c07be06154c0e7dbbee744 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 16:36:00 +0200 Subject: [PATCH 022/344] Use same name for build stage and image tag Plus get rid of one obsolete step in Githhub workflow --- .github/workflows/cd.yml | 18 ++++++------------ backend/Dockerfile | 2 +- neo4j/Dockerfile | 1 - webapp/Dockerfile | 2 +- 4 files changed, 8 insertions(+), 15 deletions(-) delete mode 100644 neo4j/Dockerfile diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 922279e6e..d1d77a29a 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -14,13 +14,13 @@ jobs: with: submodules: recursive - - name: Build neo4j base image + - name: Build neo4j image uses: docker/build-push-action@v1.1.0 with: repository: schoolsinmotion/neo4j username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - tags: bare + tags: latest path: Human-Connection/neo4j/ - name: Build backend base image uses: docker/build-push-action@v1.1.0 @@ -28,7 +28,8 @@ jobs: repository: schoolsinmotion/backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - tags: bare + tags: build-and-test + target: build-and-test path: Human-Connection/backend/ - name: Build webapp base image uses: docker/build-push-action@v1.1.0 @@ -36,17 +37,10 @@ jobs: repository: schoolsinmotion/webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - tags: bare + tags: build-and-test + target: build-and-test path: Human-Connection/webapp/ - - name: Build neo4j customized image - uses: docker/build-push-action@v1.1.0 - with: - repository: schoolsinmotion/neo4j - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - tags: latest - path: neo4j/ - name: Build backend customized image uses: docker/build-push-action@v1.1.0 with: diff --git a/backend/Dockerfile b/backend/Dockerfile index 860cb5255..53874d798 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1 +1 @@ -FROM schoolsinmotion/backend:bare +FROM schoolsinmotion/backend:build-and-test diff --git a/neo4j/Dockerfile b/neo4j/Dockerfile deleted file mode 100644 index bb20ebc6c..000000000 --- a/neo4j/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM schoolsinmotion/neo4j:bare diff --git a/webapp/Dockerfile b/webapp/Dockerfile index d3cd59181..44f98412f 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,3 +1,3 @@ -FROM schoolsinmotion/webapp:bare +FROM schoolsinmotion/webapp:build-and-test COPY static/ static/ COPY constants/ constants/ From 88c6d10c62be38c3e80d0e283ea6b66f73ca7522 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 16:45:21 +0200 Subject: [PATCH 023/344] Add new static code analysis workflow --- .github/workflows/ci.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..809b665b7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: CI + +on: [push] + +jobs: + build: + name: Static code analysis + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + submodules: recursive + - name: Check translation files + run: | + Human-Connection/scripts/translations/sort.sh + Human-Connection/scripts/translations/missing-keys.sh From a059cec4c28711ffd18f4a3f14e878ab0f1dd2ae Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 17:01:48 +0200 Subject: [PATCH 024/344] Change submodule to branch rebranding --- Human-Connection | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Human-Connection b/Human-Connection index 73c1f3c88..36679da84 160000 --- a/Human-Connection +++ b/Human-Connection @@ -1 +1 @@ -Subproject commit 73c1f3c88bd13ecfd520b76bb396e4ec460f9d79 +Subproject commit 36679da84dd59b60fa26e2de2be369cbc134cd1a From 26fa6ab26128602fa7f2220709282f79939f58d6 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 17:10:45 +0200 Subject: [PATCH 025/344] Silly me, remove continuous integration This worfklow should be located in the community repository --- .github/workflows/ci.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 809b665b7..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: CI - -on: [push] - -jobs: - build: - name: Static code analysis - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: recursive - - name: Check translation files - run: | - Human-Connection/scripts/translations/sort.sh - Human-Connection/scripts/translations/missing-keys.sh From e47d10b5bea25658107965ffed5948c3148127e7 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Mon, 8 Jun 2020 17:17:29 +0200 Subject: [PATCH 026/344] Update submodule --- Human-Connection | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Human-Connection b/Human-Connection index 36679da84..92920fe8d 160000 --- a/Human-Connection +++ b/Human-Connection @@ -1 +1 @@ -Subproject commit 36679da84dd59b60fa26e2de2be369cbc134cd1a +Subproject commit 92920fe8da9b7e720e537de2d54a49550b224d60 From dfa4ee8ed09a0280c3ea5e2464b5fd32b175039b Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 10:30:19 +0200 Subject: [PATCH 027/344] Update fyphe_O docker images --- Human-Connection | 2 +- backend/Dockerfile | 1 + backend/constants/emails.js | 4 ++ backend/constants/links.js | 7 +++ backend/constants/metadata.js | 7 +++ webapp/constants/emails.js | 4 +- webapp/constants/manifest.js | 7 --- webapp/constants/metadata.js | 7 +++ webapp/static/icon.png | Bin 11162 -> 2269 bytes webapp/static/icon.svg | 106 +--------------------------------- 10 files changed, 30 insertions(+), 115 deletions(-) create mode 100644 backend/constants/emails.js create mode 100644 backend/constants/links.js create mode 100644 backend/constants/metadata.js delete mode 100644 webapp/constants/manifest.js create mode 100644 webapp/constants/metadata.js diff --git a/Human-Connection b/Human-Connection index 92920fe8d..a20aebc02 160000 --- a/Human-Connection +++ b/Human-Connection @@ -1 +1 @@ -Subproject commit 92920fe8da9b7e720e537de2d54a49550b224d60 +Subproject commit a20aebc027412ab14ed2d1cc13ec1146c262c2e2 diff --git a/backend/Dockerfile b/backend/Dockerfile index 53874d798..af9bb27da 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1 +1,2 @@ FROM schoolsinmotion/backend:build-and-test +COPY constants/links.js constants/metadata.js src/config/ diff --git a/backend/constants/emails.js b/backend/constants/emails.js new file mode 100644 index 000000000..d59048e20 --- /dev/null +++ b/backend/constants/emails.js @@ -0,0 +1,4 @@ +export default { + SUPPORT: 'support@human-connection.org', + MODERATION: 'moderation@human-connection.org', +} diff --git a/backend/constants/links.js b/backend/constants/links.js new file mode 100644 index 000000000..36ee42370 --- /dev/null +++ b/backend/constants/links.js @@ -0,0 +1,7 @@ +export default { + ORGANIZATION: 'https://www.youth-and-arts.nrw/', + DONATE: 'https://www.youth-and-arts.nrw/de/kontakt', + IMPRINT: 'https://www.youth-and-arts.nrw/de/impressum', + DATA_PRIVACY: 'https://www.youth-and-arts.nrw/de/datenschutzerklaerung', + FAQ: 'https://www.youth-and-arts.nrw/de/kontakt', +} diff --git a/backend/constants/metadata.js b/backend/constants/metadata.js new file mode 100644 index 000000000..6017cd1af --- /dev/null +++ b/backend/constants/metadata.js @@ -0,0 +1,7 @@ +export default { + APPLICATION_NAME: 'fyphe_O', + APPLICATION_SHORT_NAME: 'fyphe', + APPLICATION_DESCRIPTION: 'The Schools in Motion Network', + ORGANIZATION_NAME: 'Ensible e.V.', + ORGANIZATION_JURISDICTION: 'Köln', +} diff --git a/webapp/constants/emails.js b/webapp/constants/emails.js index 5a69681ce..d59048e20 100644 --- a/webapp/constants/emails.js +++ b/webapp/constants/emails.js @@ -1,4 +1,4 @@ export default { - SUPPORT: 'support-schools-in-motion@roschaefer.de', - MODERATION: 'moderation-schools-in-motion@roschaefer.de', + SUPPORT: 'support@human-connection.org', + MODERATION: 'moderation@human-connection.org', } diff --git a/webapp/constants/manifest.js b/webapp/constants/manifest.js deleted file mode 100644 index 95a9dea30..000000000 --- a/webapp/constants/manifest.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - name: 'fyphe_O', - short_name: 'fO', - description: 'The schools in motion network', - theme_color: '#17b53f', - lang: 'en', -} diff --git a/webapp/constants/metadata.js b/webapp/constants/metadata.js new file mode 100644 index 000000000..6017cd1af --- /dev/null +++ b/webapp/constants/metadata.js @@ -0,0 +1,7 @@ +export default { + APPLICATION_NAME: 'fyphe_O', + APPLICATION_SHORT_NAME: 'fyphe', + APPLICATION_DESCRIPTION: 'The Schools in Motion Network', + ORGANIZATION_NAME: 'Ensible e.V.', + ORGANIZATION_JURISDICTION: 'Köln', +} diff --git a/webapp/static/icon.png b/webapp/static/icon.png index a9a119207eda609b3060f7b2327d751caa1a2f71..2fd4fe93d587cdcc5afb45e62e5d081cc469f7a3 100644 GIT binary patch delta 2255 zcmV;=2r&1WSKSeRiBL{Q4GJ0x0000DNk~Le00015000152mk;803E{~-T(jq1ZP1_ zK>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhP zJOBUy0%A)?L;(MXkIcUS000SaNLh0L01m_e01m_fl`9T^8vpt5C|4A z-3_%~000N8Nklc13A0=JD>r)v_wZ^GS(d1K<;Y+BWb!E5 z`kl>^*NbRV80c@Ft&g(l10Q{L-9Jp`?Rl;J`#>kMIh8LrjdZt-Cgjf`~Y{=n3a?e5{y2M6_t%iw&zH-mP$gqtb0l1&@*_&Y1Qh$J`Wb%q{#37VLHWQ%Vn-8>LM)V0xeH|==(aj{J^n3m92 zS^-+-{?NMz)6FGqW}6yu$L^+~yJTeJfrK6^05cPf0){EE7;S3sy&*RAIMGC4gc-;^ z5Zbe_u%QFHiN?FlxIbVXlNHEpxjMYO$(0LziJK1qP+dI%06zqftfT6d(?V~-GA5dT zFCC`e(Pv|b+73AY0PCKjvi>gf`oO@zfaDmtm^J0}yw1u)9ZIm~9Q~rcSw(7E_aFek z-TW&60EqZ`03ssl-N`M}$~#88Wn$iRyk%N4XvSA_ZrRl1k`Y8i>k^rD;13Vm z?}E@Fq963?aztYa$pQx!JW2L@LZME7r_=Q#l-SWFv9YnSp9+uICK&>9CMor<^q)>- ztX(=zX%kuE9+JPfQmIrb%Ngi?old74dCRZWHmgy%VbmI$@qo!0jro7Iewvg5@~pTn z-ZSEyb-7ZhRB9$6j2uhfN@A`eqU9;!B^EM{rW7F}YNEX>ZLW?`DQcXv?$T&~G#Vp< zG>{x!ZI8G;{&i2jpbA;Vs8H+6GI;Ui*?C?nm7!6i(P+9D=qi;;rP3l)%;!Hxj-KjA z0VEucM#Q_T03JGEJ1o2ZB$!_zL#;}sQdKd~lz>uH67Ko<-rHk{LyfO3gt&I(6!R+( z_s$JO#J=)8?`4$>ly(ja8s5Wy@v?MJ0ErkNyhs%?#*N0z!rf_}z7dfk2zv6A8Ovcx zbbtvFalEN=_x_qr#D1>|Zt^Yn9>npMZ)-37XuXP1CfcD{TjvP?Ac%{znv!*gvpEmE z>f|5*K|};O>3)BJG49Z*Qm4{^<(|RMUIc)ZmpI9wT>$`BUkVW_c3B;ND_|-yInSYCRcEoD5Db8_e(UHcLN05X>zWtqZ; z9`>gczm3hOEo@jVI~*RXw2b1cAOF2Sp@5> z+9y!N=x@x&ADgr4HoCZs;9I6$lpDHLZ}$W%pkx0S05qHi1+Bk-(QggS3AlJV1YE2& zA|j6LiWg+pk!CMdo+q5Aem_c>Cr`EcEOps}s1J=K#Fc_ja=B0xw!Ie-5pVFeW1kv$ z>OS1gvo@x^+rvC^&(r760F5}f2|RM^5m7Dd#qJoz<~RfP3e|{MpX&knz0BFJ)SAfL zWLb?RHF}4kG`wbibM)BJEs@c$)`XWDc0?!je7QDZ-ju<7m`0M4dP_g}n_2wEqODI0 zVQ=luBE2z0KDlYxvgGJH(zyu zOQFLJ+r$6>(BWDPr`S0m6gqj^A!~2#@e9%Boz@3Yx`4%3FFH8%e2KUeZ9xxy|v%DFTdb8+8%$e z=?9+`r|Qeb>2@ca}YC4)ppQO6l>g z#rxq7zog3|C-98O)|x5fXHt;K69tqOlwJ+Og2T+=Bl&!&O1Hf!E@=9R6~cTw$y;oF zoiV9h>Q1@3Mnl2aIm!rH`I8uQLR%9xb}iBq002yX%?y~sdHuvfr}g}g3XbZSzVV>n zL93KJ1Tv^kee+bysBzk6DjDMI4!;dzUq_UwoTg5_j4tgXjCE-mvmoW*lDswG$}HaO zpMtaKS@i!u`oB(={6o55WAOk003~!qSaf7zbY(hYa%Ew3WdJfTGB7PLHZ3tWR4_O? zGBP?nG&n0TFgh?W^hh;I0000bbVXQnWMOn=I&E)cX=Zr?k&PDHLkV1h1rH1Plc literal 11162 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 - - - - - - - - - - - image/svg+xml - - - - - Openclipart - - - Whale - 2008-10-24T04:19:54 - Cartoon diagram of a whale - http://openclipart.org/detail/19703/whale-by-stumbles - - - stumbles - - - - - animal - clip art - clipart - fish - image - mammal - media - png - public domain - svg - whale - - - - - - - - - - - + \ No newline at end of file From ec2ff36d3bf64680c58db40b30fe0ad0ad3a76e6 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 10:45:47 +0200 Subject: [PATCH 028/344] Use my email addresses --- backend/constants/emails.js | 4 ++-- webapp/constants/emails.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/constants/emails.js b/backend/constants/emails.js index d59048e20..5a69681ce 100644 --- a/backend/constants/emails.js +++ b/backend/constants/emails.js @@ -1,4 +1,4 @@ export default { - SUPPORT: 'support@human-connection.org', - MODERATION: 'moderation@human-connection.org', + SUPPORT: 'support-schools-in-motion@roschaefer.de', + MODERATION: 'moderation-schools-in-motion@roschaefer.de', } diff --git a/webapp/constants/emails.js b/webapp/constants/emails.js index d59048e20..5a69681ce 100644 --- a/webapp/constants/emails.js +++ b/webapp/constants/emails.js @@ -1,4 +1,4 @@ export default { - SUPPORT: 'support@human-connection.org', - MODERATION: 'moderation@human-connection.org', + SUPPORT: 'support-schools-in-motion@roschaefer.de', + MODERATION: 'moderation-schools-in-motion@roschaefer.de', } From 60da324b440d2b08c27ed16bca8dfd86dbe8b150 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 10:46:17 +0200 Subject: [PATCH 029/344] Deploy a fake mailserver Please run `docker-compose -f docker-compose.yml up` --- docker-compose.override.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 docker-compose.override.yml diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 000000000..835797533 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,25 @@ +version: "3.4" + +services: + webapp: + build: + context: webapp + environment: + - PUBLIC_REGISTRATION=true + backend: + build: + context: backend + environment: + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + - PUBLIC_REGISTRATION=true + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - hc-network + +networks: + hc-network: From 8002f8954f34f4da5dc205ca83944d53236fc591 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 12:22:02 +0200 Subject: [PATCH 030/344] Update deployment --- Human-Connection | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Human-Connection b/Human-Connection index a20aebc02..1d98f580a 160000 --- a/Human-Connection +++ b/Human-Connection @@ -1 +1 @@ -Subproject commit a20aebc027412ab14ed2d1cc13ec1146c262c2e2 +Subproject commit 1d98f580a1de0499a5d3e3f288486b26c19be52b From cfe3ba89983eefa65050bedae93e7f126bdad0dd Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 14:43:09 +0200 Subject: [PATCH 031/344] Overwrite Logo in Navigation top bar --- Human-Connection | 2 +- webapp/static/img/custom/Logo-Horizontal-Dark.svg | 1 + webapp/static/img/custom/Logo-Horizontal.svg | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 webapp/static/img/custom/Logo-Horizontal-Dark.svg create mode 100644 webapp/static/img/custom/Logo-Horizontal.svg diff --git a/Human-Connection b/Human-Connection index 1d98f580a..906ab2d79 160000 --- a/Human-Connection +++ b/Human-Connection @@ -1 +1 @@ -Subproject commit 1d98f580a1de0499a5d3e3f288486b26c19be52b +Subproject commit 906ab2d7900a53130ca587e656a8b98e506c8119 diff --git a/webapp/static/img/custom/Logo-Horizontal-Dark.svg b/webapp/static/img/custom/Logo-Horizontal-Dark.svg new file mode 100644 index 000000000..44765d64b --- /dev/null +++ b/webapp/static/img/custom/Logo-Horizontal-Dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/webapp/static/img/custom/Logo-Horizontal.svg b/webapp/static/img/custom/Logo-Horizontal.svg new file mode 100644 index 000000000..44765d64b --- /dev/null +++ b/webapp/static/img/custom/Logo-Horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file From 010d5c4bfba9f5cb6e682a678dd52de507e9833c Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 15:04:19 +0200 Subject: [PATCH 032/344] Parameterize SMTP configuration --- docker-compose.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index b69da643c..2ef6b3424 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,10 @@ services: - EMAIL_SUPPORT=support@human-connection.org - EMAIL_DEFAULT_SENDER=info@human-connection.org - PUBLIC_REGISTRATION=true + - SMTP_HOST=${SMTP_HOST} + - SMTP_PORT=${SMTP_PORT} + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} command: yarn run dev neo4j: image: schoolsinmotion/neo4j:latest From 599eab3502e84a4bfe317c04afe1387fad042529 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 15:25:21 +0200 Subject: [PATCH 033/344] Add WEBSOCKETS_URI env var --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 2ef6b3424..2cedc0251 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,7 @@ services: - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 - MAPBOX_TOKEN="pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.bZ8KK9l70omjXbEkkbHGsQ" + - WEBSOCKETS_URI=${WEBSOCKETS_URI} - PUBLIC_REGISTRATION=true command: yarn run dev backend: From 24ef989e1aff071da95844bd6cdf2fef09c894a6 Mon Sep 17 00:00:00 2001 From: roschaefer Date: Tue, 16 Jun 2020 16:27:42 +0200 Subject: [PATCH 034/344] Turn logo .svg into landscape --- .../img/custom/Logo-Horizontal-Dark.svg | 48 ++++++++++++++++++- webapp/static/img/custom/Logo-Horizontal.svg | 48 ++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/webapp/static/img/custom/Logo-Horizontal-Dark.svg b/webapp/static/img/custom/Logo-Horizontal-Dark.svg index 44765d64b..a630f1a79 100644 --- a/webapp/static/img/custom/Logo-Horizontal-Dark.svg +++ b/webapp/static/img/custom/Logo-Horizontal-Dark.svg @@ -1 +1,47 @@ - \ No newline at end of file + +image/svg+xml \ No newline at end of file diff --git a/webapp/static/img/custom/Logo-Horizontal.svg b/webapp/static/img/custom/Logo-Horizontal.svg index 44765d64b..cdcf194e7 100644 --- a/webapp/static/img/custom/Logo-Horizontal.svg +++ b/webapp/static/img/custom/Logo-Horizontal.svg @@ -1 +1,47 @@ - \ No newline at end of file + +image/svg+xml \ No newline at end of file From 4099ca981610314dbc5d8a8db04291571957a02d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 15:14:52 +0100 Subject: [PATCH 035/344] Change submodule to ours --- .gitmodules | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 518958a09..060db510e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "Human-Connection"] - path = Human-Connection - url = https://github.com/The-Schools-in-Motion-Network/fyphe_O.git +[submodule "Ocelot-Social"] + path = Ocelot-Social + url = https://github.com/Ocelot-Social-Community/Ocelot-Social.git From 09f7bba9afea7f34d3bb5f8615c40649f34cb13e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 15:29:50 +0100 Subject: [PATCH 036/344] Remove submodule Human-Connection --- Human-Connection | 1 - 1 file changed, 1 deletion(-) delete mode 160000 Human-Connection diff --git a/Human-Connection b/Human-Connection deleted file mode 160000 index 906ab2d79..000000000 --- a/Human-Connection +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 906ab2d7900a53130ca587e656a8b98e506c8119 From 3a5001b0a191102f70e571f6a041786284c31a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 15:32:02 +0100 Subject: [PATCH 037/344] Add .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..496ee2ca6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file From c37aa08450332f806197c2d93458ca9c7627bcdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 15:35:57 +0100 Subject: [PATCH 038/344] Add submodule Ocelot-Social --- Ocelot-Social | 1 + 1 file changed, 1 insertion(+) create mode 160000 Ocelot-Social diff --git a/Ocelot-Social b/Ocelot-Social new file mode 160000 index 000000000..cc9c70dbe --- /dev/null +++ b/Ocelot-Social @@ -0,0 +1 @@ +Subproject commit cc9c70dbe7fc7f1d9bc90c06f3b3e4e78dd71113 From 42007f17dda571574ecb7958413ede8de2bb9672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 15:52:35 +0100 Subject: [PATCH 039/344] Set the new Docker Hub images --- .github/workflows/cd.yml | 10 +++++----- backend/Dockerfile | 2 +- docker-compose.yml | 6 +++--- webapp/Dockerfile | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index d1d77a29a..817ba7cbe 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -17,7 +17,7 @@ jobs: - name: Build neo4j image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/neo4j + repository: ocelotsocialnetwork/develop-neo4j username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest @@ -25,7 +25,7 @@ jobs: - name: Build backend base image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/backend + repository: ocelotsocialnetwork/develop-backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: build-and-test @@ -34,7 +34,7 @@ jobs: - name: Build webapp base image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/webapp + repository: ocelotsocialnetwork/develop-webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: build-and-test @@ -44,7 +44,7 @@ jobs: - name: Build backend customized image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/backend + repository: ocelotsocialnetwork/develop-backend username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest @@ -52,7 +52,7 @@ jobs: - name: Build webapp customized image uses: docker/build-push-action@v1.1.0 with: - repository: schoolsinmotion/webapp + repository: ocelotsocialnetwork/develop-webapp username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest diff --git a/backend/Dockerfile b/backend/Dockerfile index af9bb27da..8951772a1 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,2 +1,2 @@ -FROM schoolsinmotion/backend:build-and-test +FROM ocelotsocialnetwork/develop-backend:build-and-test COPY constants/links.js constants/metadata.js src/config/ diff --git a/docker-compose.yml b/docker-compose.yml index 2cedc0251..ee0ebfe3e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.4" services: webapp: - image: schoolsinmotion/webapp:latest + image: ocelotsocialnetwork/develop-webapp:latest ports: - 3000:3000 networks: @@ -17,7 +17,7 @@ services: - PUBLIC_REGISTRATION=true command: yarn run dev backend: - image: schoolsinmotion/backend:latest + image: ocelotsocialnetwork/develop-backend:latest networks: - hc-network depends_on: @@ -40,7 +40,7 @@ services: - SMTP_PASSWORD=${SMTP_PASSWORD} command: yarn run dev neo4j: - image: schoolsinmotion/neo4j:latest + image: ocelotsocialnetwork/develop-neo4j:latest networks: - hc-network environment: diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 44f98412f..e39305fb3 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,3 +1,3 @@ -FROM schoolsinmotion/webapp:build-and-test +FROM ocelotsocialnetwork/develop-webapp:build-and-test COPY static/ static/ COPY constants/ constants/ From 556dd5ed9214ac00397fdb8142c56c4e96e3f592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 16:37:10 +0100 Subject: [PATCH 040/344] Refactor docker-compose.yml --- docker-compose.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ee0ebfe3e..ffde9a273 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.4" services: webapp: - image: ocelotsocialnetwork/develop-webapp:latest + image: ocelotsocialnetwork/develop-webapp:master.2020.12.17 ports: - 3000:3000 networks: @@ -12,12 +12,12 @@ services: environment: - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 - - MAPBOX_TOKEN="pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.bZ8KK9l70omjXbEkkbHGsQ" + - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" - WEBSOCKETS_URI=${WEBSOCKETS_URI} - - PUBLIC_REGISTRATION=true + - PUBLIC_REGISTRATION=false command: yarn run dev backend: - image: ocelotsocialnetwork/develop-backend:latest + image: ocelotsocialnetwork/develop-backend:master.2020.12.17 networks: - hc-network depends_on: @@ -29,10 +29,10 @@ services: - GRAPHQL_URI=http://backend:4000 - CLIENT_URI=http://localhost:3000 - JWT_SECRET=b/&&7b78BF&fv/Vd - - MAPBOX_TOKEN=pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.KZ8KK9l70omjXbEkkbHGsQ + - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 - - EMAIL_SUPPORT=support@human-connection.org - - EMAIL_DEFAULT_SENDER=info@human-connection.org + - EMAIL_SUPPORT=support@wir.social + - EMAIL_DEFAULT_SENDER=info@wir.social - PUBLIC_REGISTRATION=true - SMTP_HOST=${SMTP_HOST} - SMTP_PORT=${SMTP_PORT} @@ -40,7 +40,7 @@ services: - SMTP_PASSWORD=${SMTP_PASSWORD} command: yarn run dev neo4j: - image: ocelotsocialnetwork/develop-neo4j:latest + image: ocelotsocialnetwork/develop-neo4j:0.6.3 networks: - hc-network environment: From bef33d8816fa9860c0cd3be3d64f4c92da389028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 16:40:53 +0100 Subject: [PATCH 041/344] Correct Human-Connection path to Ocelot-Social --- .github/workflows/cd.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 817ba7cbe..7e0ee678e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -21,7 +21,7 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: latest - path: Human-Connection/neo4j/ + path: Ocelot-Social/neo4j/ - name: Build backend base image uses: docker/build-push-action@v1.1.0 with: @@ -30,7 +30,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: build-and-test target: build-and-test - path: Human-Connection/backend/ + path: Ocelot-Social/backend/ - name: Build webapp base image uses: docker/build-push-action@v1.1.0 with: @@ -39,7 +39,7 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} tags: build-and-test target: build-and-test - path: Human-Connection/webapp/ + path: Ocelot-Social/webapp/ - name: Build backend customized image uses: docker/build-push-action@v1.1.0 From 104c024885433109497a0eb5af61191d80062683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 17:09:19 +0100 Subject: [PATCH 042/344] Replace logo files --- webapp/static/favicon.ico | Bin 4171 -> 15086 bytes webapp/static/icon.png | Bin 2269 -> 9085 bytes webapp/static/icon.svg | 1 - .../img/custom/Logo-Horizontal-Dark.svg | 95 ++--- webapp/static/img/custom/Logo-Horizontal.svg | 108 +++--- webapp/static/img/custom/logout.svg | 361 +++++++++++++++++- webapp/static/img/custom/password-reset.svg | 2 +- webapp/static/img/custom/sign-up.svg | 164 +++++++- .../static/img/custom/under-maintenance.svg | 361 +++++++++++++++++- webapp/static/img/custom/welcome.svg | 66 +++- 10 files changed, 1059 insertions(+), 99 deletions(-) delete mode 100644 webapp/static/icon.svg diff --git a/webapp/static/favicon.ico b/webapp/static/favicon.ico index 8be72e739f8983cfbf9fd945a181fe421336789f..962e5a14a3eaff720d035f831e1da2f83335e205 100644 GIT binary patch literal 15086 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 IjyAOYfAx8|QUCw| literal 4171 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 literal 2269 zcmZ`)X*3l47yc1t$(AKsma)BP7_u)3Q#3M!mLdC^ZE6fcmeec7*lDs&GsT{oiI|3~+`b zG06ZHZ(~bi04kF?4_sLpT*}?t#u9*Vc>rP_0YGO+F^d2M!vI)z0YDEA!09`=^;ZoT z3uZS9GdTG3IJvKd!PxJZqk;h7ZvWd%nabQ^4Dkf^vgO4Sv&VVagw!UuYMdBK$z`~) z-A&5c^9XBOZ=qHz*aKjEiue6-K{1x=t!fn01b-$6Yek!Hio^z12ZY5~ULcKFnKv-B z_O=1xmv_E!$GC*_)}ASVPf)N()ded%)>*^s*50G6$ZRaNg%~(W%~7Sv(@cEG(W~4G zgxsL!jRVa3Ui1D$x|qcK3c0`*(J&#yg#3$xS9Vv|&l?UpFCz{-BFLz-oE{x7(!Yf( zbRPq)s(vFdq+;PmtSSI0v)8Za;Pi+a0<{VO4MS?f5o<2_gxx7xUE4g*tNi5kqK4t& zo11QIk1|n(#?jN66IT+a-Ts(EPuJ~B6G%~R*SanYHx&~Q~rLX~c&sx}V$4ky1b$4l?-D>W6@_mJI%p-Ar*I$I*X#K!B? zF0wCR?w8^(z~A^xC2*BMCd=-`77U}yA--+L$nj1~Aswj(kOug6LCaoiVNy>)f2mK9 zb(5u`*0Z;edAUJ-5{*1`vTQNVa)NUKMdfOnRUYvtJ$(A`%sc;1r~1tOG)uAVU47;H zcvJZrR6z%*3b=mCj0rLp@tKm`sD(=azyWT ztrrp-JUnI|Jd#iX=lF5Vaf+3~0lq(*q_wtnsBo7@A|DKS$EshyCLU{e(%H~oYvdx4 zF8IN}POq`CJCif=Ne&ONb~I!HMl30%1+qU$+l>P~re_eZ=fw|6&8UmM_B1KbI&q*3K>ThPfIyZfx}l$X^e;7d zx=msmJ?+(fI&TC8e*HX?#s`PbMkCi&PCXC)&cidl5j!MJlH6X#z}-2znNJ8AT;7Q= zAtK42e#>NxQspWcMc_ytl^0>g$SeLX-zFeEN*(o(xA{>&B+^=HZHn!bdPNqa@{nY) zu-=LICyRr3oDR7a8ZO0W98&DpPE zPD+`?s|8e_df`Q-OvI~?5WBtwBeSIZWiuvO@#IVG4JANA&qe=i!yj3^v$Sa$;+4%c zwV{j{8@p5Md%Kh4?(wF$3h1NSkXeCW%Dl7zE_i$MmcfQ+CTB(nH>c<%WwQ!v1)c~? zHJS^mcj7wx-cQ`lZ{|ydu!V1Bi1fN5urcg>cN>c_w4-cfdsGES;1-l7(Y~35_ESCZ zX?kicKSo43EU*Kq_=M{0wBX0px;%}`vr@nq&Z4^%6&<6tK2&T&{`g=nzirToB_{Kk zPWKB(CUC=SwRLr^j-uR1*S8T77!jVocg*V? z+u`^Uf0MAnwAa-4wfuAThi@JzoSbI(W1>c*SJ3t-6`D$|7=H9jGz6~j`+l94>tsgT zef*`gv~UZf-5k_GC#lSe(-ploFf&7GJ8vaPhpy(xW9&69wDvC7Ka{fz%Fa4&Exv13 zu|$dC0gX%Yb!ASL+RnibEQl1YaYnifP1~O&kLpSb=!K0-`=Qr1IjQq`!xGU+;hO)( z;lzs7F5MQDzH2`^_rR_`j8Z8jzNKYnnQ*jP6&JJ`{fm`)HeBein(9T_BNF!)POcW1 za>X4{JGsw=8dPtR3_SE>t65Xx}kdLK*ao0i$TUxawq zq^ROUel$X|B7MR&)%ltg~4aJO)|Ih$n^=N2NH5>?h@5`%Ax zR!hx&Pixft-g9BjCf36h>#66C@nir{hpEG$ zFfFK>mK{t-PhDM4Lq{0~(}Tgb%{3AKV+cTd-1Z9l|Av1BaXSoy$lnjPXfJH2E5;Lq ihK8!#4)hChcfI4Og2s5~tQ&|jj=<%MNO-x4OYDD*%Qk%g diff --git a/webapp/static/icon.svg b/webapp/static/icon.svg deleted file mode 100644 index 44765d64b..000000000 --- a/webapp/static/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webapp/static/img/custom/Logo-Horizontal-Dark.svg b/webapp/static/img/custom/Logo-Horizontal-Dark.svg index a630f1a79..deba99182 100644 --- a/webapp/static/img/custom/Logo-Horizontal-Dark.svg +++ b/webapp/static/img/custom/Logo-Horizontal-Dark.svg @@ -1,47 +1,48 @@ - -image/svg+xml \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/static/img/custom/Logo-Horizontal.svg b/webapp/static/img/custom/Logo-Horizontal.svg index cdcf194e7..4121fa08e 100644 --- a/webapp/static/img/custom/Logo-Horizontal.svg +++ b/webapp/static/img/custom/Logo-Horizontal.svg @@ -1,47 +1,63 @@ -image/svg+xml \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/static/img/custom/logout.svg b/webapp/static/img/custom/logout.svg index 44765d64b..0950b7532 100644 --- a/webapp/static/img/custom/logout.svg +++ b/webapp/static/img/custom/logout.svg @@ -1 +1,360 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapp/static/img/custom/password-reset.svg b/webapp/static/img/custom/password-reset.svg index 44765d64b..48cf12e70 100644 --- a/webapp/static/img/custom/password-reset.svg +++ b/webapp/static/img/custom/password-reset.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/webapp/static/img/custom/sign-up.svg b/webapp/static/img/custom/sign-up.svg index 44765d64b..930923ca4 100644 --- a/webapp/static/img/custom/sign-up.svg +++ b/webapp/static/img/custom/sign-up.svg @@ -1 +1,163 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapp/static/img/custom/under-maintenance.svg b/webapp/static/img/custom/under-maintenance.svg index 44765d64b..0950b7532 100644 --- a/webapp/static/img/custom/under-maintenance.svg +++ b/webapp/static/img/custom/under-maintenance.svg @@ -1 +1,360 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapp/static/img/custom/welcome.svg b/webapp/static/img/custom/welcome.svg index 44765d64b..860f59262 100644 --- a/webapp/static/img/custom/welcome.svg +++ b/webapp/static/img/custom/welcome.svg @@ -1 +1,65 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4ad6629c9ac95be6ae0536241855d26960babcf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 22 Dec 2020 17:09:25 +0100 Subject: [PATCH 043/344] Add cookie entry to 'metadata.js' --- webapp/constants/metadata.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/constants/metadata.js b/webapp/constants/metadata.js index 6017cd1af..940e28c00 100644 --- a/webapp/constants/metadata.js +++ b/webapp/constants/metadata.js @@ -2,6 +2,7 @@ export default { APPLICATION_NAME: 'fyphe_O', APPLICATION_SHORT_NAME: 'fyphe', APPLICATION_DESCRIPTION: 'The Schools in Motion Network', + COOKIE_NAME: 'ocelot-social-token', ORGANIZATION_NAME: 'Ensible e.V.', ORGANIZATION_JURISDICTION: 'Köln', } From caf49dd71538af91d219b112e2d7d85128ba828b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 6 Jan 2021 17:30:55 +0100 Subject: [PATCH 044/344] Replace HC by ocelot.social logos --- webapp/static/favicon.ico | Bin 15086 -> 5558 bytes webapp/static/icon.png | Bin 9085 -> 19173 bytes webapp/static/img/custom/Logo-Horizontal.svg | 2 +- webapp/static/img/custom/logout.svg | 425 +++-------------- webapp/static/img/custom/password-reset.svg | 66 ++- webapp/static/img/custom/sign-up.svg | 228 +++------ .../static/img/custom/under-maintenance.svg | 442 ++++-------------- webapp/static/img/custom/welcome.svg | 2 +- 8 files changed, 279 insertions(+), 886 deletions(-) diff --git a/webapp/static/favicon.ico b/webapp/static/favicon.ico index 962e5a14a3eaff720d035f831e1da2f83335e205..ca3874fcc0b329fd93da1450fe3b8f6cdc559923 100644 GIT binary patch literal 5558 zcmd^Dc~q1~68{`vfMJ|_U=Bde0S~S*0*ay{8V&^k0TJai9!W$LQ9KY8P*hfv=<1rc zZjx0uCc249-o~tkB)TRVk0dGq4dQ{(!~?Q9#JoI{-&Xg)1O!CQpZmSnZ+g0`tE#Jh zRn^^s&_@sn9v%YydIC;Dvu6)> z?%avpufB?X`}U!sq2Vz&J^GSeyLQ23G9e_yjL@)fgoTGA#B7GArzfhbs~?@=Bdlm_ zY=q8PgRE&&QM8~K({gi=m79zC)X$~9#NHMkeDJ{|aC~^ut4&uhE;<$p6nqXQQxcF0ry=>gubK8HwD|`ib_;_b z62qgPJF;_fG5eWkp;oJLh-~>VUu$bCqN1XZoH7Y()~!e7nktkoUk=xPo{&v^5ylli z@clC!GCwfP8J6DQxHPW#9*VSGFuHqTX=y26yJqcrq^6~FTVB6@y;l{sZQF*R;9xF$ zRYfH#R5XlMQhVwnMH$*EYes@$@ccvR6o z0s;duckbK=%D;E-9-^b8xy`E9RdfAWo^khfgR{9WBsvl7bY>oZ3fwn$o3JC zxQL()kwWjL!<>Rb&V$LHTR0CsK0at}ZthVBme*a~+)%P)DYD3StI8`7H8L8mId(7= z$PlnX37MY&Wzx&s_U-bSJyhv?As;BhpfUxgb;}WBXlMi~Dpw<$a^$k*Wl*V9IC$Vd zkMe73YB;7xj~)$$Tt+_g!T=v%n2IFOMmWH)P!9DF0kUx$EPikE0mFeJ@g+D%2rxY( z z&o!#P_B5@J<``r7jbWQLZQh5p=XFqw-vUj}yB7T4hd&krTEeC>=_M%QH&g#Z>v|Ti z+8Ku+@*0PC_U-L)|BYYOL*_LUddjaX$F}d!NPX8;tx#vYN_+9)IhMs=`@CUE8~%)g zA&*@P*Yeg*>sf9#mi-qZ*P%GD|DA5--@SVmlT(x7IAU=pY*}Ow|B|b))tKPuA5Zfw z9b{YLknxueD}cyB4&A&jJNt)h#W3PTHXIc>9N&G{(nW{TC5s^VO={D-V{8$BR$HDq zjy`sdP^E0|MnB@u;-BgeqtRr&-F=QA9Yp3?$jh0A-+ueeszcM|OVD@(LR(nJW&Li~ zwj4vY*3GYnojwSWgst5Dytb=SUxp3U7=3Xg*MY?X!=9Zkfc9PiW%6HnoOV~EIImLjV^ldZGbZC# zl3iDO29AaR=qP`6t|=Yt!1hn_L^2~phESeI?S>UYlJp8BiQ8d6W;GvU@hy_-p)0H< zUR0Cs!;s}a@uG35R|M)wcFlozVe35>2EteO^t6BSr+wU3Bu-4m8+%_vaq$AAr>0<1 z@s8z`{ePXaPWxek}ukIWqx*y-Go4M z7%nzmuwtgCPTiNa@HO>^WAxfKjC6wo@~5L|EKYv<30j(O!_7AcnrG=;+tFrZbLLxd zWEn<`h{Uz4S9%iJW&C1e1BMJ947*_qExD>=uBN`WupaIMLP_>5zBVg!GQ^`RezzIR z9Ykkqo{0(Zaa_kPLV6jvdGiKh#zw&=Ae;P6HfYO7EKl3Vynw8!Q>+|Le0mi2T3=}A zd;#OiA4$J2VdE2znfckcOXtDI{qEfP3DYUgMV@1!EjUa2`+@J>(GY|aWc!ZahU&Ex z2Z68)oC;^UQ&m@0cAWl0{q<`q;Ord&yMgJDxSFw{dR@2tPM!D^Z@=+6nl4}LcK(kH zHeI>Id7nCQtP`7_-Ua?&#@RawJ)Q6ulE--`Ie+dPcI?=JopjHutv%bxw!QtiL~%Mi zauh}mAAwO6g&7SzpK`+#iGSaP+YPQ{$asTX6)uM@4E6Qs51A$FEkiM#YI?5 zcaY-Z;!fwJJ9q9NJ}wRu;>N=~&JS*r1*oIrsBX}GY-uwzvB_{v7Z5bY2Z<9B5E(fF zw{G3G?&IgypAa}E6Ou8NP^WB!GBO_Ov@MjIZt

@;4|)CO|#uc}SnEhDTTuT5jL8 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 IjyAOYfAx8|QUCw| diff --git a/webapp/static/icon.png b/webapp/static/icon.png index bb953267659f2c0711f32e34414a3cb38306d412..eca54133226e089f7f8ac6d4344fdd39f2012094 100644 GIT binary patch literal 19173 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 literal 9085 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 diff --git a/webapp/static/img/custom/Logo-Horizontal.svg b/webapp/static/img/custom/Logo-Horizontal.svg index 4121fa08e..f29b498eb 100644 --- a/webapp/static/img/custom/Logo-Horizontal.svg +++ b/webapp/static/img/custom/Logo-Horizontal.svg @@ -1,6 +1,6 @@ - + diff --git a/webapp/static/img/custom/logout.svg b/webapp/static/img/custom/logout.svg index 0950b7532..f2ace345e 100644 --- a/webapp/static/img/custom/logout.svg +++ b/webapp/static/img/custom/logout.svg @@ -1,360 +1,65 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/static/img/custom/password-reset.svg b/webapp/static/img/custom/password-reset.svg index 48cf12e70..30d498fbb 100644 --- a/webapp/static/img/custom/password-reset.svg +++ b/webapp/static/img/custom/password-reset.svg @@ -1 +1,65 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/static/img/custom/sign-up.svg b/webapp/static/img/custom/sign-up.svg index 930923ca4..f2ace345e 100644 --- a/webapp/static/img/custom/sign-up.svg +++ b/webapp/static/img/custom/sign-up.svg @@ -1,163 +1,65 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/static/img/custom/under-maintenance.svg b/webapp/static/img/custom/under-maintenance.svg index 0950b7532..b130e7583 100644 --- a/webapp/static/img/custom/under-maintenance.svg +++ b/webapp/static/img/custom/under-maintenance.svg @@ -1,360 +1,82 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/static/img/custom/welcome.svg b/webapp/static/img/custom/welcome.svg index 860f59262..30d498fbb 100644 --- a/webapp/static/img/custom/welcome.svg +++ b/webapp/static/img/custom/welcome.svg @@ -1,6 +1,6 @@ - + From 190f0e9560d3b80719df36b25feb50347bc64bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 6 Jan 2021 17:36:32 +0100 Subject: [PATCH 045/344] Correct maintenance image from white-labeled to rebranded --- webapp/static/img/custom/under-maintenance.svg | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/webapp/static/img/custom/under-maintenance.svg b/webapp/static/img/custom/under-maintenance.svg index b130e7583..f2ace345e 100644 --- a/webapp/static/img/custom/under-maintenance.svg +++ b/webapp/static/img/custom/under-maintenance.svg @@ -1,23 +1,6 @@ - - - - - - - - - - - - - - - - - From d1766601f175a378cbc959b21e26d98c252ef21a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 7 Jan 2021 10:18:20 +0100 Subject: [PATCH 046/344] Change icon to a transparent background --- webapp/static/favicon.ico | Bin 5558 -> 5558 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/webapp/static/favicon.ico b/webapp/static/favicon.ico index ca3874fcc0b329fd93da1450fe3b8f6cdc559923..b535a3db8c4f259b421d370c3b319d43ed2130b7 100644 GIT binary patch literal 5558 zcmeHLc~F$+8UOZV?}NQpj%9&miQoZ2KoJxH6%Z6}$Ail&DxwmMQ9wkDS0ruIWa^}i zO>=aNGfne{b=qi~w3#*?8+F>;X;Q0+F(e+b$=G%>zdp~qEH1d9v8I3Zoq1-z{odz& z?(6*|NhZl9pHHG+pA@u8Qb3X?I(`(gN8td!P($b2hwRKolSBFiT zTCu#b5w!O;@h|$8WQZfW$715LVNA?{QZ8X!au#w^?u9~HhHKU5|Uu5 zJ_v8e7earIL-qs5oae!dA}+lhS7Dy}3`Qg*W81cNah7Q?Eu#58@ps>b40ZYWAvk57F zKki8hAh1abM}Y=u%_i7#B$&z$g#6y;1C9f8)st`*NC>Po!Z9HRsq3{!OY|c>m=3*8 zgVK`HaK5Y^hJTsLok{h}E%Mh?{R8N;8(~PX!W58TPM4rb84uTncSO8}^=DtW@BbTg zqbgwvN-(BM(EF`aGgiPn=P4*D7v*{f)Nwg1L(?$)gE2`(*X@nRMSbJgX0X@)nsnX^ zbH!t@Ejt>D|3UG`Ibg4UiG1@U;XNwOgwJ!nI##?4O|X*rR}8~HN#)J@Qp7ja*na)! zc|_+|h+Xg;>5@VHOE+W-#{khcjBkQmV}`5wje-6l9F7r7MGw^`#R=j=)6z|= zQe{3I(K{gEgiE4D84ca64x0y=2Zo&T& zV&^>#xi;sN7 z*0*1GibtlYFnS2@y}tMxLVv22+L1LJ1D$=$X?&BOF;3bNHD;KHcPqtK?Jq=cx6V04 zwaE*2%U^{IoC_R#Dpv+fr8{A*c|zoAv>qjBZKGN_eJ>=r;%VY5CkQGX>Hl(5>?L@P;4s0FzUPPNcZMWW9=B9~fA|<^ zyDVlG!k?CKf>(*lt-j!CIwdon{u(#tH_1WjCC(~VoW+O3Q(l-(7Y`PoKp11Q$m@9ieqw`^Z z%C#A@4)Zq*?z7(ZP;Iv@eNpspp4S{S_nS&OMco&@m}XwxsCmbThLYtlm33XXQKLT< z_igjkU48s{201{p=L;cvJU39^G?#T>rL){SQtA0h|Ljclo&BvFvsm;9qrM*K*)a?hQijfa;>FDlTvzE6PR|GX0rn{AATfe zBf=4L^L?+;yb`xqQff-XT+Fi>(J+^Got3o4e3EP6Qfej|C%2vBe$2YsYmY*TF_#jO zUYA{e(z*6eFicqgI{hCx@Zf-dnfm-Sr<`j}(zlpZC;4pOZZdtBSwheD0oc+1*cEyw M<0ePn{$_9g14$7TjsO4v literal 5558 zcmd^Dc~q1~68{`vfMJ|_U=Bde0S~S*0*ay{8V&^k0TJai9!W$LQ9KY8P*hfv=<1rc zZjx0uCc249-o~tkB)TRVk0dGq4dQ{(!~?Q9#JoI{-&Xg)1O!CQpZmSnZ+g0`tE#Jh zRn^^s&_@sn9v%YydIC;Dvu6)> z?%avpufB?X`}U!sq2Vz&J^GSeyLQ23G9e_yjL@)fgoTGA#B7GArzfhbs~?@=Bdlm_ zY=q8PgRE&&QM8~K({gi=m79zC)X$~9#NHMkeDJ{|aC~^ut4&uhE;<$p6nqXQQxcF0ry=>gubK8HwD|`ib_;_b z62qgPJF;_fG5eWkp;oJLh-~>VUu$bCqN1XZoH7Y()~!e7nktkoUk=xPo{&v^5ylli z@clC!GCwfP8J6DQxHPW#9*VSGFuHqTX=y26yJqcrq^6~FTVB6@y;l{sZQF*R;9xF$ zRYfH#R5XlMQhVwnMH$*EYes@$@ccvR6o z0s;duckbK=%D;E-9-^b8xy`E9RdfAWo^khfgR{9WBsvl7bY>oZ3fwn$o3JC zxQL()kwWjL!<>Rb&V$LHTR0CsK0at}ZthVBme*a~+)%P)DYD3StI8`7H8L8mId(7= z$PlnX37MY&Wzx&s_U-bSJyhv?As;BhpfUxgb;}WBXlMi~Dpw<$a^$k*Wl*V9IC$Vd zkMe73YB;7xj~)$$Tt+_g!T=v%n2IFOMmWH)P!9DF0kUx$EPikE0mFeJ@g+D%2rxY( z z&o!#P_B5@J<``r7jbWQLZQh5p=XFqw-vUj}yB7T4hd&krTEeC>=_M%QH&g#Z>v|Ti z+8Ku+@*0PC_U-L)|BYYOL*_LUddjaX$F}d!NPX8;tx#vYN_+9)IhMs=`@CUE8~%)g zA&*@P*Yeg*>sf9#mi-qZ*P%GD|DA5--@SVmlT(x7IAU=pY*}Ow|B|b))tKPuA5Zfw z9b{YLknxueD}cyB4&A&jJNt)h#W3PTHXIc>9N&G{(nW{TC5s^VO={D-V{8$BR$HDq zjy`sdP^E0|MnB@u;-BgeqtRr&-F=QA9Yp3?$jh0A-+ueeszcM|OVD@(LR(nJW&Li~ zwj4vY*3GYnojwSWgst5Dytb=SUxp3U7=3Xg*MY?X!=9Zkfc9PiW%6HnoOV~EIImLjV^ldZGbZC# zl3iDO29AaR=qP`6t|=Yt!1hn_L^2~phESeI?S>UYlJp8BiQ8d6W;GvU@hy_-p)0H< zUR0Cs!;s}a@uG35R|M)wcFlozVe35>2EteO^t6BSr+wU3Bu-4m8+%_vaq$AAr>0<1 z@s8z`{ePXaPWxek}ukIWqx*y-Go4M z7%nzmuwtgCPTiNa@HO>^WAxfKjC6wo@~5L|EKYv<30j(O!_7AcnrG=;+tFrZbLLxd zWEn<`h{Uz4S9%iJW&C1e1BMJ947*_qExD>=uBN`WupaIMLP_>5zBVg!GQ^`RezzIR z9Ykkqo{0(Zaa_kPLV6jvdGiKh#zw&=Ae;P6HfYO7EKl3Vynw8!Q>+|Le0mi2T3=}A zd;#OiA4$J2VdE2znfckcOXtDI{qEfP3DYUgMV@1!EjUa2`+@J>(GY|aWc!ZahU&Ex z2Z68)oC;^UQ&m@0cAWl0{q<`q;Ord&yMgJDxSFw{dR@2tPM!D^Z@=+6nl4}LcK(kH zHeI>Id7nCQtP`7_-Ua?&#@RawJ)Q6ulE--`Ie+dPcI?=JopjHutv%bxw!QtiL~%Mi zauh}mAAwO6g&7SzpK`+#iGSaP+YPQ{$asTX6)uM@4E6Qs51A$FEkiM#YI?5 zcaY-Z;!fwJJ9q9NJ}wRu;>N=~&JS*r1*oIrsBX}GY-uwzvB_{v7Z5bY2Z<9B5E(fF zw{G3G?&IgypAa}E6Ou8NP^WB!GBO_Ov@MjIZt

@;4|)CO|#uc}SnEhDTTuT5jL8 zuD^WY9Q-r4KwtI)<&qz%&hDWz58XwmcCn_MxE0EjSNNQs=KG~>M%|gu`1)V({esMS zbcUZpXFSTS#w;spIgy<;~IR^H$qq1 zcJ^iTbl;Xgxw=h0JA-VXv*$hwKdP~MsvmAi)%f~y1J2i-h3mxi(6`-P*_mFQUxPk= z$&k-F0mZXt(Z@dps+|3F-muhePMh=`)#=mN@sHQhH~XL^kCSeik{cM1x*GF}iZNwQ zIi?g;V%~y9@J(0-Z3*2CXpijNEX(@{J9qyR2k71>&)CarjCw&6{3ma~C!ciA!OT#H z4}ApRlr>N Date: Fri, 12 Feb 2021 03:28:58 +0100 Subject: [PATCH 047/344] delete stuff --- .github/workflows/cd.yml | 59 ----------------------------------- .gitignore | 1 - .gitmodules | 3 -- Ocelot-Social | 1 - backend/Dockerfile | 2 -- backend/constants/metadata.js | 7 ----- webapp/Dockerfile | 3 -- webapp/constants/emails.js | 4 --- webapp/constants/links.js | 7 ----- 9 files changed, 87 deletions(-) delete mode 100644 .github/workflows/cd.yml delete mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 160000 Ocelot-Social delete mode 100644 backend/Dockerfile delete mode 100644 backend/constants/metadata.js delete mode 100644 webapp/Dockerfile delete mode 100644 webapp/constants/emails.js delete mode 100644 webapp/constants/links.js diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml deleted file mode 100644 index 7e0ee678e..000000000 --- a/.github/workflows/cd.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: CD - -on: - push: - branches: [ master ] - -jobs: - build: - name: Build and push docker images - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: recursive - - - name: Build neo4j image - uses: docker/build-push-action@v1.1.0 - with: - repository: ocelotsocialnetwork/develop-neo4j - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - tags: latest - path: Ocelot-Social/neo4j/ - - name: Build backend base image - uses: docker/build-push-action@v1.1.0 - with: - repository: ocelotsocialnetwork/develop-backend - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - tags: build-and-test - target: build-and-test - path: Ocelot-Social/backend/ - - name: Build webapp base image - uses: docker/build-push-action@v1.1.0 - with: - repository: ocelotsocialnetwork/develop-webapp - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - tags: build-and-test - target: build-and-test - path: Ocelot-Social/webapp/ - - - name: Build backend customized image - uses: docker/build-push-action@v1.1.0 - with: - repository: ocelotsocialnetwork/develop-backend - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - tags: latest - path: backend/ - - name: Build webapp customized image - uses: docker/build-push-action@v1.1.0 - with: - repository: ocelotsocialnetwork/develop-webapp - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - tags: latest - path: webapp/ diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 496ee2ca6..000000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 060db510e..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Ocelot-Social"] - path = Ocelot-Social - url = https://github.com/Ocelot-Social-Community/Ocelot-Social.git diff --git a/Ocelot-Social b/Ocelot-Social deleted file mode 160000 index cc9c70dbe..000000000 --- a/Ocelot-Social +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cc9c70dbe7fc7f1d9bc90c06f3b3e4e78dd71113 diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 8951772a1..000000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,2 +0,0 @@ -FROM ocelotsocialnetwork/develop-backend:build-and-test -COPY constants/links.js constants/metadata.js src/config/ diff --git a/backend/constants/metadata.js b/backend/constants/metadata.js deleted file mode 100644 index 6017cd1af..000000000 --- a/backend/constants/metadata.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - APPLICATION_NAME: 'fyphe_O', - APPLICATION_SHORT_NAME: 'fyphe', - APPLICATION_DESCRIPTION: 'The Schools in Motion Network', - ORGANIZATION_NAME: 'Ensible e.V.', - ORGANIZATION_JURISDICTION: 'Köln', -} diff --git a/webapp/Dockerfile b/webapp/Dockerfile deleted file mode 100644 index e39305fb3..000000000 --- a/webapp/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM ocelotsocialnetwork/develop-webapp:build-and-test -COPY static/ static/ -COPY constants/ constants/ diff --git a/webapp/constants/emails.js b/webapp/constants/emails.js deleted file mode 100644 index 5a69681ce..000000000 --- a/webapp/constants/emails.js +++ /dev/null @@ -1,4 +0,0 @@ -export default { - SUPPORT: 'support-schools-in-motion@roschaefer.de', - MODERATION: 'moderation-schools-in-motion@roschaefer.de', -} diff --git a/webapp/constants/links.js b/webapp/constants/links.js deleted file mode 100644 index 36ee42370..000000000 --- a/webapp/constants/links.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - ORGANIZATION: 'https://www.youth-and-arts.nrw/', - DONATE: 'https://www.youth-and-arts.nrw/de/kontakt', - IMPRINT: 'https://www.youth-and-arts.nrw/de/impressum', - DATA_PRIVACY: 'https://www.youth-and-arts.nrw/de/datenschutzerklaerung', - FAQ: 'https://www.youth-and-arts.nrw/de/kontakt', -} From 28e2246e9f2e131274f051ce7c69f1159b4def56 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:29:26 +0100 Subject: [PATCH 048/344] constants --- {backend/constants => constants}/emails.js | 0 {backend/constants => constants}/links.js | 0 {webapp/constants => constants}/metadata.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {backend/constants => constants}/emails.js (100%) rename {backend/constants => constants}/links.js (100%) rename {webapp/constants => constants}/metadata.js (100%) diff --git a/backend/constants/emails.js b/constants/emails.js similarity index 100% rename from backend/constants/emails.js rename to constants/emails.js diff --git a/backend/constants/links.js b/constants/links.js similarity index 100% rename from backend/constants/links.js rename to constants/links.js diff --git a/webapp/constants/metadata.js b/constants/metadata.js similarity index 100% rename from webapp/constants/metadata.js rename to constants/metadata.js From 1df0381f7e60ae0e8baa2fdb664e552866a6488d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:30:01 +0100 Subject: [PATCH 049/344] statics --- {webapp/static => static}/favicon.ico | Bin {webapp/static => static}/icon.png | Bin .../img/custom/Logo-Horizontal-Dark.svg | 0 .../img/custom/Logo-Horizontal.svg | 0 {webapp/static => static}/img/custom/logout.svg | 0 .../static => static}/img/custom/password-reset.svg | 0 {webapp/static => static}/img/custom/sign-up.svg | 0 .../img/custom/under-maintenance.svg | 0 {webapp/static => static}/img/custom/welcome.svg | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename {webapp/static => static}/favicon.ico (100%) rename {webapp/static => static}/icon.png (100%) rename {webapp/static => static}/img/custom/Logo-Horizontal-Dark.svg (100%) rename {webapp/static => static}/img/custom/Logo-Horizontal.svg (100%) rename {webapp/static => static}/img/custom/logout.svg (100%) rename {webapp/static => static}/img/custom/password-reset.svg (100%) rename {webapp/static => static}/img/custom/sign-up.svg (100%) rename {webapp/static => static}/img/custom/under-maintenance.svg (100%) rename {webapp/static => static}/img/custom/welcome.svg (100%) diff --git a/webapp/static/favicon.ico b/static/favicon.ico similarity index 100% rename from webapp/static/favicon.ico rename to static/favicon.ico diff --git a/webapp/static/icon.png b/static/icon.png similarity index 100% rename from webapp/static/icon.png rename to static/icon.png diff --git a/webapp/static/img/custom/Logo-Horizontal-Dark.svg b/static/img/custom/Logo-Horizontal-Dark.svg similarity index 100% rename from webapp/static/img/custom/Logo-Horizontal-Dark.svg rename to static/img/custom/Logo-Horizontal-Dark.svg diff --git a/webapp/static/img/custom/Logo-Horizontal.svg b/static/img/custom/Logo-Horizontal.svg similarity index 100% rename from webapp/static/img/custom/Logo-Horizontal.svg rename to static/img/custom/Logo-Horizontal.svg diff --git a/webapp/static/img/custom/logout.svg b/static/img/custom/logout.svg similarity index 100% rename from webapp/static/img/custom/logout.svg rename to static/img/custom/logout.svg diff --git a/webapp/static/img/custom/password-reset.svg b/static/img/custom/password-reset.svg similarity index 100% rename from webapp/static/img/custom/password-reset.svg rename to static/img/custom/password-reset.svg diff --git a/webapp/static/img/custom/sign-up.svg b/static/img/custom/sign-up.svg similarity index 100% rename from webapp/static/img/custom/sign-up.svg rename to static/img/custom/sign-up.svg diff --git a/webapp/static/img/custom/under-maintenance.svg b/static/img/custom/under-maintenance.svg similarity index 100% rename from webapp/static/img/custom/under-maintenance.svg rename to static/img/custom/under-maintenance.svg diff --git a/webapp/static/img/custom/welcome.svg b/static/img/custom/welcome.svg similarity index 100% rename from webapp/static/img/custom/welcome.svg rename to static/img/custom/welcome.svg From ee966a533b9a85577d04c4d5b1f92b423d348b02 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:30:22 +0100 Subject: [PATCH 050/344] package.json for version number --- package.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 000000000..f93bfd10e --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "ocelot-social-branded", + "version": "0.0.1", + "description": "Ocelot Social Branded", + "author": "ocelot.social Community", + "license": "MIT", + "private": false, + "repository": { + "type": "git", + "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding.git" + }, + "scripts": {} +} From d049729b2572cf9153011e861441c174d3fb610a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:30:39 +0100 Subject: [PATCH 051/344] dockerfiles for front & backend --- backend.Dockerfile | 8 ++++++++ webapp.Dockerfile | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 backend.Dockerfile create mode 100644 webapp.Dockerfile diff --git a/backend.Dockerfile b/backend.Dockerfile new file mode 100644 index 000000000..c2e41e41b --- /dev/null +++ b/backend.Dockerfile @@ -0,0 +1,8 @@ +################################################################################## +# BRANDED ######################################################################## +################################################################################## +FROM ocelotsocialnetwork/backend:latest as branded + +# Copy public constants to the docker image branding it +COPY constants/links.js src/config/ +COPY constants/metadata.js src/config/ diff --git a/webapp.Dockerfile b/webapp.Dockerfile new file mode 100644 index 000000000..d87412ad3 --- /dev/null +++ b/webapp.Dockerfile @@ -0,0 +1,8 @@ +################################################################################## +# BRANDED ######################################################################## +################################################################################## +FROM ocelotsocialnetwork/webapp:latest as branded + +# Copy public constants to the docker image branding it +COPY static/ static/ +COPY constants/ constants/ From f7b0c4493963fc3e2b0ae7d4c582298953f1e948 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:30:51 +0100 Subject: [PATCH 052/344] publish workflow --- .github/workflows/publish.yml | 285 ++++++++++++++++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 000000000..f98a8be8e --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,285 @@ +#name: CD +# +#on: +# push: +# branches: [ master ] +# +#jobs: +# build: +# name: Build and push docker images +# runs-on: ubuntu-latest +# steps: +# - name: Checkout code +# uses: actions/checkout@v2 +# with: +# submodules: recursive +# +# - name: Build neo4j image +# uses: docker/build-push-action@v1.1.0 +# with: +# repository: ocelotsocialnetwork/develop-neo4j +# username: ${{ secrets.DOCKER_USERNAME }} +# password: ${{ secrets.DOCKER_PASSWORD }} +# tags: latest +# path: Ocelot-Social/neo4j/ +# - name: Build backend base image +# uses: docker/build-push-action@v1.1.0 +# with: +# repository: ocelotsocialnetwork/develop-backend +# username: ${{ secrets.DOCKER_USERNAME }} +# password: ${{ secrets.DOCKER_PASSWORD }} +# tags: build-and-test +# target: build-and-test +# path: Ocelot-Social/backend/ +# - name: Build webapp base image +# uses: docker/build-push-action@v1.1.0 +# with: +# repository: ocelotsocialnetwork/develop-webapp +# username: ${{ secrets.DOCKER_USERNAME }} +# password: ${{ secrets.DOCKER_PASSWORD }} +# tags: build-and-test +# target: build-and-test +# path: Ocelot-Social/webapp/ +# +# - name: Build backend customized image +# uses: docker/build-push-action@v1.1.0 +# with: +# repository: ocelotsocialnetwork/develop-backend +# username: ${{ secrets.DOCKER_USERNAME }} +# password: ${{ secrets.DOCKER_PASSWORD }} +# tags: latest +# path: backend/ +# - name: Build webapp customized image +# uses: docker/build-push-action@v1.1.0 +# with: +# repository: ocelotsocialnetwork/develop-webapp +# username: ${{ secrets.DOCKER_USERNAME }} +# password: ${{ secrets.DOCKER_PASSWORD }} +# tags: latest +# path: webapp/ + + +name: ocelot.social publish branded CI + +on: + push: + branches: + - master + +jobs: + ############################################################################## + # JOB: DOCKER BUILD BRANDED BACKEND ########################################## + ############################################################################## + build_branded_backend: + name: Docker Build Branded - Backend + runs-on: ubuntu-latest + #needs: [nothing] + 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 (branded) ################################ + ########################################################################## + - name: backend | Build `branded` image + run: | + docker build --target branded -t "ocelotsocialnetwork/backend-branded:latest" -t "ocelotsocialnetwork/backend-branded:${VERSION}" -t "ocelotsocialnetwork/backend-branded:${BUILD_VERSION}" -f backend.Dockerfile . + docker save "ocelotsocialnetwork/backend-branded" > /tmp/backend-branded.tar + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: docker-backend-branded + path: /tmp/backend-branded.tar + + ############################################################################## + # JOB: DOCKER BUILD BRANDED WEBAPP ########################################### + ############################################################################## + build_branded_webapp: + name: Docker Build Branded - WebApp + runs-on: ubuntu-latest + #needs: [nothing] + 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) ###################################### + ########################################################################## + - name: webapp | Build `branded` image + run: | + docker build --target branded -t "ocelotsocialnetwork/webapp-branded:latest" -t "ocelotsocialnetwork/webapp-branded:${VERSION}" -t "ocelotsocialnetwork/webapp-branded:${BUILD_VERSION}" -f webapp.Dockerfile . + docker save "ocelotsocialnetwork/webapp-branded" > /tmp/webapp-branded.tar + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: docker-webapp-branded + path: /tmp/webapp-branded.tar + + ############################################################################## + # JOB: DOCKER BUILD PRODUCTION MAINTENANCE ################################### + ############################################################################### + #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) ################################# + # ########################################################################## + # - name: maintenance | Build `production` image + # # TODO: --target production + # run: | + # docker build -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" webapp/ -f webapp/Dockerfile.maintenance + # docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar + # - name: Upload Artifact + # uses: actions/upload-artifact@v2 + # with: + # name: docker-maintenance-production + # path: /tmp/maintenance.tar + + ############################################################################## + # JOB: UPLOAD TO DOCKERHUB ################################################### + ############################################################################## + upload_to_dockerhub: + name: Upload to Dockerhub + runs-on: ubuntu-latest + needs: [build_branded_backend,build_branded_webapp] + env: + 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 (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-production + # path: /tmp + #- name: Load Docker Image + # run: docker load < /tmp/maintenance.tar + ########################################################################## + # Upload ################################################################# + ########################################################################## + - name: login to dockerhub + run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin + - name: Push backend + run: docker push --all-tags ocelotsocialnetwork/backend-branded + - name: Push webapp + run: docker push --all-tags ocelotsocialnetwork/webapp-branded + #- name: Push maintenance + # run: docker push --all-tags ocelotsocialnetwork/maintenance + + ############################################################################## + # JOB: GITHUB TAG LATEST VERSION ############################################# + ############################################################################## + github_tag: + name: Tag latest version on Github + runs-on: ubuntu-latest + needs: [upload_to_dockerhub] + steps: + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + 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 build tag to GitHub ############################################### + ########################################################################## + - name: package-version-to-git-tag + build number + uses: pkgdeps/git-tag-action@v2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + github_repo: ${{ github.repository }} + version: ${{ env.BUILD_VERSION }} + git_commit_sha: ${{ github.sha }} + git_tag_prefix: "b" + ########################################################################## + # Push release tag to GitHub ############################################# + ########################################################################## + - name: package-version-to-git-release + continue-on-error: true # Will fail if tag exists + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ env.VERSION }} + release_name: ${{ env.VERSION }} + #body_path: ./CHANGELOG.md + draft: false + prerelease: false \ No newline at end of file From 004180fae70866f2d141b68be976a96006329d7a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:47:54 +0100 Subject: [PATCH 053/344] maintenance dockerfile, v0.0.2, publish maintenance --- .github/workflows/publish.yml | 150 ++++++++++------------------------ maintenance.Dockerfile | 8 ++ package.json | 2 +- 3 files changed, 53 insertions(+), 107 deletions(-) create mode 100644 maintenance.Dockerfile diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f98a8be8e..a723ac904 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,64 +1,3 @@ -#name: CD -# -#on: -# push: -# branches: [ master ] -# -#jobs: -# build: -# name: Build and push docker images -# runs-on: ubuntu-latest -# steps: -# - name: Checkout code -# uses: actions/checkout@v2 -# with: -# submodules: recursive -# -# - name: Build neo4j image -# uses: docker/build-push-action@v1.1.0 -# with: -# repository: ocelotsocialnetwork/develop-neo4j -# username: ${{ secrets.DOCKER_USERNAME }} -# password: ${{ secrets.DOCKER_PASSWORD }} -# tags: latest -# path: Ocelot-Social/neo4j/ -# - name: Build backend base image -# uses: docker/build-push-action@v1.1.0 -# with: -# repository: ocelotsocialnetwork/develop-backend -# username: ${{ secrets.DOCKER_USERNAME }} -# password: ${{ secrets.DOCKER_PASSWORD }} -# tags: build-and-test -# target: build-and-test -# path: Ocelot-Social/backend/ -# - name: Build webapp base image -# uses: docker/build-push-action@v1.1.0 -# with: -# repository: ocelotsocialnetwork/develop-webapp -# username: ${{ secrets.DOCKER_USERNAME }} -# password: ${{ secrets.DOCKER_PASSWORD }} -# tags: build-and-test -# target: build-and-test -# path: Ocelot-Social/webapp/ -# -# - name: Build backend customized image -# uses: docker/build-push-action@v1.1.0 -# with: -# repository: ocelotsocialnetwork/develop-backend -# username: ${{ secrets.DOCKER_USERNAME }} -# password: ${{ secrets.DOCKER_PASSWORD }} -# tags: latest -# path: backend/ -# - name: Build webapp customized image -# uses: docker/build-push-action@v1.1.0 -# with: -# repository: ocelotsocialnetwork/develop-webapp -# username: ${{ secrets.DOCKER_USERNAME }} -# password: ${{ secrets.DOCKER_PASSWORD }} -# tags: latest -# path: webapp/ - - name: ocelot.social publish branded CI on: @@ -142,42 +81,41 @@ jobs: path: /tmp/webapp-branded.tar ############################################################################## - # JOB: DOCKER BUILD PRODUCTION MAINTENANCE ################################### - ############################################################################### - #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) ################################# - # ########################################################################## - # - name: maintenance | Build `production` image - # # TODO: --target production - # run: | - # docker build -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" webapp/ -f webapp/Dockerfile.maintenance - # docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar - # - name: Upload Artifact - # uses: actions/upload-artifact@v2 - # with: - # name: docker-maintenance-production - # path: /tmp/maintenance.tar + # JOB: DOCKER BUILD BRANDED MAINTENANCE ###################################### + ############################################################################## + build_branded_maintenance: + name: Docker Build Branded - Maintenance + runs-on: ubuntu-latest + #needs: [nothing] + 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) ################################# + ########################################################################## + - name: maintenance | Build `branded` image + run: | + docker build --target branded -t "ocelotsocialnetwork/maintenance-branded:latest" -t "ocelotsocialnetwork/maintenance-branded:${VERSION}" -t "ocelotsocialnetwork/maintenance-branded:${BUILD_VERSION}" -f maintenance.Dockerfile . + docker save "ocelotsocialnetwork/maintenance-branded" > /tmp/maintenance-branded.tar + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: docker-maintenance-branded + path: /tmp/maintenance-branded.tar ############################################################################## # JOB: UPLOAD TO DOCKERHUB ################################################### @@ -212,13 +150,13 @@ jobs: 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-production - # path: /tmp - #- name: Load Docker Image - # run: docker load < /tmp/maintenance.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 ########################################################################## # Upload ################################################################# ########################################################################## @@ -228,8 +166,8 @@ jobs: run: docker push --all-tags ocelotsocialnetwork/backend-branded - name: Push webapp run: docker push --all-tags ocelotsocialnetwork/webapp-branded - #- name: Push maintenance - # run: docker push --all-tags ocelotsocialnetwork/maintenance + - name: Push maintenance + run: docker push --all-tags ocelotsocialnetwork/maintenance-branded ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# diff --git a/maintenance.Dockerfile b/maintenance.Dockerfile new file mode 100644 index 000000000..c8ca4b71a --- /dev/null +++ b/maintenance.Dockerfile @@ -0,0 +1,8 @@ +################################################################################## +# BRANDED ######################################################################## +################################################################################## +FROM ocelotsocialnetwork/maintenance:latest as branded + +# Copy public constants to the docker image branding it +COPY static/ static/ +COPY constants/ constants/ diff --git a/package.json b/package.json index f93bfd10e..ffecd702d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-branded", - "version": "0.0.1", + "version": "0.0.2", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From ce0c36e966118a660354634f5ca2159c03476548 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 03:49:44 +0100 Subject: [PATCH 054/344] correct dependencies v0.0.3 --- .github/workflows/publish.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a723ac904..1c69757aa 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -123,7 +123,7 @@ jobs: upload_to_dockerhub: name: Upload to Dockerhub runs-on: ubuntu-latest - needs: [build_branded_backend,build_branded_webapp] + needs: [build_branded_backend,build_branded_webapp,build_branded_maintenance] env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} diff --git a/package.json b/package.json index ffecd702d..eb4a30bba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-branded", - "version": "0.0.2", + "version": "0.0.3", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From f2515874ab093a4909126400230ebccbe9bf8a13 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 12:11:18 +0100 Subject: [PATCH 055/344] v0.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb4a30bba..56a4abd59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-branded", - "version": "0.0.3", + "version": "0.0.4", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 900c4fe50a50bb0a2bb9c6c491fdc30a3cf80658 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 12:25:58 +0100 Subject: [PATCH 056/344] moved all branding files in branding repository --- backend.Dockerfile | 4 ++-- {constants => branding/constants}/emails.js | 0 {constants => branding/constants}/links.js | 0 {constants => branding/constants}/metadata.js | 0 {static => branding/static}/favicon.ico | Bin {static => branding/static}/icon.png | Bin .../static}/img/custom/Logo-Horizontal-Dark.svg | 0 .../static}/img/custom/Logo-Horizontal.svg | 0 {static => branding/static}/img/custom/logout.svg | 0 .../static}/img/custom/password-reset.svg | 0 {static => branding/static}/img/custom/sign-up.svg | 0 .../static}/img/custom/under-maintenance.svg | 0 {static => branding/static}/img/custom/welcome.svg | 0 maintenance.Dockerfile | 4 ++-- webapp.Dockerfile | 4 ++-- 15 files changed, 6 insertions(+), 6 deletions(-) rename {constants => branding/constants}/emails.js (100%) rename {constants => branding/constants}/links.js (100%) rename {constants => branding/constants}/metadata.js (100%) rename {static => branding/static}/favicon.ico (100%) rename {static => branding/static}/icon.png (100%) rename {static => branding/static}/img/custom/Logo-Horizontal-Dark.svg (100%) rename {static => branding/static}/img/custom/Logo-Horizontal.svg (100%) rename {static => branding/static}/img/custom/logout.svg (100%) rename {static => branding/static}/img/custom/password-reset.svg (100%) rename {static => branding/static}/img/custom/sign-up.svg (100%) rename {static => branding/static}/img/custom/under-maintenance.svg (100%) rename {static => branding/static}/img/custom/welcome.svg (100%) diff --git a/backend.Dockerfile b/backend.Dockerfile index c2e41e41b..db234aa44 100644 --- a/backend.Dockerfile +++ b/backend.Dockerfile @@ -4,5 +4,5 @@ FROM ocelotsocialnetwork/backend:latest as branded # Copy public constants to the docker image branding it -COPY constants/links.js src/config/ -COPY constants/metadata.js src/config/ +COPY branding/constants/links.js src/config/ +COPY branding/constants/metadata.js src/config/ diff --git a/constants/emails.js b/branding/constants/emails.js similarity index 100% rename from constants/emails.js rename to branding/constants/emails.js diff --git a/constants/links.js b/branding/constants/links.js similarity index 100% rename from constants/links.js rename to branding/constants/links.js diff --git a/constants/metadata.js b/branding/constants/metadata.js similarity index 100% rename from constants/metadata.js rename to branding/constants/metadata.js diff --git a/static/favicon.ico b/branding/static/favicon.ico similarity index 100% rename from static/favicon.ico rename to branding/static/favicon.ico diff --git a/static/icon.png b/branding/static/icon.png similarity index 100% rename from static/icon.png rename to branding/static/icon.png diff --git a/static/img/custom/Logo-Horizontal-Dark.svg b/branding/static/img/custom/Logo-Horizontal-Dark.svg similarity index 100% rename from static/img/custom/Logo-Horizontal-Dark.svg rename to branding/static/img/custom/Logo-Horizontal-Dark.svg diff --git a/static/img/custom/Logo-Horizontal.svg b/branding/static/img/custom/Logo-Horizontal.svg similarity index 100% rename from static/img/custom/Logo-Horizontal.svg rename to branding/static/img/custom/Logo-Horizontal.svg diff --git a/static/img/custom/logout.svg b/branding/static/img/custom/logout.svg similarity index 100% rename from static/img/custom/logout.svg rename to branding/static/img/custom/logout.svg diff --git a/static/img/custom/password-reset.svg b/branding/static/img/custom/password-reset.svg similarity index 100% rename from static/img/custom/password-reset.svg rename to branding/static/img/custom/password-reset.svg diff --git a/static/img/custom/sign-up.svg b/branding/static/img/custom/sign-up.svg similarity index 100% rename from static/img/custom/sign-up.svg rename to branding/static/img/custom/sign-up.svg diff --git a/static/img/custom/under-maintenance.svg b/branding/static/img/custom/under-maintenance.svg similarity index 100% rename from static/img/custom/under-maintenance.svg rename to branding/static/img/custom/under-maintenance.svg diff --git a/static/img/custom/welcome.svg b/branding/static/img/custom/welcome.svg similarity index 100% rename from static/img/custom/welcome.svg rename to branding/static/img/custom/welcome.svg diff --git a/maintenance.Dockerfile b/maintenance.Dockerfile index c8ca4b71a..585947cdd 100644 --- a/maintenance.Dockerfile +++ b/maintenance.Dockerfile @@ -4,5 +4,5 @@ FROM ocelotsocialnetwork/maintenance:latest as branded # Copy public constants to the docker image branding it -COPY static/ static/ -COPY constants/ constants/ +COPY branding/static/ static/ +COPY branding/constants/ constants/ diff --git a/webapp.Dockerfile b/webapp.Dockerfile index d87412ad3..cec47cc83 100644 --- a/webapp.Dockerfile +++ b/webapp.Dockerfile @@ -4,5 +4,5 @@ FROM ocelotsocialnetwork/webapp:latest as branded # Copy public constants to the docker image branding it -COPY static/ static/ -COPY constants/ constants/ +COPY branding/static/ static/ +COPY branding/constants/ constants/ From dc1b593b3e31ba8cd6efa11a5cfd9d9fbed210e7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 13:04:36 +0100 Subject: [PATCH 057/344] docker-compose testing --- docker-compose.override.yml | 25 ------------------------- docker-compose.yml | 30 +++++++++++++++++++++--------- 2 files changed, 21 insertions(+), 34 deletions(-) delete mode 100644 docker-compose.override.yml diff --git a/docker-compose.override.yml b/docker-compose.override.yml deleted file mode 100644 index 835797533..000000000 --- a/docker-compose.override.yml +++ /dev/null @@ -1,25 +0,0 @@ -version: "3.4" - -services: - webapp: - build: - context: webapp - environment: - - PUBLIC_REGISTRATION=true - backend: - build: - context: backend - environment: - - SMTP_HOST=mailserver - - SMTP_PORT=25 - - SMTP_IGNORE_TLS=true - - PUBLIC_REGISTRATION=true - mailserver: - image: djfarrelly/maildev - ports: - - 1080:80 - networks: - - hc-network - -networks: - hc-network: diff --git a/docker-compose.yml b/docker-compose.yml index ffde9a273..1e32ad8d9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,12 @@ +# This docker-compose file is just here for testing version: "3.4" services: webapp: - image: ocelotsocialnetwork/develop-webapp:master.2020.12.17 + build: + dockerfile: webapp.Dockerfile + target: branded + context: . ports: - 3000:3000 networks: @@ -14,10 +18,12 @@ services: - GRAPHQL_URI=http://backend:4000 - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" - WEBSOCKETS_URI=${WEBSOCKETS_URI} - - PUBLIC_REGISTRATION=false - command: yarn run dev + - PUBLIC_REGISTRATION=true backend: - image: ocelotsocialnetwork/develop-backend:master.2020.12.17 + build: + dockerfile: backend.Dockerfile + target: branded + context: . networks: - hc-network depends_on: @@ -34,13 +40,13 @@ services: - EMAIL_SUPPORT=support@wir.social - EMAIL_DEFAULT_SENDER=info@wir.social - PUBLIC_REGISTRATION=true - - SMTP_HOST=${SMTP_HOST} - - SMTP_PORT=${SMTP_PORT} - SMTP_USERNAME=${SMTP_USERNAME} - SMTP_PASSWORD=${SMTP_PASSWORD} - command: yarn run dev + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true neo4j: - image: ocelotsocialnetwork/develop-neo4j:0.6.3 + image: ocelotsocialnetwork/neo4j:community networks: - hc-network environment: @@ -49,5 +55,11 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - hc-network networks: - hc-network: + hc-network: \ No newline at end of file From 2a9d14df1e0071a1defe57e9252f6b2a021cbc31 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 13:04:53 +0100 Subject: [PATCH 058/344] v0.0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56a4abd59..7f0141e5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-branded", - "version": "0.0.4", + "version": "0.0.5", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 3ef2f7f00eaa9e016e8691a38d11c305bbf0fd03 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 13:10:45 +0100 Subject: [PATCH 059/344] adjusted data for ocelot --- branding/constants/emails.js | 4 ++-- branding/constants/links.js | 10 +++++----- branding/constants/metadata.js | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/branding/constants/emails.js b/branding/constants/emails.js index 5a69681ce..54e7bbf39 100644 --- a/branding/constants/emails.js +++ b/branding/constants/emails.js @@ -1,4 +1,4 @@ export default { - SUPPORT: 'support-schools-in-motion@roschaefer.de', - MODERATION: 'moderation-schools-in-motion@roschaefer.de', + SUPPORT: 'hello@ocelot.social', + MODERATION: 'hello@ocelot.social', } diff --git a/branding/constants/links.js b/branding/constants/links.js index 36ee42370..070ffa176 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,7 +1,7 @@ export default { - ORGANIZATION: 'https://www.youth-and-arts.nrw/', - DONATE: 'https://www.youth-and-arts.nrw/de/kontakt', - IMPRINT: 'https://www.youth-and-arts.nrw/de/impressum', - DATA_PRIVACY: 'https://www.youth-and-arts.nrw/de/datenschutzerklaerung', - FAQ: 'https://www.youth-and-arts.nrw/de/kontakt', + ORGANIZATION: 'https://ocelot.social', + DONATE: 'https://ocelot-social.herokuapp.com/donations', + IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', + DATA_PRIVACY: 'https://ocelot-social.herokuapp.com/imprint', + FAQ: 'https://ocelot-social.herokuapp.com/#kontakt', } diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 940e28c00..55dfe2372 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,8 +1,8 @@ export default { - APPLICATION_NAME: 'fyphe_O', - APPLICATION_SHORT_NAME: 'fyphe', - APPLICATION_DESCRIPTION: 'The Schools in Motion Network', + APPLICATION_NAME: 'ocelot.social', + APPLICATION_SHORT_NAME: 'ocelot', + APPLICATION_DESCRIPTION: 'Ocelot Social Community', COOKIE_NAME: 'ocelot-social-token', - ORGANIZATION_NAME: 'Ensible e.V.', - ORGANIZATION_JURISDICTION: 'Köln', + ORGANIZATION_NAME: 'busFaktor e.V.', + ORGANIZATION_JURISDICTION: 'Somewhere', } From e0e19d90edaab8c05802d84096317cd2e751f986 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 Feb 2021 13:17:07 +0100 Subject: [PATCH 060/344] use whitelabeled images for example branding --- branding/static/favicon.ico | Bin 5558 -> 5558 bytes branding/static/icon.png | Bin 19173 -> 21631 bytes .../static/img/custom/Logo-Horizontal.svg | 17 +++++++++++++++++ branding/static/img/custom/logout.svg | 17 +++++++++++++++++ branding/static/img/custom/password-reset.svg | 17 +++++++++++++++++ branding/static/img/custom/sign-up.svg | 17 +++++++++++++++++ .../static/img/custom/under-maintenance.svg | 17 +++++++++++++++++ branding/static/img/custom/welcome.svg | 17 +++++++++++++++++ 8 files changed, 102 insertions(+) diff --git a/branding/static/favicon.ico b/branding/static/favicon.ico index b535a3db8c4f259b421d370c3b319d43ed2130b7..430cef437289d45eaceaa1d096a3674fccbf62cc 100644 GIT binary patch delta 1445 zcmYjQdq`VX95%0OVvL&H7!wmr;xqV|)Ho zJiVcwot;ganwm-vI(txyMn^}5KAYCpTb?yHH&;9}GgEQCOzZji`RwzWzSq{)nB(JP zjZ7wUs#GdY#4G)fN&x#2u%+i1)J|w!y~rhm2%kLp#-j+Aoz%NrSEwG+@Q9E9%&?#B@9HV{4 zkEs(e%qmt-8yy}V4u`^f)6>%#)agYQt!YP4%mAj1;^;aJ3d0Ld&IP=NCy7`Lb3Em` z_{K7M_4kAy8ubS2=|@LLxxlx;oe>=MImhq!Cm@9aj94Vn2z}3aDwr35(~gnJ1^D?T zLBimrzP`S;-Q8UpsTgD(6~a6epau|58-h?1=JnVtX<%SL0Kpo3b0e}Cz%O&{g3HA+ zHIashkBf?mzQ%V3e7Z*CO9HkPd_Ar4Zbp3z>ly^1pxW5~dUkepg;J>uaEF4t0!A4} z%FD_K%d-E7#o{^$DkynzaWNkP9*~u^#=8Y(3dhFAmr%JjUvD+Ijf_KVF5!2`}Ckre}&D>%_|(oeHj_4`uG0*F0PTOjz>16wYBxx z;o%{@D5kU4lW14yuGH)G`nXq&GtS{~3?eTh#LU?C6MA5%1>4)(H`_e!=fbE|&J|pf zEYfC^7@e*MYX*qr<2N-Vav@jC8z!AC@v*s z7>3w{w@gq_GPR47kx@PRP)+Pngwx2O8V3glCVY+x&2i7M4Zn~`a|2=DsV2($5hBiV zueCQdR0INnOWobweBk4;--Box7=~$QXQ$9rTU!>P)GSCXpA%K{1YwL;f?P;sn|gZEYF)`}^H?yW`az*B!#9ln|xIPr^(3NLb+`qHLNV zY^sAe>zu@9dw0idHfQ5bmiYa0e;7SoxQef;sv7C(dBja9jQWQUzakckWn_JQ-Gc5a zR##Wk2L}hQnR9XimF4eqBG#zCalMjcUds5}=kt}|{(S%=AwT^%c#Tad{3EpJF;~bY zXvIeBn~si-L>!z7W_jYEAVY-x+t<-O$6PO)D0h5!fWQ)In0WY-BRw=P$TL?*l=4Q4)dBi=ceb4=9YteqlrrLaenEcIY%V23Lze1xOBY*8C_Ir(peu`!sPorBT50jCWEW@hG~SSSFpzZ6BKNxytT z2;%9k5L{tuM2cpfplU$BPpqV!%2T;#g>CW zrd!FBqs3KT2@ZzdL3bG4Cazi2v>o!*(JXUn6nb+x@Or(!ZERW%oL*K|zD3Tm$IaVO zQRFyoePm>md}e#>^J`4`O)JV8EiH#hk?R++0-8&v6%rjTm+Rs5^elPL4epx*RNIIY z(+Y@TMe+QYpTA6s{E&$A?Vbz*IzzVjJd5faDz=^Tr-&h(6!~DI9hpK?hzol9m$yK+ zg;R95-J`FLihieg$1h8gln6&6li_G|0>`EB0a|r95_^;DJO;UrE(k?xKjA%b)2gek zbTt+qtA%yY4i!K>Fa+xOeUO?aUSMFqX$9jvPbC$tYEx>v02OC8fY;N&`jVg(AApp; z2(lJm2)Dj0>$py` oYHdK!+dd#ucJUf_*V4Pd)t{uK#+2Oh7ew*@m~kdo@2P+2f7SlKP5=M^ diff --git a/branding/static/icon.png b/branding/static/icon.png index eca54133226e089f7f8ac6d4344fdd39f2012094..1c81fa5fca1a415323627f025eb8a68fbc2a6b79 100644 GIT binary patch delta 19968 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 Xl|C|^O9w(j00000NkvXXu0mjfxQ9{Q diff --git a/branding/static/img/custom/Logo-Horizontal.svg b/branding/static/img/custom/Logo-Horizontal.svg index f29b498eb..27b522b75 100644 --- a/branding/static/img/custom/Logo-Horizontal.svg +++ b/branding/static/img/custom/Logo-Horizontal.svg @@ -1,6 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/branding/static/img/custom/logout.svg b/branding/static/img/custom/logout.svg index f2ace345e..b130e7583 100644 --- a/branding/static/img/custom/logout.svg +++ b/branding/static/img/custom/logout.svg @@ -1,6 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/branding/static/img/custom/password-reset.svg b/branding/static/img/custom/password-reset.svg index 30d498fbb..68c94d49d 100644 --- a/branding/static/img/custom/password-reset.svg +++ b/branding/static/img/custom/password-reset.svg @@ -1,6 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/branding/static/img/custom/sign-up.svg b/branding/static/img/custom/sign-up.svg index f2ace345e..b130e7583 100644 --- a/branding/static/img/custom/sign-up.svg +++ b/branding/static/img/custom/sign-up.svg @@ -1,6 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/branding/static/img/custom/under-maintenance.svg b/branding/static/img/custom/under-maintenance.svg index f2ace345e..b130e7583 100644 --- a/branding/static/img/custom/under-maintenance.svg +++ b/branding/static/img/custom/under-maintenance.svg @@ -1,6 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/branding/static/img/custom/welcome.svg b/branding/static/img/custom/welcome.svg index 30d498fbb..68c94d49d 100644 --- a/branding/static/img/custom/welcome.svg +++ b/branding/static/img/custom/welcome.svg @@ -1,6 +1,23 @@ + + + + + + + + + + + + + + + + + From bf484ef6e65b0be66a91c9bfc263192ba7db35ea Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Sat, 13 Feb 2021 19:06:19 +0100 Subject: [PATCH 061/344] moved docker files into docker folder renamed hc-network to test-network in docker-compose file --- docker-compose.yml | 14 +++++++------- backend.Dockerfile => docker/backend.Dockerfile | 0 .../maintenance.Dockerfile | 0 webapp.Dockerfile => docker/webapp.Dockerfile | 0 4 files changed, 7 insertions(+), 7 deletions(-) rename backend.Dockerfile => docker/backend.Dockerfile (100%) rename maintenance.Dockerfile => docker/maintenance.Dockerfile (100%) rename webapp.Dockerfile => docker/webapp.Dockerfile (100%) diff --git a/docker-compose.yml b/docker-compose.yml index 1e32ad8d9..b680fd945 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,13 +4,13 @@ version: "3.4" services: webapp: build: - dockerfile: webapp.Dockerfile + dockerfile: docker/webapp.Dockerfile target: branded context: . ports: - 3000:3000 networks: - - hc-network + - test-network depends_on: - backend environment: @@ -21,11 +21,11 @@ services: - PUBLIC_REGISTRATION=true backend: build: - dockerfile: backend.Dockerfile + dockerfile: docker/backend.Dockerfile target: branded context: . networks: - - hc-network + - test-network depends_on: - neo4j ports: @@ -48,7 +48,7 @@ services: neo4j: image: ocelotsocialnetwork/neo4j:community networks: - - hc-network + - test-network environment: - NEO4J_AUTH=none - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* @@ -60,6 +60,6 @@ services: ports: - 1080:80 networks: - - hc-network + - test-network networks: - hc-network: \ No newline at end of file + test-network: \ No newline at end of file diff --git a/backend.Dockerfile b/docker/backend.Dockerfile similarity index 100% rename from backend.Dockerfile rename to docker/backend.Dockerfile diff --git a/maintenance.Dockerfile b/docker/maintenance.Dockerfile similarity index 100% rename from maintenance.Dockerfile rename to docker/maintenance.Dockerfile diff --git a/webapp.Dockerfile b/docker/webapp.Dockerfile similarity index 100% rename from webapp.Dockerfile rename to docker/webapp.Dockerfile From 2cbb9680e50d556dc6e15213ae3d0e423e8e7720 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Sat, 13 Feb 2021 19:08:35 +0100 Subject: [PATCH 062/344] fixed publish ci --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1c69757aa..3a28d0c4f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -35,7 +35,7 @@ jobs: ########################################################################## - name: backend | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/backend-branded:latest" -t "ocelotsocialnetwork/backend-branded:${VERSION}" -t "ocelotsocialnetwork/backend-branded:${BUILD_VERSION}" -f backend.Dockerfile . + docker build --target branded -t "ocelotsocialnetwork/backend-branded:latest" -t "ocelotsocialnetwork/backend-branded:${VERSION}" -t "ocelotsocialnetwork/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile . docker save "ocelotsocialnetwork/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -72,7 +72,7 @@ jobs: ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/webapp-branded:latest" -t "ocelotsocialnetwork/webapp-branded:${VERSION}" -t "ocelotsocialnetwork/webapp-branded:${BUILD_VERSION}" -f webapp.Dockerfile . + docker build --target branded -t "ocelotsocialnetwork/webapp-branded:latest" -t "ocelotsocialnetwork/webapp-branded:${VERSION}" -t "ocelotsocialnetwork/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile . docker save "ocelotsocialnetwork/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -109,7 +109,7 @@ jobs: ########################################################################## - name: maintenance | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/maintenance-branded:latest" -t "ocelotsocialnetwork/maintenance-branded:${VERSION}" -t "ocelotsocialnetwork/maintenance-branded:${BUILD_VERSION}" -f maintenance.Dockerfile . + docker build --target branded -t "ocelotsocialnetwork/maintenance-branded:latest" -t "ocelotsocialnetwork/maintenance-branded:${VERSION}" -t "ocelotsocialnetwork/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile . docker save "ocelotsocialnetwork/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 From 519ae6e0515fecaaf0cf66c68e61d202fa11911c Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Sat, 13 Feb 2021 19:09:02 +0100 Subject: [PATCH 063/344] v0.0.6 --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7f0141e5a..adb67e8dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-branded", - "version": "0.0.5", + "version": "0.0.6", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", @@ -8,6 +8,5 @@ "repository": { "type": "git", "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding.git" - }, - "scripts": {} + } } From 5a36f8e638e9d5acc6e873dcf9e2ae031b3af6f7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 15:18:05 +0100 Subject: [PATCH 064/344] persistent storage --- deployment/kubernetes/templates/storage/persistent.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 deployment/kubernetes/templates/storage/persistent.yml diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml new file mode 100644 index 000000000..3d609e387 --- /dev/null +++ b/deployment/kubernetes/templates/storage/persistent.yml @@ -0,0 +1,8 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: storage-persistent +provisioner: dobs.csi.digitalocean.com +reclaimPolicy: Retain +volumeBindingMode: Immediate +allowVolumeExpansion: true \ No newline at end of file From e8566b810f0a1a76a0e3a736739fb7a9eb8f9cdb Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 15:32:31 +0100 Subject: [PATCH 065/344] parameters & standard labels for persistent storage --- .../kubernetes/templates/storage/persistent.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml index 3d609e387..26bec6183 100644 --- a/deployment/kubernetes/templates/storage/persistent.yml +++ b/deployment/kubernetes/templates/storage/persistent.yml @@ -2,7 +2,13 @@ kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: storage-persistent -provisioner: dobs.csi.digitalocean.com -reclaimPolicy: Retain -volumeBindingMode: Immediate -allowVolumeExpansion: true \ No newline at end of file + labels: + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Chart.Name }}-{{ .Chart.Version }}" + app.kubernetes.io/version: "{{ .Chart.appVersion }}" + app.kubernetes.io/component: "storage-persistent" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" +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 From b21126c69627b0b63cb6c35343970bad8309257d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:05:33 +0100 Subject: [PATCH 066/344] corrected storage labels & name --- deployment/kubernetes/templates/storage/persistent.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml index 26bec6183..c1e0b4bce 100644 --- a/deployment/kubernetes/templates/storage/persistent.yml +++ b/deployment/kubernetes/templates/storage/persistent.yml @@ -1,13 +1,15 @@ kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: - name: storage-persistent + name: storage-{{ .Release.Name }}-persistent labels: app.kubernetes.io/name: "{{ .Chart.Name }}" - app.kubernetes.io/instance: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/version: "{{ .Chart.appVersion }}" - app.kubernetes.io/component: "storage-persistent" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "persistent storage" 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 }} From c4dbce979333fbaa422f812b271c8514ab7e8b5b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:06:05 +0100 Subject: [PATCH 067/344] webapp definitions --- .../kubernetes/templates/webapp/ConfigMap.yml | 17 +++++++++ .../templates/webapp/Deployment.yaml | 37 +++++++++++++++++++ .../kubernetes/templates/webapp/Secret.yaml | 13 +++++++ .../kubernetes/templates/webapp/Service.yaml | 20 ++++++++++ 4 files changed, 87 insertions(+) create mode 100644 deployment/kubernetes/templates/webapp/ConfigMap.yml create mode 100644 deployment/kubernetes/templates/webapp/Deployment.yaml create mode 100644 deployment/kubernetes/templates/webapp/Secret.yaml create mode 100644 deployment/kubernetes/templates/webapp/Service.yaml diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml new file mode 100644 index 000000000..491b7d1b1 --- /dev/null +++ b/deployment/kubernetes/templates/webapp/ConfigMap.yml @@ -0,0 +1,17 @@ +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 }}" + WEBSOCKETS_URI: "{{ .Values.WEBAPP.WEBSOCKETS_URI }}" + GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000" \ No newline at end of file diff --git a/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/kubernetes/templates/webapp/Deployment.yaml new file mode 100644 index 000000000..a5b2fcfb5 --- /dev/null +++ b/deployment/kubernetes/templates/webapp/Deployment.yaml @@ -0,0 +1,37 @@ +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 }} + selector: + matchLabels: + app: {{ .Release.Name }}-webapp + template: + metadata: + 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/kubernetes/templates/webapp/Secret.yaml b/deployment/kubernetes/templates/webapp/Secret.yaml new file mode 100644 index 000000000..a2e22563c --- /dev/null +++ b/deployment/kubernetes/templates/webapp/Secret.yaml @@ -0,0 +1,13 @@ +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: diff --git a/deployment/kubernetes/templates/webapp/Service.yaml b/deployment/kubernetes/templates/webapp/Service.yaml new file mode 100644 index 000000000..563a59693 --- /dev/null +++ b/deployment/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 From ead95a9e4e9a699caea224dfe1995731e7e2d8aa Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:06:16 +0100 Subject: [PATCH 068/344] ingress for webapp --- .../kubernetes/templates/webapp/Ingress.yaml | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 deployment/kubernetes/templates/webapp/Ingress.yaml diff --git a/deployment/kubernetes/templates/webapp/Ingress.yaml b/deployment/kubernetes/templates/webapp/Ingress.yaml new file mode 100644 index 000000000..ec0621027 --- /dev/null +++ b/deployment/kubernetes/templates/webapp/Ingress.yaml @@ -0,0 +1,32 @@ +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 \ No newline at end of file From fdd724ea4b7add4838400c406a7e05640faf1a88 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:32:42 +0100 Subject: [PATCH 069/344] neo4j templates --- .../kubernetes/templates/neo4j/ConfigMap.yml | 21 +++++++ .../templates/neo4j/Deployment.yaml | 55 +++++++++++++++++++ .../neo4j/PersistentVolumeClaim.yaml | 19 +++++++ .../kubernetes/templates/neo4j/Secret.yaml | 15 +++++ .../kubernetes/templates/neo4j/Service.yaml | 23 ++++++++ 5 files changed, 133 insertions(+) create mode 100644 deployment/kubernetes/templates/neo4j/ConfigMap.yml create mode 100644 deployment/kubernetes/templates/neo4j/Deployment.yaml create mode 100644 deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml create mode 100644 deployment/kubernetes/templates/neo4j/Secret.yaml create mode 100644 deployment/kubernetes/templates/neo4j/Service.yaml diff --git a/deployment/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/kubernetes/templates/neo4j/ConfigMap.yml new file mode 100644 index 000000000..3a14b8c73 --- /dev/null +++ b/deployment/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/kubernetes/templates/neo4j/Deployment.yaml b/deployment/kubernetes/templates/neo4j/Deployment.yaml new file mode 100644 index 000000000..ffd21b61e --- /dev/null +++ b/deployment/kubernetes/templates/neo4j/Deployment.yaml @@ -0,0 +1,55 @@ +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 + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: "100%" + selector: + matchLabels: + app: {{ .Release.Name }}-neo4j + template: + metadata: + name: neo4j + annotations: + backup.velero.io/backup-volumes: neo4j-data + labels: + app: {{ .Release.Name }}-neo4j + spec: + containers: + - 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/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml b/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml new file mode 100644 index 000000000..e946f2610 --- /dev/null +++ b/deployment/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/kubernetes/templates/neo4j/Secret.yaml b/deployment/kubernetes/templates/neo4j/Secret.yaml new file mode 100644 index 000000000..68abd52d2 --- /dev/null +++ b/deployment/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/kubernetes/templates/neo4j/Service.yaml b/deployment/kubernetes/templates/neo4j/Service.yaml new file mode 100644 index 000000000..2f190e863 --- /dev/null +++ b/deployment/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: web + # port: 7474 + # targetPort: 7474 + selector: + app: {{ .Release.Name }}-neo4j From b1680328cb48762dea6aa89ec0b0d0a60d700d97 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:33:02 +0100 Subject: [PATCH 070/344] default folders for helm chart --- deployment/kubernetes/charts/.gitkeep | 0 deployment/kubernetes/crds/.gitkeep | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 deployment/kubernetes/charts/.gitkeep create mode 100644 deployment/kubernetes/crds/.gitkeep diff --git a/deployment/kubernetes/charts/.gitkeep b/deployment/kubernetes/charts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/kubernetes/crds/.gitkeep b/deployment/kubernetes/crds/.gitkeep new file mode 100644 index 000000000..e69de29bb From 9bbbfb23f548e2c130e4690eefcdc8ada359c08b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:42:56 +0100 Subject: [PATCH 071/344] backend templates --- .../templates/backend/ConfigMap.yml | 26 +++++++++ .../templates/backend/Deployment.yaml | 55 +++++++++++++++++++ .../backend/PersistentVolumeClaim.yaml | 24 ++++++++ .../kubernetes/templates/backend/Secret.yaml | 21 +++++++ .../kubernetes/templates/backend/Service.yaml | 20 +++++++ 5 files changed, 146 insertions(+) create mode 100644 deployment/kubernetes/templates/backend/ConfigMap.yml create mode 100644 deployment/kubernetes/templates/backend/Deployment.yaml create mode 100644 deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml create mode 100644 deployment/kubernetes/templates/backend/Secret.yaml create mode 100644 deployment/kubernetes/templates/backend/Service.yaml diff --git a/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/kubernetes/templates/backend/ConfigMap.yml new file mode 100644 index 000000000..a8c480abf --- /dev/null +++ b/deployment/kubernetes/templates/backend/ConfigMap.yml @@ -0,0 +1,26 @@ +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: + PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + 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/kubernetes/templates/backend/Deployment.yaml b/deployment/kubernetes/templates/backend/Deployment.yaml new file mode 100644 index 000000000..108a5d10a --- /dev/null +++ b/deployment/kubernetes/templates/backend/Deployment.yaml @@ -0,0 +1,55 @@ +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 }} + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: "100%" + selector: + matchLabels: + app: {{ .Release.Name }}-backend + template: + metadata: + annotations: + backup.velero.io/backup-volumes: uploads + 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/kubernetes/templates/backend/PersistentVolumeClaim.yaml b/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml new file mode 100644 index 000000000..d75b2f252 --- /dev/null +++ b/deployment/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/kubernetes/templates/backend/Secret.yaml b/deployment/kubernetes/templates/backend/Secret.yaml new file mode 100644 index 000000000..a24941ebe --- /dev/null +++ b/deployment/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.BACKEND.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/kubernetes/templates/backend/Service.yaml b/deployment/kubernetes/templates/backend/Service.yaml new file mode 100644 index 000000000..0098589fd --- /dev/null +++ b/deployment/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 From 18eef420ebd1571fed9a82f4d3f0002972be8ee3 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:43:05 +0100 Subject: [PATCH 072/344] fixed neo4j container name --- deployment/kubernetes/templates/neo4j/Deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/templates/neo4j/Deployment.yaml b/deployment/kubernetes/templates/neo4j/Deployment.yaml index ffd21b61e..23ae8d8d7 100644 --- a/deployment/kubernetes/templates/neo4j/Deployment.yaml +++ b/deployment/kubernetes/templates/neo4j/Deployment.yaml @@ -28,7 +28,7 @@ spec: app: {{ .Release.Name }}-neo4j spec: containers: - - name: neo4j + - name: container-{{ .Release.Name }}-neo4j image: "{{ .Values.NEO4J.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" imagePullPolicy: {{ .Values.NEO4J.DOCKER_IMAGE_PULL_POLICY }} ports: From eb31dc08ea6c64740c43815301cc28b8677e7657 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 16 Feb 2021 16:51:30 +0100 Subject: [PATCH 073/344] job db-init --- .../templates/jobs/job-db-init.yaml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 deployment/kubernetes/templates/jobs/job-db-init.yaml diff --git a/deployment/kubernetes/templates/jobs/job-db-init.yaml b/deployment/kubernetes/templates/jobs/job-db-init.yaml new file mode 100644 index 000000000..6f2966edd --- /dev/null +++ b/deployment/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 From ac45b0a49e3d003bb626b9a40ab6c97b9e199d8a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 02:39:56 +0100 Subject: [PATCH 074/344] maintenance template --- .../templates/maintenance/ConfigMap.yml | 14 +++++++++++++ .../templates/maintenance/Secret.yaml | 13 ++++++++++++ .../templates/maintenance/Service.yaml | 20 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 deployment/kubernetes/templates/maintenance/ConfigMap.yml create mode 100644 deployment/kubernetes/templates/maintenance/Secret.yaml create mode 100644 deployment/kubernetes/templates/maintenance/Service.yaml diff --git a/deployment/kubernetes/templates/maintenance/ConfigMap.yml b/deployment/kubernetes/templates/maintenance/ConfigMap.yml new file mode 100644 index 000000000..9d845c066 --- /dev/null +++ b/deployment/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/kubernetes/templates/maintenance/Secret.yaml b/deployment/kubernetes/templates/maintenance/Secret.yaml new file mode 100644 index 000000000..420330c69 --- /dev/null +++ b/deployment/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/kubernetes/templates/maintenance/Service.yaml b/deployment/kubernetes/templates/maintenance/Service.yaml new file mode 100644 index 000000000..40a96f663 --- /dev/null +++ b/deployment/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 From 691c519be3f21e0d3b591f9bd6b79ac4e79b5fbe Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 02:40:29 +0100 Subject: [PATCH 075/344] license & notes --- deployment/kubernetes/LICENSE | 12 ++++++++++++ deployment/kubernetes/templates/NOTES.txt | 1 + 2 files changed, 13 insertions(+) create mode 100644 deployment/kubernetes/LICENSE create mode 100644 deployment/kubernetes/templates/NOTES.txt diff --git a/deployment/kubernetes/LICENSE b/deployment/kubernetes/LICENSE new file mode 100644 index 000000000..a027039fd --- /dev/null +++ b/deployment/kubernetes/LICENSE @@ -0,0 +1,12 @@ +# LICENSE + +MIT License + +Copyright \(c\) 2021 Ulf Gebhardt + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/deployment/kubernetes/templates/NOTES.txt b/deployment/kubernetes/templates/NOTES.txt new file mode 100644 index 000000000..3db4648ca --- /dev/null +++ b/deployment/kubernetes/templates/NOTES.txt @@ -0,0 +1 @@ +You installed ocelot-social! Congrats <3 \ No newline at end of file From d6d7801eb80025ffec7a3e83410fad52142c65ee Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 12:49:46 +0100 Subject: [PATCH 076/344] named port, tabs for tags --- deployment/kubernetes/templates/neo4j/Service.yaml | 2 +- .../kubernetes/templates/storage/persistent.yml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deployment/kubernetes/templates/neo4j/Service.yaml b/deployment/kubernetes/templates/neo4j/Service.yaml index 2f190e863..d6bef364a 100644 --- a/deployment/kubernetes/templates/neo4j/Service.yaml +++ b/deployment/kubernetes/templates/neo4j/Service.yaml @@ -16,7 +16,7 @@ spec: port: 7687 targetPort: 7687 protocol: TCP - #- name: web + #- name: {{ .Release.Name }}-http # port: 7474 # targetPort: 7474 selector: diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml index c1e0b4bce..173390674 100644 --- a/deployment/kubernetes/templates/storage/persistent.yml +++ b/deployment/kubernetes/templates/storage/persistent.yml @@ -3,13 +3,13 @@ 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: "persistent storage" - app.kubernetes.io/part-of: "{{ .Chart.Name }}" + app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/version: "{{ .Chart.AppVersion }}" + app.kubernetes.io/component: "persistent storage" + app.kubernetes.io/part-of: "{{ .Chart.Name }}" app.kubernetes.io/managed-by: "{{ .Release.Service }}" - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" provisioner: {{ .Values.STORAGE.PROVISIONER }} reclaimPolicy: {{ .Values.STORAGE.RECLAIM_POLICY }} volumeBindingMode: {{ .Values.STORAGE.VOLUME_BINDING_MODE }} From 49a46ef5e343942b63fdfeb813211c8590b8e67a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 12:51:40 +0100 Subject: [PATCH 077/344] tabs --- deployment/kubernetes/templates/storage/persistent.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml index 173390674..d067dd3ad 100644 --- a/deployment/kubernetes/templates/storage/persistent.yml +++ b/deployment/kubernetes/templates/storage/persistent.yml @@ -3,7 +3,7 @@ apiVersion: storage.k8s.io/v1 metadata: name: storage-{{ .Release.Name }}-persistent labels: - app.kubernetes.io/name: "{{ .Chart.Name }}" + app.kubernetes.io/name: "{{ .Chart.Name }}" app.kubernetes.io/instance: "{{ .Release.Name }}" app.kubernetes.io/version: "{{ .Chart.AppVersion }}" app.kubernetes.io/component: "persistent storage" From 412473b85d733f49e98be729c9c5358629ae398b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 12:57:11 +0100 Subject: [PATCH 078/344] fixed tabs --- .../kubernetes/templates/jobs/job-db-init.yaml | 12 ++++++------ .../kubernetes/templates/maintenance/ConfigMap.yml | 12 ++++++------ .../kubernetes/templates/maintenance/Secret.yaml | 12 ++++++------ .../kubernetes/templates/maintenance/Service.yaml | 12 ++++++------ deployment/kubernetes/templates/neo4j/ConfigMap.yml | 12 ++++++------ deployment/kubernetes/templates/webapp/ConfigMap.yml | 12 ++++++------ .../kubernetes/templates/webapp/Deployment.yaml | 12 ++++++------ deployment/kubernetes/templates/webapp/Ingress.yaml | 12 ++++++------ deployment/kubernetes/templates/webapp/Secret.yaml | 12 ++++++------ deployment/kubernetes/templates/webapp/Service.yaml | 12 ++++++------ 10 files changed, 60 insertions(+), 60 deletions(-) diff --git a/deployment/kubernetes/templates/jobs/job-db-init.yaml b/deployment/kubernetes/templates/jobs/job-db-init.yaml index 6f2966edd..6536d3ac7 100644 --- a/deployment/kubernetes/templates/jobs/job-db-init.yaml +++ b/deployment/kubernetes/templates/jobs/job-db-init.yaml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" annotations: "helm.sh/hook": post-install "helm.sh/hook-delete-policy": hook-succeeded, hook-failed diff --git a/deployment/kubernetes/templates/maintenance/ConfigMap.yml b/deployment/kubernetes/templates/maintenance/ConfigMap.yml index 9d845c066..91d50e60f 100644 --- a/deployment/kubernetes/templates/maintenance/ConfigMap.yml +++ b/deployment/kubernetes/templates/maintenance/ConfigMap.yml @@ -3,12 +3,12 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" data: HOST: "0.0.0.0" \ No newline at end of file diff --git a/deployment/kubernetes/templates/maintenance/Secret.yaml b/deployment/kubernetes/templates/maintenance/Secret.yaml index 420330c69..fa8129915 100644 --- a/deployment/kubernetes/templates/maintenance/Secret.yaml +++ b/deployment/kubernetes/templates/maintenance/Secret.yaml @@ -3,11 +3,11 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" stringData: diff --git a/deployment/kubernetes/templates/maintenance/Service.yaml b/deployment/kubernetes/templates/maintenance/Service.yaml index 40a96f663..f924bafe6 100644 --- a/deployment/kubernetes/templates/maintenance/Service.yaml +++ b/deployment/kubernetes/templates/maintenance/Service.yaml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: ports: - name: {{ .Release.Name }}-http diff --git a/deployment/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/kubernetes/templates/neo4j/ConfigMap.yml index 3a14b8c73..e4371f035 100644 --- a/deployment/kubernetes/templates/neo4j/ConfigMap.yml +++ b/deployment/kubernetes/templates/neo4j/ConfigMap.yml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" data: NEO4J_ACCEPT_LICENSE_AGREEMENT: "{{ .Values.NEO4J.ACCEPT_LICENSE_AGREEMENT }}" NEO4J_AUTH: "{{ .Values.NEO4J.AUTH }}" diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml index 491b7d1b1..ba955ef6d 100644 --- a/deployment/kubernetes/templates/webapp/ConfigMap.yml +++ b/deployment/kubernetes/templates/webapp/ConfigMap.yml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" data: HOST: "0.0.0.0" PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" diff --git a/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/kubernetes/templates/webapp/Deployment.yaml index a5b2fcfb5..c12b08e8d 100644 --- a/deployment/kubernetes/templates/webapp/Deployment.yaml +++ b/deployment/kubernetes/templates/webapp/Deployment.yaml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: replicas: {{ .Values.WEBAPP.REPLICAS }} minReadySeconds: {{ .Values.WEBAPP.MIN_READY_SECONDS }} diff --git a/deployment/kubernetes/templates/webapp/Ingress.yaml b/deployment/kubernetes/templates/webapp/Ingress.yaml index ec0621027..12957443c 100644 --- a/deployment/kubernetes/templates/webapp/Ingress.yaml +++ b/deployment/kubernetes/templates/webapp/Ingress.yaml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: {{ .Values.LETSENCRYPT.ISSUER }} diff --git a/deployment/kubernetes/templates/webapp/Secret.yaml b/deployment/kubernetes/templates/webapp/Secret.yaml index a2e22563c..8cf937ce6 100644 --- a/deployment/kubernetes/templates/webapp/Secret.yaml +++ b/deployment/kubernetes/templates/webapp/Secret.yaml @@ -3,11 +3,11 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" stringData: diff --git a/deployment/kubernetes/templates/webapp/Service.yaml b/deployment/kubernetes/templates/webapp/Service.yaml index 563a59693..832ec757d 100644 --- a/deployment/kubernetes/templates/webapp/Service.yaml +++ b/deployment/kubernetes/templates/webapp/Service.yaml @@ -3,13 +3,13 @@ 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/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 "+" "_" }}" + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: ports: - name: {{ .Release.Name }}-http From 63b00d67b5b909c9f3e363070cfc7e4babe34aeb Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 16:59:30 +0100 Subject: [PATCH 079/344] corrected component label (no spaces allowed) --- deployment/kubernetes/templates/backend/ConfigMap.yml | 2 +- deployment/kubernetes/templates/backend/Deployment.yaml | 2 +- .../kubernetes/templates/backend/PersistentVolumeClaim.yaml | 2 +- deployment/kubernetes/templates/backend/Secret.yaml | 2 +- deployment/kubernetes/templates/backend/Service.yaml | 2 +- deployment/kubernetes/templates/jobs/job-db-init.yaml | 2 +- deployment/kubernetes/templates/maintenance/ConfigMap.yml | 2 +- deployment/kubernetes/templates/maintenance/Secret.yaml | 2 +- deployment/kubernetes/templates/maintenance/Service.yaml | 2 +- deployment/kubernetes/templates/neo4j/ConfigMap.yml | 2 +- deployment/kubernetes/templates/neo4j/Deployment.yaml | 2 +- .../kubernetes/templates/neo4j/PersistentVolumeClaim.yaml | 2 +- deployment/kubernetes/templates/neo4j/Secret.yaml | 2 +- deployment/kubernetes/templates/neo4j/Service.yaml | 2 +- deployment/kubernetes/templates/storage/persistent.yml | 2 +- deployment/kubernetes/templates/webapp/ConfigMap.yml | 2 +- deployment/kubernetes/templates/webapp/Deployment.yaml | 2 +- deployment/kubernetes/templates/webapp/Ingress.yaml | 2 +- deployment/kubernetes/templates/webapp/Secret.yaml | 2 +- deployment/kubernetes/templates/webapp/Service.yaml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/kubernetes/templates/backend/ConfigMap.yml index a8c480abf..ec7a56658 100644 --- a/deployment/kubernetes/templates/backend/ConfigMap.yml +++ b/deployment/kubernetes/templates/backend/ConfigMap.yml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/backend/Deployment.yaml b/deployment/kubernetes/templates/backend/Deployment.yaml index 108a5d10a..3c606fa85 100644 --- a/deployment/kubernetes/templates/backend/Deployment.yaml +++ b/deployment/kubernetes/templates/backend/Deployment.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml b/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml index d75b2f252..758e9e18c 100644 --- a/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml +++ b/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/backend/Secret.yaml b/deployment/kubernetes/templates/backend/Secret.yaml index a24941ebe..51e5516c2 100644 --- a/deployment/kubernetes/templates/backend/Secret.yaml +++ b/deployment/kubernetes/templates/backend/Secret.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/backend/Service.yaml b/deployment/kubernetes/templates/backend/Service.yaml index 0098589fd..9029be586 100644 --- a/deployment/kubernetes/templates/backend/Service.yaml +++ b/deployment/kubernetes/templates/backend/Service.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/jobs/job-db-init.yaml b/deployment/kubernetes/templates/jobs/job-db-init.yaml index 6536d3ac7..f207bd8c1 100644 --- a/deployment/kubernetes/templates/jobs/job-db-init.yaml +++ b/deployment/kubernetes/templates/jobs/job-db-init.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/maintenance/ConfigMap.yml b/deployment/kubernetes/templates/maintenance/ConfigMap.yml index 91d50e60f..fe29afbfe 100644 --- a/deployment/kubernetes/templates/maintenance/ConfigMap.yml +++ b/deployment/kubernetes/templates/maintenance/ConfigMap.yml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/maintenance/Secret.yaml b/deployment/kubernetes/templates/maintenance/Secret.yaml index fa8129915..b4752e552 100644 --- a/deployment/kubernetes/templates/maintenance/Secret.yaml +++ b/deployment/kubernetes/templates/maintenance/Secret.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/maintenance/Service.yaml b/deployment/kubernetes/templates/maintenance/Service.yaml index f924bafe6..95f042df5 100644 --- a/deployment/kubernetes/templates/maintenance/Service.yaml +++ b/deployment/kubernetes/templates/maintenance/Service.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/kubernetes/templates/neo4j/ConfigMap.yml index e4371f035..9f0aa4bee 100644 --- a/deployment/kubernetes/templates/neo4j/ConfigMap.yml +++ b/deployment/kubernetes/templates/neo4j/ConfigMap.yml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/neo4j/Deployment.yaml b/deployment/kubernetes/templates/neo4j/Deployment.yaml index 23ae8d8d7..dc3ec902d 100644 --- a/deployment/kubernetes/templates/neo4j/Deployment.yaml +++ b/deployment/kubernetes/templates/neo4j/Deployment.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml b/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml index e946f2610..3aab02d9f 100644 --- a/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml +++ b/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/neo4j/Secret.yaml b/deployment/kubernetes/templates/neo4j/Secret.yaml index 68abd52d2..d8b1c17db 100644 --- a/deployment/kubernetes/templates/neo4j/Secret.yaml +++ b/deployment/kubernetes/templates/neo4j/Secret.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/neo4j/Service.yaml b/deployment/kubernetes/templates/neo4j/Service.yaml index d6bef364a..4ed56bd3f 100644 --- a/deployment/kubernetes/templates/neo4j/Service.yaml +++ b/deployment/kubernetes/templates/neo4j/Service.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml index d067dd3ad..2ac07c5de 100644 --- a/deployment/kubernetes/templates/storage/persistent.yml +++ b/deployment/kubernetes/templates/storage/persistent.yml @@ -6,7 +6,7 @@ metadata: app.kubernetes.io/name: "{{ .Chart.Name }}" app.kubernetes.io/instance: "{{ .Release.Name }}" app.kubernetes.io/version: "{{ .Chart.AppVersion }}" - app.kubernetes.io/component: "persistent storage" + 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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml index ba955ef6d..e7093e680 100644 --- a/deployment/kubernetes/templates/webapp/ConfigMap.yml +++ b/deployment/kubernetes/templates/webapp/ConfigMap.yml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/kubernetes/templates/webapp/Deployment.yaml index c12b08e8d..e418343ed 100644 --- a/deployment/kubernetes/templates/webapp/Deployment.yaml +++ b/deployment/kubernetes/templates/webapp/Deployment.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/webapp/Ingress.yaml b/deployment/kubernetes/templates/webapp/Ingress.yaml index 12957443c..00c8f94ed 100644 --- a/deployment/kubernetes/templates/webapp/Ingress.yaml +++ b/deployment/kubernetes/templates/webapp/Ingress.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/webapp/Secret.yaml b/deployment/kubernetes/templates/webapp/Secret.yaml index 8cf937ce6..15b1db4f6 100644 --- a/deployment/kubernetes/templates/webapp/Secret.yaml +++ b/deployment/kubernetes/templates/webapp/Secret.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" diff --git a/deployment/kubernetes/templates/webapp/Service.yaml b/deployment/kubernetes/templates/webapp/Service.yaml index 832ec757d..0c3112e77 100644 --- a/deployment/kubernetes/templates/webapp/Service.yaml +++ b/deployment/kubernetes/templates/webapp/Service.yaml @@ -6,7 +6,7 @@ metadata: 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/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 "+" "_" }}" From 481174421b67ded6e5164baad73c864879fcbdb0 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 17:22:22 +0100 Subject: [PATCH 080/344] support multiple domains --- deployment/kubernetes/templates/webapp/Ingress.yaml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/templates/webapp/Ingress.yaml b/deployment/kubernetes/templates/webapp/Ingress.yaml index 00c8f94ed..d7b12bdc8 100644 --- a/deployment/kubernetes/templates/webapp/Ingress.yaml +++ b/deployment/kubernetes/templates/webapp/Ingress.yaml @@ -17,16 +17,20 @@ metadata: spec: tls: - hosts: - - {{ .Values.LETSENCRYPT.DOMAIN }} + {{- range .Values.LETSENCRYPT.DOMAINS }} + - {{ . }} + {{- end }} secretName: tls rules: - - host: {{ .Values.LETSENCRYPT.DOMAIN }} + {{- range .Values.LETSENCRYPT.DOMAINS }} + - host: {{ . }} http: paths: - path: / pathType: ImplementationSpecific backend: service: - name: {{ .Release.Name }}-webapp + name: {{ $.Release.Name }}-webapp port: - number: 3000 \ No newline at end of file + number: 3000 + {{- end }} \ No newline at end of file From 82c3fdcaf2b38d1f1ee1031d5472304f7b8dd3de Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 17:42:13 +0100 Subject: [PATCH 081/344] maintenance deployment --- .../templates/maintenance/Deployment.yaml | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 deployment/kubernetes/templates/maintenance/Deployment.yaml diff --git a/deployment/kubernetes/templates/maintenance/Deployment.yaml b/deployment/kubernetes/templates/maintenance/Deployment.yaml new file mode 100644 index 000000000..1094d0833 --- /dev/null +++ b/deployment/kubernetes/templates/maintenance/Deployment.yaml @@ -0,0 +1,34 @@ +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: + selector: + matchLabels: + app: {{ .Release.Name }}-maintenance + template: + metadata: + labels: + app: {{ .Release.Name }}-maintenance + spec: + containers: + - 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 }} From 55e977f7a10a4d2cae8703b46b4c96c5a7b7a5ec Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 17:47:13 +0100 Subject: [PATCH 082/344] helm chart --- deployment/kubernetes/Chart.yaml | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 deployment/kubernetes/Chart.yaml diff --git a/deployment/kubernetes/Chart.yaml b/deployment/kubernetes/Chart.yaml new file mode 100644 index 000000000..e7f36a7a3 --- /dev/null +++ b/deployment/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: "0.6.10" +# Be aware that this requires all dockers to have the same 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 From 0a4c8381b861c7fee46f93b6bae5b474d093a8a9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 17:57:38 +0100 Subject: [PATCH 083/344] cluster issues (letsencrypt - production & staging) --- .../issuer/letsencrypt-production.yaml | 22 +++++++++++++++++++ .../templates/issuer/letsencrypt-staging.yaml | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 deployment/kubernetes/templates/issuer/letsencrypt-production.yaml create mode 100644 deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml new file mode 100644 index 000000000..2836cceff --- /dev/null +++ b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml @@ -0,0 +1,22 @@ +apiVersion: cert-manager.io/v1alpha2 +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/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml new file mode 100644 index 000000000..7190e6553 --- /dev/null +++ b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml @@ -0,0 +1,22 @@ +apiVersion: cert-manager.io/v1alpha2 +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 From 58b624f2d6b7b9c1343cbd8424ad9bfdfe0b5373 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 17 Feb 2021 21:45:18 +0100 Subject: [PATCH 084/344] job db-migrate (works now in 0.6.14) --- .../templates/jobs/job-db-migrate.yaml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 deployment/kubernetes/templates/jobs/job-db-migrate.yaml diff --git a/deployment/kubernetes/templates/jobs/job-db-migrate.yaml b/deployment/kubernetes/templates/jobs/job-db-migrate.yaml new file mode 100644 index 000000000..950793db4 --- /dev/null +++ b/deployment/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 From 0ce7c637f43c52ec0900d0462b118bc0c51f1cc1 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 23 Feb 2021 17:54:00 +0100 Subject: [PATCH 085/344] deployment make sure to restart pods, restart policy --- deployment/kubernetes/templates/backend/Deployment.yaml | 5 +++-- deployment/kubernetes/templates/maintenance/Deployment.yaml | 5 +++++ deployment/kubernetes/templates/neo4j/Deployment.yaml | 5 +++-- deployment/kubernetes/templates/webapp/Deployment.yaml | 6 ++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/templates/backend/Deployment.yaml b/deployment/kubernetes/templates/backend/Deployment.yaml index 3c606fa85..1d7bcfad4 100644 --- a/deployment/kubernetes/templates/backend/Deployment.yaml +++ b/deployment/kubernetes/templates/backend/Deployment.yaml @@ -16,8 +16,7 @@ spec: progressDeadlineSeconds: {{ .Values.BACKEND.PROGRESS_DEADLINE_SECONDS }} strategy: rollingUpdate: - maxSurge: 0 - maxUnavailable: "100%" + maxUnavailable: 1 selector: matchLabels: app: {{ .Release.Name }}-backend @@ -25,6 +24,8 @@ spec: metadata: annotations: backup.velero.io/backup-volumes: uploads + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} labels: app: {{ .Release.Name }}-backend spec: diff --git a/deployment/kubernetes/templates/maintenance/Deployment.yaml b/deployment/kubernetes/templates/maintenance/Deployment.yaml index 1094d0833..6c4e7f8dd 100644 --- a/deployment/kubernetes/templates/maintenance/Deployment.yaml +++ b/deployment/kubernetes/templates/maintenance/Deployment.yaml @@ -11,6 +11,9 @@ metadata: app.kubernetes.io/managed-by: "{{ .Release.Service }}" helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: + strategy: + rollingUpdate: + maxUnavailable: 1 selector: matchLabels: app: {{ .Release.Name }}-maintenance @@ -18,6 +21,8 @@ spec: metadata: labels: app: {{ .Release.Name }}-maintenance + # make sure the pod is redeployed + rollme: {{ randAlphaNum 5 | quote }} spec: containers: - name: maintenance diff --git a/deployment/kubernetes/templates/neo4j/Deployment.yaml b/deployment/kubernetes/templates/neo4j/Deployment.yaml index dc3ec902d..2176fb2d9 100644 --- a/deployment/kubernetes/templates/neo4j/Deployment.yaml +++ b/deployment/kubernetes/templates/neo4j/Deployment.yaml @@ -14,8 +14,7 @@ spec: replicas: 1 strategy: rollingUpdate: - maxSurge: 0 - maxUnavailable: "100%" + maxUnavailable: 1 selector: matchLabels: app: {{ .Release.Name }}-neo4j @@ -24,6 +23,8 @@ spec: 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: diff --git a/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/kubernetes/templates/webapp/Deployment.yaml index e418343ed..93d1639d4 100644 --- a/deployment/kubernetes/templates/webapp/Deployment.yaml +++ b/deployment/kubernetes/templates/webapp/Deployment.yaml @@ -14,11 +14,17 @@ spec: replicas: {{ .Values.WEBAPP.REPLICAS }} minReadySeconds: {{ .Values.WEBAPP.MIN_READY_SECONDS }} progressDeadlineSeconds: {{ .Values.WEBAPP.PROGRESS_DEADLINE_SECONDS }} + 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: From 58124209bcde202ff65fb2d74a46798d71028562 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 24 Feb 2021 01:12:42 +0100 Subject: [PATCH 086/344] READMEs & ignore value files --- deployment/README.md | 5 ++ deployment/kubernetes/.gitignore | 3 + deployment/kubernetes/README.md | 111 +++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 deployment/README.md create mode 100644 deployment/kubernetes/.gitignore create mode 100644 deployment/kubernetes/README.md diff --git a/deployment/README.md b/deployment/README.md new file mode 100644 index 000000000..1800e1a29 --- /dev/null +++ b/deployment/README.md @@ -0,0 +1,5 @@ +# Deployment + +You have the following options for a deployment: + +- [Kubernetes with Helm](./kubernetes/README.md) \ No newline at end of file diff --git a/deployment/kubernetes/.gitignore b/deployment/kubernetes/.gitignore new file mode 100644 index 000000000..e0473b0fd --- /dev/null +++ b/deployment/kubernetes/.gitignore @@ -0,0 +1,3 @@ +/dns.values.yaml +/nginx.values.yaml +/values.yaml diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md new file mode 100644 index 000000000..c3722dd7d --- /dev/null +++ b/deployment/kubernetes/README.md @@ -0,0 +1,111 @@ +# Helm installation of Ocelot.social + +Deploying Ocelot.social with Helm 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. + +## Configuration + +You can customize the network with your configuration by changing the `values.yaml`, all variables will be available as environment variables in your deployed kubernetes pods. For more details refer to the `values.yaml.dist` file. + +Besides the `values.yaml.dist` file we provide a `nginx.values.yaml.dist` and `dns.values.yaml.dist`. The `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 digital ocean and therefore optional. + +As hinted above you should copy the given files and rename them accordingly. Then go ahead and modify the values in the newly created files accordingly. + +## Installation + +Due to the many limitations of Helm you still have to do several manual steps. Those occur before you run the actual ocelot helm chart. Obviously it is expected of you to have `helm` and `kubectl` installed. For Digital Ocean you might require `doctl` aswell. + +### Cert Manager (https) + +Please refer to https://cert-manager.io/docs/installation/kubernetes/ for more details. + +1. Create Namespace + +```bash +kubectl --kubeconfig=/../kubeconfig.yaml create namespace cert-manager +``` + +2. Add Helm Repo & update + +```bash +helm repo add jetstack https://charts.jetstack.io +helm repo update +``` + +3. Install Cert-Manager Helm chart +```bash +# this can not be included sine the CRDs cant be installed properly via helm... +helm --kubeconfig=/../kubeconfig.yaml \ + install cert-manager jetstack/cert-manager \ + --namespace cert-manager \ + --version v1.1.0 \ + --set installCRDs=true +``` + +### Ingress-Nginx + +1. Add Helm Repo & update +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +``` + +2. Install ingress-nginx +```bash +helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +``` + +### Digital Ocean Firewall + +This is only necessary if you run Digital Ocean without load balancer. + +1. Authenticate towards DO with your local `doctl` + +You will need a DO token for that. +```bash +doctl auth init +``` + +2. Generate DO firewall +```bash +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:1ebf0cdc-86c9-4384-936b-40010b71d049 \ +--name=my-domain-http-https +``` + +### DNS + +This chart is only necessary (recommended is more precise) if you run Digital Ocean without load balancer. +You need to generate a token for the `dns.values.yaml`. + +1. Add Helm Repo & update +```bash +helm repo add bitnami https://charts.bitnami.com/bitnami +helm repo update +``` + +2. Install DNS +```bash +helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns.values.yaml +``` + +### Ocelot.social + +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 +```bash +helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ +``` + +#### Upgrade +```bash +helm --kubeconfig=/../kubeconfig.yaml upgrade 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 +helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot +``` \ No newline at end of file From 9186c1e92c7df642d2b1356545c19792259e82d7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 24 Feb 2021 01:14:57 +0100 Subject: [PATCH 087/344] dns.values.yaml.dist --- deployment/kubernetes/dns.values.yaml.dist | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 deployment/kubernetes/dns.values.yaml.dist diff --git a/deployment/kubernetes/dns.values.yaml.dist b/deployment/kubernetes/dns.values.yaml.dist new file mode 100644 index 000000000..16d297573 --- /dev/null +++ b/deployment/kubernetes/dns.values.yaml.dist @@ -0,0 +1,10 @@ +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 From 3ae0cf77961849dd1d51745f12c03c58cfa08de8 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 24 Feb 2021 01:15:17 +0100 Subject: [PATCH 088/344] nginx.values.yaml.dist --- deployment/kubernetes/nginx.values.yaml.dist | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 deployment/kubernetes/nginx.values.yaml.dist diff --git a/deployment/kubernetes/nginx.values.yaml.dist b/deployment/kubernetes/nginx.values.yaml.dist new file mode 100644 index 000000000..06dad8136 --- /dev/null +++ b/deployment/kubernetes/nginx.values.yaml.dist @@ -0,0 +1,11 @@ +controller: + kind: DaemonSet + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + ingressClass: nginx + daemonset: + useHostPort: true + service: + type: ClusterIP +rbac: + create: true \ No newline at end of file From a506f0216d593a695de4d045b854d12f12db1400 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 24 Feb 2021 01:38:22 +0100 Subject: [PATCH 089/344] values.yaml.dist --- deployment/kubernetes/values.yaml.dist | 104 +++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 deployment/kubernetes/values.yaml.dist diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist new file mode 100644 index 000000000..e259e9125 --- /dev/null +++ b/deployment/kubernetes/values.yaml.dist @@ -0,0 +1,104 @@ +# Change all the below if needed +PUBLIC_REGISTRATION: 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" + CLIENT_URI: "https://staging.ocelot.social" + JWT_SECRET: "b/&&7b78BF&fv/Vd" + MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + PRIVATE_KEY_PASSPHRASE: "a7dsf78sadg87ad87sfagsadg78" + EMAIL_DEFAULT_SENDER: "devops@ocelot.social" + SMTP_HOST: "mail.ocelot.social" + SMTP_USERNAME: "devops@ocelot.social" + SMTP_PASSWORD: "devops@ocelot.social" + SMTP_PORT: "465" + SMTP_IGNORE_TLS: 'true' + SMTP_SECURE: 'false' + + # Most likely you don't need to change this + MIN_READY_SECONDS: "15" + PROGRESS_DEADLINE_SECONDS: "60" + 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" + 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" + 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 + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j" + 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" + + # Most likely you don't need to change this + 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 From 200b8b72f1f2efd442c8339592471610119d943d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 25 Feb 2021 17:22:26 +0100 Subject: [PATCH 090/344] included some README texts in the two main READMEs --- deployment/README.md | 30 +++++++++++++++++++++++++++++- deployment/kubernetes/README.md | 23 ++++++++++++++++++++--- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/deployment/README.md b/deployment/README.md index 1800e1a29..53ea1957b 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -2,4 +2,32 @@ You have the following options for a deployment: -- [Kubernetes with Helm](./kubernetes/README.md) \ No newline at end of file +- [Kubernetes with Helm](./kubernetes/README.md) + + +## 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 +``` + diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index c3722dd7d..e71ecede9 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -16,7 +16,7 @@ Due to the many limitations of Helm you still have to do several manual steps. T ### Cert Manager (https) -Please refer to https://cert-manager.io/docs/installation/kubernetes/ for more details. +Please refer to [cert-manager.io docs](https://cert-manager.io/docs/installation/kubernetes/) for more details. 1. Create Namespace @@ -56,7 +56,7 @@ helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingres ### Digital Ocean Firewall -This is only necessary if you run Digital Ocean without load balancer. +This is only necessary if you run Digital Ocean 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` @@ -108,4 +108,21 @@ Be aware that if you uninstall ocelot the formerly bound volumes become unbound. ```bash helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot -``` \ No newline at end of file +``` + +## 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 Digital Ocean's kubernetes clusters do not fulfill the requirements. \ No newline at end of file From 8e1708284bd93fb511d518c55909c9aa9404d077 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 25 Feb 2021 18:57:37 +0100 Subject: [PATCH 091/344] updated README.md & external Minikube.md --- deployment/Minikube.md | 25 +++++++++++++++++++++++++ deployment/README.md | 29 +++++------------------------ 2 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 deployment/Minikube.md 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.md b/deployment/README.md index 53ea1957b..f0d573a51 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -4,30 +4,11 @@ You have the following options for a deployment: - [Kubernetes with Helm](./kubernetes/README.md) +## After Deployment -## Minikube +After the first deployment of the new network on your server, the database is initialized with the default administrator: -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 -``` +- E-mail: admin@example.org +- Password: 1234 +TODO: 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 !!! \ No newline at end of file From dfc07d88af49dd54005da67520ff6378a31811d4 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 25 Feb 2021 19:01:54 +0100 Subject: [PATCH 092/344] remains from the deployment folder of the ocelot-social repository --- deployment/old/Maintenance.md | 45 +++++ deployment/old/digital-ocean/README.md | 39 +++++ .../old/digital-ocean/dashboard/README.md | 55 ++++++ .../digital-ocean/dashboard/admin-user.yaml | 5 + .../dashboard/dashboard-screenshot.png | Bin 0 -> 181783 bytes .../digital-ocean/dashboard/role-binding.yaml | 12 ++ deployment/old/digital-ocean/https/README.md | 126 ++++++++++++++ .../old/digital-ocean/https/ip-address.png | Bin 0 -> 144403 bytes deployment/old/legacy-migration/README.md | 85 ++++++++++ .../legacy-migration/maintenance-worker.yaml | 40 +++++ .../maintenance-worker/.dockerignore | 1 + .../maintenance-worker/.gitignore | 2 + .../maintenance-worker/Dockerfile | 21 +++ .../maintenance-worker/binaries/.env | 6 + .../maintenance-worker/binaries/idle | 2 + .../binaries/import_legacy_db | 12 ++ .../binaries/import_legacy_uploads | 17 ++ .../maintenance-worker/known_hosts | 3 + .../maintenance-worker/migration/mongo/.env | 17 ++ .../migration/mongo/export.sh | 53 ++++++ .../maintenance-worker/migration/neo4j/.env | 16 ++ .../migration/neo4j/badges/badges.cql | 52 ++++++ .../migration/neo4j/badges/delete.cql | 1 + .../migration/neo4j/categories/categories.cql | 129 +++++++++++++++ .../migration/neo4j/categories/delete.cql | 1 + .../migration/neo4j/comments/comments.cql | 67 ++++++++ .../migration/neo4j/comments/delete.cql | 1 + .../neo4j/contributions/contributions.cql | 156 ++++++++++++++++++ .../migration/neo4j/contributions/delete.cql | 2 + .../migration/neo4j/delete_all.cql | 1 + .../migration/neo4j/emotions/delete.cql | 1 + .../migration/neo4j/emotions/emotions.cql | 58 +++++++ .../migration/neo4j/follows/delete.cql | 1 + .../migration/neo4j/follows/follows.cql | 36 ++++ .../migration/neo4j/import.sh | 108 ++++++++++++ .../migration/neo4j/invites/delete.cql | 0 .../migration/neo4j/invites/invites.cql | 39 +++++ .../migration/neo4j/notifications/delete.cql | 0 .../neo4j/notifications/notifications.cql | 48 ++++++ .../migration/neo4j/organizations/delete.cql | 0 .../neo4j/organizations/organizations.cql | 137 +++++++++++++++ .../migration/neo4j/pages/delete.cql | 0 .../migration/neo4j/pages/pages.cql | 55 ++++++ .../migration/neo4j/projects/delete.cql | 0 .../migration/neo4j/projects/projects.cql | 44 +++++ .../migration/neo4j/settings/delete.cql | 0 .../migration/neo4j/settings/settings.cql | 36 ++++ .../migration/neo4j/shouts/delete.cql | 1 + .../migration/neo4j/shouts/shouts.cql | 36 ++++ .../migration/neo4j/status/delete.cql | 0 .../migration/neo4j/status/status.cql | 19 +++ .../neo4j/systemnotifications/delete.cql | 0 .../systemnotifications.cql | 61 +++++++ .../migration/neo4j/users/delete.cql | 2 + .../migration/neo4j/users/users.cql | 124 ++++++++++++++ .../migration/neo4j/userscandos/delete.cql | 0 .../neo4j/userscandos/userscandos.cql | 35 ++++ .../migration/neo4j/usersettings/delete.cql | 0 .../neo4j/usersettings/usersettings.cql | 43 +++++ deployment/old/mailserver/Deployment.yaml | 40 +++++ deployment/old/mailserver/README.md | 18 ++ deployment/old/mailserver/Service.yaml | 22 +++ deployment/old/mailserver/ingress.yaml | 42 +++++ deployment/old/monitoring/README.md | 43 +++++ deployment/old/monitoring/grafana/config.yml | 16 ++ deployment/old/monitoring/grafana/metrics.png | Bin 0 -> 211436 bytes deployment/old/monitoring/grafana/values.yml | 4 + deployment/old/volumes/README.md | 37 +++++ deployment/old/volumes/neo4j-data.yaml | 12 ++ .../volumes/neo4j-offline-backup/README.md | 88 ++++++++++ .../old/volumes/neo4j-online-backup/README.md | 59 +++++++ deployment/old/volumes/uploads.yaml | 12 ++ deployment/old/volumes/velero/README.md | 112 +++++++++++++ .../old/volumes/volume-snapshots/README.md | 50 ++++++ .../digital-ocean-volume-snapshots.png | Bin 0 -> 120810 bytes .../volumes/volume-snapshots/neo4j-data.yaml | 18 ++ .../volumes/volume-snapshots/snapshot.yaml | 10 ++ 77 files changed, 2434 insertions(+) create mode 100644 deployment/old/Maintenance.md create mode 100644 deployment/old/digital-ocean/README.md create mode 100644 deployment/old/digital-ocean/dashboard/README.md create mode 100644 deployment/old/digital-ocean/dashboard/admin-user.yaml create mode 100644 deployment/old/digital-ocean/dashboard/dashboard-screenshot.png create mode 100644 deployment/old/digital-ocean/dashboard/role-binding.yaml create mode 100644 deployment/old/digital-ocean/https/README.md create mode 100644 deployment/old/digital-ocean/https/ip-address.png create mode 100644 deployment/old/legacy-migration/README.md create mode 100644 deployment/old/legacy-migration/maintenance-worker.yaml create mode 100644 deployment/old/legacy-migration/maintenance-worker/.dockerignore create mode 100644 deployment/old/legacy-migration/maintenance-worker/.gitignore create mode 100644 deployment/old/legacy-migration/maintenance-worker/Dockerfile create mode 100644 deployment/old/legacy-migration/maintenance-worker/binaries/.env create mode 100755 deployment/old/legacy-migration/maintenance-worker/binaries/idle create mode 100755 deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db create mode 100755 deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads create mode 100644 deployment/old/legacy-migration/maintenance-worker/known_hosts create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/mongo/.env create mode 100755 deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/.env create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql create mode 100755 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql create mode 100644 deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql create mode 100644 deployment/old/mailserver/Deployment.yaml create mode 100644 deployment/old/mailserver/README.md create mode 100644 deployment/old/mailserver/Service.yaml create mode 100644 deployment/old/mailserver/ingress.yaml create mode 100644 deployment/old/monitoring/README.md create mode 100644 deployment/old/monitoring/grafana/config.yml create mode 100644 deployment/old/monitoring/grafana/metrics.png create mode 100644 deployment/old/monitoring/grafana/values.yml create mode 100644 deployment/old/volumes/README.md create mode 100644 deployment/old/volumes/neo4j-data.yaml create mode 100644 deployment/old/volumes/neo4j-offline-backup/README.md create mode 100644 deployment/old/volumes/neo4j-online-backup/README.md create mode 100644 deployment/old/volumes/uploads.yaml create mode 100644 deployment/old/volumes/velero/README.md create mode 100644 deployment/old/volumes/volume-snapshots/README.md create mode 100644 deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png create mode 100644 deployment/old/volumes/volume-snapshots/neo4j-data.yaml create mode 100644 deployment/old/volumes/volume-snapshots/snapshot.yaml diff --git a/deployment/old/Maintenance.md b/deployment/old/Maintenance.md new file mode 100644 index 000000000..08a177e65 --- /dev/null +++ b/deployment/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/old/digital-ocean/README.md b/deployment/old/digital-ocean/README.md new file mode 100644 index 000000000..2ded38336 --- /dev/null +++ b/deployment/old/digital-ocean/README.md @@ -0,0 +1,39 @@ +# Digital Ocean + +As a start, read the [introduction into Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) by the folks at Digital Ocean. The following section should enable you to deploy ocelot.social to your Kubernetes cluster. + +## Connect to your local cluster + +1. Create a cluster at [Digital Ocean](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. + +Digital Ocean Kubernetes clusters don't have a graphical interface, so I suggest +to setup the [Kubernetes dashboard](./dashboard/README.md) as a next step. +Configuring [HTTPS](./https/README.md) is bit tricky and therefore I suggest to +do this as a last step. + +## Spaces + +We are storing our images in the s3-compatible [DigitalOcean Spaces](https://www.digitalocean.com/docs/spaces/). + +We still want to take backups of our images in case something happens to the images in the cloud. See these [instructions](https://www.digitalocean.com/docs/spaces/resources/s3cmd-usage/) about getting set up with `s3cmd` to take a copy of all images in a `Spaces` namespace, 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/old/digital-ocean/dashboard/README.md b/deployment/old/digital-ocean/dashboard/README.md new file mode 100644 index 000000000..5f66afe0b --- /dev/null +++ b/deployment/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/old/digital-ocean/dashboard/admin-user.yaml b/deployment/old/digital-ocean/dashboard/admin-user.yaml new file mode 100644 index 000000000..27b6bb802 --- /dev/null +++ b/deployment/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/old/digital-ocean/dashboard/dashboard-screenshot.png b/deployment/old/digital-ocean/dashboard/dashboard-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6aefb5414d26ac3cb69153c0624456e47e4ba88f GIT binary patch literal 181783 zcmeFZX*|?@`!`-n3nyAkibRVRLMas4Qd*QH#@JP2GJ~;%j4gypqOz5>1(`83wz1Dl z2xTuB%P^E>ForPJvHU+%=k>eJ&g;DDe?Pb%-M=UE%E9ULL-GqbFqX@O?@y|8Ad-Tq*N|4@@4DHoYXJlhQp#0_bqx4AmB= zqfC;!4P#1krTW8JFUzCrTNDxP0|81CJ4u31dcr|QgR%~h+{ zZu-@Syk>J<#BZOt;mosDTBvBJ?JZ}2_rSFq(8cS2`AY7B0uOGL9E!*lur2w%m7GIS zPo7*yQnPZLXa!aKS7CL2e$Bn@fp_n&l`%?xD7AmTPJLqhh95_eb5OHcEWEVw`S*>! z)Vn(Iwd!t}VIlI;_Mi5Bu!x7x2MfiTxQM*3{js=vJgbA~2iy0h-}`=?Z+ik(1bF^_ zu$!e^zLl>(_t`i8k3V0yAG{E$+KB$~!Yg-Dm8A_ zc#jWV=&bC6s?|wYW^SY9+l46-U|lLohpwIFI~Tam=*;)sN{aAqK)Y{_)BX8r8*W?x zZ_#xu+wgr$fjhU}yO-)^f$0cqQR21oV>yX>mAI?YX#dPPUb&&LL!XY7yi? z_!;xTyFVV^xN#GEFi{G2`e)gCzXJ$DqHDkO52d;Rm23*4@1Qv6gz4aklsHrm!;;`& z)A`l%HfJu3IWylCECVU9P&v@CQ89dMs`%9EAJ=jd0uGd#WJ~|?m_M~tvmAUaTjW#s zL+V~?OX>$%6X9bn;|fM+$Cn?5Tb(5Y(M4*;i(e|URWL(-lmI&;3�f35BeD2-34X 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 z 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 L0K-54 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 LT8ahoPXhi67M*0s literal 0 HcmV?d00001 diff --git a/deployment/old/digital-ocean/dashboard/role-binding.yaml b/deployment/old/digital-ocean/dashboard/role-binding.yaml new file mode 100644 index 000000000..faa8927a2 --- /dev/null +++ b/deployment/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/old/digital-ocean/https/README.md b/deployment/old/digital-ocean/https/README.md new file mode 100644 index 000000000..b306a48d9 --- /dev/null +++ b/deployment/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 Digital Ocean 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 Digital Ocean Load Balancer" %} + +{% hint style="info" %} +CAUTION: It seems that the behaviour of Digital Ocean 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 Digital Ocean, this is how it should look like: + +![Screenshot of Digital Ocean dashboard showing external ip address](./ip-address.png) + +If the load balancer isn't created automatically you have to create it your self on Digital Ocean under Networks. +In case you don't need a Digital Ocean 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/old/digital-ocean/https/ip-address.png b/deployment/old/digital-ocean/https/ip-address.png new file mode 100644 index 0000000000000000000000000000000000000000..db523156adce4de5bd9bb198823c83bda84b795a GIT binary patch literal 144403 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

hd)T8SBB&CgR2GyvwhxGi)5ks07mk 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 +MERGE (author)-[:WROTE]->(c) +; diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql new file mode 100644 index 000000000..c4a7961c5 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql new file mode 100644 index 000000000..f09b5ad71 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql new file mode 100644 index 000000000..70adad664 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql new file mode 100644 index 000000000..d01871300 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql new file mode 100644 index 000000000..18fb6699f --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql new file mode 100644 index 000000000..06341f277 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql new file mode 100644 index 000000000..3de01f8ea --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql new file mode 100644 index 000000000..fac858a9a --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh new file mode 100755 index 000000000..ccb22dafb --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql new file mode 100644 index 000000000..f4a5bf006 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql new file mode 100644 index 000000000..aa6ac8eb9 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql new file mode 100644 index 000000000..e473e697c --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql new file mode 100644 index 000000000..18223136b --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql new file mode 100644 index 000000000..ed859c157 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql new file mode 100644 index 000000000..1d557d30c --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql new file mode 100644 index 000000000..21c2e1f90 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql new file mode 100644 index 000000000..d370b4b4a --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql new file mode 100644 index 000000000..010c2ca09 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql new file mode 100644 index 000000000..4bd33eb7c --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql new file mode 100644 index 000000000..32679f6c8 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql new file mode 100644 index 000000000..02dff089f --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql new file mode 100644 index 000000000..55f58f171 --- /dev/null +++ b/deployment/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/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql new file mode 100644 index 000000000..e69de29bb diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql new file mode 100644 index 000000000..722625944 --- /dev/null +++ b/deployment/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/old/mailserver/Deployment.yaml b/deployment/old/mailserver/Deployment.yaml new file mode 100644 index 000000000..a36e1652e --- /dev/null +++ b/deployment/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/old/mailserver/README.md b/deployment/old/mailserver/README.md new file mode 100644 index 000000000..ed9292d5c --- /dev/null +++ b/deployment/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/old/mailserver/Service.yaml b/deployment/old/mailserver/Service.yaml new file mode 100644 index 000000000..bba734967 --- /dev/null +++ b/deployment/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/old/mailserver/ingress.yaml b/deployment/old/mailserver/ingress.yaml new file mode 100644 index 000000000..1ea9c58be --- /dev/null +++ b/deployment/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/old/monitoring/README.md b/deployment/old/monitoring/README.md new file mode 100644 index 000000000..46dfb0301 --- /dev/null +++ b/deployment/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/old/monitoring/grafana/config.yml b/deployment/old/monitoring/grafana/config.yml new file mode 100644 index 000000000..a338e3480 --- /dev/null +++ b/deployment/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/old/monitoring/grafana/metrics.png b/deployment/old/monitoring/grafana/metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..cc68f1bad10efef0abdf03fc1194808c17dc6484 GIT binary patch literal 211436 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

EF08;%p#ff|dFI5N9t2H`efG+MxXUSYzoO(5rY; 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%0D&^X}H_1K7blDBEZi#$wOX7ECBemaE z8l6vgwtMJVpF)@9#I~}I-TcO$l}sQWbo*t5In*WugA=?#>w|Q%`+l4tG{cGDz{%1j zU~Jf8_+xldui!(3QHSF`jYx4gC6qv>O0)_Wemm?A3@tZJ<1@|Y*Q()O8H)I8c-LvP z*;Lo?B2v;ge4RL_7df}$HEMdtEYWbm5pJKxcAgY%nXhlZhc;% zfYya!SQlNM8LUTCF+p@2>pYz)Rxsv+Wu4u&vtXUJSxzr7Rq z{8rP(QEr&(_AJiUb?_97R7V|j3h37(X+4u*N+rwE4F?W!yOPQfH` zY@`&>bs5g)e0Ph-wqxMyN<`tPD?YfYDgJY12C613@I3Tm#Z?L@CA6^c;XA^}OU;be zsR=I!Kn5f@z{}(Wo1%V4A`Y&>n7PON;Fi^IoXSI)#r>Vcuv_uGoT6tllo=%nqDz?X zGB)Smr&H6?4^^b;-?n)X8fG%6E)xI=KsGaA*3CY+v_*WEWuEvM7^v;C7bP@Pi5`hN zqgEZ&0^R{O-Ws(G95KB-O6a=5TQL1fS8Tyk=bz*bTvry$wCMP9J@-M2RJ8gqm1M?4;MQOo zE~|i{$my%3;Wy{sHsd0oZqBE-khb@6Qe&8~!MFiltf&gS*w@!Lf|)72ToGEAdQF~z zrOcE{=yxUe#bwcC?8~_`rGB*cZtVx4Uq1TC2h3YUkPJ4-rmvG+!Ka>D&dVR1#KfAx zBn2J)8aZAt5QceE09YV+l=jJB)>#j5;rqp3S}pOxTN;Vp23I+7RTcT?T1M?9fVSr) z@OhNj%jvaKc}3bIEm{XY&65vYr*slD!6IUm1JLoLu|e&8;Bf zFd!v{7O712Fa`!AZ5DM&0v`Fivd?6x(pmGf&196_*JlRN8FkEu(K+k_rGYHJ;JpPi zvO-0STAtz;%M+Ulyp*`#fIAs@jd392zr2RB*nhl+j}vDj>i!&d-e4WS2h(nTJ>hmD z1vFZ+G?#)BCF?vOYvtt-MvVYu)ypq~_hvX*bWANSUml+wL<ZG1k|3Feqw(cO32MxqHxtDY)G?}H=w9StsxbT~3$dn~85th@Zz+~l0(eUXstAEAA1^5O7jRTtW#{x{yLmwY@^802gliLDlTFz|&~ij+Q`yr%7ts z%#^?u;OA59hJeY2=~P9*-r)lw>hL}ffS9SabNV@{vCP{5`4V%p8Sx4Or856NRI2aF zO|&VgGODPB8KQwQFXX*o)unNzp_JG19=LKo$oR2?8afc`UxpsW@E=1bXwJt%DQ!yX z4KQ(^?tn$2G90ypzLh5$FNcAJlCLsKzS535jZcB5G8TQsh1-08YH$N{nhZ`TygP!6 z3m25h!T2tmr*Waac|Vy_vHX1n9*B4eu7wCZD9)HsZn}Cx0mWy0v}+}Ii4LlSSBx6D z;IEPYGCPk@Ye`gcViDM}4uSuNCKw$E>$yMBd?Iu6U2i8fs_sBhtgU!V0nY=V*Q^b{ z>;TFz@qlRrGhvRAo2Fbb|Kc^u9!oQ>;pG`>3CgeGZ5NE1WBr$n;{!^FeV3mhq|=p) zD4X+b=|lORgJm90-;dgyRR2#EDVCV)GPZ6SYBAdU@0qawZs@Av|1or6az6q^1-Ax^ ziExDqI3Zenm!8#$qV_e0Qsuc%w8u%X{QY**!^zYCDsNRh z(7+Dx2u$_h9WEMP5d=fHv5Lr3lzdfzd^7t39q3jv?w`pr6R{7-=pRZ%9OBRQeJ zJegmn<{el|#CXaF&cJrr0m`V|6n5v)AUXg#}F42itp;jpI@Q%6ajv!F0w>=_cCg~p-0}M1468}`-BVc%ZY+v zZsqB;&jR^!S{b(6c>x&m&G8Kh%qYUF=uACrCHWa7;% znT__bvb4ZUNruPPiJK}%PP*Z$+U&t7@3LzE`{+HGHS^ma9!yX`38cyb!9(PPRWfcg z=RXLPr;rUmqE8n6vm@xOL7N5#BN(YkPU#~_uN@V+sczn!^gy*;k@i5xB-+@ z&*!f`XS-5ftC+vKF$jwuJ?olsfARy5?k01Te0v4_KuJ?7)9%=b1SPt!+U%yumw@Qd zr|Elu*W^u|a1*2rsGnfefW;j)hyKjZNe(w9v=-%t>il)bw2fl04Nr|G0!yw_amSH7 z#I-p*o18K+Dsj}vpAlz3vNE)i66Jp(IDPlAz?Ls}DG5y%gesCHZMa}QeN<9Nn)A`5 z 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 d@du_~0kVU{B{F(ZXb 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/old/volumes/neo4j-online-backup/README.md b/deployment/old/volumes/neo4j-online-backup/README.md new file mode 100644 index 000000000..602bbd577 --- /dev/null +++ b/deployment/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/old/volumes/uploads.yaml b/deployment/old/volumes/uploads.yaml new file mode 100644 index 000000000..45e1292a8 --- /dev/null +++ b/deployment/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/old/volumes/velero/README.md b/deployment/old/volumes/velero/README.md new file mode 100644 index 000000000..5b8fc9d2e --- /dev/null +++ b/deployment/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 Digital Ocean 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/old/volumes/volume-snapshots/README.md b/deployment/old/volumes/volume-snapshots/README.md new file mode 100644 index 000000000..cc66ae4ae --- /dev/null +++ b/deployment/old/volumes/volume-snapshots/README.md @@ -0,0 +1,50 @@ +# 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 `neo4j-data-claim`: + +```sh +# in folder deployment/volumes/volume-snapshots/ +kubectl apply -f snapshot.yaml +``` + +If you are on Digital Ocean the volume snapshot should show up in the Web UI: + +![Digital Ocean 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: + +``` +# in folder deployment/volumes/volume-snapshots/ +kubectl apply -f neo4j-data.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/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png b/deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6599616cad86471f5a990596a0f681470255c3 GIT binary patch literal 120810 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 z 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%0ACGdls>#g|@A z^}U>zZXdsi2s&(QH42}@tgRmZC8ZV#U9TMNBoy_VkC7s9`fvh4E4HUPNB&(*Clre} zV6TpGhIwgRk7~+&*!yaW;#)xe@3voXA4IFKr3Y(=h`=y9lx%{Svzsu;F0HtMf(bozT&gkrM;TaVZ8RH zOGKI}?1a;&Fm(1eNL!M6ur6WHOuKWS_+o*+Us+_v?+7AX!9~!@wK>_T{GgeZr?~3P z^1w&j4z4a*$^8d#b~w(S0S2)*ZqXik{7!xBTk>rH7v>agCRzgk&O(SbS5Nd~(DBt* z-0EbX08Sa^0V*j~Mrihf%r1=GQjTlT7=151;5OPAo>Uf0X(b;%l^`r_YeL_-o@rgA zkL{>*JK^Euj)>=78nnmoNvcvD+DSZO&9 ztbha)SVT!ex~{p27TWR;nuEU7KhF5xE>Gbq>?UPfjs_t50k4jr3Bm!aYn z`FHUZ00flc4X>Za@+R(VShYqkyMDVG;}{uo*9uH5;TdG*Z5tmQ#JkaPQ<(#9Ri^S; zuCDz#gCtSHk&f0{tObsC#sRxomYk(q3=VD({<|HHbf<-Ays2&>K?hyZ8z!n;k`%9T z54A~qUxzn+#wC6+{RS;kC&&*#pCaSjtoo^xC7+!W^B!5J8VZD^jVWv2G|b)3c` zRI)pPcRnT?`R)ky`F(EGi_}PO#Zj19fqMBP}KpJv$sXPXFnS@=5*IrW$&NaQ| z*B%V=o(vW0$mIp;2z~=2S&}Vf)z<@6o#WAm72cTSg*KsMsf@|6J5h1ba;bsTyQn2; zxSzkw_KO@7Z#_ts#Z-*1u*!O;$jzPP{@dT8T?s=q;BVznjAHKZMLLErh~ghgT$Y8k zh?-IP+aGou>rkDDnL;EfthhtJUIv2A(yY}VP&{0{01_eEuLCElcd$I6YC02MV#V+u z@qi8>y9MeJj0q(qfge|0%bJE0sYZAZzT%%{&1$cW3kZ=zxT^E`vk5j(pDJ_6Lj!+E zv~#e)H<3n81M-9by73XQ81PeWv_RVGk}i69izGB_4_73Ph%9>ah$pAeIaYiFZ=OD= z&$VJ8()lZ9Y3eB~XzDp`9l#W1{$P)+OK4_! zZZ%VQ)Cz9yWDUIui__5DQ|ao7yCZ@n!V5 z@D8e)RsxYAh*hJ2ej$aVts}ey(ZeDm1E{6um9)@fky(6Ae2@_SdQ^Ru`)570W zz(*H&KT?e@oZpk9!(U259r2!y|AmZSQ{17HE^jUTxR6KoIX`IomF)NfiEkqV=DO`s z0BJAzN>+%IWg8E#B07JQqOZ?nHvFge>e>nGTOR{hwaU9B{BlMMkpSrz@4f?-%Jd|a z##$a-3evtEO2xfhA8!V4Sf+n=*f;*oDP$d@0Rk_=$`S>M_b>Ta_>Yo4T2EaN-OqV?9P_PE z|E;Sc37wh20S!)npYIJ11(|RXAH~nD5@|hD-jWMMYR|5>X@{-Il9+s9`krG0&$GIYxVNf}@Dc z`o;?x3UYt1!C!3YXieb%-qpVCHG=^EPx)>n`X7eh|8Ve6plU4vaKKNTsFNQ4{TzR@ z>HdXr_ZA3mmH5i{0VIaW3XRf8U`797F8=$0timPpfvo?%Jo**zM~07{Wc?4L`sXJf zz`shTR$Ur-e!0NL2?d}3`RP9ohID{)YaT-jE3_{egUtUj{{Ppb{U65QA13Dip|t=SFitB zh@N!WnZ@JF{3y`kpwh$B6Jzpti4#{!^KEf)e;0G0f4ccABHv%*zHfmr#MxySBG5UP ze4h-EeJMP{SWplL$7hxkfO|G^OIO{3SN>1(2oMI}&@1Wr%5WMBppMnz`zsfkL4d8` z?kcGJ50iNXXyj7LrV@j)mIP{-nb|>h!non}B3**Ihy*x@ zm&B;0Hz{{Pe^YtyWXm#HxiR@9nz>H{>Gt0><79+CAXEfwwfT{{m|M^oR{Aqzd*A}a@#FmT3N*dOaJpQ}XKR+4xkMfQw z2P3(|Q6XTG_ou|U(+T%(T+Vm9fmVS6pljC4v>)FF*$LwM@QTtG^>UZ|(Td+FgCx5a zB!A}f+~J1*`R*PK@SP>V@kXz3yBGi(D>+1sI!acTd<6pWY9s2dWfV5+S3u6!sB9L3 zW<7CC9ER(i;;-RPoobHcuWsg<1yp;@T%fYx z5tZTfy6VCau_dn~?tXqp!q|j9kRjODz4x zn+PPCv#*;3B4G zr_*U_$BnLx2k*}oCXmTMEj-^Uw=2kw|P z;5%MO?fsL7g=ig1m%>{pOXTLMEESXjx_Ny>SluvK3fTl)4K+4IHugj;0w$W zF#C04(*0~sUG_*l2NedrhV^~R4T4{9{LKZZC)qi|NHEvVo54o*4{>xgFufuZ0q6BB z{P>W=hIFQ%fqI{^WM`XU&Q0G_wzGy98Lf%}F9JMI%knmW1`eMFkq>T?Lmfk((niVl zk@Z-$j^8bNto=t#<>UO>+H&6$|H53r+E?B9y|wv9Objb>0rq~y_!E23it^j;&Z)dC zzY!`UyPJ*JVd_njW&1` zX-%qR$LxPpLY?_`+~K_9IaVa3<*48S>ximSwcL8OJK&(kCthoE|Hw4mD<;+HixQ@) zFm!5k38!K8q;K47_QK9<`q1f%3wg&>Shn|vblWXGHkD&ro+Onku`3>WMr{G-`+D@A z7tk$?rV*@D31HTC9XiW=R0gN8W0FTT8w~Lj&5bWtzVpf7_~@-Wt`EG^=ZCfr$&0+d z@y}mc!g&9k&87BAHPZ8-2y(*nHAcadQ-Gb&Nb^bj$ZG)ciu`&UwBbT z38gfIAS>oapFB79`_ArPx0!P&HRAEqC0&BehtI3VE&cS2pIW-{-MiEAE}ysrL^^@e z5*W8wgC+Kwts}+b&A$a%{LiDC@V%)0^XOH=zgN9@IxMXTAnT?#g*=e~J@`ww0p6mW zV{t{kOqgfMxNVu-fP|+8=af?ClyKgbbM5%2gYz&m(bj!yvjleP)V>h8tnX&b1G*%Z z{J2>7h=%ogart|xwSkHy!+|E)LamVJ>lA^}rn8wm=@ybvgDw>(j-tEvud7oIE}EAH zIDfU+LbIB0OS&yTw}cv_o*ldwJx45U+@%jJy&pQ0qN%gjx4 z*#b=1|cpbOaG1=UaVKo2-B z^%x+TE0XSd)e#(NpG~2!cucFqJ+&cT=+uvHudtR89|E>_QZfjf=AEX1fZ9cA*`B{9 zOV+R-x_NKn)WmYDVxW&2EXrl#xA^*C(`$CJZFkTmBVA%|#&)A!E7Z%R;iwHdwm{qu zgsSmfht)^4oU=)pEn0r1`3v)d5qX)u?x#O?OQAq7f~l!^ZUvB?*k9`EW*Yb3#R_8N zJyyH}Y_SZ5?~DFGspbpHBZ2w!a8C zXyd{9LPWfeV}4;I{EqiY8-CK2x|$jJ)L+}EPnj*x%MR=dJDE1$w7%5N`>eYuY|YgL zc^N27CY0lJA~Wo?Ws-S!^p=E>*N@tFo9Wu`zJI3+1|SH&{T)hOyfwt7;Sn#%iu|2} zXTkN*`fa|~m=dqw`D4;OE={_=r3<4-S>)6EfX#lw_86aaXdBO01C?o6q3RT!L|wh^ z8qlKvkE{oZnzIh4VEqxzvC{j7B0W)j_rmzfw=+C9HAu&5-v!X9pq3Ww3DjNai>ecw zjvQKrfaS#(6`1XG9=kd??#CQ3!`HGus^5EZnB8-J+CuPaR;95-fGIhh8ot;Rwb;3BfNeG9e5H_yD?5Z>vE(y%uV?RrbNna687M4to$1} z$oy8hb^%{M<^1{XTg-2GGEp7tz6ArIh+hlIV_eXRGp-Z|=D<^F-yalyNk^3aO-GcZ z%J`lvclgI`ljWiKy(ONyT>WnHN4=PLW8{lcv z>ph-`fO?dHu?cH7d?LD}V74hgNm6_pMg+{><;ysofp$^{!z#?<;UG4r&o6Omrri6+ z*9uErU?+P!_r-xW2SDA)(@LPsAt%gnOd_^%^<(Jj#g4R znwLc&Bca;mif;*k!%ev{-^VbJ9UWwp7Pc{aA>4RmSxIdwc)G7wXZqkw)}@+w=ZJZf4kZVkLkE-R`vm?MWp4ph zW&5;?D}ru7y1N9VOS+K|5s_{X5Reu&u>k?;27~Spq-#@~mX6J)yBq25I1l>1-*?V; zexCpOujO(fxNn|k?wPsgp1I~4^uC52At+mA=gAg@Gbhl#4h^L2cJ}Z!RNwYF1lWZ5 z{d%(W+&RiRY54#NPXWwp7QefQ1eU^_o9;gvhb)DUeKpm=o7JSY>baz}6dYuZzQ-57%{;^wfd-fS;s)j#nlK?Fx~II6kdT!(xU9d7n^)@9}ivKCGr`9VTF?ic~zjWyUxn`bW_x4;c>M~ z5oW#*<87*vCj!V467AzfkJTjWlFdk=m%IG@m!z8T`o$0*iA2*t&-x%3Xbi$U3o(&| zC)-r|d{PumP=q@f#5LHw7Vfn^nLsz*xw$;ux=fIP&p0SRfo>J+wPbWt;M|6V8@O-t z3LnCGY-07DO96(j>?x1CUJB8xy_U*Zw@p{9WDUG2>}tagyC=$}y$r+|eF965tK>{y z-ZhwULyK0M9VQgug#nd2cR{W90qU~RRUrdb>$J9c@<`>RW&Qy=6)ZEx*j627sP~^s z*Jtmh@V>-rr<@6sK+|f0g|C+Fi=Xu~gJHnfw)${#!9gM~U^<~#^UyOy1V7NKbJ@5* z2k;8Ap*`c^itVJ9-ai8*Eiw!FL3D94bJQ!F0WLbY2P@ zR~7R|;0~E^mrKfiFRPw`i=;@iYT%YTVOvX3$A3Bv6%Noev;qn=+pK0yehltL$3r!n|Ab&XM>jaOOo-d8`w<5jP_Eh;vO0R}Bh^7qbg zE?h86+BML`F%tR}P%6!h8Bhp7YgcCYMs$VGs>C<;bBnMrj_B5~sgVP~e>Mqp@h!FR z_T9DRd2h(@++-*wmkJy-Q>Pty}M^#N*v!cUrhT;$Jnt<$w zG5_=j-&13=t5ow8*DC=YfD_}qgKG!Zei`^}U~dP{qa~y-atPsFkxQU?LVI5eyPZ74 zfm58?2h~6@Xf29MQP@{OrL5~e1ZonQxMz`v^y7}o zM4j7g&_+QnmvL|Z+mu-hEN~1?PEJCpK#3KA%$i&+=!>U{TJlJUjq90=s?&PTeGB@f zV2+2jXlr-UC(^3NH^ig)Gh#3YxRGX7CUvtRo!=!%sT5X*-y$bS!P|tR!4*jWQ=#Z( zfuMrILIMD}Ku9dLunRwkIQ4Wg4g!-sGoRtAlChiS>|spZs?@(3Nm^;37Ha=CHL!*< zdVAH8q~6xM{DT8xL;E@)+21x}z1SWpQs0?`kO>?TJwYEEmng$9*5%LPRBGO97WXsh zrLptHuT{(+Li$L4)u_;WWD+$CwEO~K28lWjt$Yu+0J5u|Z4<3d z^wL}B>k}6Q3+ciazo5=VtQO`4N<+u(umLBfssR(D1_E|bpjFjiZyI3Yu_=PB9*o^~ z)MqNxR!&U&o2`+^)!Zn-ub^`;WBeHWFf>s_y1?n=6&r2)A3a%#Kx6*CU__PE&Vyy1nGGGQAe9(rcj z9R4V&D`-zb_-2Xfc2Cv?@vSvY>2_Jn+12Doj(q-A*DU5t^abt)5^$i@(7*YmMPB%Z z*A)N>h0*V~x|BvHKBCR0b)dCnZ@fCVvD2(}#U_J{5Br~Woxug5zKIH4&YbNjV1(d} zPWzj7KE7vwGgbFYl4Zp(nRsk#03V0XLCiz|%r~(WP5?>%SvDOxRPwzOzj<4ZJJ8a5 zxrBL^eVA;HH_4n|uow;xi5aQ78uXFwv7qJlH`c zrlj2r?`R8=(k{y~NwRCyepZqjW`6KkBAd<8*yOsR)WAFEeJZAtrNQSvHrp{=(7t(o26hhAh!M|>S5UNF;3n`tLL z)P=k~E1ZwpJe+$?>Ma6EJ%>z+UId#hS+X}4H6p1h6w>P?M`eTfs(~GY^L_@XGe2}e zo@gUv0d>9pyeIX<=g2IP;J^v*&92~<2xa{|hT%p~C#phSKel4BHzKqLjIdaBM!j$l z=;JetDPU3nTm|*hCB@LV4P@#c1q2&yuAQK%VSi_-E7`|#QS8oU>`vJjxsR^B594vb zz(b6omJ-tlLxSG8;2MkQS(p&Rz;CX>MyFFGxv-P)0#=slqCpf!^rTFEs^_i7T;F1_ zr}o%?29XS!+CD%=$9r7E>V|z30dSxewc(B#ZM9Z+&1r)c{X-ZP_S6$_K7o z2{k30E!2p)rw^FWBj1k89KHKOgqy*YevFh>gOaN2YVZ3_A``5 zB-dd7q$%_CLzM+mq*h(MRN|7U|9xTfKnMlYZPnmcgFdJt{pyIO4$35q>U+=pk*XNs zL=c5Fb`aVbAwq*(bzeTtPx`Q2_k0=G%5`A?F{Xzt!l{q_30Q%bXv%vKWph5mJT-ykYvB*Z| z*sR^OUz$|9ip1Zyb{Y94&Q2_)9W+W)zqRVA+&BHQ9jTqZoqSagH1(v;ZsJPXlenBj z>BT^}WSBB&z}iiL^l)e+$rN7vy>Wx`cPT;^$)(0)XR5Zz-Y|l1Y6L|_zy=KM>KX0^ z?C`;m86LQlti%?Rtb+JfYm8%cOF7IHV2X1RGTux=5I*-q^HVG`_vN5vBdfr9IiZzU zzCe5vRQhBT0tyu256W8Z$aZK|=gTY=j6Lw@gcsZrpTYvK&M_{LHbr)V=OP6ZT}e77 zN(j0`-}XS1w6*8JW_EjUQ!#u1lbGVmsbC;Yyd+j+p8RSSRB0`>j;yA=BKIQupk0tLy;()F4VPG4&RjcYoDzZ znZFj~Uc)qcEy@y99F^S4vscurO3V)Vz8Jj0Fl4J>vOp@LwqL$-V^hTjYP6M_DBM~8 z#n5Y;Z*r1n&ctKP&YA>y$5N=)NoEueR?^clm^%S=1sx9G@;{G1jmZuNK+?d!&Gm>x z0TBQD4YF1Vkq_q-2*?vC51uTjo5ufuCgIz`7TJVFjE89!I$}OP6htJ>!JmsQzgD?8 z)4ike_{V82wDkNDo%J)CRim&rtFLX?i!?q)ANhB@U%z6EqD2?>8(>VX;->}gl|2^r z;_6(iCvBvnWAdSxZQu9XkNwcREHAe8#0;m|_>g+G%P)#ybum7aA7}Qt{GtgVC9x-$ zNa}}X)EO!1M-S{lOys7iSvLSnaA*>dNT{*M_e|6;M0UD$Zr?VdThS_6YjD~DpZpUb z`Yk;@Lo|E)d(fxA{3;^?jN2bT&`!5o-C3VVdm%q0Tt4D*whq*vS|DY}fT+;BmPcPp zZ9D{y&6p>5$0jhghjPVFdzP2mMK-FfHrhT2p9oBXcP2`#{M?o6%_48enC-X#9#zjG z1&usBe75Bwozybktl*P_j!OpVym=QXF_ZbWpxWMyz7kvMj4nonJDI9|z%*v3 z>@YHDC4WHnh^$IV%=!c7DGdWy5u{tl*>gO;sm=h1)d5JWu*Jp|*^%Cv*5dspzhLa2 zL7^78QE{O-!FvrsHu6k<+Ok2dE%*!D{4J^gI0xDrXyLs0_4MR%@aN_rBFSg6B}=!y zKiJ1;&S;s1e&!SaTzXD48Z~~}B2@ED+9fnJl&X|<^706i{?PHO@RB|n8U$|9L@=uX zw(N2^L-VuRy>u}zk+(C;6M<FN7$da5GHH2Pv}!UQ44-|-A*bIX1KCWn z^k}vA1nl<^uGqZ>5I87Q8LPv%{3YNEb7Bo=^_Rm|@c=&87HMQ@KWS=!P@D)gIxLWl zvYv(pzvhsj{zC{Oiw^~5qB0$U>4InTRm?X4+6M6n;BmtNGx28_zX*a2M{@Rqs{NE? z%iDPF?;493?#lvJvhWF&ilW!IZhCnrH6Pu)`6bxE{>hURFLI-N9NYZ^dcoa?=J#13 zYq%jKk$h5wU{Bl8s4Tc7JiH8K%)UrY%S@w#lZcv5foo9X_m*7~?(|T6NpIn^UZ>8F zMf^G^pbFWz506NJg`O#%WBcq2^g-?3nQH%Z0#s4^)jU_|!WSN^%wYXoNYgw<3oS!0 zPpkv>Yi#96|CcYcn^~a}ndCtLBy$l}N#A*vc3uo1W4L)G^0;y!xeS!qh7h4grW5u- z%_75H+rv#M1;D6nTO>PM7KDzMVA~1>dD&T35uf|y9OLVVW%n7`2i5fc+6a}~&m7IJ z0#r{C_}*mu$^8jg&8!{uhM`W%$ZpM=3)`>Aa6J>E{2z?TToR!lC~(vdp9X)%p66=B zjVOlv>c24)A-MB((~YwWukIthtIFpAcGG9Y#}x~7-%ijr(B>`H_lPTV5#iwNYG=Ho zK3fd#*7F8YLxvA@b($}UXn2#j$coG#uU5@phkVw11((q?-SIiK7FZ+v!ppp>a$=kU z8z=Hn^cMO;mBB6rM3=hVJVfcleWqI+!&zSQtUT;8W^F!_0(-4 zOAhp|^+oexJ6<#SS_5qga34ht4Ew=mY@#9tG`l8oAS+0BklAuhz5DjA2BN>1OnM5J zX>E0{AoS6vG-h8zX}O;*c@J|T$QN*8jEBwaG+#4O?_+S72rQX~3iN2#?)%+~lps}v z+@ssV&2T2Ea*F0`(^ie)Hpc-A3Xdn73t|=MA>xjU)X`;^= zc6RtkafQBc#axcRYbkvUiFu1mUnjOi*xr?b3yx1L>3THa2vCOJSPO}OCm@7=I;&Wb zu--4$H^v{AQgmnRDWyMy#?-h8-vJJY4E#-hIzY8uO~f~@v0x*kNsW2cjO6h61~A%6&?(Cxr)Bn}M$x{%%JR7rg(}%v0Jm!+f=D zR@&M$SxGSH;-?loz8Yv*Kg8AIT5FDIP9WES|G;jLFF0nxTjbu{{totK`Bf$A8reFX z^1aYJSi%FqJ?f@zXQ&+C^UlTwKOZ+1c^xTQDa`99Ak8BpIddLH50pq1oz|3`g#jMs z5t4|H#O8GjE%7kFrIk7kskKE{G8~K=w5Is#Bzb`K{EP(GpwN$qA&TADBIUO^&{zr% zjVVgh;?l%+kzwhyS`#%7Yfr$L$ozRe$lG>gsz#usABmoJtA|;sQ1+5?1Y{I1sFi z;S5v|Fz4@U_!4c3GPY7W{{%}!U7Ni0g^^K<>kq4H#rq4^NkHokI+ZkkSj#d`=G3z$ zSlJdF2wKi)L&`ohhZ3d7aQbcen5ILj4)HsPLvuQ4!+7kmU0Qr1WyY|p7UoUY2oMq4 zDZYCo#{t1&kq$->*(6h=&c)!ica!n3VfrV?dMVHKN1bP{z0n(q@I;3o$PWY-5^@hW zck0XtVA=<4jl&Y=`Ob|rU;q53q+OT_h4Zb)7&Hd4F7dnX zm4H^xZ5kq{6`{2sSK-S3^JeF2)*~9i`KI=jtw;AUHl_a2RlCZH?=KlEy_*+1+Cl{R@M_h1jPAL*bSKaUXhf@>LGYJ8odqD+2m2qlTv-8mx>@NaAjmHeDD);LwanhJ>WyuJTTc2!Af0 z|Dxcr{|=x7_jw=sHsaAHP(JgUS5;zr`@tZ{pmXKp+YNYMY?Ac3_(qZ=YwtK zOpyEo5o9$fuGnvb-LFW7TJ=)oX0T%$FY>6Fp)_v?WO`vjaiKkldb9|u01WfOK_zTo z;6F*d0aF=FvLA&P3)9r*)*gl(G4(YlWA<4@MI)qT+m4 zdISCd==lTUPvYS8H)Npa$ ztNljJR_rkU3n&|Y@CWCT^N5hy_a7U2#{36)6+U^v>_P~982VD(WD!t2z~%m{8^cv-X8?S)n4XwYopcEqHf(|S4pi+Xo*v1z7j zYjLt&<$qC7S2ppP#w^h`;c9xjlBf3602(RAy*c#5aiVg(*?Rc})TqT$HL%V>(U{Be zy#b6R740{|2XH4c|3VAr`Txi={o#LsoO6=?h_d^96LE1zLVYv!f*#*n2iSI9tLE-T zTh#KTxXXhcGc0lI%C(e<$?pcO(?C(1dR6SYe1g3ezjgYjZ|`c-5P-}d3Sof* zBb2sU@p{EB;npEcHDfyfh-J!x5gKd2t^3ydD1kpDPB%=(4Z}$${I_tF2crIkX_O=X z1Ajst&-?z5S_}vM5e_MDL|GyFola$tsDXfaAi$UI1dWuliFcLJ>lLEAvLo5E&aFf{ zIH7*|d~nUx0ZKXGR%5{&t~A+2^_3HXYxt)-ZHK3QUVQEwOwbc&XjUvAK#A~>c<|5nW=-1DN#I*os==(s13W&^#4p zS_{H4QxelYy95fT05j&qlwIQSu3aTU$m~a|0fdhUxPLi!_tYz}3-TF?c=J!RK9=Mi zeo#Cwe)V&!unG>a`fYWy^rpBMy-DS0c3RRc-PLjapuh5%(-Z&Q z-nM^$+WW7Emq%jbrj{`ZHi9J{0^;P67^Lr&Ph)D;YX;GMaG+#2rjuepqVt)vhDH;D zdtj%%{Jk;ymDEj(7>QA{kQQs8jL$b+Le1&o7>7ehd>?2#?KMjpc$|*A;BY+B3k(Ia zo^SH04xR_#0sdCq^2@$YujhSDcBP)koJrpUDDZrmLSotb7T`0H;_SmFgYvy8kmiEI z!jD}1!zP*GaD>>DH9XE|U1%0!7Rq7pK60T2JwwQ-5a926)9?WEDX0f%W~*#QGjo~K z#|FbZBSq1UsZ-H8SUE2a6re3w{FmqEP&rDbz_6linmZTdo|EJDUm$(@e{}6-bzamz zx^@IymhOQ2qQhEluZr*530TID-{9o1+^JojpjuqYlm0y*ja5DLN)=lM$4oxRbIL|@ zPfg#daM9RS@Rar=dzIb-mB`D`EMF|X+AVIVk~nYT`;2CFfPIzk`Uu5N57|Kajdaf= zN={vitY%&+k9T~BaI>meO8_IX;&i{xz-1OTZyy@VjvA?3=gZU)rJBH288`9izM0Fc zAm6U8EmIHzf=gE&vl&mev46INvTHIZ`G^4dUF&jA$L{)oS=F4uUQ%{FwmDABb2JeH zuX^gohr(kK;+_j3ec~Jtn!vRvxfhyazmb)sM9LHY;sjOyIg+yj3cCLVs)he^^xD%g zT^ihRe{1eQbnS1;~W_kv6~tc_||Y)v^S@zZ(4bMvf_l|H~1@? z1(YU7p6j48Aqe_$$BQreX?R*k!S#lv&HMz$zc8Llm?kD0k6!pY6i`yaKA(&Pxnp{HY**N zKdyeRq@( zJnGlqHMoQz;BR?ZQ#D zVkz~X$^x~~_h!R6)OHC-&)*cqYXQ~16+i@I Jp!aEjgaMMT=M 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 Date: Thu, 25 Feb 2021 20:39:01 +0100 Subject: [PATCH 093/344] implemented wolles changes to backup/snapshots --- .../volume-snapshots/backen-uploads-snapshot.yaml | 8 ++++++++ ...4j-data.yaml => neo4j-data-provision-snapshot.yaml} | 0 .../neo4j-data-snapshot.yaml } | 0 deployment/old/volumes/volume-snapshots/snapshot.yaml | 10 ---------- 4 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml rename deployment/old/volumes/volume-snapshots/{neo4j-data.yaml => neo4j-data-provision-snapshot.yaml} (100%) rename deployment/old/volumes/{neo4j-data.yaml => volume-snapshots/neo4j-data-snapshot.yaml } (100%) delete mode 100644 deployment/old/volumes/volume-snapshots/snapshot.yaml diff --git a/deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml b/deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml new file mode 100644 index 000000000..697346c82 --- /dev/null +++ b/deployment/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/old/volumes/volume-snapshots/neo4j-data.yaml b/deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml similarity index 100% rename from deployment/old/volumes/volume-snapshots/neo4j-data.yaml rename to deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml diff --git a/deployment/old/volumes/neo4j-data.yaml b/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml similarity index 100% rename from deployment/old/volumes/neo4j-data.yaml rename to deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml diff --git a/deployment/old/volumes/volume-snapshots/snapshot.yaml b/deployment/old/volumes/volume-snapshots/snapshot.yaml deleted file mode 100644 index eac2f0857..000000000 --- a/deployment/old/volumes/volume-snapshots/snapshot.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- - apiVersion: snapshot.storage.k8s.io/v1alpha1 - kind: VolumeSnapshot - metadata: - name: uploads-snapshot - namespace: ocelot-social - spec: - source: - name: uploads-claim - kind: PersistentVolumeClaim From 66b7c8088f474d0df266a25a96762d13455ceea8 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 25 Feb 2021 20:46:33 +0100 Subject: [PATCH 094/344] missing usaved changes --- .../old/volumes/volume-snapshots/README.md | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/deployment/old/volumes/volume-snapshots/README.md b/deployment/old/volumes/volume-snapshots/README.md index cc66ae4ae..4b6aab58d 100644 --- a/deployment/old/volumes/volume-snapshots/README.md +++ b/deployment/old/volumes/volume-snapshots/README.md @@ -1,19 +1,20 @@ # 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. +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 `neo4j-data-claim`: +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`. -```sh +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 snapshot.yaml +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 Digital Ocean the volume snapshot should show up in the Web UI: @@ -26,13 +27,11 @@ 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: +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.yaml +kubectl apply -f neo4j-data-provision-snapshot.yaml ``` ## Data Consistency Warning From 26cd9b990f436da2e4c3f138d16faf2f1d1fa6ac Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 25 Feb 2021 21:30:28 +0100 Subject: [PATCH 095/344] more missing changes --- .../volume-snapshots/neo4j-data-snapshot.yaml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml index 1053d0105..6ac15cc05 100644 --- a/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml +++ b/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml @@ -1,12 +1,8 @@ --- - kind: PersistentVolumeClaim - apiVersion: v1 - metadata: - name: neo4j-data-claim - namespace: ocelot-social - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: "10Gi" # see requirements for Neo4j v3.5.14 https://neo4j.com/docs/operations-manual/3.5/installation/requirements/ +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 From 874d719ae32731f908bb2c0367c535609d6f3004 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 11 Mar 2021 03:19:05 +0100 Subject: [PATCH 096/344] support new INVITE_REGISTRATION config flag --- deployment/kubernetes/templates/backend/ConfigMap.yml | 1 + deployment/kubernetes/templates/webapp/ConfigMap.yml | 1 + deployment/kubernetes/values.yaml.dist | 1 + 3 files changed, 3 insertions(+) diff --git a/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/kubernetes/templates/backend/ConfigMap.yml index ec7a56658..4ea065c01 100644 --- a/deployment/kubernetes/templates/backend/ConfigMap.yml +++ b/deployment/kubernetes/templates/backend/ConfigMap.yml @@ -12,6 +12,7 @@ metadata: helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" data: PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" CLIENT_URI: "{{ .Values.BACKEND.CLIENT_URI }}" EMAIL_DEFAULT_SENDER: "{{ .Values.BACKEND.EMAIL_DEFAULT_SENDER }}" SMTP_HOST: "{{ .Values.BACKEND.SMTP_HOST }}" diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml index e7093e680..eb378f49c 100644 --- a/deployment/kubernetes/templates/webapp/ConfigMap.yml +++ b/deployment/kubernetes/templates/webapp/ConfigMap.yml @@ -13,5 +13,6 @@ metadata: data: HOST: "0.0.0.0" PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" + INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" WEBSOCKETS_URI: "{{ .Values.WEBAPP.WEBSOCKETS_URI }}" GRAPHQL_URI: "http://{{ .Release.Name }}-backend:4000" \ No newline at end of file diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index e259e9125..2b1842f80 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -1,5 +1,6 @@ # Change all the below if needed PUBLIC_REGISTRATION: false +INVITE_REGISTRATION: true BACKEND: # Change all the below if needed From 0bf8b1e282be0ebb06a87dfa7ff1818b81411383 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 11 Mar 2021 11:47:03 +0100 Subject: [PATCH 097/344] default value `INVITE_REGISTRATION=false` --- deployment/kubernetes/values.yaml.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index 2b1842f80..19df89e5d 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -1,6 +1,6 @@ # Change all the below if needed PUBLIC_REGISTRATION: false -INVITE_REGISTRATION: true +INVITE_REGISTRATION: false BACKEND: # Change all the below if needed From fc41111f8caa56fd8ef187b49c62e49a768ee3ae Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 7 Apr 2021 07:02:19 +0200 Subject: [PATCH 098/344] limit the amount of replicasets held in the kubernetes stack. --- deployment/kubernetes/templates/backend/Deployment.yaml | 1 + deployment/kubernetes/templates/maintenance/Deployment.yaml | 1 + deployment/kubernetes/templates/neo4j/Deployment.yaml | 1 + deployment/kubernetes/templates/webapp/Deployment.yaml | 1 + deployment/kubernetes/values.yaml.dist | 4 ++++ 5 files changed, 8 insertions(+) diff --git a/deployment/kubernetes/templates/backend/Deployment.yaml b/deployment/kubernetes/templates/backend/Deployment.yaml index 1d7bcfad4..f475a0173 100644 --- a/deployment/kubernetes/templates/backend/Deployment.yaml +++ b/deployment/kubernetes/templates/backend/Deployment.yaml @@ -14,6 +14,7 @@ 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 diff --git a/deployment/kubernetes/templates/maintenance/Deployment.yaml b/deployment/kubernetes/templates/maintenance/Deployment.yaml index 6c4e7f8dd..5a2eb394e 100644 --- a/deployment/kubernetes/templates/maintenance/Deployment.yaml +++ b/deployment/kubernetes/templates/maintenance/Deployment.yaml @@ -11,6 +11,7 @@ metadata: 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 diff --git a/deployment/kubernetes/templates/neo4j/Deployment.yaml b/deployment/kubernetes/templates/neo4j/Deployment.yaml index 2176fb2d9..96867dbb5 100644 --- a/deployment/kubernetes/templates/neo4j/Deployment.yaml +++ b/deployment/kubernetes/templates/neo4j/Deployment.yaml @@ -12,6 +12,7 @@ metadata: helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: replicas: 1 + revisionHistoryLimit: {{ .Values.NEO4J.REVISIONS_HISTORY_LIMIT }} strategy: rollingUpdate: maxUnavailable: 1 diff --git a/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/kubernetes/templates/webapp/Deployment.yaml index 93d1639d4..a334738ec 100644 --- a/deployment/kubernetes/templates/webapp/Deployment.yaml +++ b/deployment/kubernetes/templates/webapp/Deployment.yaml @@ -14,6 +14,7 @@ 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 diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index 19df89e5d..52890e534 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -22,6 +22,7 @@ BACKEND: # 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" @@ -38,12 +39,14 @@ WEBAPP: 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" DOCKER_IMAGE_PULL_POLICY: "Always" CONTAINER_RESTART_POLICY: "Always" @@ -76,6 +79,7 @@ MAINTENANCE: DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance" # 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" From f74045e3b938925859f1ad2c84f97a0d91c8679b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 11 May 2021 02:47:53 +0200 Subject: [PATCH 099/344] brand as default --- deployment/kubernetes/values.yaml.dist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index 52890e534..5357a22db 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -6,7 +6,7 @@ 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" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/backend-branded" CLIENT_URI: "https://staging.ocelot.social" JWT_SECRET: "b/&&7b78BF&fv/Vd" MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" @@ -32,7 +32,7 @@ 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" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp-branded" WEBSOCKETS_URI: "wss://staging.ocelot.social/api/graphql" # Most likely you don't need to change this @@ -76,7 +76,7 @@ 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" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance-branded" # Most likely you don't need to change this REVISIONS_HISTORY_LIMIT: "25" From 708b01521a562c12d78ca67d67e5a339db3a82fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 13:10:03 +0200 Subject: [PATCH 100/344] Replace ocelot logos 619x593 with 600x570 like the others --- .gitignore | 1 + branding/static/img/custom/password-reset.svg | 10 +++++----- branding/static/img/custom/welcome.svg | 10 +++++----- 3 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e43b0f988 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/branding/static/img/custom/password-reset.svg b/branding/static/img/custom/password-reset.svg index 68c94d49d..b130e7583 100644 --- a/branding/static/img/custom/password-reset.svg +++ b/branding/static/img/custom/password-reset.svg @@ -1,7 +1,7 @@ - - + + @@ -18,7 +18,7 @@ - + @@ -39,7 +39,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/branding/static/img/custom/welcome.svg b/branding/static/img/custom/welcome.svg index 68c94d49d..b130e7583 100644 --- a/branding/static/img/custom/welcome.svg +++ b/branding/static/img/custom/welcome.svg @@ -1,7 +1,7 @@ - - + + @@ -18,7 +18,7 @@ - + @@ -39,7 +39,7 @@ - + @@ -59,7 +59,7 @@ - + From 0344a1b4cc3ba1d2d9c49e3bee7dcc4ea63c9107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 16:03:41 +0200 Subject: [PATCH 101/344] =?UTF-8?q?Implement=20use=20of=20package.json=20'?= =?UTF-8?q?version'=20etc.=20for=20'$=20docker=20build=20=E2=80=A6'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 12 +++++++++--- docker/webapp.Dockerfile | 3 ++- package.json | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3a28d0c4f..fe372363b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -61,10 +61,16 @@ jobs: ########################################################################## - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + - name: ENV - BUILD_NUMBER + run: echo "BUILD_NUMBER=$(node -p -e "require('./package.json').build-number")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION_SOURCE + run: echo "DOCKER_ORGANISATION_SOURCE=$(node -p -e "require('./package.json').docker-organisation-source")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION_PUSH + run: echo "DOCKER_ORGANISATION_PUSH=$(node -p -e "require('./package.json').docker-organisation-push")" >> $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 + run: echo "BUILD_VERSION=${VERSION}-${BUILD_NUMBER}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -72,8 +78,8 @@ jobs: ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/webapp-branded:latest" -t "ocelotsocialnetwork/webapp-branded:${VERSION}" -t "ocelotsocialnetwork/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile . - docker save "ocelotsocialnetwork/webapp-branded" > /tmp/webapp-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:latest" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=${DOCKER_ORGANISATION_SOURCE}/webapp:${BUILD_VERSION} . + docker save "${DOCKER_ORGANISATION_PUSH}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index cec47cc83..58516f343 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,7 +1,8 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -FROM ocelotsocialnetwork/webapp:latest as branded +ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest +FROM $APP_IMAGE as branded # Copy public constants to the docker image branding it COPY branding/static/ static/ diff --git a/package.json b/package.json index adb67e8dc..b483e1f88 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "ocelot-social-branded", - "version": "0.0.6", + "version": "1.0.2", + "build-number": "79", + "docker-organisation-source": "ocelotsocialnetwork", + "docker-organisation-push": "ocelotsocialnetwork", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 1afe893fb6a2ceac5ab5f97a863591fe1023cdc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 16:50:52 +0200 Subject: [PATCH 102/344] Build branded Neo4j as well --- .github/workflows/publish.yml | 39 ++++++++++++++++++++++++++++++++++- docker/neo4j.Dockerfile | 9 ++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 docker/neo4j.Dockerfile diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fe372363b..878bd1bce 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,6 +6,43 @@ on: - master jobs: + ############################################################################## + # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## + ############################################################################## + build_production_neo4j: + name: Docker Build Branded - Neo4j Community + runs-on: ubuntu-latest + #needs: [nothing] + 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 NEO4J DOCKER IMAGE (community-branded) ########################### + ########################################################################## + - name: Neo4j | Build `community-branded` image + run: | + docker build --target community-branded -t "ocelotsocialnetwork/neo4j-community-branded:latest" -t "ocelotsocialnetwork/neo4j-community-branded:${VERSION}" -t "ocelotsocialnetwork/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile . + docker save "ocelotsocialnetwork/neo4j-community-branded" > /tmp/neo4j-community-branded.tar + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: docker-neo4j-community-branded + path: /tmp/neo4j-community-branded.tar + ############################################################################## # JOB: DOCKER BUILD BRANDED BACKEND ########################################## ############################################################################## @@ -27,7 +64,7 @@ jobs: - 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 + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile new file mode 100644 index 000000000..f30315472 --- /dev/null +++ b/docker/neo4j.Dockerfile @@ -0,0 +1,9 @@ +################################################################################## +# COMMUNITY ###################################################################### +################################################################################## +FROM ocelotsocialnetwork/neo4j:latest as community-branded + +################################################################################## +# ENTERPRISE ##################################################################### +################################################################################## +FROM ocelotsocialnetwork/neo4j-enterprise:latest as enterprise-branded From b57e1f23e2da6172f9fb16a3a0051a5b6d5f15ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 17:27:31 +0200 Subject: [PATCH 103/344] Refine Helm charts --- deployment/kubernetes/Chart.yaml | 6 +++--- deployment/kubernetes/README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/Chart.yaml b/deployment/kubernetes/Chart.yaml index e7f36a7a3..14a8032db 100644 --- a/deployment/kubernetes/Chart.yaml +++ b/deployment/kubernetes/Chart.yaml @@ -5,9 +5,9 @@ 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: "0.6.10" -# Be aware that this requires all dockers to have the same version available. -appVersion: "latest" +# e.g. appVersion: "1.0.2-79" +# Be aware that this requires all your apps to have the same docker image version available. +appVersion: "1.0.2-79" description: The Helm chart for ocelot.social home: https://ocelot.social sources: diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index e71ecede9..c48da6d11 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -1,6 +1,6 @@ # Helm installation of Ocelot.social -Deploying Ocelot.social with Helm 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. +Deploying *ocelot.social* with Helm 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. ## Configuration From ef1b2e7b7f566c31cd2d10f8e1b8c87d2bae5e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 08:52:39 +0200 Subject: [PATCH 104/344] Refactor to Ulf's suggestions --- .github/workflows/publish.yml | 30 +++++++++++++----------------- deployment/kubernetes/Chart.yaml | 4 ++-- package.json | 5 ++--- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 878bd1bce..f6d521a72 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,9 +1,10 @@ name: ocelot.social publish branded CI -on: - push: - branches: - - master +# Wolle on: +# push: +# branches: +# - master +on: [push] jobs: ############################################################################## @@ -98,25 +99,20 @@ jobs: ########################################################################## - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_NUMBER - run: echo "BUILD_NUMBER=$(node -p -e "require('./package.json').build-number")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION_SOURCE - run: echo "DOCKER_ORGANISATION_SOURCE=$(node -p -e "require('./package.json').docker-organisation-source")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION_PUSH - run: echo "DOCKER_ORGANISATION_PUSH=$(node -p -e "require('./package.json').docker-organisation-push")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelot-docker-version-tag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').docker-organisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${BUILD_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:latest" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=${DOCKER_ORGANISATION_SOURCE}/webapp:${BUILD_VERSION} . - docker save "${DOCKER_ORGANISATION_PUSH}/webapp-branded" > /tmp/webapp-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: diff --git a/deployment/kubernetes/Chart.yaml b/deployment/kubernetes/Chart.yaml index 14a8032db..5b953e3e7 100644 --- a/deployment/kubernetes/Chart.yaml +++ b/deployment/kubernetes/Chart.yaml @@ -5,9 +5,9 @@ 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: "1.0.2-79" +# 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: "1.0.2-79" +appVersion: "latest" description: The Helm chart for ocelot.social home: https://ocelot.social sources: diff --git a/package.json b/package.json index b483e1f88..7b6a8dee6 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,8 @@ { "name": "ocelot-social-branded", "version": "1.0.2", - "build-number": "79", - "docker-organisation-source": "ocelotsocialnetwork", - "docker-organisation-push": "ocelotsocialnetwork", + "ocelot-docker-version-tag": "1.0.2-79", + "docker-organisation": "ocelotsocialnetwork", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 278317095aff70e6341d1cec0863945ef6f054fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 09:03:06 +0200 Subject: [PATCH 105/344] Fix package.json entries --- .github/workflows/publish.yml | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f6d521a72..820d2a03e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -100,9 +100,9 @@ jobs: - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelot-docker-version-tag")" >> $GITHUB_ENV + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').docker-organisation")" >> $GITHUB_ENV + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV diff --git a/package.json b/package.json index 7b6a8dee6..e73be6c97 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "ocelot-social-branded", "version": "1.0.2", - "ocelot-docker-version-tag": "1.0.2-79", - "docker-organisation": "ocelotsocialnetwork", + "ocelotDockerVersionTag": "1.0.2-79", + "dockerOrganisation": "ocelotsocialnetwork", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 272a485f673210abdedae0ab4a60173bc6a01cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 11:30:16 +0200 Subject: [PATCH 106/344] Add the other docker images --- .github/workflows/publish.yml | 89 ++++++++++++++++++++++++++++------- docker/backend.Dockerfile | 5 +- docker/maintenance.Dockerfile | 5 +- docker/neo4j.Dockerfile | 4 +- docker/webapp.Dockerfile | 2 +- 5 files changed, 81 insertions(+), 24 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 820d2a03e..bd80ce394 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,8 +27,13 @@ jobs: 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 - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -36,8 +41,8 @@ jobs: ########################################################################## - name: Neo4j | Build `community-branded` image run: | - docker build --target community-branded -t "ocelotsocialnetwork/neo4j-community-branded:latest" -t "ocelotsocialnetwork/neo4j-community-branded:${VERSION}" -t "ocelotsocialnetwork/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile . - docker save "ocelotsocialnetwork/neo4j-community-branded" > /tmp/neo4j-community-branded.tar + docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/neo4j:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/neo4j-community-branded" > /tmp/neo4j-community-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -64,8 +69,13 @@ jobs: 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 - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -73,8 +83,8 @@ jobs: ########################################################################## - name: backend | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/backend-branded:latest" -t "ocelotsocialnetwork/backend-branded:${VERSION}" -t "ocelotsocialnetwork/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile . - docker save "ocelotsocialnetwork/backend-branded" > /tmp/backend-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/backend:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -99,6 +109,8 @@ jobs: ########################################################################## - 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 - OCELOT_DOCKER_VERSION_TAG run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION @@ -106,12 +118,14 @@ jobs: # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV + - name: ENV - BUILD_COMMIT + run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -139,8 +153,13 @@ jobs: 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 - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -148,8 +167,8 @@ jobs: ########################################################################## - name: maintenance | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/maintenance-branded:latest" -t "ocelotsocialnetwork/maintenance-branded:${VERSION}" -t "ocelotsocialnetwork/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile . - docker save "ocelotsocialnetwork/maintenance-branded" > /tmp/maintenance-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/maintenance:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -173,8 +192,33 @@ jobs: - 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 - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + - name: ENV - BUILD_VERSION + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV + - name: ENV - BUILD_COMMIT + run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + ########################################################################## # DOWNLOAD DOCKER IMAGES ################################################# ########################################################################## + # Neo4j Community + - name: Download Docker Image (Neo4j Community) + uses: actions/download-artifact@v2 + with: + name: docker-neo4j-community-branded + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/neo4j-community-branded.tar + # Backend - name: Download Docker Image (Backend) uses: actions/download-artifact@v2 with: @@ -182,13 +226,15 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/backend-branded.tar - - name: Download Docker Image (WebApp) + # Webapp + - 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 + # Maintenance - name: Download Docker Image (Maintenance) uses: actions/download-artifact@v2 with: @@ -201,12 +247,14 @@ jobs: ########################################################################## - name: login to dockerhub run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin - - name: Push backend - run: docker push --all-tags ocelotsocialnetwork/backend-branded - - name: Push webapp - run: docker push --all-tags ocelotsocialnetwork/webapp-branded - - name: Push maintenance - run: docker push --all-tags ocelotsocialnetwork/maintenance-branded + - name: Push Neo4j Community + run: docker push --all-tags ${DOCKER_ORGANISATION}/neo4j-community-branded + - name: Push Backend + run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-branded + - name: Push Webapp + run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-branded + - name: Push Maintenance + run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-branded ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# @@ -230,8 +278,13 @@ jobs: 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 - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index db234aa44..9b68fb8ef 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,8 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -FROM ocelotsocialnetwork/backend:latest as branded +ARG APP_IMAGE=ocelotsocialnetwork/backend:latest +FROM $APP_IMAGE as branded -# Copy public constants to the docker image branding it +# Copy public constants to the docker image and branding it COPY branding/constants/links.js src/config/ COPY branding/constants/metadata.js src/config/ diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 585947cdd..8b05fe793 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,8 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -FROM ocelotsocialnetwork/maintenance:latest as branded +ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest +FROM $APP_IMAGE as branded -# Copy public constants to the docker image branding it +# Copy public constants to the docker image and branding it COPY branding/static/ static/ COPY branding/constants/ constants/ diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index f30315472..dff5209da 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,7 +1,9 @@ +ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest + ################################################################################## # COMMUNITY ###################################################################### ################################################################################## -FROM ocelotsocialnetwork/neo4j:latest as community-branded +FROM $APP_IMAGE as community-branded ################################################################################## # ENTERPRISE ##################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 58516f343..bfdb899ee 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image branding it +# Copy public constants to the docker image and branding it COPY branding/static/ static/ COPY branding/constants/ constants/ From 3fe2ec64507565c38ca81ae45869c81afc6302f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 12:04:20 +0200 Subject: [PATCH 107/344] Use correct Neo4j docker image --- deployment/kubernetes/values.yaml.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index 5357a22db..d20e2bcea 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -47,7 +47,7 @@ WEBAPP: NEO4J: # Most likely you don't need to change this REVISIONS_HISTORY_LIMIT: "25" - DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j-community-branded" DOCKER_IMAGE_PULL_POLICY: "Always" CONTAINER_RESTART_POLICY: "Always" CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30" From c0a1028eb7fce888f96fbd2f52a7531c074a5822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 12:53:15 +0200 Subject: [PATCH 108/344] Rename *.yaml.dist files to *.template.yaml --- .../{dns.values.yaml.dist => dns.values.template.yaml} | 2 ++ .../{nginx.values.yaml.dist => nginx.values.template.yaml} | 2 ++ .../kubernetes/{values.yaml.dist => values.template.yaml} | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) rename deployment/kubernetes/{dns.values.yaml.dist => dns.values.template.yaml} (74%) rename deployment/kubernetes/{nginx.values.yaml.dist => nginx.values.template.yaml} (68%) rename deployment/kubernetes/{values.yaml.dist => values.template.yaml} (97%) diff --git a/deployment/kubernetes/dns.values.yaml.dist b/deployment/kubernetes/dns.values.template.yaml similarity index 74% rename from deployment/kubernetes/dns.values.yaml.dist rename to deployment/kubernetes/dns.values.template.yaml index 16d297573..09539e37e 100644 --- a/deployment/kubernetes/dns.values.yaml.dist +++ b/deployment/kubernetes/dns.values.template.yaml @@ -1,3 +1,5 @@ +# 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 diff --git a/deployment/kubernetes/nginx.values.yaml.dist b/deployment/kubernetes/nginx.values.template.yaml similarity index 68% rename from deployment/kubernetes/nginx.values.yaml.dist rename to deployment/kubernetes/nginx.values.template.yaml index 06dad8136..8035104d2 100644 --- a/deployment/kubernetes/nginx.values.yaml.dist +++ b/deployment/kubernetes/nginx.values.template.yaml @@ -1,3 +1,5 @@ +# please duplicate template file and rename to "nginx.values.yaml" and fill in your value + controller: kind: DaemonSet hostNetwork: true diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.template.yaml similarity index 97% rename from deployment/kubernetes/values.yaml.dist rename to deployment/kubernetes/values.template.yaml index d20e2bcea..21bcd9c68 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.template.yaml @@ -1,4 +1,6 @@ -# Change all the below if needed +# please duplicate template file and rename to "values.yaml" and fill in your value + +# change all the below if needed PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false From 050d0c3ea89ebb078bd7f3b82c4582758f56d288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 12:27:33 +0200 Subject: [PATCH 109/344] Refine README and values.template.yaml --- .github/workflows/publish.yml | 10 +- deployment/kubernetes/README.md | 130 +++++++++++++++------ deployment/kubernetes/values.template.yaml | 25 ++-- 3 files changed, 115 insertions(+), 50 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bd80ce394..76ac7e2f7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,10 +1,10 @@ name: ocelot.social publish branded CI -# Wolle on: -# push: -# branches: -# - master -on: [push] +on: + push: + branches: + - master +# on: [push] # for testing while developing jobs: ############################################################################## diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index c48da6d11..ce0ff1999 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -1,40 +1,54 @@ -# Helm installation of Ocelot.social +# Helm Installation Of Ocelot.Social Deploying *ocelot.social* with Helm 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. ## Configuration -You can customize the network with your configuration by changing the `values.yaml`, all variables will be available as environment variables in your deployed kubernetes pods. For more details refer to the `values.yaml.dist` file. +You can customize the network 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.yaml.dist` file we provide a `nginx.values.yaml.dist` and `dns.values.yaml.dist`. The `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 digital ocean and therefore optional. - -As hinted above you should copy the given files and rename them accordingly. Then go ahead and modify the values in the newly created files accordingly. +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 digital ocean 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 helm chart. Obviously it is expected of you to have `helm` and `kubectl` installed. For Digital Ocean you might require `doctl` aswell. +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 Digital Ocean you might require `doctl` aswell. ### Cert Manager (https) Please refer to [cert-manager.io docs](https://cert-manager.io/docs/installation/kubernetes/) for more details. +***ATTENTION:*** *Be with the Terminal in your repository in the folder of this README.* + 1. Create Namespace ```bash -kubectl --kubeconfig=/../kubeconfig.yaml create namespace cert-manager +# kubeconfig.yaml set globaly +$ kubectl create namespace cert-manager +# or kubeconfig.yaml in your repo, then adjust +$ kubectl --kubeconfig=/../kubeconfig.yaml create namespace cert-manager ``` -2. Add Helm Repo & update +2. Add Helm repository and update ```bash -helm repo add jetstack https://charts.jetstack.io -helm repo update +$ helm repo add jetstack https://charts.jetstack.io +$ helm repo update ``` 3. Install Cert-Manager Helm chart + ```bash -# this can not be included sine the CRDs cant be installed properly via helm... -helm --kubeconfig=/../kubeconfig.yaml \ +# option 1 +# this can't be applied via kubectl to our cluster since the CRDs can't be installed properly this way ... +# $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.crds.yaml + +# option 2 +# kubeconfig.yaml set globaly +$ helm install cert-manager jetstack/cert-manager \ + --namespace cert-manager \ + --version v1.1.0 \ + --set installCRDs=true +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml \ install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --version v1.1.0 \ @@ -43,15 +57,20 @@ helm --kubeconfig=/../kubeconfig.yaml \ ### Ingress-Nginx -1. Add Helm Repo & update +1. Add Helm repository and update + ```bash -helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx -helm repo update +$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +$ helm repo update ``` 2. Install ingress-nginx + ```bash -helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +# 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 ``` ### Digital Ocean Firewall @@ -61,56 +80,101 @@ This is only necessary if you run Digital Ocean without load balancer ([see here 1. Authenticate towards DO with your local `doctl` You will need a DO token for that. + ```bash -doctl auth init +# 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 + +Fill in the `CLUSTER_UUID` and `your-domain` (Get the `CLUSTER_UUID` value from the dashboard or the ID column from doctl kubernetes cluster list.): + ```bash -doctl compute firewall create \ +# 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:1ebf0cdc-86c9-4384-936b-40010b71d049 \ ---name=my-domain-http-https +--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 -This chart is only necessary (recommended is more precise) if you run Digital Ocean without load balancer. -You need to generate a token for the `dns.values.yaml`. +This chart is only necessary (recommended is more precise) if you run Digital Ocean 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 and update -1. Add Helm Repo & update ```bash -helm repo add bitnami https://charts.bitnami.com/bitnami -helm repo update +$ helm repo add bitnami https://charts.bitnami.com/bitnami +$ helm repo update ``` 2. Install DNS + ```bash -helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns.values.yaml +# 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 +### Ocelot.Social 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 -helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ +# kubeconfig.yaml set globaly +$ helm install ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ ``` -#### Upgrade +#### Upgrade & Update + +Run for all upgrades and updates: + ```bash -helm --kubeconfig=/../kubeconfig.yaml upgrade ocelot ./ +# kubeconfig.yaml set globaly +$ helm upgrade ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml upgrade 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 -helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot +# kubeconfig.yaml set globaly +$ helm uninstall ocelot +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot ``` -## Error reporting +## 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 @@ -125,4 +189,4 @@ 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 Digital Ocean's kubernetes clusters do not fulfill the requirements. \ No newline at end of file +Apparently Digital Ocean's kubernetes clusters do not fulfill the requirements. diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 21bcd9c68..a525a3ba6 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -5,11 +5,12 @@ PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false BACKEND: - # Change all the below if needed + # change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image - # Label is appended based on .Chart.appVersion + # 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" MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" PRIVATE_KEY_PASSPHRASE: "a7dsf78sadg87ad87sfagsadg78" @@ -21,7 +22,7 @@ BACKEND: SMTP_IGNORE_TLS: 'true' SMTP_SECURE: 'false' - # Most likely you don't need to change this + # most likely you don't need to change this MIN_READY_SECONDS: "15" PROGRESS_DEADLINE_SECONDS: "60" REVISIONS_HISTORY_LIMIT: "25" @@ -31,9 +32,9 @@ BACKEND: STORAGE_UPLOADS: "25Gi" WEBAPP: - # Change all the below if needed + # change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image - # Label is appended based on .Chart.appVersion + # label is appended based on .Chart.appVersion DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp-branded" WEBSOCKETS_URI: "wss://staging.ocelot.social/api/graphql" @@ -47,7 +48,7 @@ WEBAPP: DOCKER_IMAGE_PULL_POLICY: "Always" NEO4J: - # Most likely you don't need to change this + # 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" @@ -75,9 +76,9 @@ NEO4J: DBMS_SECURITY_PROCEDURES_UNRESTRICTED: "algo.*,apoc.*" MAINTENANCE: - # Change all the below if needed + # change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image - # Label is appended based on .Chart.appVersion + # label is appended based on .Chart.appVersion DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance-branded" # Most likely you don't need to change this @@ -87,7 +88,7 @@ MAINTENANCE: DOCKER_IMAGE_PULL_POLICY: "Always" LETSENCRYPT: - # Change all the below if needed + # 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 @@ -98,14 +99,14 @@ LETSENCRYPT: - "www.staging.ocelot.social" NGINX: - # Most likely you don't need to change this + # most likely you don't need to change this PROXY_BODY_SIZE: "10m" STORAGE: - # Change all the below if needed + # change all the below if needed PROVISIONER: "dobs.csi.digitalocean.com" - # Most likely you don't need to change this + # 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 From d478a5af7e8908952663ad4742bdb4b1a4ae249c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 13:07:50 +0200 Subject: [PATCH 110/344] Correct needs for 'upload_to_dockerhub' --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 76ac7e2f7..6c455c73a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ jobs: ############################################################################## # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## ############################################################################## - build_production_neo4j: + build_branded_neo4j: name: Docker Build Branded - Neo4j Community runs-on: ubuntu-latest #needs: [nothing] @@ -181,7 +181,7 @@ jobs: upload_to_dockerhub: name: Upload to Dockerhub runs-on: ubuntu-latest - needs: [build_branded_backend,build_branded_webapp,build_branded_maintenance] + needs: [build_branded_neo4j,build_branded_backend,build_branded_webapp,build_branded_maintenance] env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} From 825b05f43ee63f6250497edfa0e6c84a663fdc14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 13:12:53 +0200 Subject: [PATCH 111/344] Fix comments --- docker/backend.Dockerfile | 2 +- docker/maintenance.Dockerfile | 2 +- docker/webapp.Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 9b68fb8ef..0021950dc 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/backend:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and branding it +# Copy public constants to the docker image and brand it COPY branding/constants/links.js src/config/ COPY branding/constants/metadata.js src/config/ diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 8b05fe793..29ea4fd4b 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and branding it +# Copy public constants to the docker image and brand it COPY branding/static/ static/ COPY branding/constants/ constants/ diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index bfdb899ee..fef479603 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and branding it +# Copy public constants to the docker image and brand it COPY branding/static/ static/ COPY branding/constants/ constants/ From 936743d8b533a7de75c71dda1347a01393afe2ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 20:37:49 +0200 Subject: [PATCH 112/344] Refine comments and default Docker image names --- docker/backend.Dockerfile | 4 ++-- docker/maintenance.Dockerfile | 4 ++-- docker/neo4j.Dockerfile | 2 +- docker/webapp.Dockerfile | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 0021950dc..ef39c141a 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,9 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/backend:latest +ARG APP_IMAGE=ocelotsocialnetwork/backend-branded:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and brand it +# copy public constants into the Docker image to brand it COPY branding/constants/links.js src/config/ COPY branding/constants/metadata.js src/config/ diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 29ea4fd4b..0f273b06a 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,9 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest +ARG APP_IMAGE=ocelotsocialnetwork/maintenance-branded:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and brand it +# copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index dff5209da..2220b6bed 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,4 +1,4 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest +ARG APP_IMAGE=ocelotsocialnetwork/neo4j-community-branded:latest ################################################################################## # COMMUNITY ###################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index fef479603..c530a1f74 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,9 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest +ARG APP_IMAGE=ocelotsocialnetwork/webapp-branded:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and brand it +# copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ From 6cc5f1dff678bbd38d0a128863c50c7521393205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 17 May 2021 09:26:09 +0200 Subject: [PATCH 113/344] Add README and LICENSE --- LICENSE.md | 11 +++++++++ README.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 LICENSE.md create mode 100644 README.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..de166111d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,11 @@ +# LICENSE + +MIT License + +Copyright \(c\) 2021 by the [ocelot.social community](https://github.com/Ocelot-Social-Community) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..253130c92 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# 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. + + + + + + + +

+ Ocelot-Social +

+ + + +## Usage + +Fork this repository and configure as well as rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. + +- [Configure And Rebrand](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding) + +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://discordapp.com/invite/DFSjPaX) :heart_eyes_cat: +Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: +Check out the [contribution guideline](./CONTRIBUTING.md), too! + +We give write permissions to every developer who asks for it. Just text us on +[Discord](https://discord.gg/6ub73U3). + +## Technology Stack + +- [Kubernetes](https://kubernetes.io) +- [Helm](https://helm.sh) +- [Docker](https://www.docker.com) + + + +## License + +See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT). From cc728e829f40efa50bbd0217ede47061242e64fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 17 May 2021 13:31:06 +0200 Subject: [PATCH 114/344] Revert apps default DockerHub image names --- docker/backend.Dockerfile | 2 +- docker/maintenance.Dockerfile | 2 +- docker/neo4j.Dockerfile | 2 +- docker/webapp.Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index ef39c141a..3a1618d79 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/backend-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/backend:latest FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 0f273b06a..1da296d54 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/maintenance-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index 2220b6bed..dff5209da 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,4 +1,4 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j-community-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest ################################################################################## # COMMUNITY ###################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index c530a1f74..157072b91 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/webapp-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it From eafc02c8693a30adc110bf4d0d228ef2398b6698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 17 May 2021 13:31:36 +0200 Subject: [PATCH 115/344] Refine organization description --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e73be6c97..a2b6100cb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.2", "ocelotDockerVersionTag": "1.0.2-79", "dockerOrganisation": "ocelotsocialnetwork", - "description": "Ocelot Social Branded", + "description": "ocelot.social Branded", "author": "ocelot.social Community", "license": "MIT", "private": false, From 9d370c19217cd2cf8d0d169d5f791bde0fc0a4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 11:07:07 +0200 Subject: [PATCH 116/344] Adjust to new logo structure - Rename logo 'logo-horizontal--dummy' to dummy to get small caps in the next step. --- branding/constants/links.js | 1 + branding/constants/logos.js | 10 +++ branding/constants/metadata.js | 1 + .../img/custom/Logo-Horizontal-Dark.svg | 48 ----------- ...izontal.svg => logo-horizontal--dummy.svg} | 2 +- .../custom/{sign-up.svg => logo-squared.svg} | 2 +- branding/static/img/custom/logout.svg | 82 ------------------- branding/static/img/custom/password-reset.svg | 82 ------------------- .../static/img/custom/under-maintenance.svg | 82 ------------------- branding/static/img/custom/welcome.svg | 82 ------------------- docker/backend.Dockerfile | 1 + 11 files changed, 15 insertions(+), 378 deletions(-) create mode 100644 branding/constants/logos.js delete mode 100644 branding/static/img/custom/Logo-Horizontal-Dark.svg rename branding/static/img/custom/{Logo-Horizontal.svg => logo-horizontal--dummy.svg} (99%) rename branding/static/img/custom/{sign-up.svg => logo-squared.svg} (99%) delete mode 100644 branding/static/img/custom/logout.svg delete mode 100644 branding/static/img/custom/password-reset.svg delete mode 100644 branding/static/img/custom/under-maintenance.svg delete mode 100644 branding/static/img/custom/welcome.svg diff --git a/branding/constants/links.js b/branding/constants/links.js index 070ffa176..cdccbae6b 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,3 +1,4 @@ +// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding export default { ORGANIZATION: 'https://ocelot.social', DONATE: 'https://ocelot-social.herokuapp.com/donations', diff --git a/branding/constants/logos.js b/branding/constants/logos.js new file mode 100644 index 000000000..d093c7b46 --- /dev/null +++ b/branding/constants/logos.js @@ -0,0 +1,10 @@ +// 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_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/branding/constants/metadata.js b/branding/constants/metadata.js index 55dfe2372..e5f32c7f5 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,3 +1,4 @@ +// 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', diff --git a/branding/static/img/custom/Logo-Horizontal-Dark.svg b/branding/static/img/custom/Logo-Horizontal-Dark.svg deleted file mode 100644 index deba99182..000000000 --- a/branding/static/img/custom/Logo-Horizontal-Dark.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/Logo-Horizontal.svg b/branding/static/img/custom/logo-horizontal--dummy.svg similarity index 99% rename from branding/static/img/custom/Logo-Horizontal.svg rename to branding/static/img/custom/logo-horizontal--dummy.svg index 27b522b75..d821c8329 100644 --- a/branding/static/img/custom/Logo-Horizontal.svg +++ b/branding/static/img/custom/logo-horizontal--dummy.svg @@ -1,6 +1,6 @@ - + diff --git a/branding/static/img/custom/sign-up.svg b/branding/static/img/custom/logo-squared.svg similarity index 99% rename from branding/static/img/custom/sign-up.svg rename to branding/static/img/custom/logo-squared.svg index b130e7583..15f420c79 100644 --- a/branding/static/img/custom/sign-up.svg +++ b/branding/static/img/custom/logo-squared.svg @@ -1,6 +1,6 @@ - + diff --git a/branding/static/img/custom/logout.svg b/branding/static/img/custom/logout.svg deleted file mode 100644 index b130e7583..000000000 --- a/branding/static/img/custom/logout.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/password-reset.svg b/branding/static/img/custom/password-reset.svg deleted file mode 100644 index b130e7583..000000000 --- a/branding/static/img/custom/password-reset.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/under-maintenance.svg b/branding/static/img/custom/under-maintenance.svg deleted file mode 100644 index b130e7583..000000000 --- a/branding/static/img/custom/under-maintenance.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/welcome.svg b/branding/static/img/custom/welcome.svg deleted file mode 100644 index b130e7583..000000000 --- a/branding/static/img/custom/welcome.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 3a1618d79..88512427f 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -6,4 +6,5 @@ FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it COPY branding/constants/links.js src/config/ +COPY branding/constants/logos.js src/config/ COPY branding/constants/metadata.js src/config/ From ac85a971919a7ac9448043a102e1008b34c6e890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 11:10:01 +0200 Subject: [PATCH 117/344] Rename logo 'logo-horizontal.svg' to small caps, remove dummy --- .../custom/{logo-horizontal--dummy.svg => logo-horizontal.svg} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename branding/static/img/custom/{logo-horizontal--dummy.svg => logo-horizontal.svg} (100%) diff --git a/branding/static/img/custom/logo-horizontal--dummy.svg b/branding/static/img/custom/logo-horizontal.svg similarity index 100% rename from branding/static/img/custom/logo-horizontal--dummy.svg rename to branding/static/img/custom/logo-horizontal.svg From 981c48a782889e93a65254783a5dd7409e0723de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 11:10:33 +0200 Subject: [PATCH 118/344] Release v1.0.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a2b6100cb..5931cf796 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.2", - "ocelotDockerVersionTag": "1.0.2-79", + "version": "1.0.3", + "ocelotDockerVersionTag": "1.0.3-81", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 71f250ceb65e024297bea21c72ca1bc0fde71e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 17:12:48 +0200 Subject: [PATCH 119/344] Upgrade ocelot.social build number to 1.0.3-82 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5931cf796..1ad10aede 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.3", - "ocelotDockerVersionTag": "1.0.3-81", + "ocelotDockerVersionTag": "1.0.3-82", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 06fafb8ceed257d76dae131d655f6f436135736f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 May 2021 16:59:27 +0200 Subject: [PATCH 120/344] Change logo file name in main Readme.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 253130c92..5f5ca6b03 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This repository is an in use template to rebrand, configure, and deploy [ocelot.

- Ocelot-Social + Ocelot-Social

+ +

Ich bin der Inhalt vom Verhaltenskodex

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html new file mode 100644 index 000000000..3e1cc4d08 --- /dev/null +++ b/branding/locales/html/de/data-privacy.html @@ -0,0 +1,3 @@ + + +

Das hier wäre der Inhalt der Datenschutzbestimmungen

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html new file mode 100644 index 000000000..6b04c72aa --- /dev/null +++ b/branding/locales/html/de/faq.html @@ -0,0 +1,3 @@ + + +

Hier stehen die FAQs

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html new file mode 100644 index 000000000..4cd4eafa4 --- /dev/null +++ b/branding/locales/html/de/imprint.html @@ -0,0 +1,3 @@ + + +

Ich bin das Impressum

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html new file mode 100644 index 000000000..87bdaf672 --- /dev/null +++ b/branding/locales/html/de/terms-and-conditions.html @@ -0,0 +1,3 @@ + + +

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html new file mode 100644 index 000000000..b6d8ca55a --- /dev/null +++ b/branding/locales/html/en/code-of-conduct.html @@ -0,0 +1,3 @@ + + +

I am the content of the code of conduct

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html new file mode 100644 index 000000000..5a6c5d86f --- /dev/null +++ b/branding/locales/html/en/data-privacy.html @@ -0,0 +1,3 @@ + + +

This would be our data privacy section

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html new file mode 100644 index 000000000..c8a173b37 --- /dev/null +++ b/branding/locales/html/en/faq.html @@ -0,0 +1,3 @@ + + +

Here are the FAQs

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html new file mode 100644 index 000000000..03fa2f136 --- /dev/null +++ b/branding/locales/html/en/imprint.html @@ -0,0 +1,3 @@ + + +

I am the imprint

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html new file mode 100644 index 000000000..a93ad6642 --- /dev/null +++ b/branding/locales/html/en/terms-and-conditions.html @@ -0,0 +1,3 @@ + + +

I am the content of the page "terms and conditions"

diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 1da296d54..f045c95dd 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -7,3 +7,4 @@ FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 157072b91..0f104321c 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -7,3 +7,4 @@ FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ From 5240bc9e6748210ad320e9a4e93e16931a53d695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 19:03:22 +0200 Subject: [PATCH 126/344] Add text line to the rebranded translated html files --- branding/locales/html/de/code-of-conduct.html | 2 ++ branding/locales/html/de/data-privacy.html | 2 ++ branding/locales/html/de/faq.html | 2 ++ branding/locales/html/de/imprint.html | 2 ++ branding/locales/html/de/terms-and-conditions.html | 2 ++ branding/locales/html/en/code-of-conduct.html | 2 ++ branding/locales/html/en/data-privacy.html | 2 ++ branding/locales/html/en/faq.html | 2 ++ branding/locales/html/en/imprint.html | 2 ++ branding/locales/html/en/terms-and-conditions.html | 2 ++ 10 files changed, 20 insertions(+) diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html index dda9c276e..8212ecf2a 100644 --- a/branding/locales/html/de/code-of-conduct.html +++ b/branding/locales/html/de/code-of-conduct.html @@ -1,3 +1,5 @@

Ich bin der Inhalt vom Verhaltenskodex

+ +Neu gebrandet … diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index 3e1cc4d08..c09c72fd9 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,3 +1,5 @@

Das hier wäre der Inhalt der Datenschutzbestimmungen

+ +Neu gebrandet … diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index 6b04c72aa..457fbac6c 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,3 +1,5 @@

Hier stehen die FAQs

+ +Neu gebrandet … diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 4cd4eafa4..d9d0e2328 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,3 +1,5 @@

Ich bin das Impressum

+ +Neu gebrandet … diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 87bdaf672..30e3be335 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,3 +1,5 @@

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

+ +Neu gebrandet … diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index b6d8ca55a..7f78e2786 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,3 +1,5 @@

I am the content of the code of conduct

+ +Rebranded … diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index 5a6c5d86f..92b8918f4 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,3 +1,5 @@

This would be our data privacy section

+ +Rebranded … diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index c8a173b37..63eed99ad 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,3 +1,5 @@

Here are the FAQs

+ +Rebranded … diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index 03fa2f136..6f50585fc 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,3 +1,5 @@

I am the imprint

+ +Rebranded … diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index a93ad6642..8a135e3d3 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,3 +1,5 @@

I am the content of the page "terms and conditions"

+ +Rebranded … From c3212eaca147fe5ba80088913baaf17acdc5060c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 19:20:54 +0200 Subject: [PATCH 127/344] Implement 'docker-compose.ocelotsocial-branded.yml' --- docker-compose.ocelotsocial-branded.yml | 80 +++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docker-compose.ocelotsocial-branded.yml diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml new file mode 100644 index 000000000..5ea530e3a --- /dev/null +++ b/docker-compose.ocelotsocial-branded.yml @@ -0,0 +1,80 @@ +# This docker-compose file is just here for testing +version: "3.4" + +services: + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + 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=${WEBSOCKETS_URI} + - PUBLIC_REGISTRATION=true + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + image: ocelotsocialnetwork/backend-branded:latest + networks: + - test-network + depends_on: + - neo4j + ports: + - 4000:4000 + 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 + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + 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 + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + image: ocelotsocialnetwork/maintenance-branded:latest + networks: + - test-network + ports: + - 5000:80 + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - test-network +networks: + test-network: \ No newline at end of file From f0a01fa42aab9cd8eadf777553c9d73db29f4fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 18:07:09 +0200 Subject: [PATCH 128/344] Add comment and lineend --- deployment/kubernetes/values.template.yaml | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index a525a3ba6..f8669d150 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -20,7 +20,7 @@ BACKEND: SMTP_PASSWORD: "devops@ocelot.social" SMTP_PORT: "465" SMTP_IGNORE_TLS: 'true' - SMTP_SECURE: 'false' + SMTP_SECURE: 'false' # true for 465, false for other ports # most likely you don't need to change this MIN_READY_SECONDS: "15" diff --git a/docker-compose.yml b/docker-compose.yml index b680fd945..3604d1a9d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -62,4 +62,4 @@ services: networks: - test-network networks: - test-network: \ No newline at end of file + test-network: From bab552ae8692b82f62f8a7569e09e8d76302f52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 20:17:13 +0200 Subject: [PATCH 129/344] Overtake the tested changes from sender.fm --- .github/workflows/publish.yml | 16 +++---- branding/constants/links.js | 13 ++++-- branding/constants/metadata.js | 4 +- branding/locales/html/de/code-of-conduct.html | 5 +++ branding/locales/html/de/data-privacy.html | 5 +++ branding/locales/html/de/faq.html | 5 +++ branding/locales/html/de/imprint.html | 5 +++ .../locales/html/de/terms-and-conditions.html | 5 +++ branding/locales/html/en/code-of-conduct.html | 5 +++ branding/locales/html/en/data-privacy.html | 5 +++ branding/locales/html/en/faq.html | 5 +++ branding/locales/html/en/imprint.html | 5 +++ .../locales/html/en/terms-and-conditions.html | 5 +++ docker-compose.yml | 25 +++++++++++ docker/backend.Dockerfile | 40 +++++++++++++++-- docker/maintenance.Dockerfile | 34 ++++++++++++-- docker/neo4j.Dockerfile | 6 ++- docker/webapp.Dockerfile | 45 +++++++++++++++++-- package.json | 2 +- 19 files changed, 209 insertions(+), 26 deletions(-) create mode 100644 branding/locales/html/de/code-of-conduct.html create mode 100644 branding/locales/html/de/data-privacy.html create mode 100644 branding/locales/html/de/faq.html create mode 100644 branding/locales/html/de/imprint.html create mode 100644 branding/locales/html/de/terms-and-conditions.html create mode 100644 branding/locales/html/en/code-of-conduct.html create mode 100644 branding/locales/html/en/data-privacy.html create mode 100644 branding/locales/html/en/faq.html create mode 100644 branding/locales/html/en/imprint.html create mode 100644 branding/locales/html/en/terms-and-conditions.html diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0937a1e2a..b450000ee 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master -# on: [push] # for testing while developing + - 14-new-deployment-with-base-and-code # for testing while developing jobs: ############################################################################## @@ -41,7 +41,7 @@ jobs: ########################################################################## - name: Neo4j | Build `community-branded` image run: | - docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/neo4j:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg "APP_IMAGE_TAG=${OCELOT_DOCKER_VERSION_TAG}" . docker save "${DOCKER_ORGANISATION}/neo4j-community-branded" > /tmp/neo4j-community-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -81,9 +81,9 @@ jobs: ########################################################################## # BUILD BACKEND DOCKER IMAGE (branded) ################################ ########################################################################## - - name: backend | Build `branded` image + - name: Backend | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/backend:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -123,9 +123,9 @@ jobs: ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - - name: webapp | Build `branded` image + - name: Webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -165,9 +165,9 @@ jobs: ########################################################################## # BUILD MAINTENANCE DOCKER IMAGE (build) ################################# ########################################################################## - - name: maintenance | Build `branded` image + - name: Maintenance | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/maintenance:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 diff --git a/branding/constants/links.js b/branding/constants/links.js index cdccbae6b..6b945a5e0 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,8 +1,13 @@ // this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding export default { ORGANIZATION: 'https://ocelot.social', - DONATE: 'https://ocelot-social.herokuapp.com/donations', - IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', - DATA_PRIVACY: 'https://ocelot-social.herokuapp.com/imprint', - FAQ: 'https://ocelot-social.herokuapp.com/#kontakt', + SUPPORT: 'https://ocelot.social', + + // on null or empty strings internal imprint is used, see 'webapp/locales/html/' + DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + TERMS_AND_CONDITIONS: null, + CODE_OF_CONDUCT: null, + DATA_PRIVACY: null, + FAQ: 'https://ocelot.social', } diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index e5f32c7f5..3d09066d5 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,9 +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', + APPLICATION_SHORT_NAME: 'ocelot.social', APPLICATION_DESCRIPTION: 'Ocelot Social Community', COOKIE_NAME: 'ocelot-social-token', ORGANIZATION_NAME: 'busFaktor e.V.', - ORGANIZATION_JURISDICTION: 'Somewhere', + ORGANIZATION_JURISDICTION: 'Deutschland', } diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html new file mode 100644 index 000000000..028650aa4 --- /dev/null +++ b/branding/locales/html/de/code-of-conduct.html @@ -0,0 +1,5 @@ + + +

Ich bin der Inhalt vom Verhaltenskodex

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html new file mode 100644 index 000000000..25047fb89 --- /dev/null +++ b/branding/locales/html/de/data-privacy.html @@ -0,0 +1,5 @@ + + +

Das hier wäre der Inhalt der Datenschutzbestimmungen

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html new file mode 100644 index 000000000..214d48173 --- /dev/null +++ b/branding/locales/html/de/faq.html @@ -0,0 +1,5 @@ + + +

Hier stehen die FAQs

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html new file mode 100644 index 000000000..174f61a8a --- /dev/null +++ b/branding/locales/html/de/imprint.html @@ -0,0 +1,5 @@ + + +

Ich bin das Impressum

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html new file mode 100644 index 000000000..4e0aaebeb --- /dev/null +++ b/branding/locales/html/de/terms-and-conditions.html @@ -0,0 +1,5 @@ + + +

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

+
+

Neu gebrandet …

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html new file mode 100644 index 000000000..b0065de2a --- /dev/null +++ b/branding/locales/html/en/code-of-conduct.html @@ -0,0 +1,5 @@ + + +

I am the content of the code of conduct

+
+

Rebranded …

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html new file mode 100644 index 000000000..2be9cf500 --- /dev/null +++ b/branding/locales/html/en/data-privacy.html @@ -0,0 +1,5 @@ + + +

This would be our data privacy section

+
+

Rebranded …

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html new file mode 100644 index 000000000..f8f08972c --- /dev/null +++ b/branding/locales/html/en/faq.html @@ -0,0 +1,5 @@ + + +

Here are the FAQs

+
+

Rebranded …

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html new file mode 100644 index 000000000..ae192da77 --- /dev/null +++ b/branding/locales/html/en/imprint.html @@ -0,0 +1,5 @@ + + +

I am the imprint

+
+

Rebranded …

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html new file mode 100644 index 000000000..6ebc0beb3 --- /dev/null +++ b/branding/locales/html/en/terms-and-conditions.html @@ -0,0 +1,5 @@ + + +

I am the content of the page "terms and conditions"

+
+

Rebranded …

diff --git a/docker-compose.yml b/docker-compose.yml index 3604d1a9d..4379459ca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,9 @@ version: "3.4" services: + ######################################################## + # WEBAPP ############################################### + ######################################################## webapp: build: dockerfile: docker/webapp.Dockerfile @@ -19,6 +22,9 @@ services: - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" - WEBSOCKETS_URI=${WEBSOCKETS_URI} - PUBLIC_REGISTRATION=true + ######################################################## + # BACKEND ############################################## + ######################################################## backend: build: dockerfile: docker/backend.Dockerfile @@ -45,6 +51,9 @@ services: - SMTP_HOST=mailserver - SMTP_PORT=25 - SMTP_IGNORE_TLS=true + ######################################################## + # NEO4J ################################################ + ######################################################## neo4j: image: ocelotsocialnetwork/neo4j:community networks: @@ -55,6 +64,22 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + build: + # TODO: Separate from webapp, this must be independent + dockerfile: docker/maintenance.Dockerfile + target: branded + context: . + networks: + - test-network + ports: + - 5000:80 + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## mailserver: image: djfarrelly/maildev ports: diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 88512427f..91e57b04f 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,10 +1,44 @@ +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} + ################################################################################## -# BRANDED ######################################################################## +# CODE (branded) ################################################################# ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/backend:latest -FROM $APP_IMAGE as branded +FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/constants/links.js src/config/ COPY branding/constants/logos.js src/config/ COPY branding/constants/metadata.js src/config/ + +################################################################################## +# 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 +# Copy static files # Wolle comment overfluid here? +# 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/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 1da296d54..eeda31f88 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,9 +1,37 @@ +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} + ################################################################################## -# BRANDED ######################################################################## +# CODE (branded) ################################################################# ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest -FROM $APP_IMAGE as branded +FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ + +################################################################################## +# 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/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index dff5209da..980c45e41 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,9 +1,11 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest +ARG APP_IMAGE=ocelotsocialnetwork/neo4j +ARG APP_IMAGE_TAG=latest +ARG APP_IMAGE_COMMUNITY=${APP_IMAGE}:${APP_IMAGE_TAG} ################################################################################## # COMMUNITY ###################################################################### ################################################################################## -FROM $APP_IMAGE as community-branded +FROM $APP_IMAGE_COMMUNITY as community-branded ################################################################################## # ENTERPRISE ##################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 157072b91..1d7ee67c3 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,9 +1,48 @@ +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} + ################################################################################## -# BRANDED ######################################################################## +# CODE (branded) ################################################################# ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest -FROM $APP_IMAGE as branded +FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ + +################################################################################## +# 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 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/package.json b/package.json index 1ad10aede..3b0724f74 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.3", - "ocelotDockerVersionTag": "1.0.3-82", + "ocelotDockerVersionTag": "1.0.3-97", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 92664ee0dfec9c74d4ba7c339018a78fe5cf16ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 21:04:54 +0200 Subject: [PATCH 130/344] Set publish again on master push only --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b450000ee..0fde053ed 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 14-new-deployment-with-base-and-code # for testing while developing + # - 14-new-deployment-with-base-and-code # for testing while developing jobs: ############################################################################## From 511095451a08a9e2be27a59493a2fcfeb97b35c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 16 Jun 2021 09:09:46 +0200 Subject: [PATCH 131/344] Add configure and rebranding Readme.md - Refine general Readme.md. --- README.md | 10 +++++----- branding/README.md | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 branding/README.md diff --git a/README.md b/README.md index 8b68a1b8a..fc53cb8c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Ocelot-Social-Deploy-Rebranding +# Ocelot.Social Deploy And Rebranding This repository is an in use template to rebrand, configure, and deploy [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) networks. @@ -28,13 +28,13 @@ Logins: ## Usage -Fork this repository and configure as well as rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. +Fork this repository and configure as well as rebrand it for your own [ocelot.social](/branding/README.md) network. - [Configure And Rebrand](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding) -Afterwards you can [deploy](deployment/README.md) it on your server: +Afterwards you can [deploy](/deployment/README.md) it on your server: -- [Kubernetes with Helm](deployment/kubernetes/README.md) +- [Kubernetes with Helm](/deployment/kubernetes/README.md) ## Developer Chat @@ -63,4 +63,4 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/) ## License -See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT). +See the [LICENSE](/LICENSE.md) file for license rights and limitations (MIT). diff --git a/branding/README.md b/branding/README.md new file mode 100644 index 000000000..f32803492 --- /dev/null +++ b/branding/README.md @@ -0,0 +1,5 @@ +# Configure And Rebranding + +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. From 03bc560443e365c9eee213c0b9002ed0511d3040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 16 Jun 2021 09:36:46 +0200 Subject: [PATCH 132/344] Fix line ending --- deployment/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/README.md b/deployment/README.md index f0d573a51..ae4aa22d8 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -11,4 +11,4 @@ After the first deployment of the new network on your server, the database is in - E-mail: admin@example.org - Password: 1234 -TODO: 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 !!! \ No newline at end of file +TODO: 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 !!! From 5bd12081036596ae66bc3be690f60be180b82c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 17 Jun 2021 13:02:29 +0200 Subject: [PATCH 133/344] Add docs for DockerHub --- README.md | 58 +++++++++++++++++++++++++++++++++++++++++--- branding/README.md | 2 +- deployment/README.md | 9 +++++++ package.json | 4 +-- 4 files changed, 67 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fc53cb8c6..b9fc8fece 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,61 @@ Logins: ## Usage -Fork this repository and configure as well as rebrand it for your own [ocelot.social](/branding/README.md) network. +Fork this repository to configure and rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. -- [Configure And Rebrand](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding) +### 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) + +### Proof Configuration And Branding Locally + +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 + +To check your pushed Docker images in your organisation's DockerHub repositories, rename the file `docker-compose.ocelotsocial-branded.yml` with your network 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 above. + +### 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. + +### Deployment Afterwards you can [deploy](/deployment/README.md) it on your server: @@ -47,9 +99,9 @@ We give write permissions to every developer who asks for it. Just text us on ## Technology Stack +- [Docker](https://www.docker.com) - [Kubernetes](https://kubernetes.io) - [Helm](https://helm.sh) -- [Docker](https://www.docker.com) +

Ich bin der Inhalt vom Verhaltenskodex


diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index 25047fb89..0472a6877 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,4 +1,5 @@ +

Das hier wäre der Inhalt der Datenschutzbestimmungen


diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index 214d48173..e2f6fcbbd 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,4 +1,5 @@ +

Hier stehen die FAQs


diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 174f61a8a..4c64c8c6a 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,4 +1,5 @@ +

Ich bin das Impressum


diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 4e0aaebeb..75892442a 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,4 +1,5 @@ +

Ich bin der Inhalt der Seite "Nutzungsbedingungen"


diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index b0065de2a..7a93d97b9 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,4 +1,5 @@ +

I am the content of the code of conduct


diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index 2be9cf500..ccbd2c3f1 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,4 +1,5 @@ +

This would be our data privacy section


diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index f8f08972c..ada798d3e 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,4 +1,5 @@ +

Here are the FAQs


diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index ae192da77..3e021cbad 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,4 +1,5 @@ +

I am the imprint


diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index 6ebc0beb3..1da118d36 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,4 +1,5 @@ +

I am the content of the page "terms and conditions"


diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html new file mode 100644 index 000000000..65af881fc --- /dev/null +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -0,0 +1,68 @@ + + + + + +
+

+ Wir sind ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk der nächsten Generation. + Von Menschen – für Menschen. 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. + Unsere Funktionen bringen die Menschen zusammen – offline und online – so dass wir die Welt zu einem besseren Ort machen können.
+

+

+ Mit diesen Verhaltensregeln regeln wir die wesentlichen Grundsätze für das Verhalten in unserem sozialen Netzwerk. + Dabei bildet die Menschenrechtscharta der Vereinten Nationen das Herz unseres Werteverständnisses und dient uns als Orientierung. + Die Verhaltensregeln dienen als Leitsätze für den persönlichen Auftritt und den Umgang untereinander. + Wer als Nutzer bei uns 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ürwortung oder Ermutigung 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.:
+
+ - Aufforderung 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.
+

From 1f6a0874c906ae6f620b99a68ec251e13c6b4a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Jul 2021 13:54:18 +0200 Subject: [PATCH 143/344] Fulfill Ulf's suggestions and minor design fixes --- deployment/kubernetes/DigitalOcean.md | 10 ++++++- deployment/kubernetes/README.md | 30 ++++++++++--------- deployment/old/digital-ocean/README.md | 8 ++--- deployment/old/digital-ocean/https/README.md | 14 ++++----- deployment/old/volumes/README.md | 2 +- deployment/old/volumes/velero/README.md | 2 +- .../old/volumes/volume-snapshots/README.md | 4 +-- 7 files changed, 40 insertions(+), 30 deletions(-) diff --git a/deployment/kubernetes/DigitalOcean.md b/deployment/kubernetes/DigitalOcean.md index 9a9623921..61998d710 100644 --- a/deployment/kubernetes/DigitalOcean.md +++ b/deployment/kubernetes/DigitalOcean.md @@ -63,7 +63,15 @@ Take one of the IPs of perhaps two or more droplets in your cluster from the lis ### Manage DNS With DigitalOcean -TODO: Describe what the purpose is and how to implement it … +***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`. +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 diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index e34751e14..18baa4359 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -15,7 +15,7 @@ Managed Kubernetes: 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 digital ocean and therefore optional. +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 @@ -27,7 +27,7 @@ Please refer to [cert-manager.io docs](https://cert-manager.io/docs/installation ***ATTENTION:*** *Be with the Terminal in your repository in the folder of this README.* -1. Create Namespace +#### 1. Create Namespace ```bash # kubeconfig.yaml set globaly @@ -36,14 +36,14 @@ $ kubectl create namespace cert-manager $ kubectl --kubeconfig=/../kubeconfig.yaml create namespace cert-manager ``` -2. Add Helm repository and update +#### 2. Add Helm repository and update ```bash $ helm repo add jetstack https://charts.jetstack.io $ helm repo update ``` -3. Install Cert-Manager Helm chart +#### 3. Install Cert-Manager Helm chart ```bash # option 1 @@ -66,14 +66,14 @@ $ helm --kubeconfig=/../kubeconfig.yaml \ ### Ingress-Nginx -1. Add Helm repository and update +#### 1. Add Helm repository and update ```bash $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx $ helm repo update ``` -2. Install ingress-nginx +#### 2. Install ingress-nginx ```bash # kubeconfig.yaml set globaly @@ -82,11 +82,11 @@ $ helm install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml $ helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml ``` -### Digital Ocean Firewall +### DigitalOcean Firewall -This is only necessary if you run Digital Ocean 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)) . +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` +#### 1. Authenticate towards DO with your local `doctl` You will need a DO token for that. @@ -99,7 +99,7 @@ $ doctl auth init --context You will need an API token, which you can generate in the control panel at . -2. Generate DO firewall +#### 2. Generate DO firewall Get the `CLUSTER_UUID` value from the dashboard or from the ID column via `doctl kubernetes cluster list`: @@ -134,17 +134,19 @@ $ doctl compute firewall get --context ### DNS -This chart is only necessary (recommended is more precise) if you run Digital Ocean without load balancer. +***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 and update +#### 1. Add Helm repository and update ```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm repo update ``` -2. Install DNS +#### 2. Install DNS ```bash # kubeconfig.yaml set globaly @@ -205,4 +207,4 @@ 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 Digital Ocean's kubernetes clusters do not fulfill the requirements. +Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements. diff --git a/deployment/old/digital-ocean/README.md b/deployment/old/digital-ocean/README.md index 2ded38336..c5893f645 100644 --- a/deployment/old/digital-ocean/README.md +++ b/deployment/old/digital-ocean/README.md @@ -1,10 +1,10 @@ -# Digital Ocean +# DigitalOcean -As a start, read the [introduction into Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) by the folks at Digital Ocean. The following section should enable you to deploy ocelot.social to your Kubernetes cluster. +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 [Digital Ocean](https://www.digitalocean.com/). +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` @@ -21,7 +21,7 @@ nifty-driscoll-uusn Ready 69d v1.13.2 If you got the steps right above and see your nodes you can continue. -Digital Ocean Kubernetes clusters don't have a graphical interface, so I suggest +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. diff --git a/deployment/old/digital-ocean/https/README.md b/deployment/old/digital-ocean/https/README.md index b306a48d9..8cfaabde4 100644 --- a/deployment/old/digital-ocean/https/README.md +++ b/deployment/old/digital-ocean/https/README.md @@ -19,7 +19,7 @@ $ kubectl apply -f . ``` {% hint style="info" %} -CAUTION: It seems that the behaviour of Digital Ocean has changed and the load balancer is not created automatically anymore. +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 %} @@ -29,20 +29,20 @@ And to create a load balancer costs money. Please refine the following documenta A solution without a load balance you can find [here](../no-loadbalancer/README.md). {% endtab %} -{% tab title="With Digital Ocean Load Balancer" %} +{% tab title="With DigitalOcean Load Balancer" %} {% hint style="info" %} -CAUTION: It seems that the behaviour of Digital Ocean has changed and the load balancer is not created automatically anymore. +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 Digital Ocean, this is how it should look like: +address. On DigitalOcean, this is how it should look like: -![Screenshot of Digital Ocean dashboard showing external ip address](./ip-address.png) +![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 Digital Ocean under Networks. -In case you don't need a Digital Ocean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`. +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 %} diff --git a/deployment/old/volumes/README.md b/deployment/old/volumes/README.md index 1d849682c..00619d33a 100644 --- a/deployment/old/volumes/README.md +++ b/deployment/old/volumes/README.md @@ -3,7 +3,7 @@ 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 Digital Ocean Spaces (an AWS S3 bucket) for this purpose. +* 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 diff --git a/deployment/old/volumes/velero/README.md b/deployment/old/volumes/velero/README.md index 5b8fc9d2e..bf63f13c8 100644 --- a/deployment/old/volumes/velero/README.md +++ b/deployment/old/volumes/velero/README.md @@ -5,7 +5,7 @@ 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 Digital Ocean had some bugs when I +working reliably. It is very likely that DigitalOcean had some bugs when I tried out the steps below. {% endhint %} diff --git a/deployment/old/volumes/volume-snapshots/README.md b/deployment/old/volumes/volume-snapshots/README.md index 4b6aab58d..010cfc636 100644 --- a/deployment/old/volumes/volume-snapshots/README.md +++ b/deployment/old/volumes/volume-snapshots/README.md @@ -17,9 +17,9 @@ kubectl apply -f neo4j-data-snapshot.yaml kubectl apply -f backen-uploads-snapshot.yaml ``` -If you are on Digital Ocean the volume snapshot should show up in the Web UI: +If you are on DigitalOcean the volume snapshot should show up in the Web UI: -![Digital Ocean Web UI showing a volume snapshot](./digital-ocean-volume-snapshots.png) +![DigitalOcean Web UI showing a volume snapshot](./digital-ocean-volume-snapshots.png) ## Provision a Volume based on a Snapshot From c675b6fa22b548ed37da5d2c53b953c1c85df825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Jul 2021 15:36:19 +0200 Subject: [PATCH 144/344] Add original repos absolute link to Readme.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 735d6ce5e..8950f2a5f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Ocelot.Social Deploy And 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). From 5ce8b9e237ca3dcabf6ebbcefa91b6fe88c9a89e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 19 Jul 2021 15:22:55 +0200 Subject: [PATCH 145/344] Refine HTML of internal pages and their templates --- branding/locales/html/de/code-of-conduct.html | 3 ++- branding/locales/html/de/data-privacy.html | 3 ++- branding/locales/html/de/faq.html | 3 ++- branding/locales/html/de/imprint.html | 3 ++- branding/locales/html/de/terms-and-conditions.html | 3 ++- branding/locales/html/en/code-of-conduct.html | 3 ++- branding/locales/html/en/data-privacy.html | 3 ++- branding/locales/html/en/faq.html | 3 ++- branding/locales/html/en/imprint.html | 3 ++- branding/locales/html/en/terms-and-conditions.html | 3 ++- branding/templates/locales/html/de/code-of-conduct.html | 2 +- 11 files changed, 21 insertions(+), 11 deletions(-) diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html index 5e096fe1e..fd0b0118a 100644 --- a/branding/locales/html/de/code-of-conduct.html +++ b/branding/locales/html/de/code-of-conduct.html @@ -1,6 +1,7 @@ - + +

Ich bin der Inhalt vom Verhaltenskodex


Neu gebrandet …

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index 0472a6877..2de7663e3 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,6 +1,7 @@ - + +

Das hier wäre der Inhalt der Datenschutzbestimmungen


Neu gebrandet …

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index e2f6fcbbd..8380fc335 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,6 +1,7 @@ - + +

Hier stehen die FAQs


Neu gebrandet …

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 4c64c8c6a..110868f60 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,6 +1,7 @@ - + +

Ich bin das Impressum


Neu gebrandet …

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 75892442a..988c10430 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,6 +1,7 @@ - + +

Ich bin der Inhalt der Seite "Nutzungsbedingungen"


Neu gebrandet …

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index 7a93d97b9..609ffd431 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,6 +1,7 @@ - + +

I am the content of the code of conduct


Rebranded …

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index ccbd2c3f1..0905a5038 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,6 +1,7 @@ - + +

This would be our data privacy section


Rebranded …

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index ada798d3e..905c1c53b 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,6 +1,7 @@ - + +

Here are the FAQs


Rebranded …

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index 3e021cbad..05a0a9ab3 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,6 +1,7 @@ - + +

I am the imprint


Rebranded …

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index 1da118d36..0109e1ce2 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,6 +1,7 @@ - + +

I am the content of the page "terms and conditions"


Rebranded …

diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html index 65af881fc..0934ad276 100644 --- a/branding/templates/locales/html/de/code-of-conduct.html +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -1,5 +1,5 @@ - + From e9638147d1ac2bc612026dca315970166ed870c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 19 Jul 2021 15:31:32 +0200 Subject: [PATCH 146/344] Add comment to 'links.js' --- branding/constants/links.js | 1 + 1 file changed, 1 insertion(+) diff --git a/branding/constants/links.js b/branding/constants/links.js index 6b945a5e0..70586f283 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -4,6 +4,7 @@ export default { SUPPORT: 'https://ocelot.social', // on null or empty strings internal imprint is used, see 'webapp/locales/html/' + // you can find and store templates at 'master/branding/templates/' DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly TERMS_AND_CONDITIONS: null, From 74852aa2d15408677d5ce59ebc34c15e02f867b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 20 Jul 2021 10:43:49 +0200 Subject: [PATCH 147/344] Add dot at line end of HTML internal pages --- branding/locales/html/de/code-of-conduct.html | 2 +- branding/locales/html/de/data-privacy.html | 2 +- branding/locales/html/de/faq.html | 2 +- branding/locales/html/de/imprint.html | 2 +- branding/locales/html/de/terms-and-conditions.html | 2 +- branding/locales/html/en/code-of-conduct.html | 2 +- branding/locales/html/en/data-privacy.html | 2 +- branding/locales/html/en/faq.html | 2 +- branding/locales/html/en/imprint.html | 2 +- branding/locales/html/en/terms-and-conditions.html | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html index fd0b0118a..18f28be43 100644 --- a/branding/locales/html/de/code-of-conduct.html +++ b/branding/locales/html/de/code-of-conduct.html @@ -2,6 +2,6 @@
-

Ich bin der Inhalt vom Verhaltenskodex

+

Ich bin der Inhalt vom Verhaltenskodex.


Neu gebrandet …

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index 2de7663e3..e0df6d366 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -2,6 +2,6 @@
-

Das hier wäre der Inhalt der Datenschutzbestimmungen

+

Das hier wäre der Inhalt der Datenschutzbestimmungen.


Neu gebrandet …

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index 8380fc335..e7b6ab91b 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -2,6 +2,6 @@
-

Hier stehen die FAQs

+

Hier stehen die FAQs.


Neu gebrandet …

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 110868f60..17a15c5fc 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -2,6 +2,6 @@
-

Ich bin das Impressum

+

Ich bin das Impressum.


Neu gebrandet …

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 988c10430..49a09ca6b 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -2,6 +2,6 @@
-

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

+

Ich bin der Inhalt der Seite "Nutzungsbedingungen".


Neu gebrandet …

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index 609ffd431..936ebdea8 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -2,6 +2,6 @@
-

I am the content of the code of conduct

+

I am the content of the code of conduct.


Rebranded …

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index 0905a5038..dec473520 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -2,6 +2,6 @@
-

This would be our data privacy section

+

This would be our data privacy section.


Rebranded …

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index 905c1c53b..b5905c64a 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -2,6 +2,6 @@
-

Here are the FAQs

+

Here are the FAQs.


Rebranded …

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index 05a0a9ab3..6c496ad31 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -2,6 +2,6 @@
-

I am the imprint

+

I am the imprint.


Rebranded …

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index 0109e1ce2..a959ee9a6 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -2,6 +2,6 @@
-

I am the content of the page "terms and conditions"

+

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


Rebranded …

From 2f045553d41799b66b2dfd4f69d49fad619f83a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 20 Jul 2021 11:34:30 +0200 Subject: [PATCH 148/344] Implement HTML internal support and organization pages --- branding/constants/links.js | 11 ++++++----- branding/locales/html/de/code-of-conduct.html | 4 ++-- branding/locales/html/de/data-privacy.html | 4 ++-- branding/locales/html/de/faq.html | 4 ++-- branding/locales/html/de/imprint.html | 4 ++-- branding/locales/html/de/organization.html | 7 +++++++ branding/locales/html/de/support.html | 7 +++++++ branding/locales/html/de/terms-and-conditions.html | 4 ++-- branding/locales/html/en/code-of-conduct.html | 4 ++-- branding/locales/html/en/data-privacy.html | 4 ++-- branding/locales/html/en/faq.html | 4 ++-- branding/locales/html/en/imprint.html | 4 ++-- branding/locales/html/en/organization.html | 7 +++++++ branding/locales/html/en/support.html | 7 +++++++ branding/locales/html/en/terms-and-conditions.html | 4 ++-- 15 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 branding/locales/html/de/organization.html create mode 100644 branding/locales/html/de/support.html create mode 100644 branding/locales/html/en/organization.html create mode 100644 branding/locales/html/en/support.html diff --git a/branding/constants/links.js b/branding/constants/links.js index 70586f283..4a55fc56e 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,10 +1,11 @@ -// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding +// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ export default { + LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization' + SUPPORT: 'https://ocelot.social', // example for internal support page: 'https://staging.ocelot.social/support' + + // on null or empty strings internal pages are used, see 'webapp/locales/html/' + // you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ ORGANIZATION: 'https://ocelot.social', - SUPPORT: 'https://ocelot.social', - - // on null or empty strings internal imprint is used, see 'webapp/locales/html/' - // you can find and store templates at 'master/branding/templates/' DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly TERMS_AND_CONDITIONS: null, diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html index 18f28be43..e890fcc01 100644 --- a/branding/locales/html/de/code-of-conduct.html +++ b/branding/locales/html/de/code-of-conduct.html @@ -1,5 +1,5 @@ - - + +

Ich bin der Inhalt vom Verhaltenskodex.

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index e0df6d366..094f1e7c0 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,5 +1,5 @@ - - + +

Das hier wäre der Inhalt der Datenschutzbestimmungen.

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index e7b6ab91b..7a0f5a1a2 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,5 +1,5 @@ - - + +

Hier stehen die FAQs.

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 17a15c5fc..8a902f6fd 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,5 +1,5 @@ - - + +

Ich bin das Impressum.

diff --git a/branding/locales/html/de/organization.html b/branding/locales/html/de/organization.html new file mode 100644 index 000000000..7ecd4395e --- /dev/null +++ b/branding/locales/html/de/organization.html @@ -0,0 +1,7 @@ + + + +
+

Hier wird das Netzwerk beschrieben.

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/support.html b/branding/locales/html/de/support.html new file mode 100644 index 000000000..6dab2b250 --- /dev/null +++ b/branding/locales/html/de/support.html @@ -0,0 +1,7 @@ + + + +
+

Ich bin der Inhalt vom Support.

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 49a09ca6b..38cc15a96 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,5 +1,5 @@ - - + +

Ich bin der Inhalt der Seite "Nutzungsbedingungen".

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index 936ebdea8..fe10442a6 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,5 +1,5 @@ - - + +

I am the content of the code of conduct.

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index dec473520..981c7467e 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,5 +1,5 @@ - - + +

This would be our data privacy section.

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index b5905c64a..33d6d27ac 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,5 +1,5 @@ - - + +

Here are the FAQs.

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index 6c496ad31..5f42e2efd 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,5 +1,5 @@ - - + +

I am the imprint.

diff --git a/branding/locales/html/en/organization.html b/branding/locales/html/en/organization.html new file mode 100644 index 000000000..7c972d2bf --- /dev/null +++ b/branding/locales/html/en/organization.html @@ -0,0 +1,7 @@ + + + +
+

Here the network is described.

+
+

Rebranded …

diff --git a/branding/locales/html/en/support.html b/branding/locales/html/en/support.html new file mode 100644 index 000000000..b54197d8a --- /dev/null +++ b/branding/locales/html/en/support.html @@ -0,0 +1,7 @@ + + + +
+

I am the content of the support.

+
+

Rebranded …

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index a959ee9a6..030a96c07 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,5 +1,5 @@ - - + +

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

From bfecd09fcdb1ef4997f7be95d148ae6164fd1eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 20 Jul 2021 11:49:59 +0200 Subject: [PATCH 149/344] Refine comments --- branding/constants/links.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 4a55fc56e..55cc72d4d 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,7 +1,7 @@ // this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ export default { - LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization' - SUPPORT: 'https://ocelot.social', // example for internal support page: 'https://staging.ocelot.social/support' + LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization', or external 'https://ocelot.social' + SUPPORT: 'https://ocelot.social', // example for internal support page: 'https://staging.ocelot.social/support'. set a full URL please, because it is used in e-mails as well! // on null or empty strings internal pages are used, see 'webapp/locales/html/' // you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ From 551dd5eec72111ab1f94a90c70a49721c31eb52f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 20 Jul 2021 17:33:37 +0200 Subject: [PATCH 150/344] Change comments --- branding/constants/links.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 55cc72d4d..b111726f3 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,10 +1,12 @@ // this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ export default { LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization', or external 'https://ocelot.social' + + // you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ + SUPPORT: 'https://ocelot.social', // example for internal support page: 'https://staging.ocelot.social/support'. set a full URL please, because it is used in e-mails as well! - + // on null or empty strings internal pages are used, see 'webapp/locales/html/' - // you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ ORGANIZATION: 'https://ocelot.social', DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly From 895150f997d8659c168bfb606e462280a7db056a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 27 Jul 2021 11:54:03 +0200 Subject: [PATCH 151/344] Change DockerHub build number to compatible one --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8519b2f1a..cb57d4923 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.4", - "ocelotDockerVersionTag": "1.0.4-100", + "ocelotDockerVersionTag": "1.0.4-135", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From a57f6cb9c97937a1edaec6dd8cfd60fc6e209619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 12 Aug 2021 11:53:42 +0200 Subject: [PATCH 152/344] Implement new internal pages - Add internal donation page. - Replace `links.js`. - Remove copying of `links.js` to backend. - Add copying of `emails.js` to backend and set new values. - Remove leading `
` on each internal page default. --- branding/constants/emails.js | 8 +- branding/constants/links.js | 141 ++++++++++++++++-- branding/locales/html/de/code-of-conduct.html | 1 - branding/locales/html/de/data-privacy.html | 1 - branding/locales/html/de/donate.html | 6 + branding/locales/html/de/faq.html | 1 - branding/locales/html/de/imprint.html | 1 - branding/locales/html/de/organization.html | 1 - branding/locales/html/de/support.html | 1 - .../locales/html/de/terms-and-conditions.html | 1 - branding/locales/html/en/code-of-conduct.html | 1 - branding/locales/html/en/data-privacy.html | 1 - branding/locales/html/en/donate.html | 6 + branding/locales/html/en/faq.html | 1 - branding/locales/html/en/imprint.html | 1 - branding/locales/html/en/organization.html | 1 - branding/locales/html/en/support.html | 1 - .../locales/html/en/terms-and-conditions.html | 1 - docker/backend.Dockerfile | 3 +- docker/maintenance.Dockerfile | 1 - 20 files changed, 149 insertions(+), 30 deletions(-) create mode 100644 branding/locales/html/de/donate.html create mode 100644 branding/locales/html/en/donate.html diff --git a/branding/constants/emails.js b/branding/constants/emails.js index 54e7bbf39..f5bd9a4a6 100644 --- a/branding/constants/emails.js +++ b/branding/constants/emails.js @@ -1,4 +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: 'hello@ocelot.social', - MODERATION: 'hello@ocelot.social', + 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/branding/constants/links.js b/branding/constants/links.js index b111726f3..b2dc4f69d 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,17 +1,136 @@ -// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/ +// 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({ + externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + + 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({ + // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + externalLink: 'https://ocelot-social.herokuapp.com/donations', // if string is defined and not empty it's dominating + + 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({ + // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + externalLink: 'https://ocelot-social.herokuapp.com/imprint', // if string is defined and not empty it's dominating + + 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 string is defined and not empty 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 string is defined and not empty 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 string is defined and not empty 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: 'https://ocelot.social', // if string is defined and not empty 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({ + externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + + 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 at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ + // you can find and store templates for 👇🏼 at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ - SUPPORT: 'https://ocelot.social', // example for internal support page: 'https://staging.ocelot.social/support'. set a full URL please, because it is used in e-mails as well! + ORGANIZATION, + DONATE, + IMPRINT, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, + DATA_PRIVACY, + FAQ, + SUPPORT, - // on null or empty strings internal pages are used, see 'webapp/locales/html/' - ORGANIZATION: 'https://ocelot.social', - DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - TERMS_AND_CONDITIONS: null, - CODE_OF_CONDUCT: null, - DATA_PRIVACY: null, - FAQ: 'https://ocelot.social', + FOOTER_LINK_LIST: [ + ORGANIZATION, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, + DATA_PRIVACY, + FAQ, + DONATE, + IMPRINT, + SUPPORT, + ], } diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html index e890fcc01..ba039b574 100644 --- a/branding/locales/html/de/code-of-conduct.html +++ b/branding/locales/html/de/code-of-conduct.html @@ -1,7 +1,6 @@ -

Ich bin der Inhalt vom Verhaltenskodex.


Neu gebrandet …

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index 094f1e7c0..a00b03c34 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,7 +1,6 @@ -

Das hier wäre der Inhalt der Datenschutzbestimmungen.


Neu gebrandet …

diff --git a/branding/locales/html/de/donate.html b/branding/locales/html/de/donate.html new file mode 100644 index 000000000..d4b14a15f --- /dev/null +++ b/branding/locales/html/de/donate.html @@ -0,0 +1,6 @@ + + + +

Hier steht was zu den Spenden.

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index 7a0f5a1a2..24e0ced15 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,7 +1,6 @@ -

Hier stehen die FAQs.


Neu gebrandet …

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 8a902f6fd..521c5279c 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,7 +1,6 @@ -

Ich bin das Impressum.


Neu gebrandet …

diff --git a/branding/locales/html/de/organization.html b/branding/locales/html/de/organization.html index 7ecd4395e..ed7c97b51 100644 --- a/branding/locales/html/de/organization.html +++ b/branding/locales/html/de/organization.html @@ -1,7 +1,6 @@ -

Hier wird das Netzwerk beschrieben.


Neu gebrandet …

diff --git a/branding/locales/html/de/support.html b/branding/locales/html/de/support.html index 6dab2b250..6282306a0 100644 --- a/branding/locales/html/de/support.html +++ b/branding/locales/html/de/support.html @@ -1,7 +1,6 @@ -

Ich bin der Inhalt vom Support.


Neu gebrandet …

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 38cc15a96..74396a67f 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,7 +1,6 @@ -

Ich bin der Inhalt der Seite "Nutzungsbedingungen".


Neu gebrandet …

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index fe10442a6..75128e8a4 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,7 +1,6 @@ -

I am the content of the code of conduct.


Rebranded …

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index 981c7467e..31a116912 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,7 +1,6 @@ -

This would be our data privacy section.


Rebranded …

diff --git a/branding/locales/html/en/donate.html b/branding/locales/html/en/donate.html new file mode 100644 index 000000000..a3e7daffe --- /dev/null +++ b/branding/locales/html/en/donate.html @@ -0,0 +1,6 @@ + + + +

Here's what it says about donations.

+
+

Rebranded …

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index 33d6d27ac..08d3ceea0 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,7 +1,6 @@ -

Here are the FAQs.


Rebranded …

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index 5f42e2efd..fbae0bdc9 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,7 +1,6 @@ -

I am the imprint.


Rebranded …

diff --git a/branding/locales/html/en/organization.html b/branding/locales/html/en/organization.html index 7c972d2bf..99a8bbb17 100644 --- a/branding/locales/html/en/organization.html +++ b/branding/locales/html/en/organization.html @@ -1,7 +1,6 @@ -

Here the network is described.


Rebranded …

diff --git a/branding/locales/html/en/support.html b/branding/locales/html/en/support.html index b54197d8a..30f85357d 100644 --- a/branding/locales/html/en/support.html +++ b/branding/locales/html/en/support.html @@ -1,7 +1,6 @@ -

I am the content of the support.


Rebranded …

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index 030a96c07..50f354b66 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,7 +1,6 @@ -

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


Rebranded …

diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 91e57b04f..319c7d0ae 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -10,7 +10,7 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it -COPY branding/constants/links.js src/config/ +COPY branding/constants/emails.js src/config/ COPY branding/constants/logos.js src/config/ COPY branding/constants/metadata.js src/config/ @@ -33,7 +33,6 @@ FROM $APP_IMAGE_BASE as branded # Copy "binary"-files from build image COPY --from=build ${DOCKER_WORKDIR}/dist ./dist COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules -# Copy static files # Wolle comment overfluid here? # 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 diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index eeda31f88..e7771c533 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -34,4 +34,3 @@ 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/ - From 59a98eccbb2f2307f63053566a583b40976f5b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 12 Aug 2021 12:11:53 +0200 Subject: [PATCH 153/344] Set 'ocelotDockerVersionTag' to '1.0.5-153' --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index cb57d4923..92c12c5f8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.4", - "ocelotDockerVersionTag": "1.0.4-135", + "version": "1.0.5", + "ocelotDockerVersionTag": "1.0.5-153", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 2ddf8173728fd31953502a8a8e6fd6cfc9a00805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 12 Aug 2021 13:24:09 +0200 Subject: [PATCH 154/344] Fix image upload problem by adding volumes to Docker YAML files --- docker-compose.ocelotsocial-branded.yml | 11 ++++++++++- docker-compose.yml | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml index 5ea530e3a..0b09900d2 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.ocelotsocial-branded.yml @@ -30,6 +30,8 @@ services: - neo4j ports: - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads environment: - NEO4J_URI=bolt://neo4j:7687 - GRAPHQL_URI=http://backend:4000 @@ -58,6 +60,8 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 + volumes: + - neo4j_data:/data ######################################################## # MAINTENANCE ########################################## ######################################################## @@ -76,5 +80,10 @@ services: - 1080:80 networks: - test-network + networks: - test-network: \ No newline at end of file + test-network: + +volumes: + backend_uploads: + neo4j_data: diff --git a/docker-compose.yml b/docker-compose.yml index 4379459ca..17d5001cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,6 +36,8 @@ services: - neo4j ports: - 4000:4000 + volumes: + - backend_uploads:/app/public/uploads environment: - NEO4J_URI=bolt://neo4j:7687 - GRAPHQL_URI=http://backend:4000 @@ -58,6 +60,8 @@ services: image: ocelotsocialnetwork/neo4j:community networks: - test-network + volumes: + - neo4j_data:/data environment: - NEO4J_AUTH=none - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* @@ -86,5 +90,10 @@ services: - 1080:80 networks: - test-network + networks: test-network: + +volumes: + backend_uploads: + neo4j_data: From 89ef3aad2d6fba5c0136224608bfa5d18f947bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 12 Aug 2021 13:34:31 +0200 Subject: [PATCH 155/344] Fix warning in docker-compose - Fixes 'WARNING: The WEBSOCKETS_URI variable is not set. Defaulting to a blank string.' --- docker-compose.ocelotsocial-branded.yml | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml index 0b09900d2..6d4c148f8 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.ocelotsocial-branded.yml @@ -17,7 +17,7 @@ services: - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" - - WEBSOCKETS_URI=${WEBSOCKETS_URI} + # - WEBSOCKETS_URI=ws://backend:4000/graphql # is not working and not given in Docker YAML in main repo - PUBLIC_REGISTRATION=true ######################################################## # BACKEND ############################################## diff --git a/docker-compose.yml b/docker-compose.yml index 17d5001cb..41d515dec 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,7 +20,7 @@ services: - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" - - WEBSOCKETS_URI=${WEBSOCKETS_URI} + # - WEBSOCKETS_URI=ws://backend:4000/graphql # is not working and not given in Docker YAML in main repo - PUBLIC_REGISTRATION=true ######################################################## # BACKEND ############################################## From e7af6f5fea0bda15352a3fc3f849befe7fc9d944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 28 Sep 2021 09:02:35 +0200 Subject: [PATCH 156/344] Fix dummy IP and last README.md link --- deployment/kubernetes/DigitalOcean.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/kubernetes/DigitalOcean.md b/deployment/kubernetes/DigitalOcean.md index 61998d710..f9cc3ef51 100644 --- a/deployment/kubernetes/DigitalOcean.md +++ b/deployment/kubernetes/DigitalOcean.md @@ -67,7 +67,7 @@ Take one of the IPs of perhaps two or more droplets in your cluster from the lis 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`. +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. @@ -75,4 +75,4 @@ The IPs of the DigitalOcean machines are not necessarily stable, so the cluster' ## Deploy -Yeah, you're done here. Back to [Deployment with Helm for Kubernetes](deployment/kubernetes/README.md). +Yeah, you're done here. Back to [Deployment with Helm for Kubernetes](/deployment/kubernetes/README.md). From 0dc321cf70227e7fd6da75177fad1950f874f9b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 28 Sep 2021 09:57:20 +0200 Subject: [PATCH 157/344] Add the need of a Docker organisation --- deployment/kubernetes/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index 18baa4359..c528858ca 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -157,6 +157,8 @@ $ helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns. ### Ocelot.Social +***Caution:** 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 From ed76d712ddc8e11b5a9692a6dd5ed3e6f2656f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 28 Sep 2021 09:59:19 +0200 Subject: [PATCH 158/344] Change caution to attention --- deployment/kubernetes/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index c528858ca..410910e2f 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -157,7 +157,7 @@ $ helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns. ### Ocelot.Social -***Caution:** 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.* +***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`. From c8a6f05eda01d2b909451f5484c83c7b16d3048a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 29 Sep 2021 11:15:22 +0200 Subject: [PATCH 159/344] Set version 1.0.6 and new image tag 1.0.6-160 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 92c12c5f8..c60dc3104 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.5", - "ocelotDockerVersionTag": "1.0.5-153", + "version": "1.0.6", + "ocelotDockerVersionTag": "1.0.6-160", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 07d1bb65b8ceda859d7b1de767a7424adc5b58fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 29 Sep 2021 11:32:08 +0200 Subject: [PATCH 160/344] Implement backend email templates --- branding/email/.gitkeep | 1 + branding/email/templates/de/.gitkeep | 1 + branding/email/templates/en/.gitkeep | 1 + docker/backend.Dockerfile | 3 ++- 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 branding/email/.gitkeep create mode 100644 branding/email/templates/de/.gitkeep create mode 100644 branding/email/templates/en/.gitkeep diff --git a/branding/email/.gitkeep b/branding/email/.gitkeep new file mode 100644 index 000000000..afe8c26c9 --- /dev/null +++ b/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/branding/email/templates/de/.gitkeep b/branding/email/templates/de/.gitkeep new file mode 100644 index 000000000..5b414a0c8 --- /dev/null +++ b/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/branding/email/templates/en/.gitkeep b/branding/email/templates/en/.gitkeep new file mode 100644 index 000000000..5b414a0c8 --- /dev/null +++ b/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/docker/backend.Dockerfile b/docker/backend.Dockerfile index 319c7d0ae..542632c97 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -9,10 +9,11 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code -# copy public constants into the Docker image to brand it +# copy public constants and email templates into the Docker image to brand it COPY branding/constants/emails.js src/config/ COPY branding/constants/logos.js src/config/ COPY branding/constants/metadata.js src/config/ +COPY branding/email/ src/middleware/helpers/email/ ################################################################################## # BUILD ########################################################################## From cd68541f3695073e58d3a37adb123f84e41a00ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 7 Oct 2021 15:56:00 +0200 Subject: [PATCH 161/344] Add templates for code-of-conduct.html and terms-and-conditions.htm --- .../locales/html/de/code-of-conduct.html | 37 ++++-- .../locales/html/de/terms-and-conditions.html | 106 ++++++++++++++++++ .../locales/html/en/code-of-conduct.html | 81 +++++++++++++ .../locales/html/en/terms-and-conditions.html | 105 +++++++++++++++++ 4 files changed, 317 insertions(+), 12 deletions(-) create mode 100644 branding/templates/locales/html/de/terms-and-conditions.html create mode 100644 branding/templates/locales/html/en/code-of-conduct.html create mode 100644 branding/templates/locales/html/en/terms-and-conditions.html diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html index 0934ad276..ab2e88767 100644 --- a/branding/templates/locales/html/de/code-of-conduct.html +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -1,21 +1,33 @@ - - + +

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


-

- Wir sind ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk der nächsten Generation. - Von Menschen – für Menschen. Open Source, fair und transparent. +

+ 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. - Unsere Funktionen bringen die Menschen zusammen – offline und online – so dass wir die Welt zu einem besseren Ort machen können.
+ Die Funktionen von {{ networkName }} bringen die Menschen zusammen – offline und online – so dass wir die Welt zu einem besseren Ort machen können.

-

- Mit diesen Verhaltensregeln regeln wir die wesentlichen Grundsätze für das Verhalten in unserem sozialen Netzwerk. - Dabei bildet die Menschenrechtscharta der Vereinten Nationen das Herz unseres Werteverständnisses und dient uns als Orientierung. +
+

+ 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 bei uns aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an.
+ 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.


@@ -41,7 +53,7 @@ - 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“)."
+ - 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.
@@ -64,5 +76,6 @@ - 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.
+ 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 am Beitrag, Kommentar oder Benutzer auf die drei Punkte und melde ihn über das aufgeklappte Menü.

diff --git a/branding/templates/locales/html/de/terms-and-conditions.html b/branding/templates/locales/html/de/terms-and-conditions.html new file mode 100644 index 000000000..fd1efb114 --- /dev/null +++ b/branding/templates/locales/html/de/terms-and-conditions.html @@ -0,0 +1,106 @@ + + + + +

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

+
+

+ Nutzungsbedingungen +

+
+
+
+

+ 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 Human Connection-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 erhält 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 Human Connection Netzwerkes ist nicht gestattet für kommerzielle Nutzung. + 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/branding/templates/locales/html/en/code-of-conduct.html b/branding/templates/locales/html/en/code-of-conduct.html new file mode 100644 index 000000000..45be395e2 --- /dev/null +++ b/branding/templates/locales/html/en/code-of-conduct.html @@ -0,0 +1,81 @@ + + + + +

+ 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/branding/templates/locales/html/en/terms-and-conditions.html b/branding/templates/locales/html/en/terms-and-conditions.html new file mode 100644 index 000000000..7c4e5e5e3 --- /dev/null +++ b/branding/templates/locales/html/en/terms-and-conditions.html @@ -0,0 +1,105 @@ + + + + +

+ Für das Soziale Netzwerk {{ 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 }}/impressum/
+

+
+

+ 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 Human Connection 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 Human Connection 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
+

From 4e28bfcc3173381a45938576670e015406ad36a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 7 Oct 2021 16:14:18 +0200 Subject: [PATCH 162/344] Refine templates for code-of-conduct.html and terms-and-conditions.htm --- branding/templates/locales/html/de/code-of-conduct.html | 2 +- branding/templates/locales/html/de/terms-and-conditions.html | 2 +- branding/templates/locales/html/en/terms-and-conditions.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html index ab2e88767..ef691e701 100644 --- a/branding/templates/locales/html/de/code-of-conduct.html +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -3,7 +3,7 @@

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


diff --git a/branding/templates/locales/html/de/terms-and-conditions.html b/branding/templates/locales/html/de/terms-and-conditions.html index fd1efb114..bacffc207 100644 --- a/branding/templates/locales/html/de/terms-and-conditions.html +++ b/branding/templates/locales/html/de/terms-and-conditions.html @@ -3,7 +3,7 @@

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


diff --git a/branding/templates/locales/html/en/terms-and-conditions.html b/branding/templates/locales/html/en/terms-and-conditions.html index 7c4e5e5e3..23aada654 100644 --- a/branding/templates/locales/html/en/terms-and-conditions.html +++ b/branding/templates/locales/html/en/terms-and-conditions.html @@ -3,7 +3,7 @@

- Für das Soziale Netzwerk {{ organization }} + For the social network of {{ organization }}


From 62c436b3dc5485179bc595f53c11917bcc415643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 7 Oct 2021 16:14:49 +0200 Subject: [PATCH 163/344] Add templates for faq.htm --- branding/templates/locales/html/de/faq.html | 15 +++++++++++++++ branding/templates/locales/html/en/faq.html | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 branding/templates/locales/html/de/faq.html create mode 100644 branding/templates/locales/html/en/faq.html diff --git a/branding/templates/locales/html/de/faq.html b/branding/templates/locales/html/de/faq.html new file mode 100644 index 000000000..33f4a2e54 --- /dev/null +++ b/branding/templates/locales/html/de/faq.html @@ -0,0 +1,15 @@ + + + + +

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

+
+

+ Allgemeine FAQs +

+
+

+ Im offiziellen Wiki: https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki
+

diff --git a/branding/templates/locales/html/en/faq.html b/branding/templates/locales/html/en/faq.html new file mode 100644 index 000000000..9e72418ac --- /dev/null +++ b/branding/templates/locales/html/en/faq.html @@ -0,0 +1,15 @@ + + + + +

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

+
+

+ General FAQs +

+
+

+ The official Wiki: https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki
+

From 83cdc611f32ebc7320ca1f9f499392cd7f9f52ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 11 Oct 2021 13:43:02 +0200 Subject: [PATCH 164/344] Add template for data-privacy.html --- .../locales/html/de/data-privacy.html | 652 ++++++++++++++++++ 1 file changed, 652 insertions(+) create mode 100644 branding/templates/locales/html/de/data-privacy.html diff --git a/branding/templates/locales/html/de/data-privacy.html b/branding/templates/locales/html/de/data-privacy.html new file mode 100644 index 000000000..9369e1253 --- /dev/null +++ b/branding/templates/locales/html/de/data-privacy.html @@ -0,0 +1,652 @@ + + + + +

+ For the social network of {{ 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 +

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+
+

+ XXX +

+
+

+ XXX
+

+ + +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. +CookiesDieser 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. +1 Tag +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. koreekter 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: + • AGBs und Datenschutz von Codepen + • AGBs und Datenschutz von D.Tube + • AGBs und Datenschutz von Facebook + • AGBs und Datenschutz von Flickr + • AGBs und Datenschutz von GIPHY + • AGBs und Datenschutz von Meetup + • AGBs und Datenschutz von MixCloud + • AGBs und Datenschutz von Reddit + • AGBs und Datenschutz von SlideShare + • AGBs und Datenschutz von SoundCloud + • AGBs und Datenschutz von Twitch + • AGBs und Datenschutz von Twitter + • AGBs und Datenschutz von Vimeo + • YouTube ist gesondert aufgeführt. +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 + + +SpeicherdauerDatails 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. \ No newline at end of file From 51900facedeb9f9726d27a68c00c4cef611432ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 11 Oct 2021 14:07:49 +0200 Subject: [PATCH 165/344] Refine template for data-privacy.html --- .../locales/html/de/data-privacy.html | 93 ++++++++++--------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/branding/templates/locales/html/de/data-privacy.html b/branding/templates/locales/html/de/data-privacy.html index 9369e1253..468bc3b39 100644 --- a/branding/templates/locales/html/de/data-privacy.html +++ b/branding/templates/locales/html/de/data-privacy.html @@ -189,9 +189,9 @@ Support


-

+

Zweck -

+

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


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. @@ -209,18 +209,18 @@ 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. @@ -228,17 +228,17 @@ 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.
@@ -248,9 +248,9 @@ 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. @@ -272,9 +272,9 @@ 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.
@@ -314,17 +314,17 @@ 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. @@ -338,17 +338,17 @@ 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. @@ -362,25 +362,25 @@ 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.
@@ -390,57 +390,57 @@ Profildaten
-

- XXX -

+

+ Zweck +


XXX


-

+

XXX -

+

XXX


-

+

XXX -

+

XXX


-

+

XXX -

+

XXX


-

+

XXX -

+

XXX


-

+

XXX -

+

XXX


-

+

XXX -

+

XXX
@@ -457,19 +457,26 @@ 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. From 3ad58ab989fb34c2fd3601f11c93d23320f126e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 11 Oct 2021 17:45:54 +0200 Subject: [PATCH 166/344] =?UTF-8?q?Refine=20template=20for=20terms-and-?= =?UTF-8?q?=E2=80=A6.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- branding/templates/locales/html/de/terms-and-conditions.html | 4 ++-- branding/templates/locales/html/en/terms-and-conditions.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/branding/templates/locales/html/de/terms-and-conditions.html b/branding/templates/locales/html/de/terms-and-conditions.html index bacffc207..b18f03891 100644 --- a/branding/templates/locales/html/de/terms-and-conditions.html +++ b/branding/templates/locales/html/de/terms-and-conditions.html @@ -50,7 +50,7 @@

Unser Verhaltenskodex dient als Leitfaden für das persönliche Auftreten und den Umgang miteinander. - Wer als Nutzer im Human Connection-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
+ 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


@@ -85,7 +85,7 @@


- Die Nutzung des Human Connection Netzwerkes ist nicht gestattet für kommerzielle Nutzung. + Die Nutzung des {{ networkName }} Netzwerkes ist nicht gestattet für kommerzielle Nutzung. 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.


diff --git a/branding/templates/locales/html/en/terms-and-conditions.html b/branding/templates/locales/html/en/terms-and-conditions.html index 23aada654..3d0f59f81 100644 --- a/branding/templates/locales/html/en/terms-and-conditions.html +++ b/branding/templates/locales/html/en/terms-and-conditions.html @@ -50,7 +50,7 @@

Our code of conduct serves as a handbook for personal appearance and interaction with each other. - Whoever is active as a user in the Human Connection 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
+ 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


@@ -84,7 +84,7 @@


- The use of the Human Connection Network is not permitted for commercial purposes. + 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.


From 973e6a0249a6223be7e3a8258faea188a2bbd9da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 12 Oct 2021 08:41:33 +0200 Subject: [PATCH 167/344] Refine info pages --- .../locales/html/de/code-of-conduct.html | 42 +++- .../locales/html/de/data-privacy.html | 213 ++++++++++-------- branding/templates/locales/html/de/faq.html | 31 ++- .../locales/html/de/terms-and-conditions.html | 58 +++-- 4 files changed, 214 insertions(+), 130 deletions(-) diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html index ef691e701..451e24b04 100644 --- a/branding/templates/locales/html/de/code-of-conduct.html +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -2,15 +2,15 @@ -

+

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. @@ -19,22 +19,22 @@ 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.
@@ -43,11 +43,11 @@ - 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.
@@ -60,11 +60,11 @@ - Befürwortung oder Ermutigung 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.:

- Aufforderung zum sofortigen Abstellen des inakzeptablen Verhaltens
@@ -79,3 +79,23 @@ 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 am Beitrag, Kommentar oder Benutzer auf die drei Punkte und melde ihn über das aufgeklappte Menü.

+
+ + diff --git a/branding/templates/locales/html/de/data-privacy.html b/branding/templates/locales/html/de/data-privacy.html index 468bc3b39..3cdad0106 100644 --- a/branding/templates/locales/html/de/data-privacy.html +++ b/branding/templates/locales/html/de/data-privacy.html @@ -2,58 +2,58 @@ -

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

+ 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
    • @@ -76,37 +76,37 @@ 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. @@ -260,7 +260,7 @@ 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. @@ -268,18 +268,18 @@ 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. @@ -289,168 +289,168 @@ 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


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX


        -

        +

        XXX

        @@ -656,4 +656,27 @@ 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. \ No newline at end of file +MACHST DU VON DEINEM WIDERSPRUCHSRECHT GEBRAUCH, BEENDEN WIR DIE VERARBEITUNG DER BETROFFENEN DATEN ZU DIREKTWERBEZWECKEN. + + + +
        + + diff --git a/branding/templates/locales/html/de/faq.html b/branding/templates/locales/html/de/faq.html index 33f4a2e54..e16f7ed17 100644 --- a/branding/templates/locales/html/de/faq.html +++ b/branding/templates/locales/html/de/faq.html @@ -2,14 +2,35 @@ -

        +

        Für das soziale Netzwerk {{ organization }}


        -

        - Allgemeine FAQs +

        + Wie bediene ich dieses Netzwerk?


        -

        - Im offiziellen Wiki: https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki
        +

        + Hier findest Du die + Bedienungsanleitung.

        +
        + + diff --git a/branding/templates/locales/html/de/terms-and-conditions.html b/branding/templates/locales/html/de/terms-and-conditions.html index b18f03891..e36431036 100644 --- a/branding/templates/locales/html/de/terms-and-conditions.html +++ b/branding/templates/locales/html/de/terms-and-conditions.html @@ -2,15 +2,15 @@ -

        +

        Für das soziale Netzwerk {{ organization }}


        -

        +

        Nutzungsbedingungen


        -

        +

        Die folgenden Nutzungsbedingungen sind Basis für die Nutzung unseres Netzwerkes. Beim Registrieren musst Du sie anerkennen und wir werden Dich auch später über ggf. stattfindende Änderungen informieren. Das {{ networkName }} Netzwerk wird in Deutschland betrieben und unterliegt daher deutschem Recht. @@ -18,21 +18,21 @@ Zu Details schau in unser Impressum: https://{{ networkURL }}/impressum/


        -

        +

        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. @@ -44,20 +44,20 @@ 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. @@ -68,11 +68,11 @@ 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. @@ -80,27 +80,47 @@ 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 gestattet für kommerzielle Nutzung. 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

        +
        + + From 4b892ff43f046f4389cf3dc6265e780e1e16b36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 12 Oct 2021 09:12:31 +0200 Subject: [PATCH 168/344] Overtake some corrections --- .../locales/html/de/code-of-conduct.html | 118 ++++++++++++++---- .../locales/html/de/terms-and-conditions.html | 18 +-- 2 files changed, 101 insertions(+), 35 deletions(-) diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html index 451e24b04..a545a897c 100644 --- a/branding/templates/locales/html/de/code-of-conduct.html +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -36,11 +36,20 @@

        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.
        +

          +
        • + 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. +
        • +


        @@ -48,17 +57,56 @@


        - 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ürwortung oder Ermutigung zu diesen Verhaltensweisen.
        + 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 @@ -66,18 +114,36 @@

        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.:
        -
        - - Aufforderung 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.
        -
        +

        +
          +
        • + 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 am Beitrag, Kommentar oder Benutzer auf die drei Punkte und melde ihn über das aufgeklappte Menü.
        + Bitte klicke beim Beitrag, Kommentar oder Benutzer auf die drei Punkte und melde ihn über das aufgeklappte Menü.


        diff --git a/branding/templates/locales/html/de/terms-and-conditions.html b/branding/templates/locales/html/de/terms-and-conditions.html index e36431036..45faffac8 100644 --- a/branding/templates/locales/html/de/terms-and-conditions.html +++ b/branding/templates/locales/html/de/terms-and-conditions.html @@ -11,11 +11,11 @@


        - Die folgenden Nutzungsbedingungen sind Basis für die Nutzung unseres Netzwerkes. - Beim Registrieren musst Du sie anerkennen und wir werden Dich auch später über ggf. stattfindende Änderungen informieren. - Das {{ networkName }} Netzwerk wird in Deutschland betrieben und unterliegt daher deutschem Recht. - Gerichtsstand ist {{ organizationLocation }}. - Zu Details schau in unser Impressum: https://{{ networkURL }}/impressum/
        + 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 }}/impressum/.


        @@ -64,7 +64,7 @@ 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 erhält derzeitig von uns leider noch keine Rückmeldung, das ist aber in Planung. + 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.


        @@ -77,7 +77,7 @@ 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
        + Du kannst gerne jeden von Dir entdeckten Fehler dem Support/der Hilfe-Assistenz mitteilen: https://{{ networkURL }}/support.


        @@ -85,7 +85,7 @@


        - Die Nutzung des {{ networkName }} Netzwerkes ist nicht gestattet für 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.


        @@ -102,7 +102,7 @@

        - 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
        + 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.


        From 81ac662b33e0111584d8c119f3f3da5ad972f418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 12 Oct 2021 12:26:15 +0200 Subject: [PATCH 169/344] Refine info pages --- .../locales/html/de/code-of-conduct.html | 22 --- .../locales/html/en/code-of-conduct.html | 136 +++++++++++++----- branding/templates/locales/html/en/faq.html | 29 +++- .../locales/html/en/terms-and-conditions.html | 58 +++++--- 4 files changed, 164 insertions(+), 81 deletions(-) diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/de/code-of-conduct.html index a545a897c..c0e9e4076 100644 --- a/branding/templates/locales/html/de/code-of-conduct.html +++ b/branding/templates/locales/html/de/code-of-conduct.html @@ -34,28 +34,6 @@ 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 werden von allen Community-Mitgliedern erwartet und gefordert:

        diff --git a/branding/templates/locales/html/en/code-of-conduct.html b/branding/templates/locales/html/en/code-of-conduct.html index 45be395e2..79bb6dd63 100644 --- a/branding/templates/locales/html/en/code-of-conduct.html +++ b/branding/templates/locales/html/en/code-of-conduct.html @@ -2,15 +2,15 @@ -

        +

        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. @@ -18,64 +18,128 @@ 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.

        +
          +
        • + 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.

        +
          +
        • + 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.
        -
        +

        +
          +
        • + 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/branding/templates/locales/html/en/faq.html b/branding/templates/locales/html/en/faq.html index 9e72418ac..30033a1a3 100644 --- a/branding/templates/locales/html/en/faq.html +++ b/branding/templates/locales/html/en/faq.html @@ -6,10 +6,31 @@ For the social network of {{ organization }}
        -

        - General FAQs +

        + How do I operate this network?


        -

        - The official Wiki: https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki
        +

        + Here you can find the + user manual.

        +
        + + diff --git a/branding/templates/locales/html/en/terms-and-conditions.html b/branding/templates/locales/html/en/terms-and-conditions.html index 3d0f59f81..a2bf448d4 100644 --- a/branding/templates/locales/html/en/terms-and-conditions.html +++ b/branding/templates/locales/html/en/terms-and-conditions.html @@ -2,15 +2,15 @@ -

        +

        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. @@ -18,21 +18,21 @@ For details see our imprint: https://{{ networkURL }}/impressum/


        -

        +

        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. @@ -44,20 +44,20 @@ 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. @@ -68,38 +68,58 @@ 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

        +
        + + From 9bb3ff8b1a0b42ec0e6b0ed0c9ea035e6f682658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 13 Oct 2021 16:24:50 +0200 Subject: [PATCH 170/344] Restructure template folders --- branding/templates/locales/html/{ => general}/de/faq.html | 0 branding/templates/locales/html/{ => general}/en/faq.html | 0 .../templates/locales/html/{ => hc-y2020}/de/code-of-conduct.html | 0 .../locales/html/{ => hc-y2020}/de/terms-and-conditions.html | 0 .../templates/locales/html/{ => hc-y2020}/en/code-of-conduct.html | 0 .../locales/html/{ => hc-y2020}/en/terms-and-conditions.html | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename branding/templates/locales/html/{ => general}/de/faq.html (100%) rename branding/templates/locales/html/{ => general}/en/faq.html (100%) rename branding/templates/locales/html/{ => hc-y2020}/de/code-of-conduct.html (100%) rename branding/templates/locales/html/{ => hc-y2020}/de/terms-and-conditions.html (100%) rename branding/templates/locales/html/{ => hc-y2020}/en/code-of-conduct.html (100%) rename branding/templates/locales/html/{ => hc-y2020}/en/terms-and-conditions.html (100%) diff --git a/branding/templates/locales/html/de/faq.html b/branding/templates/locales/html/general/de/faq.html similarity index 100% rename from branding/templates/locales/html/de/faq.html rename to branding/templates/locales/html/general/de/faq.html diff --git a/branding/templates/locales/html/en/faq.html b/branding/templates/locales/html/general/en/faq.html similarity index 100% rename from branding/templates/locales/html/en/faq.html rename to branding/templates/locales/html/general/en/faq.html diff --git a/branding/templates/locales/html/de/code-of-conduct.html b/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html similarity index 100% rename from branding/templates/locales/html/de/code-of-conduct.html rename to branding/templates/locales/html/hc-y2020/de/code-of-conduct.html diff --git a/branding/templates/locales/html/de/terms-and-conditions.html b/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html similarity index 100% rename from branding/templates/locales/html/de/terms-and-conditions.html rename to branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html diff --git a/branding/templates/locales/html/en/code-of-conduct.html b/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html similarity index 100% rename from branding/templates/locales/html/en/code-of-conduct.html rename to branding/templates/locales/html/hc-y2020/en/code-of-conduct.html diff --git a/branding/templates/locales/html/en/terms-and-conditions.html b/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html similarity index 100% rename from branding/templates/locales/html/en/terms-and-conditions.html rename to branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html From f28119a536318d8af3ee36cef69eba83e46b2a31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 13 Oct 2021 16:25:36 +0200 Subject: [PATCH 171/344] Finish data-privacy.html --- .../locales/html/de/data-privacy.html | 682 ---------- .../html/hc-y2020/de/data-privacy.html | 1159 +++++++++++++++++ 2 files changed, 1159 insertions(+), 682 deletions(-) delete mode 100644 branding/templates/locales/html/de/data-privacy.html create mode 100644 branding/templates/locales/html/hc-y2020/de/data-privacy.html diff --git a/branding/templates/locales/html/de/data-privacy.html b/branding/templates/locales/html/de/data-privacy.html deleted file mode 100644 index 3cdad0106..000000000 --- a/branding/templates/locales/html/de/data-privacy.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - -

        - 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 -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        -
        -

        - XXX -

        -
        -

        - XXX
        -

        - - -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. -CookiesDieser 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. -1 Tag -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. koreekter 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: - • AGBs und Datenschutz von Codepen - • AGBs und Datenschutz von D.Tube - • AGBs und Datenschutz von Facebook - • AGBs und Datenschutz von Flickr - • AGBs und Datenschutz von GIPHY - • AGBs und Datenschutz von Meetup - • AGBs und Datenschutz von MixCloud - • AGBs und Datenschutz von Reddit - • AGBs und Datenschutz von SlideShare - • AGBs und Datenschutz von SoundCloud - • AGBs und Datenschutz von Twitch - • AGBs und Datenschutz von Twitter - • AGBs und Datenschutz von Vimeo - • YouTube ist gesondert aufgeführt. -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 - - -SpeicherdauerDatails 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/branding/templates/locales/html/hc-y2020/de/data-privacy.html b/branding/templates/locales/html/hc-y2020/de/data-privacy.html new file mode 100644 index 000000000..376568334 --- /dev/null +++ b/branding/templates/locales/html/hc-y2020/de/data-privacy.html @@ -0,0 +1,1159 @@ + + + + +

        + 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.
        +

        +
        + + From dea98061761e706fe5f667c435bbb6b09bd9c9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 14 Oct 2021 11:05:11 +0200 Subject: [PATCH 172/344] Delete comments in data-privacy.html --- .../templates/locales/html/hc-y2020/de/data-privacy.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/branding/templates/locales/html/hc-y2020/de/data-privacy.html b/branding/templates/locales/html/hc-y2020/de/data-privacy.html index 376568334..752b502c4 100644 --- a/branding/templates/locales/html/hc-y2020/de/data-privacy.html +++ b/branding/templates/locales/html/hc-y2020/de/data-privacy.html @@ -1136,12 +1136,7 @@ .info-page-table { border: 1px solid #e0dede; - /* border-left: 1px solid #ac8585; */ - /* border-color: #e0dede; */ border-collapse: collapse; - /* border-spacing: 10px; */ - /* box-sizing: border-box; */ - /* display: table; */ background-color: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5); max-width: 100%; From 550f197626c193c49dfa718fbc8361e06eb0ba8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 14 Oct 2021 13:23:55 +0200 Subject: [PATCH 173/344] Refactor CSS on internal pages --- .../locales/html/general/de/faq.html | 48 ++- .../locales/html/general/en/faq.html | 48 ++- .../html/hc-y2020/de/code-of-conduct.html | 64 ++-- .../html/hc-y2020/de/data-privacy.html | 332 +++++------------- .../hc-y2020/de/terms-and-conditions.html | 80 +++-- .../html/hc-y2020/en/code-of-conduct.html | 64 ++-- .../hc-y2020/en/terms-and-conditions.html | 80 +++-- 7 files changed, 347 insertions(+), 369 deletions(-) diff --git a/branding/templates/locales/html/general/de/faq.html b/branding/templates/locales/html/general/de/faq.html index e16f7ed17..1479fa648 100644 --- a/branding/templates/locales/html/general/de/faq.html +++ b/branding/templates/locales/html/general/de/faq.html @@ -2,14 +2,12 @@ -

        +

        Für das soziale Netzwerk {{ organization }}

        -
        -

        +

        Wie bediene ich dieses Netzwerk?

        -

        Hier findest Du die Bedienungsanleitung.
        @@ -17,20 +15,50 @@
        diff --git a/branding/templates/locales/html/general/en/faq.html b/branding/templates/locales/html/general/en/faq.html index 30033a1a3..7e0788438 100644 --- a/branding/templates/locales/html/general/en/faq.html +++ b/branding/templates/locales/html/general/en/faq.html @@ -2,14 +2,12 @@ -

        +

        For the social network of {{ organization }}

        -
        -

        +

        How do I operate this network?

        -

        Here you can find the user manual.
        @@ -17,20 +15,50 @@
        diff --git a/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html b/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html index c0e9e4076..eda2d36dd 100644 --- a/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html +++ b/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html @@ -2,14 +2,12 @@ -

        +

        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. @@ -18,22 +16,18 @@ 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:

        @@ -51,11 +45,9 @@ 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:

      @@ -85,11 +77,9 @@ 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.:

    @@ -126,20 +116,50 @@
    diff --git a/branding/templates/locales/html/hc-y2020/de/data-privacy.html b/branding/templates/locales/html/hc-y2020/de/data-privacy.html index 752b502c4..308edf854 100644 --- a/branding/templates/locales/html/hc-y2020/de/data-privacy.html +++ b/branding/templates/locales/html/hc-y2020/de/data-privacy.html @@ -2,25 +2,21 @@ -

    +

    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

    @@ -34,22 +30,18 @@ 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:

    @@ -81,19 +73,15 @@ 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.

    @@ -126,11 +114,9 @@

    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. @@ -184,15 +170,12 @@ 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. @@ -208,50 +191,39 @@ 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. @@ -267,15 +239,12 @@ 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.

    @@ -298,34 +267,27 @@

    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. @@ -337,19 +299,15 @@ 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. @@ -361,126 +319,96 @@ 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:

    @@ -519,175 +447,134 @@ -
    -

    +

    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. @@ -718,11 +605,9 @@ 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:
@@ -771,43 +656,34 @@ YouTube ist gesondert aufgeführt. -
-

+

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:

@@ -985,153 +861,133 @@ -
-

+

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/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html b/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html index 79bb6dd63..67e04d10c 100644 --- a/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html +++ b/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html @@ -2,14 +2,12 @@ -

+

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. @@ -17,22 +15,18 @@ 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:

@@ -51,11 +45,9 @@ 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:

@@ -85,11 +77,9 @@ 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:

@@ -126,20 +116,50 @@
diff --git a/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html b/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html index a2bf448d4..36f057984 100644 --- a/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html +++ b/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html @@ -2,14 +2,12 @@ -

+

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. @@ -17,21 +15,17 @@ Place of jurisdiction is {{ organizationLocation }}. For details see our imprint: https://{{ networkURL }}/impressum/

-
-

+

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. @@ -43,20 +37,16 @@ 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. @@ -67,59 +57,81 @@ 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


From e6f648cc01783c1f01d0afc3b1f7b08bbe4a9b88 Mon Sep 17 00:00:00 2001 From: sushidave Date: Fri, 15 Oct 2021 13:46:40 +0200 Subject: [PATCH 174/344] Simplify CSS data-privacy.html --- .../html/hc-y2020/de/data-privacy.html | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/branding/templates/locales/html/hc-y2020/de/data-privacy.html b/branding/templates/locales/html/hc-y2020/de/data-privacy.html index 308edf854..87ab3cda3 100644 --- a/branding/templates/locales/html/hc-y2020/de/data-privacy.html +++ b/branding/templates/locales/html/hc-y2020/de/data-privacy.html @@ -2,6 +2,7 @@ +

Für das soziale Netzwerk {{ organization }}

@@ -961,6 +962,7 @@ MACHST DU VON DEINEM WIDERSPRUCHSRECHT GEBRAUCH, BEENDEN WIR DIE VERARBEITUNG DER BETROFFENEN DATEN ZU DIREKTWERBEZWECKEN.


+
+ From ff24b34df5ca589d37a4ff2328c786e0892701f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Oct 2021 07:59:22 +0200 Subject: [PATCH 175/344] Refactor CSS on internal pages after Davids suggestions --- .../locales/html/general/de/faq.html | 63 +- .../locales/html/general/en/faq.html | 63 +- .../html/hc-y2020/de/code-of-conduct.html | 265 ++- .../html/hc-y2020/de/data-privacy.html | 1968 ++++++++--------- .../hc-y2020/de/terms-and-conditions.html | 211 +- .../html/hc-y2020/en/code-of-conduct.html | 265 ++- .../hc-y2020/en/terms-and-conditions.html | 209 +- 7 files changed, 1482 insertions(+), 1562 deletions(-) diff --git a/branding/templates/locales/html/general/de/faq.html b/branding/templates/locales/html/general/de/faq.html index 1479fa648..698d410d6 100644 --- a/branding/templates/locales/html/general/de/faq.html +++ b/branding/templates/locales/html/general/de/faq.html @@ -2,62 +2,57 @@ -

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

-

- Wie bediene ich dieses Netzwerk? -

-

- Hier findest Du die - Bedienungsanleitung.
-

-
+
+

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

+

+ Wie bediene ich dieses Netzwerk? +

+

+ Hier findest Du die + Bedienungsanleitung.
+

+
+
- diff --git a/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html b/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html index bd9888505..aa3a8364c 100644 --- a/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html +++ b/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html @@ -2,136 +2,131 @@ -

- 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 }}/impressum/.
-

-

- 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.
-

-
+
+

+ 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 }}/impressum/.
+

+

+ 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/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index a00b03c34..104d18300 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,6 +1,60 @@ -

Das hier wäre der Inhalt der Datenschutzbestimmungen.

-
-

Neu gebrandet …

+
+

+ 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/branding/locales/html/de/donate.html b/branding/locales/html/de/donate.html index d4b14a15f..71f1027ef 100644 --- a/branding/locales/html/de/donate.html +++ b/branding/locales/html/de/donate.html @@ -1,6 +1,60 @@ -

Hier steht was zu den Spenden.

-
-

Neu gebrandet …

+
+

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

+

+ Wohin kann ich spenden? +

+

+ Hier steht was zu den Spenden. +

+
+ + diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index 24e0ced15..15a9d976d 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,6 +1,67 @@ -

Hier stehen die FAQs.

-
-

Neu gebrandet …

+
+

+ 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/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 521c5279c..ad3c93562 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,6 +1,60 @@ -

Ich bin das Impressum.

-
-

Neu gebrandet …

+
+

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

+

+ Betreiber +

+

+ Ich bin das Impressum. +

+
+ + diff --git a/branding/locales/html/de/organization.html b/branding/locales/html/de/organization.html index ed7c97b51..089d72fa4 100644 --- a/branding/locales/html/de/organization.html +++ b/branding/locales/html/de/organization.html @@ -1,6 +1,60 @@ -

Hier wird das Netzwerk beschrieben.

-
-

Neu gebrandet …

+
+

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

+

+ Das Entwicklernetzwerk +

+

+ Hier wird das Netzwerk beschrieben. +

+
+ + diff --git a/branding/locales/html/de/support.html b/branding/locales/html/de/support.html index 6282306a0..f4dcb537e 100644 --- a/branding/locales/html/de/support.html +++ b/branding/locales/html/de/support.html @@ -1,6 +1,60 @@ -

Ich bin der Inhalt vom Support.

-
-

Neu gebrandet …

+
+

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

+

+ Ansprechpartner +

+

+ Ich bin der Inhalt vom Support. +

+
+ + diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 74396a67f..74057ada1 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,6 +1,61 @@ -

Ich bin der Inhalt der Seite "Nutzungsbedingungen".

-
-

Neu gebrandet …

+ +
+

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

+

+ Nutzung und Lizenz +

+

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

+
+ + diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index 75128e8a4..714cad330 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,6 +1,60 @@ -

I am the content of the code of conduct.

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ Präambel +

+

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

+
+ + diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index 31a116912..c4b718fe0 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,6 +1,60 @@ -

This would be our data privacy section.

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ Information about the collection of personal data +

+

+ This would be our data privacy section. +

+
+ + diff --git a/branding/locales/html/en/donate.html b/branding/locales/html/en/donate.html index a3e7daffe..d25e9f419 100644 --- a/branding/locales/html/en/donate.html +++ b/branding/locales/html/en/donate.html @@ -1,6 +1,60 @@ -

Here's what it says about donations.

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ Where can I donate? +

+

+ Here's what it says about donations. +

+
+ + diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index 08d3ceea0..a5998db78 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,6 +1,67 @@ -

Here are the FAQs.

-
-

Rebranded …

+
+

+ 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/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index fbae0bdc9..6a7489a06 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,6 +1,60 @@ -

I am the imprint.

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ Operator +

+

+ I am the imprint. +

+
+ + diff --git a/branding/locales/html/en/organization.html b/branding/locales/html/en/organization.html index 99a8bbb17..e5a6d0f93 100644 --- a/branding/locales/html/en/organization.html +++ b/branding/locales/html/en/organization.html @@ -1,6 +1,60 @@ -

Here the network is described.

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ The Developers Network +

+

+ Here the network is described. +

+
+ + diff --git a/branding/locales/html/en/support.html b/branding/locales/html/en/support.html index 30f85357d..118328b06 100644 --- a/branding/locales/html/en/support.html +++ b/branding/locales/html/en/support.html @@ -1,6 +1,60 @@ -

I am the content of the support.

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ Contact +

+

+ I am the content of the support. +

+
+ + diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index 50f354b66..44e3fe3cd 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,6 +1,60 @@ -

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

-
-

Rebranded …

+
+

+ For the social network Ocelot.Social Staging +

+

+ Use and License +

+

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

+
+ + From b494dc14564ce75dc06bc5b453453491898f0da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 30 Nov 2021 11:09:42 +0100 Subject: [PATCH 182/344] Refactor to use internal FAQ page --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index b2dc4f69d..9cbc605c0 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -83,7 +83,7 @@ const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ }, }) const FAQ = defaultPageParamsPages.FAQ.overwrite({ - externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + // externalLink: null, // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.faq', // localized string identifier, if undefined default is used From 76994852611ece387330c6748d54df58ab22c44e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 30 Nov 2021 11:59:19 +0100 Subject: [PATCH 183/344] Realease v1.0.6-170 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c60dc3104..4b7a791fe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.6", - "ocelotDockerVersionTag": "1.0.6-160", + "ocelotDockerVersionTag": "1.0.6-170", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From b792a18fb18d7488957c7ab0f2f33433e212fd14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 2 Dec 2021 17:22:55 +0100 Subject: [PATCH 184/344] Add docs for backups and release v1.0.7-171 --- deployment/kubernetes/Backup.md | 305 ++++++++++++++++++++++++++ deployment/kubernetes/DigitalOcean.md | 6 + deployment/kubernetes/README.md | 15 ++ package.json | 4 +- 4 files changed, 328 insertions(+), 2 deletions(-) create mode 100644 deployment/kubernetes/Backup.md diff --git a/deployment/kubernetes/Backup.md b/deployment/kubernetes/Backup.md new file mode 100644 index 000000000..738cdcfee --- /dev/null +++ b/deployment/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 webside 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/kubernetes/DigitalOcean.md b/deployment/kubernetes/DigitalOcean.md index f9cc3ef51..50b70346b 100644 --- a/deployment/kubernetes/DigitalOcean.md +++ b/deployment/kubernetes/DigitalOcean.md @@ -76,3 +76,9 @@ The IPs of the DigitalOcean machines are not necessarily stable, so the cluster' ## 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/kubernetes/README.md b/deployment/kubernetes/README.md index 410910e2f..c519cb06d 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -183,6 +183,17 @@ $ helm upgrade ocelot ./ $ 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) @@ -194,6 +205,10 @@ $ helm uninstall ocelot $ 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 diff --git a/package.json b/package.json index 4b7a791fe..7d2a1ddd7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.6", - "ocelotDockerVersionTag": "1.0.6-170", + "version": "1.0.7", + "ocelotDockerVersionTag": "1.0.7-171", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 1d6c4de01ae2d3539d64f4a6b494908eaef6120a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 18 Jan 2022 12:36:43 +0100 Subject: [PATCH 185/344] Refactor to configure 'COOKIE_EXPIRE_TIME' --- deployment/kubernetes/templates/webapp/ConfigMap.yml | 1 + deployment/kubernetes/values.template.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml index eb378f49c..685f67675 100644 --- a/deployment/kubernetes/templates/webapp/ConfigMap.yml +++ b/deployment/kubernetes/templates/webapp/ConfigMap.yml @@ -14,5 +14,6 @@ data: HOST: "0.0.0.0" PUBLIC_REGISTRATION: "{{ .Values.PUBLIC_REGISTRATION }}" INVITE_REGISTRATION: "{{ .Values.INVITE_REGISTRATION }}" + 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/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index d5f92a895..9904344c8 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -3,6 +3,7 @@ # change all the below if needed PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false +COOKIE_EXPIRE_TIME: 730 # days (730 days, two years by default in main code, if not set here) BACKEND: # change all the below if needed From b7908e617c6f30bc55c8420a3f5f4ef63414ae6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 18 Jan 2022 12:59:47 +0100 Subject: [PATCH 186/344] Comment the new setting out, because it's the default value --- deployment/kubernetes/values.template.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 9904344c8..5908e3eb0 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -3,7 +3,7 @@ # change all the below if needed PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false -COOKIE_EXPIRE_TIME: 730 # days (730 days, two years by default in main code, if not set here) +# COOKIE_EXPIRE_TIME: 730 # days (730 days, two years by default in main code, if not set here) BACKEND: # change all the below if needed From adc9f0967e4860f48ff4c218224d4d91f19f5344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 18 Jan 2022 13:12:55 +0100 Subject: [PATCH 187/344] Revert "Comment the new setting out, because it's the default value" This reverts commit b7908e617c6f30bc55c8420a3f5f4ef63414ae6d. - I revert, because it looks like that an undefined .env variable becomes an empty string. To handle this with if statements seems to uncertain to me without intense testing! --- deployment/kubernetes/values.template.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 5908e3eb0..9904344c8 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -3,7 +3,7 @@ # change all the below if needed PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false -# COOKIE_EXPIRE_TIME: 730 # days (730 days, two years by default in main code, if not set here) +COOKIE_EXPIRE_TIME: 730 # days (730 days, two years by default in main code, if not set here) BACKEND: # change all the below if needed From 96c640af0fa33df3b6c9b818ad1595823066b369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 18 Jan 2022 13:14:49 +0100 Subject: [PATCH 188/344] Adjust comment --- deployment/kubernetes/values.template.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 9904344c8..921ce3cde 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -3,7 +3,7 @@ # change all the below if needed PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false -COOKIE_EXPIRE_TIME: 730 # days (730 days, two years by default in main code, if not set here) +COOKIE_EXPIRE_TIME: 730 # days (730 days, two years is the default in main code) BACKEND: # change all the below if needed From 518ec8ffef001720fec36e827274b79d290d9055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 20 Jan 2022 18:37:01 +0100 Subject: [PATCH 189/344] Add 'TODO-next-update.md' --- TODO-next-update.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 TODO-next-update.md diff --git a/TODO-next-update.md b/TODO-next-update.md new file mode 100644 index 000000000..a2608d566 --- /dev/null +++ b/TODO-next-update.md @@ -0,0 +1,13 @@ +# Todo For Next Update + +When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … + +## This Latest Version > 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 + +### 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 prevered value. + +## Version 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 + +- No informations. From 4fe3c5807af2b86c806fa0b6d36feac8687a5f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 21 Jan 2022 20:05:59 +0100 Subject: [PATCH 190/344] Add todo in 'TODO-next-update.md' --- TODO-next-update.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO-next-update.md b/TODO-next-update.md index a2608d566..02f87e16c 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -7,6 +7,7 @@ When you overtake this deploy and rebrand repo to your network you have to recog ### 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 prevered value. +- Correct cookie exploration time in data privacy. ## Version 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 From 327668ece2d5c0925dae868bf1161db4bed918ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 21 Jan 2022 20:10:20 +0100 Subject: [PATCH 191/344] Adjust todo --- TODO-next-update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO-next-update.md b/TODO-next-update.md index 02f87e16c..b27f5f1e0 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -7,7 +7,7 @@ When you overtake this deploy and rebrand repo to your network you have to recog ### 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 prevered value. -- Correct cookie exploration time in data privacy. +- Correct `locale` cookie exploration time in data privacy. ## Version 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 From cbe5e766acb677005182c390a73911415cd93772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 1 Jul 2022 12:38:29 +0200 Subject: [PATCH 192/344] Release version v1.0.8, Docker version tag 1.0.8-182 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7d2a1ddd7..9963e6949 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.7", - "ocelotDockerVersionTag": "1.0.7-171", + "version": "1.0.8", + "ocelotDockerVersionTag": "1.0.8-182", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 45913de805b9747cf0f468ab533208db4f189bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 8 Jul 2022 11:14:18 +0200 Subject: [PATCH 193/344] Refine docs, first step --- README.md | 31 ++++++++++++++++++++++----- deployment/kubernetes/DigitalOcean.md | 3 ++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a74a590b6..a57f1840a 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,20 @@ 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

+ - Logins: @@ -24,7 +30,8 @@ Logins: | `user@example.org` | 1234 | user | | `moderator@example.org` | 1234 | moderator | | `admin@example.org` | 1234 | admin | ---> + +Deployed networks can be found [here](#list-of-deployed-networks). ## Usage @@ -44,7 +51,7 @@ The next step is: - [Configure And Branding](/branding/README.md) -### Optional: Proof Configuration And Branding Locally +### Optional: Locally Testing Configuration And Branding Just in case you have Docker installed and run the following, you can check your branding locally: @@ -74,7 +81,7 @@ Secondly, in your GitHub repository, click on the 'Settings' tab and go to the ' 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: Proof DockerHub Images Locally +### Optional: Locally Testing Your DockerHub Images Just in case you like to check your pushed Docker images in your organisation's DockerHub repositories locally: @@ -123,6 +130,20 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/) BrowserStack Logo --> +## List Of Deployed Networks + +You may need an invitation to access a network. + +### More Likely To Try + +- [wir.social](https://wir.social) + +### Others + +- [freilernen.social](https://freilernen.social) +- [helfa.social](https://helfa.social) +- [sender.fm](https://sender.fm) + ## License See the [LICENSE](/LICENSE.md) file for license rights and limitations (MIT). diff --git a/deployment/kubernetes/DigitalOcean.md b/deployment/kubernetes/DigitalOcean.md index 50b70346b..b935ff7d1 100644 --- a/deployment/kubernetes/DigitalOcean.md +++ b/deployment/kubernetes/DigitalOcean.md @@ -18,7 +18,8 @@ On the right top you find the button `Create`. Click on it and choose `Kubernete - use the latest Kubernetes version - choose your datacenter region - name your node pool: e.g. `pool-` -- 2 `Basic node` with a total of 4GB and 2 shared CPUs are enough to start with +- `2 Basic nodes` with a total of `4 GB` and `2 shared CPUs` are enough to start with +- `2 Basic nodes` with a total of `8 GB` and `2 shared CPUs` are a bit more optimal for the beginning - no tags necessary - set your cluster name: e.g. `cluster-` - select your project From 2dd33909c7a7829828d1ff994a7f5f67061d3ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 9 Jul 2022 21:20:16 +0200 Subject: [PATCH 194/344] Update cert-manager apiVersion "cert-manager.io/v1alpha2" to "cert-manager.io/v1" --- .../kubernetes/templates/issuer/letsencrypt-production.yaml | 2 +- deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml index 2836cceff..6f82f3686 100644 --- a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml +++ b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml @@ -1,4 +1,4 @@ -apiVersion: cert-manager.io/v1alpha2 +apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-production diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml index 7190e6553..e488d9335 100644 --- a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml +++ b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml @@ -1,4 +1,4 @@ -apiVersion: cert-manager.io/v1alpha2 +apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging From 70a60122b4c456e0a087a0a82ba66a2ec30f875f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 9 Jul 2022 21:21:33 +0200 Subject: [PATCH 195/344] Update deploy instructions --- LICENSE.md | 2 +- deployment/kubernetes/DigitalOcean.md | 11 +++++----- deployment/kubernetes/LICENSE | 12 ----------- deployment/kubernetes/README.md | 31 ++++++++++++++++++++++----- 4 files changed, 32 insertions(+), 24 deletions(-) delete mode 100644 deployment/kubernetes/LICENSE diff --git a/LICENSE.md b/LICENSE.md index d2be00378..69cc340af 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -2,7 +2,7 @@ MIT License -Copyright \(c\) 2021 by the [Ocelot.Social Community](https://github.com/Ocelot-Social-Community) +Copyright \(c\) 2022 by the [Ocelot.Social Community](https://github.com/Ocelot-Social-Community) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/deployment/kubernetes/DigitalOcean.md b/deployment/kubernetes/DigitalOcean.md index b935ff7d1..2c919d5f2 100644 --- a/deployment/kubernetes/DigitalOcean.md +++ b/deployment/kubernetes/DigitalOcean.md @@ -18,18 +18,17 @@ On the right top you find the button `Create`. Click on it and choose `Kubernete - use the latest Kubernetes version - choose your datacenter region - name your node pool: e.g. `pool-` -- `2 Basic nodes` with a total of `4 GB` and `2 shared CPUs` are enough to start with -- `2 Basic nodes` with a total of `8 GB` and `2 shared CPUs` are a bit more optimal for the beginning -- no tags necessary +- `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: +After your cluster is set up – see progress bar above – click on `Getting started`. Please install the following management tools: -- [kubectl](https://kubernetes.io/docs/tasks/tools/) -- [doctl](https://github.com/digitalocean/doctl) +- [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. diff --git a/deployment/kubernetes/LICENSE b/deployment/kubernetes/LICENSE deleted file mode 100644 index a027039fd..000000000 --- a/deployment/kubernetes/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -# LICENSE - -MIT License - -Copyright \(c\) 2021 Ulf Gebhardt - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index c519cb06d..8388f502c 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -19,15 +19,36 @@ Besides the `values.template.yaml` file we provide a `nginx.values.template.yaml ## 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 DigitalOcean you might require `doctl` aswell. +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/kubernetes/) for more details. +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.* -#### 1. Create Namespace +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) + +***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 @@ -108,7 +129,7 @@ You will need an API token, which you can generate in the control panel at Date: Sat, 9 Jul 2022 21:33:39 +0200 Subject: [PATCH 196/344] Update TODO-next-update.md --- TODO-next-update.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/TODO-next-update.md b/TODO-next-update.md index b27f5f1e0..458536484 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,7 +2,14 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … -## This Latest Version > 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 +## Version > 1.0.8 with 'ocelotDockerVersionTag' 1.0.8-182 + +### Deployment/Rebranding PR – chore: [WIP] 🍰 Refine docs, first step #46 + +- Commit: `Update cert-manager apiVersion "cert-manager.io/v1alpha2" to "cert-manager.io/v1" + - Check for `kubectl` and `helm` versions. + +## Version 1.0.8 with 'ocelotDockerVersionTag' 1.0.8-182 ### PR – feat: 🍰 Configure Cookie Expire Time #43 From 35796f338fba8cbf45fb18460659ac9442e17268 Mon Sep 17 00:00:00 2001 From: ogerly Date: Mon, 11 Jul 2022 15:40:53 +0200 Subject: [PATCH 197/344] change package.json for yunite.net --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9963e6949..d98284468 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "ocelot-social-branded", + "name": "yunite.net", "version": "1.0.8", "ocelotDockerVersionTag": "1.0.8-182", - "dockerOrganisation": "ocelotsocialnetwork", - "description": "ocelot.social Branded", - "author": "ocelot.social Community", + "dockerOrganisation": "XXX", + "description": "yunite.net Branded", + "author": "yunite.net Community", "license": "MIT", "private": false, "repository": { "type": "git", - "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding.git" + "url": "https://github.com/Yunite-Net/Yunite-Net-Ocelot-Social-Deploy-Rebranding" } } From 11742743760737d9b7c138e3d5cb9ec4a8a5739b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Jul 2022 07:24:58 +0200 Subject: [PATCH 198/344] Add Docker documentation --- docker/DOCKER_MORE_CLOSELY.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 docker/DOCKER_MORE_CLOSELY.md diff --git a/docker/DOCKER_MORE_CLOSELY.md b/docker/DOCKER_MORE_CLOSELY.md new file mode 100644 index 000000000..c5c926982 --- /dev/null +++ b/docker/DOCKER_MORE_CLOSELY.md @@ -0,0 +1,16 @@ +# Docker + +## Apple M1 Platform + +***Attention:** For using Docker commands in Apple M1 environments!* + +```bash +# set env variable for your shell +$ export DOCKER_DEFAULT_PLATFORM=linux/amd64 +``` + +For even more informations, see [Docker More Closely](#docker-more-closely) + +## Docker More Closely + +To get more informations about the Apple M1 platform and to analyze the Docker builds etc. you find our documentation in our main code, [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/DOCKER_MORE_CLOSELY.md). From d6480c14e5ac47577d4cd24bbd036063d06544f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Jul 2022 07:56:06 +0200 Subject: [PATCH 199/344] Rename Neo4j Docker image in general to 'neo4j-community:*' --- docker-compose.ocelotsocial-branded.yml | 27 ++++++++++------ docker-compose.yml | 41 ++++++++++++++++--------- docker/neo4j.Dockerfile | 3 +- 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml index 6d4c148f8..7591b4a3a 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.ocelotsocial-branded.yml @@ -2,10 +2,12 @@ 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 @@ -19,10 +21,12 @@ services: - 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 + ######################################################## # 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 @@ -47,10 +51,23 @@ services: - 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 @@ -62,15 +79,7 @@ services: - 7687:7687 volumes: - neo4j_data:/data - ######################################################## - # MAINTENANCE ########################################## - ######################################################## - maintenance: - image: ocelotsocialnetwork/maintenance-branded:latest - networks: - - test-network - ports: - - 5000:80 + ######################################################## # MAILSERVER TO FAKE SMTP ############################## ######################################################## diff --git a/docker-compose.yml b/docker-compose.yml index 41d515dec..5610511ce 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,15 @@ # This docker-compose file is just here for testing + version: "3.4" services: + ######################################################## # WEBAPP ############################################### ######################################################## webapp: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/webapp-branded:local-production build: dockerfile: docker/webapp.Dockerfile target: branded @@ -22,10 +26,13 @@ services: - 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 + ######################################################## # BACKEND ############################################## ######################################################## backend: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/backend-branded:local-production build: dockerfile: docker/backend.Dockerfile target: branded @@ -53,11 +60,29 @@ services: - SMTP_HOST=mailserver - SMTP_PORT=25 - SMTP_IGNORE_TLS=true + + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there + image: ocelotsocialnetwork/maintenance-branded:local-production + build: + # TODO: Separate from webapp, this must be independent + dockerfile: docker/maintenance.Dockerfile + target: branded + context: . + networks: + - test-network + ports: + - 3001:80 + ######################################################## # NEO4J ################################################ ######################################################## neo4j: - image: ocelotsocialnetwork/neo4j:community + # 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-branded:local-production networks: - test-network volumes: @@ -68,19 +93,7 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 - ######################################################## - # MAINTENANCE ########################################## - ######################################################## - maintenance: - build: - # TODO: Separate from webapp, this must be independent - dockerfile: docker/maintenance.Dockerfile - target: branded - context: . - networks: - - test-network - ports: - - 5000:80 + ######################################################## # MAILSERVER TO FAKE SMTP ############################## ######################################################## diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index 980c45e41..eddc7be38 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,4 +1,4 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j +ARG APP_IMAGE=ocelotsocialnetwork/neo4j-community ARG APP_IMAGE_TAG=latest ARG APP_IMAGE_COMMUNITY=${APP_IMAGE}:${APP_IMAGE_TAG} @@ -10,4 +10,5 @@ FROM $APP_IMAGE_COMMUNITY as community-branded ################################################################################## # ENTERPRISE ##################################################################### ################################################################################## +# Todo: refactor this with 'APP_IMAGE', 'APP_IMAGE_TAG', and similar to 'APP_IMAGE_COMMUNITY', Neo4j 'dockerfile' from main code FROM ocelotsocialnetwork/neo4j-enterprise:latest as enterprise-branded From d66e8f0f1752b55879a452ee0091ba77087c0db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Jul 2022 10:55:10 +0200 Subject: [PATCH 200/344] Adjust maintenance container name in deployment with Helm --- deployment/kubernetes/templates/maintenance/Deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/templates/maintenance/Deployment.yaml b/deployment/kubernetes/templates/maintenance/Deployment.yaml index 5a2eb394e..fd1aa311a 100644 --- a/deployment/kubernetes/templates/maintenance/Deployment.yaml +++ b/deployment/kubernetes/templates/maintenance/Deployment.yaml @@ -26,7 +26,7 @@ spec: rollme: {{ randAlphaNum 5 | quote }} spec: containers: - - name: maintenance + - name: container-{{ .Release.Name }}-maintenance image: "{{ .Values.MAINTENANCE.DOCKER_IMAGE_REPO }}:{{ .Chart.AppVersion }}" imagePullPolicy: {{ .Values.MAINTENANCE.DOCKER_IMAGE_PULL_POLICY }} envFrom: From 86a613cbe025f94fb6a02185c8da246716fd44db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Jul 2022 13:39:40 +0200 Subject: [PATCH 201/344] Release new build version v1.0.8-184 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9963e6949..57fcb263c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.8", - "ocelotDockerVersionTag": "1.0.8-182", + "ocelotDockerVersionTag": "1.0.8-184", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From a9d43d88e5c24d10cd3737eb4b7ee7781703fcf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 18 Jul 2022 18:38:30 +0200 Subject: [PATCH 202/344] Fix 'apiVersion: cert-manager.io/v1alpha2' to '*/v1' --- .../kubernetes/templates/issuer/letsencrypt-production.yaml | 2 +- deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml index 2836cceff..6f82f3686 100644 --- a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml +++ b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml @@ -1,4 +1,4 @@ -apiVersion: cert-manager.io/v1alpha2 +apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-production diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml index 7190e6553..e488d9335 100644 --- a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml +++ b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml @@ -1,4 +1,4 @@ -apiVersion: cert-manager.io/v1alpha2 +apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging From f09a32d0d19f984a186cf343c54560b3d6e07e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 08:28:13 +0200 Subject: [PATCH 203/344] Implement 'PRODUCTION_DB_CLEAN_ALLOW' for production environments on staging servers --- deployment/kubernetes/templates/backend/ConfigMap.yml | 1 + deployment/kubernetes/values.template.yaml | 1 + docker-compose.ocelotsocial-branded.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/kubernetes/templates/backend/ConfigMap.yml index 4ea065c01..a4c8405f0 100644 --- a/deployment/kubernetes/templates/backend/ConfigMap.yml +++ b/deployment/kubernetes/templates/backend/ConfigMap.yml @@ -11,6 +11,7 @@ metadata: 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 }}" CLIENT_URI: "{{ .Values.BACKEND.CLIENT_URI }}" diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 921ce3cde..9b5b751dc 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -1,6 +1,7 @@ # please duplicate template file and rename to "values.yaml" and fill in your value # change all the below if needed +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) diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml index 7591b4a3a..9d678ecff 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.ocelotsocial-branded.yml @@ -45,6 +45,7 @@ services: - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 - EMAIL_SUPPORT=support@wir.social - EMAIL_DEFAULT_SENDER=info@wir.social + - PRODUCTION_DB_CLEAN_ALLOW=true # because this is stage.ocelot.social # false # only true for production environments on staging servers - PUBLIC_REGISTRATION=true - SMTP_USERNAME=${SMTP_USERNAME} - SMTP_PASSWORD=${SMTP_PASSWORD} From 0317d44adee9db47eb59aca3e49c124003dca107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 09:37:16 +0200 Subject: [PATCH 204/344] Set push branch temporary to this branch as well --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0fde053ed..c89ab3f5b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - # - 14-new-deployment-with-base-and-code # for testing while developing + - 5065-automatic-deployment-to-stage.ocelot.social-on-push-to-master-branch # for testing while developing jobs: ############################################################################## From efc78594de545471b9498b1203681aa0b95d1a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 09:38:50 +0200 Subject: [PATCH 205/344] Add Documentation for 'Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster' --- deployment/kubernetes/README.md | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index c519cb06d..e14ab4015 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -225,3 +225,50 @@ support, try this [helm chart](https://github.com/helm/charts/tree/master/stable 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 dist/db/clean.js" +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/seed.js" + +``` From eafc73dc0f449827598a538dc85518acdf5e7226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 09:51:30 +0200 Subject: [PATCH 206/344] Comment out 'PRODUCTION_DB_CLEAN_ALLOW' in 'docker-compose.ocelotsocial-branded.yml' --- docker-compose.ocelotsocial-branded.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml index 9d678ecff..b8c3ce43d 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.ocelotsocial-branded.yml @@ -45,7 +45,7 @@ services: - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 - EMAIL_SUPPORT=support@wir.social - EMAIL_DEFAULT_SENDER=info@wir.social - - PRODUCTION_DB_CLEAN_ALLOW=true # because this is stage.ocelot.social # false # only true for production environments on staging servers + # - PRODUCTION_DB_CLEAN_ALLOW=false # only true for production environments on staging servers - PUBLIC_REGISTRATION=true - SMTP_USERNAME=${SMTP_USERNAME} - SMTP_PASSWORD=${SMTP_PASSWORD} From ac19f5959c6ad7c3a322e4ebf27c02aa7b57de0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 09:52:56 +0200 Subject: [PATCH 207/344] Comment out 'PRODUCTION_DB_CLEAN_ALLOW' in 'docker-compose.yml' --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 5610511ce..285a0d374 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -54,6 +54,7 @@ services: - 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 - SMTP_USERNAME=${SMTP_USERNAME} - SMTP_PASSWORD=${SMTP_PASSWORD} From 126c92480b8b55e742799838bac83a7a5013d2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 10:00:55 +0200 Subject: [PATCH 208/344] Fix changing of push branch temporary to this branch as well --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c89ab3f5b..ce08ee14b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 5065-automatic-deployment-to-stage.ocelot.social-on-push-to-master-branch # for testing while developing + - 55-implement-PRODUCTION_DB_CLEAN_ALLOW-for-staging-production-evironments # for testing while developing jobs: ############################################################################## From a44f00310490aa20c128e15ea7c9185e43898e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 10:11:35 +0200 Subject: [PATCH 209/344] Add Docker Compose override for Apple M1 --- docker-compose.apple-m1.override.yml | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docker-compose.apple-m1.override.yml diff --git a/docker-compose.apple-m1.override.yml b/docker-compose.apple-m1.override.yml new file mode 100644 index 000000000..80344e49f --- /dev/null +++ b/docker-compose.apple-m1.override.yml @@ -0,0 +1,36 @@ +# This docker-compose file is just here for testing + +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 From b36eb508a64363ef7b3a60ad2bd040765cabd7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 10:45:38 +0200 Subject: [PATCH 210/344] Document Docker Compose override for Apple M1 --- docker/DOCKER_MORE_CLOSELY.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docker/DOCKER_MORE_CLOSELY.md diff --git a/docker/DOCKER_MORE_CLOSELY.md b/docker/DOCKER_MORE_CLOSELY.md new file mode 100644 index 000000000..113e3a4da --- /dev/null +++ b/docker/DOCKER_MORE_CLOSELY.md @@ -0,0 +1,33 @@ +# Docker + +## Apple M1 Platform + +***Attention:** For using Docker commands in Apple M1 environments!* + +```bash +# set env variable for your shell +$ export DOCKER_DEFAULT_PLATFORM=linux/amd64 +``` + +For even more informations, see [Docker More Closely](#docker-more-closely) + +### Docker Compose Override File For Apple M1 Platform + +For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform: + +```bash +# in main folder + +# for production +$ docker compose -f docker-compose.yml -f docker-compose.apple-m1.override.yml up + +# for production testing Docker images from DockerHub +$ docker compose -f docker-compose.ocelotsocial-branded.yml -f docker-compose.apple-m1.override.yml up + +# only once: init admin user and create indexes and contraints in Neo4j database +$ docker compose exec backend /bin/sh -c "yarn prod:migrate init" +``` + +## Docker More Closely In Main Code + +To get more informations about the Apple M1 platform and to analyze the Docker builds etc. you find our documentation in our main code, [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/DOCKER_MORE_CLOSELY.md). From 0adbe7696b8540814367f614ad230995150a7377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 14:50:07 +0200 Subject: [PATCH 211/344] Change back to only publish on master branch push --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ce08ee14b..2743a25df 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 55-implement-PRODUCTION_DB_CLEAN_ALLOW-for-staging-production-evironments # for testing while developing + # - 55-implement-PRODUCTION_DB_CLEAN_ALLOW-for-staging-production-evironments # for testing while developing jobs: ############################################################################## From 92007dfb7452a1b072dd8f927ae2ada9d4407dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 14:53:10 +0200 Subject: [PATCH 212/344] Change document by accumulate Neo4j db 'clean.js' and 'seed.js' and make the node calls await with flag '--experimental-repl-await' in 'publish.yml' --- deployment/kubernetes/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index e14ab4015..1a9a762b9 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -268,7 +268,7 @@ $ kubectl -n default rollout status deployment/ocelot-neo4j --timeout=240s $ kubectl config get-contexts # reset and seed Neo4j database via backend for staging -$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/clean.js" -$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node dist/db/seed.js" +$ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node --experimental-repl-await dist/db/clean.js && node --experimental-repl-await dist/db/seed.js" + ``` From eb8d3903a289177127075dcb56b75202639fa2aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 20 Jul 2022 16:17:24 +0200 Subject: [PATCH 213/344] Release v1.0.9-199 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 57fcb263c..da08624e6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.8", - "ocelotDockerVersionTag": "1.0.8-184", + "version": "1.0.9", + "ocelotDockerVersionTag": "1.0.9-199", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 7afb2d688e390c61a985ad3b87b8f4d5da14158f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 25 Jul 2022 18:07:53 +0200 Subject: [PATCH 214/344] Update issue templates --- .github/ISSUE_TEMPLATE/---bug-report.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/---devops-ticket.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/---epic.md | 15 +++++++++++++++ .github/ISSUE_TEMPLATE/---feature-request.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/---question.md | 15 +++++++++++++++ .github/ISSUE_TEMPLATE/---refactor.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/custom.md | 10 ++++++++++ 7 files changed, 84 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/---bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/---devops-ticket.md create mode 100644 .github/ISSUE_TEMPLATE/---epic.md create mode 100644 .github/ISSUE_TEMPLATE/---feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/---question.md create mode 100644 .github/ISSUE_TEMPLATE/---refactor.md create mode 100644 .github/ISSUE_TEMPLATE/custom.md diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md new file mode 100644 index 000000000..602283ac7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---bug-report.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F41B Bug Report" +about: Create a report to help us improve +title: "\U0001F41B [Bug] XXX" +labels: bug +assignees: '' + +--- + +## :bug: Bug Report + diff --git a/.github/ISSUE_TEMPLATE/---devops-ticket.md b/.github/ISSUE_TEMPLATE/---devops-ticket.md new file mode 100644 index 000000000..a382d1f19 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---devops-ticket.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F4A5 DevOps Ticket" +about: Help us manage our deployed app. +title: "\U0001F4A5 [DevOps] XXX" +labels: '' +assignees: '' + +--- + +## 💥 DevOps Ticket + diff --git a/.github/ISSUE_TEMPLATE/---epic.md b/.github/ISSUE_TEMPLATE/---epic.md new file mode 100644 index 000000000..8dcb1952c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---epic.md @@ -0,0 +1,15 @@ +--- +name: "\U0001F31F Epic" +about: Define a big development step. +title: "\U0001F31F [EPIC] XXX" +labels: '' +assignees: '' + +--- + + + + +## 🌟 EPIC + diff --git a/.github/ISSUE_TEMPLATE/---feature-request.md b/.github/ISSUE_TEMPLATE/---feature-request.md new file mode 100644 index 000000000..f387d7703 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---feature-request.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F680 Feature Request" +about: Suggest an idea for this project. +title: "\U0001F680 [Feature] XXX" +labels: enhancement +assignees: '' + +--- + +## :rocket: Feature Request + diff --git a/.github/ISSUE_TEMPLATE/---question.md b/.github/ISSUE_TEMPLATE/---question.md new file mode 100644 index 000000000..cbbcaaa9c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---question.md @@ -0,0 +1,15 @@ +--- +name: "\U0001F4AC Question" +about: If you need help understanding ocelot.social. +title: "\U0001F4AC [Question] XXX" +labels: '' +assignees: '' + +--- + + + + +## 💬 Question + diff --git a/.github/ISSUE_TEMPLATE/---refactor.md b/.github/ISSUE_TEMPLATE/---refactor.md new file mode 100644 index 000000000..fb1ac4e61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---refactor.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F527 Refactor" +about: Help us improve our code by refactoring it. +title: "\U0001F527 [Refactor] XXX" +labels: enhancement +assignees: '' + +--- + +## 🔧 Refactor + diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 000000000..48d5f81fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + From 1d7f3988cb6116c2511a7a333fec392ef003d740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 25 Jul 2022 18:08:13 +0200 Subject: [PATCH 215/344] Update issue templates --- .github/ISSUE_TEMPLATE/---bug-report.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/---devops-ticket.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/---epic.md | 13 +++++++++++++ .github/ISSUE_TEMPLATE/---feature-request.md | 11 +++++++++++ .github/ISSUE_TEMPLATE/---question.md | 14 ++++++++++++++ .github/ISSUE_TEMPLATE/---refactor.md | 11 +++++++++++ 6 files changed, 71 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/---bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/---devops-ticket.md create mode 100644 .github/ISSUE_TEMPLATE/---epic.md create mode 100644 .github/ISSUE_TEMPLATE/---feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/---question.md create mode 100644 .github/ISSUE_TEMPLATE/---refactor.md diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md new file mode 100644 index 000000000..602283ac7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---bug-report.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F41B Bug Report" +about: Create a report to help us improve +title: "\U0001F41B [Bug] XXX" +labels: bug +assignees: '' + +--- + +## :bug: Bug Report + diff --git a/.github/ISSUE_TEMPLATE/---devops-ticket.md b/.github/ISSUE_TEMPLATE/---devops-ticket.md new file mode 100644 index 000000000..a382d1f19 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---devops-ticket.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F4A5 DevOps Ticket" +about: Help us manage our deployed app. +title: "\U0001F4A5 [DevOps] XXX" +labels: '' +assignees: '' + +--- + +## 💥 DevOps Ticket + diff --git a/.github/ISSUE_TEMPLATE/---epic.md b/.github/ISSUE_TEMPLATE/---epic.md new file mode 100644 index 000000000..5099f6a28 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---epic.md @@ -0,0 +1,13 @@ +--- +name: "\U0001F31F Epic" +about: Define a big development step. +title: "\U0001F31F [EPIC] XXX" +labels: '' +assignees: '' + +--- + + + +## 🌟 EPIC + diff --git a/.github/ISSUE_TEMPLATE/---feature-request.md b/.github/ISSUE_TEMPLATE/---feature-request.md new file mode 100644 index 000000000..f387d7703 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---feature-request.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F680 Feature Request" +about: Suggest an idea for this project. +title: "\U0001F680 [Feature] XXX" +labels: enhancement +assignees: '' + +--- + +## :rocket: Feature Request + diff --git a/.github/ISSUE_TEMPLATE/---question.md b/.github/ISSUE_TEMPLATE/---question.md new file mode 100644 index 000000000..0ac81f92f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---question.md @@ -0,0 +1,14 @@ +--- +name: "\U0001F4AC Question" +about: If you need help understanding ocelot.social. +title: "\U0001F4AC [Question] XXX" +labels: '' +assignees: '' + +--- + + + + +## 💬 Question + diff --git a/.github/ISSUE_TEMPLATE/---refactor.md b/.github/ISSUE_TEMPLATE/---refactor.md new file mode 100644 index 000000000..fb1ac4e61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---refactor.md @@ -0,0 +1,11 @@ +--- +name: "\U0001F527 Refactor" +about: Help us improve our code by refactoring it. +title: "\U0001F527 [Refactor] XXX" +labels: enhancement +assignees: '' + +--- + +## 🔧 Refactor + From 323b73680a0efe0f7abdde6bc3513a7bc8466fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 3 Aug 2022 15:50:21 +0200 Subject: [PATCH 216/344] Add 'CATEGORIES_ACTIVE' config --- TODO-next-update.md | 7 +++++++ deployment/kubernetes/templates/backend/ConfigMap.yml | 1 + deployment/kubernetes/templates/webapp/ConfigMap.yml | 1 + deployment/kubernetes/values.template.yaml | 1 + 4 files changed, 10 insertions(+) diff --git a/TODO-next-update.md b/TODO-next-update.md index b27f5f1e0..59bbf8363 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,6 +2,13 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … +## This Latest Version > 1.0.9 with 'ocelotDockerVersionTag' 1.0.9-199 + +### 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 prevered value. +- Make sure the correct categories are in your Neo4j database on the server. + ## This Latest Version > 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 ### PR – feat: 🍰 Configure Cookie Expire Time #43 diff --git a/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/kubernetes/templates/backend/ConfigMap.yml index a4c8405f0..1222b0da0 100644 --- a/deployment/kubernetes/templates/backend/ConfigMap.yml +++ b/deployment/kubernetes/templates/backend/ConfigMap.yml @@ -14,6 +14,7 @@ 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 }}" diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml index 685f67675..762b355cc 100644 --- a/deployment/kubernetes/templates/webapp/ConfigMap.yml +++ b/deployment/kubernetes/templates/webapp/ConfigMap.yml @@ -14,6 +14,7 @@ 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/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 9b5b751dc..e601f1ae6 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -5,6 +5,7 @@ PRODUCTION_DB_CLEAN_ALLOW: false # only true for production environments on stag 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 From b094bdb27822112a80796978af74c07b6fa9f5a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 4 Aug 2022 06:18:18 +0200 Subject: [PATCH 217/344] Refine 'TODO-next-update.md' --- TODO-next-update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO-next-update.md b/TODO-next-update.md index 59bbf8363..f05dfcbf2 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,7 +2,7 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … -## This Latest Version > 1.0.9 with 'ocelotDockerVersionTag' 1.0.9-199 +## This Latest Version >= 1.1.0 with 'ocelotDockerVersionTag' 1.1.0-205 ### PR – chore: 🍰 Release v1.1.0 - Implement Categories Again #63 From bfa39422385fcfa32842918020268128d69c60db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 4 Aug 2022 06:19:03 +0200 Subject: [PATCH 218/344] Release v1.1.0-205 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index da08624e6..1bbd611c5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.9", - "ocelotDockerVersionTag": "1.0.9-199", + "version": "1.1.0", + "ocelotDockerVersionTag": "1.1.0-205", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 0285c4c622891463fe2fe944bbc2b9d7e10035ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Sep 2022 15:01:51 +0200 Subject: [PATCH 219/344] Add documentation for `PRODUCTION_DB_CLEAN_ALLOW` --- TODO-next-update.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TODO-next-update.md b/TODO-next-update.md index 458536484..c324ad95f 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,10 +2,12 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … -## Version > 1.0.8 with 'ocelotDockerVersionTag' 1.0.8-182 +## Version 1.0.9 with 'ocelotDockerVersionTag' 1.0.9-199 ### Deployment/Rebranding PR – chore: [WIP] 🍰 Refine docs, first step #46 +- PR: `chore: 🍰 Implement PRODUCTION_DB_CLEAN_ALLOW for Staging Production Environments #56` + - Copy `PRODUCTION_DB_CLEAN_ALLOW` from `values.template.yaml` to `values.yaml` and set it to `false` for production envireonments and only for several stage test servers to `true`. - Commit: `Update cert-manager apiVersion "cert-manager.io/v1alpha2" to "cert-manager.io/v1" - Check for `kubectl` and `helm` versions. From c68499c2a8adde36bd9d9d2cf4221e7332a74bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Sep 2022 15:39:44 +0200 Subject: [PATCH 220/344] Remove live networks --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index a57f1840a..9b70d3a8c 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,6 @@ Logins: | `moderator@example.org` | 1234 | moderator | | `admin@example.org` | 1234 | admin | -Deployed networks can be found [here](#list-of-deployed-networks). - ## Usage Fork this repository to configure and rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. @@ -130,20 +128,6 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/) BrowserStack Logo --> -## List Of Deployed Networks - -You may need an invitation to access a network. - -### More Likely To Try - -- [wir.social](https://wir.social) - -### Others - -- [freilernen.social](https://freilernen.social) -- [helfa.social](https://helfa.social) -- [sender.fm](https://sender.fm) - ## License See the [LICENSE](/LICENSE.md) file for license rights and limitations (MIT). From ba4ad7550851e9bbfc2eb586a1c668e262b1865e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Sep 2022 16:25:31 +0200 Subject: [PATCH 221/344] Refine main readme for cert-manager and kubectl version --- deployment/kubernetes/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index 868676dc1..0f7ecd20f 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -46,6 +46,10 @@ 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 and update +#### 1. Add Helm repository for `ingress-nginx` and update ```bash $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx @@ -160,7 +164,7 @@ $ doctl compute firewall get --context 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 and update +#### 1. Add Helm repository for `binami` and update ```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami From 8d6a80cc3a24c35c97a0e747267a432a1b8e9e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Sep 2022 16:48:59 +0200 Subject: [PATCH 222/344] Release v1.1.0-225 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bbd611c5..021f7ca5a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.1.0", - "ocelotDockerVersionTag": "1.1.0-205", + "ocelotDockerVersionTag": "1.1.0-225", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 239faa1acf698c70ec4a4917f5e1fc3bd42e0d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 13 Sep 2022 16:53:41 +0200 Subject: [PATCH 223/344] Refine installation partly before pull main deploy repo --- .../kubernetes/templates/issuer/letsencrypt-production.yaml | 2 +- deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml index 2836cceff..6f82f3686 100644 --- a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml +++ b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml @@ -1,4 +1,4 @@ -apiVersion: cert-manager.io/v1alpha2 +apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-production diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml index 7190e6553..e488d9335 100644 --- a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml +++ b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml @@ -1,4 +1,4 @@ -apiVersion: cert-manager.io/v1alpha2 +apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging diff --git a/package.json b/package.json index d98284468..c87a9371d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "yunite.net", "version": "1.0.8", "ocelotDockerVersionTag": "1.0.8-182", - "dockerOrganisation": "XXX", + "dockerOrganisation": "tirokk", "description": "yunite.net Branded", "author": "yunite.net Community", "license": "MIT", From 5d5ac673fd9b5f80d4bb68635eee5dee491d7ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 20 Sep 2022 08:41:25 +0200 Subject: [PATCH 224/344] Ignore value.yaml files of the different deploys --- deployment/kubernetes/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/kubernetes/.gitignore b/deployment/kubernetes/.gitignore index e0473b0fd..092cda60e 100644 --- a/deployment/kubernetes/.gitignore +++ b/deployment/kubernetes/.gitignore @@ -1,3 +1,4 @@ /dns.values.yaml /nginx.values.yaml /values.yaml +/values*-ME.yaml \ No newline at end of file From 870fe89a80ca031782629a60aff3ccfbe134797c Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 22 Sep 2022 19:49:24 +0200 Subject: [PATCH 225/344] refactor rebranding --- branding/assets/styles/import/_branding.scss | 5 +++++ branding/constants/headerMenu.js | 12 ++++++++++++ branding/constants/logos.js | 1 + docker-compose.ocelotsocial-branded.yml | 4 ++++ docker-compose.yml | 4 ++++ docker/webapp.Dockerfile | 2 ++ 6 files changed, 28 insertions(+) create mode 100644 branding/assets/styles/import/_branding.scss create mode 100644 branding/constants/headerMenu.js diff --git a/branding/assets/styles/import/_branding.scss b/branding/assets/styles/import/_branding.scss new file mode 100644 index 000000000..75058595d --- /dev/null +++ b/branding/assets/styles/import/_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/branding/constants/headerMenu.js b/branding/constants/headerMenu.js new file mode 100644 index 000000000..33cba8d5c --- /dev/null +++ b/branding/constants/headerMenu.js @@ -0,0 +1,12 @@ +export default { + MENU: [ + // { + // name: 'Beiträge', + // path: '/#', + // }, + // { + // name: 'Über Yunite', + // url: 'https://yunite.org', + // }, + ], +} diff --git a/branding/constants/logos.js b/branding/constants/logos.js index d093c7b46..2bea199da 100644 --- a/branding/constants/logos.js +++ b/branding/constants/logos.js @@ -2,6 +2,7 @@ // this are the paths in the webapp export default { LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', + LOGO_HEADER_WIDTH: '130px', LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg', diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml index b8c3ce43d..0c42d6273 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.ocelotsocial-branded.yml @@ -21,6 +21,8 @@ services: - 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 ############################################## @@ -47,6 +49,8 @@ services: - 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 diff --git a/docker-compose.yml b/docker-compose.yml index 285a0d374..535d485be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,6 +26,8 @@ services: - 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 ############################################## @@ -56,6 +58,8 @@ services: - 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 diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 1d7ee67c3..81748e08f 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -13,6 +13,7 @@ FROM $APP_IMAGE_CODE as code COPY branding/static/ static/ COPY branding/constants/ constants/ COPY branding/locales/ locales/ +COPY branding/assets/styles/imports/ assets/styles/imports/ ################################################################################## # BUILD ########################################################################## @@ -41,6 +42,7 @@ 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 package.json for script definitions (lock file should not be needed) COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json From 5f967f563a37bda6d1dd8db1e80fc4b81607b5fd Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 22 Sep 2022 20:48:40 +0200 Subject: [PATCH 226/344] update package.json to v1.1.1 -228 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 021f7ca5a..61afb1f1b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.1.0", - "ocelotDockerVersionTag": "1.1.0-225", + "version": "1.1.1", + "ocelotDockerVersionTag": "1.1.1-228", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From e0b2b098cfc544c6704a023c9ee54558a31ecc66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 23 Sep 2022 07:20:14 +0200 Subject: [PATCH 227/344] Fix folder name from `branding/assets/styles/import` to `branding/assets/styles/imports` --- branding/assets/styles/{import => imports}/_branding.scss | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename branding/assets/styles/{import => imports}/_branding.scss (100%) diff --git a/branding/assets/styles/import/_branding.scss b/branding/assets/styles/imports/_branding.scss similarity index 100% rename from branding/assets/styles/import/_branding.scss rename to branding/assets/styles/imports/_branding.scss From 0f2785828456d9bb9d3953e9f53ba362d85a1f47 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 23 Sep 2022 08:45:41 +0200 Subject: [PATCH 228/344] resolve conflicts --- branding/assets/styles/imports/_branding.scss | 28 ++++++ branding/constants/emails.js | 8 +- branding/constants/headerMenu.js | 16 ++-- branding/constants/links.js | 38 ++++---- branding/constants/logos.js | 2 +- branding/constants/metadata.js | 10 +- branding/static/favicon.ico | Bin 5558 -> 5558 bytes branding/static/icon.png | Bin 21631 -> 7958 bytes .../static/img/custom/logo-horizontal.svg | 81 ++-------------- branding/static/img/custom/logo-squared.svg | 87 ++---------------- 10 files changed, 83 insertions(+), 187 deletions(-) create mode 100644 branding/assets/styles/imports/_branding.scss diff --git a/branding/assets/styles/imports/_branding.scss b/branding/assets/styles/imports/_branding.scss new file mode 100644 index 000000000..5f6607013 --- /dev/null +++ b/branding/assets/styles/imports/_branding.scss @@ -0,0 +1,28 @@ +/* + * + * Here, all SCSS variables and classes can be adapted to your custom design. + * +*/ + +$color-primary: #6e8b87; +$color-primary-light: #a6ff00; + +$color-header-background: $color-primary; +$color-footer-background: $color-primary-light; + +$color-locale-menu: $color-primary-light; + +.main-navigation a { + color: $color-primary-light; +} +.main-navigation a:hover { + color: $color-neutral-100; +} + +.main-navigation .locale-menu { + color: $color-primary-light; +} + +.main-navigation .base-button { + color: $color-primary-light; +} \ No newline at end of file diff --git a/branding/constants/emails.js b/branding/constants/emails.js index f5bd9a4a6..d64a9e772 100644 --- a/branding/constants/emails.js +++ b/branding/constants/emails.js @@ -1,8 +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', + SUPPORT_EMAIL: 'support@yunite.org', + MODERATION_EMAIL: 'hello@yunite.org', // 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', + ORGANIZATION_LINK: 'https://yunite.org', + SUPPORT_LINK: 'https://yunite.org', } diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index 33cba8d5c..c95e79122 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -1,12 +1,12 @@ export default { MENU: [ - // { - // name: 'Beiträge', - // path: '/#', - // }, - // { - // name: 'Über Yunite', - // url: 'https://yunite.org', - // }, + { + name: 'Beiträge', + path: '/#', + }, + { + name: 'Über Yunite', + url: 'https://yunite.org', + }, ], } diff --git a/branding/constants/links.js b/branding/constants/links.js index 9cbc605c0..4d27e9669 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -3,7 +3,7 @@ import { defaultPageParamsPages } from '~/components/utils/InternalPages.js' const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ - externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.made', // localized string identifier, if undefined default is used @@ -12,12 +12,12 @@ const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const DONATE = defaultPageParamsPages.DONATE.overwrite({ // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - externalLink: 'https://ocelot-social.herokuapp.com/donations', // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org/brand-guidelines/', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.donate', // localized string identifier, if undefined default is used @@ -26,12 +26,12 @@ const DONATE = defaultPageParamsPages.DONATE.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - externalLink: 'https://ocelot-social.herokuapp.com/imprint', // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org/impressum/', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.imprint', // localized string identifier, if undefined default is used @@ -40,7 +40,7 @@ const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwrite({ @@ -53,11 +53,11 @@ const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwri hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org/ueber-yunite/unsere-werte/', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used @@ -66,11 +66,11 @@ const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org/datenschutz/', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.data-privacy', // localized string identifier, if undefined default is used @@ -79,11 +79,11 @@ const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const FAQ = defaultPageParamsPages.FAQ.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org/ueber-yunite/faq-hilfe/', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.faq', // localized string identifier, if undefined default is used @@ -92,11 +92,11 @@ const FAQ = defaultPageParamsPages.FAQ.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ - externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + // externalLink: '', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.support', // localized string identifier, if undefined default is used @@ -105,7 +105,7 @@ const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'branding/locales/html/' + // in case internal page content is here 'webapp/locales/html/' }, }) @@ -125,12 +125,12 @@ export default { FOOTER_LINK_LIST: [ ORGANIZATION, - TERMS_AND_CONDITIONS, + // TERMS_AND_CONDITIONS, CODE_OF_CONDUCT, DATA_PRIVACY, FAQ, - DONATE, + // DONATE, + // SUPPORT, IMPRINT, - SUPPORT, ], -} +} \ No newline at end of file diff --git a/branding/constants/logos.js b/branding/constants/logos.js index 2bea199da..75ac91b30 100644 --- a/branding/constants/logos.js +++ b/branding/constants/logos.js @@ -2,7 +2,7 @@ // this are the paths in the webapp export default { LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', - LOGO_HEADER_WIDTH: '130px', + LOGO_HEADER_WIDTH: '47px', LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg', diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 3d09066d5..623612dab 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,9 +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', + APPLICATION_NAME: 'yunite.me', + APPLICATION_SHORT_NAME: 'yunite.me', + APPLICATION_DESCRIPTION: 'Yunite Community', COOKIE_NAME: 'ocelot-social-token', - ORGANIZATION_NAME: 'busFaktor e.V.', - ORGANIZATION_JURISDICTION: 'Deutschland', + ORGANIZATION_NAME: 'Verein Corona-Reset', + ORGANIZATION_JURISDICTION: 'Switzerland', } diff --git a/branding/static/favicon.ico b/branding/static/favicon.ico index 430cef437289d45eaceaa1d096a3674fccbf62cc..0f8dc3ea6fe96277c031128c682cfdcbe9d67a60 100644 GIT binary patch literal 5558 zcmds5X=oi)6rL<%^;gnG1%DV7Bxn^}sy`H$KWbG3e~1>5RuDC7+t?&+>e7;zzASAP zu}N(bmtri1wxP}P-po^DQ&3!fsI4GM!3CwbRuHVz_Zk`!9x!mcsUGU>vr@{t+~7$-837gh%8#$2H1O7CQ4CGO-A@YAs2f zaIuKv5DS#dAkJ~k_(dJ+!p2;NB(4MQQA^%~%~S?fCU(&O)KOj7fUSInB<=&|PwqPh z+2$PI*H2+`+#}k8%_u|cm5~1vv4dW)&7!GnhfXN}r#h{aJ?Fz><@6PA^@mVK{No?L5_LN&o z&K17aEnu2^OyfbHB9JYMe?KT&yVpx=do8F&w)E6V$sfberQIktD5G}??#<*A`Q#qY z$c@JaWP7|y;vKb0y$*vG%S6k?-*Q zDS%A&cQ?83)gQ%=Qhyy;_UnFW?p&wmjyZqLSFbCP=UHs-S|>|>I{^G#IgnX@quf6! zxdrzf-?bI{9mBpa1r~`pz`5;MTk&~+jy(vtf7}@4xPKjae7Hr=9rJHP|3%}>xJm z#n6lL=NYW{h(@(z+*1gkcp)@!=2DU5Bv_!=cGsEImb1~1P!svQCp5#as;xD6yUpy zwTMLCtvk8~8OZvFi+kMPZ=QE%3^lt!iTv!{&AMSzcGeF`z%SaKtuIAW<8s#rFDsGv zueq|&;gCZYV-58;{ca*=-9VGn4K_(SJ~31lI@GlvaAP%#O)Tm(?rPNjuQ<(rBgdFh z*RDDH`_`7yQ^VTJv!4&{;dx(DH%LDvHyj_-o`8Kpa1TDCAK-sVR*l3ZhMtD>XkZU* z{LhS^t^MwEJ2%Lh12IsuY~ER)(F6P9r+eVvKS!?kZb-Uf6>|GWy-Hp9Jt4h^l#5Osl*@kDE5&EVmB=r{ez@m>Ii8Wf h)aP*XnCHj)jfycQnY%8_`Ef0{f9HCB{Wc=<{{nFHQI7xs literal 5558 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 diff --git a/branding/static/icon.png b/branding/static/icon.png index 1c81fa5fca1a415323627f025eb8a68fbc2a6b79..8a3da6f6014ab8e257a8b5d3a88618216e7eab3b 100644 GIT binary patch delta 6718 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/logo-squared.svg b/branding/static/img/custom/logo-squared.svg index 15f420c79..6c12acd28 100644 --- a/branding/static/img/custom/logo-squared.svg +++ b/branding/static/img/custom/logo-squared.svg @@ -1,82 +1,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + From 3f59926a75e43f472d560f2fe23689f314b11144 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 23 Sep 2022 08:53:20 +0200 Subject: [PATCH 229/344] change neo4j image path docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 535d485be..519c9a9e8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -87,7 +87,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-branded:local-production + image: ocelotsocialnetwork/neo4j-community-branded:latest networks: - test-network volumes: From d14fd3f47ad39054f0b1c837c31bd6e40b277810 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:09:56 +0200 Subject: [PATCH 230/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 4d27e9669..dff55e7c6 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -26,7 +26,7 @@ const DONATE = defaultPageParamsPages.DONATE.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ From 3ea522ff2a06a4cc8a9ad700ce9edf9fcd9a8747 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:10:03 +0200 Subject: [PATCH 231/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index dff55e7c6..65916bbe4 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -40,7 +40,7 @@ const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwrite({ From af6a7ee06334b83a74b0e620c31d2057ba1fe240 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:10:10 +0200 Subject: [PATCH 232/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 65916bbe4..afadb77c4 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -53,7 +53,7 @@ const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwri hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ From 5c134140f76a1657dff8837f86968b4e29a146aa Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:10:15 +0200 Subject: [PATCH 233/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index afadb77c4..a3229c79e 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -66,7 +66,7 @@ const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ From f764a5e840070252bc83a9d7bb91edf05b6756e3 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:10:21 +0200 Subject: [PATCH 234/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index a3229c79e..4ce3ea19d 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -79,7 +79,7 @@ const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const FAQ = defaultPageParamsPages.FAQ.overwrite({ From b44ab6ff930924b952a2931570ba3c85993e3cc7 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:10:26 +0200 Subject: [PATCH 235/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 4ce3ea19d..3c67cb7f9 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -92,7 +92,7 @@ const FAQ = defaultPageParamsPages.FAQ.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ From a9b1ab8e2c7e491e570d171611f8594d97973205 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 23 Sep 2022 09:10:31 +0200 Subject: [PATCH 236/344] Update branding/constants/links.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- branding/constants/links.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 3c67cb7f9..7e89159eb 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -105,7 +105,7 @@ const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) From 48860b7c701e1ffec83f7c6d63bbbc3220a3f70f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 23 Sep 2022 12:37:24 +0200 Subject: [PATCH 237/344] Add '/dns.values*-ME.yaml' to .gitignore --- deployment/kubernetes/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/kubernetes/.gitignore b/deployment/kubernetes/.gitignore index 092cda60e..3bcb187b9 100644 --- a/deployment/kubernetes/.gitignore +++ b/deployment/kubernetes/.gitignore @@ -1,4 +1,5 @@ /dns.values.yaml +/dns.values*-ME.yaml /nginx.values.yaml /values.yaml /values*-ME.yaml \ No newline at end of file From 7e05f2e82ab81a24bb077382e0688296a9e36e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 14:52:22 +0200 Subject: [PATCH 238/344] Implement automatic deployment for groups branch `5059-epic-groups` for Yunite branding --- .github/workflows/publish.yml | 106 ++++++++++++++++++++++++++++------ 1 file changed, 89 insertions(+), 17 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2743a25df..3d067c5a5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,8 +3,8 @@ name: ocelot.social publish branded CI on: push: branches: - - master - # - 55-implement-PRODUCTION_DB_CLEAN_ALLOW-for-staging-production-evironments # for testing while developing + # - master + - 5059-epic-groups # for testing while developing jobs: ############################################################################## @@ -83,13 +83,13 @@ jobs: ########################################################################## - name: Backend | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-groups-branded:latest" -t "${DOCKER_ORGANISATION}/backend-groups-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-groups-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/backend-groups" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker save "${DOCKER_ORGANISATION}/backend-groups-branded" > /tmp/backend-groups-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: docker-backend-branded - path: /tmp/backend-branded.tar + path: /tmp/backend-groups-branded.tar ############################################################################## # JOB: DOCKER BUILD BRANDED WEBAPP ########################################### @@ -125,13 +125,13 @@ jobs: ########################################################################## - name: Webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-groups-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-groups-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-groups-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/webapp-groups" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker save "${DOCKER_ORGANISATION}/webapp-groups-branded" > /tmp/webapp-groups-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: docker-webapp-branded - path: /tmp/webapp-branded.tar + path: /tmp/webapp-groups-branded.tar ############################################################################## # JOB: DOCKER BUILD BRANDED MAINTENANCE ###################################### @@ -167,13 +167,13 @@ jobs: ########################################################################## - name: Maintenance | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-groups-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-groups-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-groups-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/maintenance-groups" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker save "${DOCKER_ORGANISATION}/maintenance-groups-branded" > /tmp/maintenance-groups-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: docker-maintenance-branded - path: /tmp/maintenance-branded.tar + path: /tmp/maintenance-groups-branded.tar ############################################################################## # JOB: UPLOAD TO DOCKERHUB ################################################### @@ -225,7 +225,7 @@ jobs: name: docker-backend-branded path: /tmp - name: Load Docker Image - run: docker load < /tmp/backend-branded.tar + run: docker load < /tmp/backend-groups-branded.tar # Webapp - name: Download Docker Image (Webapp) uses: actions/download-artifact@v2 @@ -233,7 +233,7 @@ jobs: name: docker-webapp-branded path: /tmp - name: Load Docker Image - run: docker load < /tmp/webapp-branded.tar + run: docker load < /tmp/webapp-groups-branded.tar # Maintenance - name: Download Docker Image (Maintenance) uses: actions/download-artifact@v2 @@ -241,7 +241,7 @@ jobs: name: docker-maintenance-branded path: /tmp - name: Load Docker Image - run: docker load < /tmp/maintenance-branded.tar + run: docker load < /tmp/maintenance-groups-branded.tar ########################################################################## # Upload ################################################################# ########################################################################## @@ -250,11 +250,83 @@ jobs: - name: Push Neo4j Community run: docker push --all-tags ${DOCKER_ORGANISATION}/neo4j-community-branded - name: Push Backend - run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-branded + run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-groups-branded - name: Push Webapp - run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-branded + run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-groups-branded - name: Push Maintenance - run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-branded + run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-groups-branded + + ############################################################################## + # 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 + run: | + kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp-groups:$BUILD_VERSION + kubectl -n default rollout restart deployment/ocelot-webapp + kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend-groups:$BUILD_VERSION + kubectl -n default rollout restart deployment/ocelot-backend + kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance-groups:$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 regularely 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 deplyment 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: 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" ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# From bb2b4df2763f1340521494e75da8f9bdc0caa8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 16:48:59 +0200 Subject: [PATCH 239/344] Implement automatic deployment for groups branch `5059-epic-groups` for Yunite branding --- .github/workflows/publish.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3d067c5a5..8df86c03f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -274,6 +274,8 @@ jobs: ########################################################################## # SET ENVS ############################################################### ########################################################################## + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - BUILD_VERSION @@ -302,13 +304,13 @@ jobs: # 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-groups:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=${DOCKER_ORGANISATION}/webapp-groups:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-webapp - kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend-groups:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-groups:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-backend - kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance-groups:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups:$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 set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/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. From 34c50967554234604e6005c0c647c9c4cc8c9dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 16:52:43 +0200 Subject: [PATCH 240/344] Change build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dfce46c3c..feb38ece5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "yunite.net", "version": "1.1.1", - "ocelotDockerVersionTag": "1.1.1-228", + "ocelotDockerVersionTag": "1.1.1-229", "dockerOrganisation": "tirokk", "description": "yunite.net Branded", "author": "yunite.net Community", From 3b034679bc873a9b28e40e6c988ae805687bc9e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 17:16:38 +0200 Subject: [PATCH 241/344] Add groups header menu --- branding/constants/headerMenu.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index c95e79122..e6d76d8be 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -4,6 +4,10 @@ export default { name: 'Beiträge', path: '/#', }, + { + name: 'Gruppen', + path: '/my-groups', + }, { name: 'Über Yunite', url: 'https://yunite.org', From c800930ee11f8d7510bcea384d6f33ebe7c153ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 17:17:03 +0200 Subject: [PATCH 242/344] Fix publishing of groups branch --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8df86c03f..b55545166 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -304,11 +304,11 @@ jobs: # 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=${DOCKER_ORGANISATION}/webapp-groups:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=${DOCKER_ORGANISATION}/webapp-groups-branded:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-webapp - kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-groups:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-groups-branded:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-backend - kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups-branded:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-maintenance kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/neo4j-community:$BUILD_VERSION kubectl -n default rollout restart deployment/ocelot-neo4j From 49d89bff9b2df2af3b9c712c7fe189cf556a19ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 19:35:47 +0200 Subject: [PATCH 243/344] Fix publishing of groups branch, again --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b55545166..55933f052 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -288,7 +288,7 @@ jobs: 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 + run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 cluster-stage-yunite-me ########################################################################## # Deploy new Docker images to DigitalOcean Kubernetes cluster ############ ########################################################################## From ca20e11b91680d51a9657eb49fe05b93db76cece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 20:07:25 +0200 Subject: [PATCH 244/344] Fix publishing of groups branch, again, again --- .github/workflows/publish.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 55933f052..9531e783d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -274,12 +274,17 @@ jobs: ########################################################################## # SET ENVS ############################################################### ########################################################################## - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - 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 - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV ########################################################################## # Install DigitalOceans doctl and set kubeconfig ######################### ########################################################################## @@ -304,13 +309,13 @@ jobs: # 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=${DOCKER_ORGANISATION}/webapp-groups-branded:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=${DOCKER_ORGANISATION}/webapp-groups-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-webapp - kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-groups-branded:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-groups-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-backend - kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups-branded:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-maintenance - kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/neo4j-community:$BUILD_VERSION + kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/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. From 0a33fc05b175714e8c60f90e31c20580b47d4e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 20:26:41 +0200 Subject: [PATCH 245/344] Fix 'neo4j-community' name to 'neo4j-community-branded' --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9531e783d..7fa3e608a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -315,7 +315,7 @@ jobs: kubectl -n default rollout restart deployment/ocelot-backend kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-maintenance - kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/neo4j-community:${BUILD_VERSION} + kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/neo4j-community-branded:${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. From ccd039ec6143fe2d4ca43c8e98ac2cbf8707dc81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 26 Sep 2022 21:02:11 +0200 Subject: [PATCH 246/344] Add 'stage.yunite.me' to the live demo list --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b70d3a8c..28dcd80ef 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ __Try out our deployed [development environment](https://stage.ocelot.social).__ Visit our staging networks: -- central staging network: [stage.ocelot.social](https://stage.ocelot.social). +- central staging network: [stage.ocelot.social](https://stage.ocelot.social) +- Yunite staging network: [stage.yunite.me](https://stage.yunite.me) Logins: From 4f5ff1ff36b394c39e77676b30323ab7dbb6ca8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 30 Sep 2022 09:52:09 +0200 Subject: [PATCH 247/344] Release v1.1.1-231 show new group features --- TODO-next-update.md | 8 +++++++- branding/constants/groups.js | 5 +++++ package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 branding/constants/groups.js diff --git a/TODO-next-update.md b/TODO-next-update.md index 4cf3c8d10..844dde5a1 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,11 +2,17 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … +## This Latest Version >= 1.1.1 with 'ocelotDockerVersionTag' 1.1.1-231 + +### Yunite Deployment/Rebranding PR – chore: 🍰 Release v1.1.1-231 - New Group Features #14 + +- You have to add the file `webapp/constants/groups.js` as `branding/constants/groups.js` which should include `SHOW_GROUP_BUTTON_IN_HEADER` set to your needs. + ## This Latest 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 prevered value. +- 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 diff --git a/branding/constants/groups.js b/branding/constants/groups.js new file mode 100644 index 000000000..3b00b2433 --- /dev/null +++ b/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 GROUPNAME_MIN_LENGTH = 3 +export const GROUPNAME_MAX_LENGTH = 50 +export const GROUPDESCRIPTION_WITHOUT_HTML_LENGTH_MIN = 100 // with removed HTML tags +export const SHOW_GROUP_BUTTON_IN_HEADER = false diff --git a/package.json b/package.json index dfce46c3c..1dd33f47e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "yunite.net", "version": "1.1.1", - "ocelotDockerVersionTag": "1.1.1-228", + "ocelotDockerVersionTag": "1.1.1-231", "dockerOrganisation": "tirokk", "description": "yunite.net Branded", "author": "yunite.net Community", From 111b1da00d3d45d0708ca33036d33a2502b3f6a6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 11 Oct 2022 18:59:52 +0200 Subject: [PATCH 248/344] test jq to merge locale files --- docker/webapp.Dockerfile | 3 +++ tools/test/file1.json | 12 ++++++++++++ tools/test/file2.json | 11 +++++++++++ tools/test/result.json | 15 +++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 tools/test/file1.json create mode 100644 tools/test/file2.json create mode 100644 tools/test/result.json diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 81748e08f..5c3f98f6e 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -15,6 +15,9 @@ COPY branding/constants/ constants/ COPY branding/locales/ locales/ COPY branding/assets/styles/imports/ assets/styles/imports/ +## Something like (bash, jq must be installed) +# for locale in `ls locales/*.json`; do jq -s '.[0] * .[1]' source/$locale $locale; done; + ################################################################################## # BUILD ########################################################################## ################################################################################## diff --git a/tools/test/file1.json b/tools/test/file1.json new file mode 100644 index 000000000..19ec4e19e --- /dev/null +++ b/tools/test/file1.json @@ -0,0 +1,12 @@ +{ + "a-key": "A", + "b-key": { + "a-subkey": "A", + "b-subkey": "B", + "c-subkey": { + "a-subsubkey": "A", + "b-subsubkey": "B" + } + }, + "c-key": "C" +} diff --git a/tools/test/file2.json b/tools/test/file2.json new file mode 100644 index 000000000..e4d7ade81 --- /dev/null +++ b/tools/test/file2.json @@ -0,0 +1,11 @@ +{ + "a-key": "AA", + "b-key": { + "b-subkey": "BB", + "c-subkey": { + "b-subsubkey": "BB", + "c-subsubkey": "C" + } + }, + "d-key": "D" +} diff --git a/tools/test/result.json b/tools/test/result.json new file mode 100644 index 000000000..843c23538 --- /dev/null +++ b/tools/test/result.json @@ -0,0 +1,15 @@ +{ + "a-key": "AA", + "b-key": { + "a-subkey": "A", + "b-subkey": "BB", + "c-subkey": { + "a-subsubkey": "A", + "b-subsubkey": "BB", + "c-subsubkey": "C" + } + }, + "c-key": "C", + "d-key": "D" +} + From 9045ac3199545789ffd47ece6f5997371b0ebe0f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 12 Oct 2022 15:33:07 +0200 Subject: [PATCH 249/344] add script to merge variables --- branding/locales/de.json | 3 +++ docker/webapp.Dockerfile | 8 +++++++- tools/merge-locales.sh | 10 ++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 branding/locales/de.json create mode 100755 tools/merge-locales.sh diff --git a/branding/locales/de.json b/branding/locales/de.json new file mode 100644 index 000000000..7fa1f1b48 --- /dev/null +++ b/branding/locales/de.json @@ -0,0 +1,3 @@ +{ + "new-key": "This is a new key" +} diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 5c3f98f6e..104b48429 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -12,9 +12,15 @@ FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ -COPY branding/locales/ locales/ +COPY branding/locales/html/ locales/html/ +# COPY branding/locales/index.js locales/index.js +COPY branding/locales/*.json locales/tmp/ COPY branding/assets/styles/imports/ assets/styles/imports/ +RUN apk add --no-cache bash jq + +RUN tools/merge-locales.sh + ## Something like (bash, jq must be installed) # for locale in `ls locales/*.json`; do jq -s '.[0] * .[1]' source/$locale $locale; done; diff --git a/tools/merge-locales.sh b/tools/merge-locales.sh new file mode 100755 index 000000000..8fc5c75d2 --- /dev/null +++ b/tools/merge-locales.sh @@ -0,0 +1,10 @@ +#!/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; From ebf8894ca25b5dfeec032390ea42fc5c961891b4 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 12 Oct 2022 15:58:28 +0200 Subject: [PATCH 250/344] remove tmp folder, test for override of existing locales --- branding/locales/de.json | 5 +++++ docker/webapp.Dockerfile | 4 +--- tools/merge-locales.sh | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/branding/locales/de.json b/branding/locales/de.json index 7fa1f1b48..8f42e8998 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -1,3 +1,8 @@ { +"user": { + "avatar": { + "submitted": "XXXXXXX" + } + }, "new-key": "This is a new key" } diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 104b48429..ba7cbffb0 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -10,6 +10,7 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it +COPY tools/ tools/ COPY branding/static/ static/ COPY branding/constants/ constants/ COPY branding/locales/html/ locales/html/ @@ -21,9 +22,6 @@ RUN apk add --no-cache bash jq RUN tools/merge-locales.sh -## Something like (bash, jq must be installed) -# for locale in `ls locales/*.json`; do jq -s '.[0] * .[1]' source/$locale $locale; done; - ################################################################################## # BUILD ########################################################################## ################################################################################## diff --git a/tools/merge-locales.sh b/tools/merge-locales.sh index 8fc5c75d2..21d263265 100755 --- a/tools/merge-locales.sh +++ b/tools/merge-locales.sh @@ -2,9 +2,11 @@ for locale in `ls locales/*.json`; do - file = basename $locale; + 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/ From a1ce8049957bfb4388a12f3cec64e1309ed6d15a Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 12 Oct 2022 16:29:20 +0200 Subject: [PATCH 251/344] clean up --- branding/locales/de.json | 8 -------- tools/test/file1.json | 12 ------------ tools/test/file2.json | 11 ----------- tools/test/result.json | 15 --------------- 4 files changed, 46 deletions(-) delete mode 100644 branding/locales/de.json delete mode 100644 tools/test/file1.json delete mode 100644 tools/test/file2.json delete mode 100644 tools/test/result.json diff --git a/branding/locales/de.json b/branding/locales/de.json deleted file mode 100644 index 8f42e8998..000000000 --- a/branding/locales/de.json +++ /dev/null @@ -1,8 +0,0 @@ -{ -"user": { - "avatar": { - "submitted": "XXXXXXX" - } - }, - "new-key": "This is a new key" -} diff --git a/tools/test/file1.json b/tools/test/file1.json deleted file mode 100644 index 19ec4e19e..000000000 --- a/tools/test/file1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "a-key": "A", - "b-key": { - "a-subkey": "A", - "b-subkey": "B", - "c-subkey": { - "a-subsubkey": "A", - "b-subsubkey": "B" - } - }, - "c-key": "C" -} diff --git a/tools/test/file2.json b/tools/test/file2.json deleted file mode 100644 index e4d7ade81..000000000 --- a/tools/test/file2.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "a-key": "AA", - "b-key": { - "b-subkey": "BB", - "c-subkey": { - "b-subsubkey": "BB", - "c-subsubkey": "C" - } - }, - "d-key": "D" -} diff --git a/tools/test/result.json b/tools/test/result.json deleted file mode 100644 index 843c23538..000000000 --- a/tools/test/result.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "a-key": "AA", - "b-key": { - "a-subkey": "A", - "b-subkey": "BB", - "c-subkey": { - "a-subsubkey": "A", - "b-subsubkey": "BB", - "c-subsubkey": "C" - } - }, - "c-key": "C", - "d-key": "D" -} - From be603a5af237d031693e8429f4c0499af7c4fdd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 13 Oct 2022 15:11:42 +0200 Subject: [PATCH 252/344] =?UTF-8?q?Set=20this=20branch=20as=20publishing?= =?UTF-8?q?=20branch=20for=20testing=20purposes=20=E2=80=93=20revert=20lat?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2743a25df..7ad535dc6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - # - 55-implement-PRODUCTION_DB_CLEAN_ALLOW-for-staging-production-evironments # for testing while developing + - 79-fix-implementation-of-overwriting-locales # for testing while developing jobs: ############################################################################## From 0cf00fdc078514d173563b92249e91c8f49da975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 13 Oct 2022 15:13:34 +0200 Subject: [PATCH 253/344] Fix copy error by adding two empty JSON files to the locales --- branding/locales/de.json | 2 ++ branding/locales/en.json | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 branding/locales/de.json create mode 100644 branding/locales/en.json diff --git a/branding/locales/de.json b/branding/locales/de.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/branding/locales/de.json @@ -0,0 +1,2 @@ +{ +} diff --git a/branding/locales/en.json b/branding/locales/en.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/branding/locales/en.json @@ -0,0 +1,2 @@ +{ +} From 4479fb4cbc7aeec86f5b451353635a221f49e6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 13 Oct 2022 16:55:39 +0200 Subject: [PATCH 254/344] Revert the publish branch --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7ad535dc6..5cbdf9004 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 79-fix-implementation-of-overwriting-locales # for testing while developing + # - 79-fix-implementation-of-overwriting-locales # for testing while developing jobs: ############################################################################## From 323826ca20f84ae34cbe555a6d13c7a6a1132686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 15 Oct 2022 15:04:28 +0200 Subject: [PATCH 255/344] Add '/dns.values*-ME.yaml' to .gitignore --- deployment/kubernetes/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/kubernetes/.gitignore b/deployment/kubernetes/.gitignore index 092cda60e..3bcb187b9 100644 --- a/deployment/kubernetes/.gitignore +++ b/deployment/kubernetes/.gitignore @@ -1,4 +1,5 @@ /dns.values.yaml +/dns.values*-ME.yaml /nginx.values.yaml /values.yaml /values*-ME.yaml \ No newline at end of file From 0794115b3fdb4e1b7d86631692af62705bd98179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 15 Oct 2022 15:57:36 +0200 Subject: [PATCH 256/344] Release v1.1.2-XXX - configurable header menu is translatable --- branding/constants/headerMenu.js | 6 +++--- branding/locales/de.json | 4 ++++ branding/locales/en.json | 4 ++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index c95e79122..8f0293485 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -1,11 +1,11 @@ export default { MENU: [ { - name: 'Beiträge', - path: '/#', + nameIdent: 'ocelotRebranding.newsFeed', + path: '/', }, { - name: 'Über Yunite', + nameIdent: 'ocelotRebranding.about', url: 'https://yunite.org', }, ], diff --git a/branding/locales/de.json b/branding/locales/de.json index 2c63c0851..0fac27985 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -1,2 +1,6 @@ { + "yuniteRebranding": { + "newsFeed": "Beiträge", + "about": "Über Yunite" + } } diff --git a/branding/locales/en.json b/branding/locales/en.json index 2c63c0851..11a82212c 100644 --- a/branding/locales/en.json +++ b/branding/locales/en.json @@ -1,2 +1,6 @@ { + "yuniteRebranding": { + "newsFeed": "News Feed", + "about": "About Yunite" + } } From 4dca4269cb6b21373d69423870b9afe2db99647b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 22 Oct 2022 20:04:52 +0200 Subject: [PATCH 257/344] Change and correct readme's --- README.md | 2 +- TODO-next-update.md | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b70d3a8c..e6fd53546 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ __Try out our deployed [development environment](https://stage.ocelot.social).__ Visit our staging networks: -- central staging network: [stage.ocelot.social](https://stage.ocelot.social). +- central staging network: [stage.ocelot.social](https://stage.ocelot.social) Logins: diff --git a/TODO-next-update.md b/TODO-next-update.md index 4cf3c8d10..bc1207f20 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,9 +2,19 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … +## This Latest Version >= 2.0.0 with 'ocelotDockerVersionTag' 2.0.0-XXX + +### 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 prevered 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 prevered value. + ## This Latest Version >= 1.1.0 with 'ocelotDockerVersionTag' 1.1.0-205 -### Deployment/Rebranding PR – chore: 🍰 Release v1.1.0 - Implement Categories Again #63 +### 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 prevered value. - Make sure the correct categories are in your Neo4j database on the server. From b0ff413d8351f40def20ce737f3b4d72a92393b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 22 Oct 2022 20:05:29 +0200 Subject: [PATCH 258/344] Adjust and add constants files --- branding/constants/groups.js | 5 +++++ branding/constants/headerMenu.js | 8 ++++---- branding/constants/logos.js | 9 +++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 branding/constants/groups.js diff --git a/branding/constants/groups.js b/branding/constants/groups.js new file mode 100644 index 000000000..1c49d3ff3 --- /dev/null +++ b/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/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index 33cba8d5c..6d0a0afad 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -1,12 +1,12 @@ export default { MENU: [ // { - // name: 'Beiträge', - // path: '/#', + // nameIdent: 'nameIdent', + // path: '/', // }, // { - // name: 'Über Yunite', - // url: 'https://yunite.org', + // nameIdent: 'nameIdent', + // url: 'https://ocelot.social', // }, ], } diff --git a/branding/constants/logos.js b/branding/constants/logos.js index 2bea199da..136918762 100644 --- a/branding/constants/logos.js +++ b/branding/constants/logos.js @@ -3,6 +3,15 @@ export default { LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', LOGO_HEADER_WIDTH: '130px', + LOGO_HEADER_CLICK: { + 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', From 94921627125399482d8fd46d07f6d977c24998b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 22 Oct 2022 20:14:51 +0200 Subject: [PATCH 259/344] Set footer --- branding/constants/links.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 7e89159eb..ecde14ebb 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -126,9 +126,9 @@ export default { FOOTER_LINK_LIST: [ ORGANIZATION, // TERMS_AND_CONDITIONS, - CODE_OF_CONDUCT, + // CODE_OF_CONDUCT, DATA_PRIVACY, - FAQ, + // FAQ, // DONATE, // SUPPORT, IMPRINT, From 7ec3ee09dfecad761f93af6adeeedc00295bff4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 22 Oct 2022 20:26:31 +0200 Subject: [PATCH 260/344] Adjust merge of groups branch by fixing header menu lacales idents --- branding/constants/headerMenu.js | 6 +++--- branding/locales/de.json | 5 +++-- branding/locales/en.json | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index 37c46e202..eea94e14b 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -1,15 +1,15 @@ export default { MENU: [ { - nameIdent: 'ocelotRebranding.newsFeed', + nameIdent: 'yuniteRebranding.newsFeed', path: '/', }, { - nameIdent: 'ocelotRebranding.myGroups', + nameIdent: 'yuniteRebranding.myGroups', path: '/my-groups', }, { - nameIdent: 'ocelotRebranding.about', + nameIdent: 'yuniteRebranding.about', url: 'https://yunite.org', }, ], diff --git a/branding/locales/de.json b/branding/locales/de.json index 0fac27985..6237e4428 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -1,6 +1,7 @@ { "yuniteRebranding": { - "newsFeed": "Beiträge", - "about": "Über Yunite" + "about": "Über Yunite", + "myGroups": "Gruppen", + "newsFeed": "Beiträge" } } diff --git a/branding/locales/en.json b/branding/locales/en.json index 11a82212c..9b78f48b5 100644 --- a/branding/locales/en.json +++ b/branding/locales/en.json @@ -1,6 +1,7 @@ { "yuniteRebranding": { - "newsFeed": "News Feed", - "about": "About Yunite" + "about": "About Yunite", + "myGroups": "Groups", + "newsFeed": "News Feed" } } From c13b2859925d7ee161efff22a17be5f24cc05efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 22 Oct 2022 20:31:32 +0200 Subject: [PATCH 261/344] Add header menu item 'Topic' --- branding/constants/headerMenu.js | 4 ++++ branding/locales/de.json | 3 ++- branding/locales/en.json | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index eea94e14b..0f7a06f6a 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -8,6 +8,10 @@ export default { nameIdent: 'yuniteRebranding.myGroups', path: '/my-groups', }, + { + nameIdent: 'yuniteRebranding.topics', + url: 'https://yunite.org/themen/', + }, { nameIdent: 'yuniteRebranding.about', url: 'https://yunite.org', diff --git a/branding/locales/de.json b/branding/locales/de.json index 6237e4428..374b7a4d1 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -2,6 +2,7 @@ "yuniteRebranding": { "about": "Über Yunite", "myGroups": "Gruppen", - "newsFeed": "Beiträge" + "newsFeed": "Beiträge", + "topics": "Themen" } } diff --git a/branding/locales/en.json b/branding/locales/en.json index 9b78f48b5..2ac41ce62 100644 --- a/branding/locales/en.json +++ b/branding/locales/en.json @@ -2,6 +2,7 @@ "yuniteRebranding": { "about": "About Yunite", "myGroups": "Groups", - "newsFeed": "News Feed" + "newsFeed": "News Feed", + "topics": "Topics" } } From ea51f73b64995d49b6ee0cadec45b60ce2f4cf00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sat, 22 Oct 2022 20:46:38 +0200 Subject: [PATCH 262/344] Adjust the footer --- branding/constants/headerMenu.js | 8 ++++---- branding/constants/links.js | 8 ++++---- branding/locales/de.json | 14 ++++++++++---- branding/locales/en.json | 14 ++++++++++---- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index 0f7a06f6a..48f9fd29f 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -1,19 +1,19 @@ export default { MENU: [ { - nameIdent: 'yuniteRebranding.newsFeed', + nameIdent: 'yuniteRebranding.header.newsFeed', path: '/', }, { - nameIdent: 'yuniteRebranding.myGroups', + nameIdent: 'yuniteRebranding.header.myGroups', path: '/my-groups', }, { - nameIdent: 'yuniteRebranding.topics', + nameIdent: 'yuniteRebranding.header.topics', url: 'https://yunite.org/themen/', }, { - nameIdent: 'yuniteRebranding.about', + nameIdent: 'yuniteRebranding.header.about', url: 'https://yunite.org', }, ], diff --git a/branding/constants/links.js b/branding/constants/links.js index ecde14ebb..aa9e3a129 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -17,7 +17,7 @@ const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ }) const DONATE = defaultPageParamsPages.DONATE.overwrite({ // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - externalLink: 'https://yunite.org/brand-guidelines/', // if string is defined and not empty it's dominating + externalLink: 'https://yunite.org/spenden/', // if string is defined and not empty it's dominating internalPage: { // footerIdent: 'site.donate', // localized string identifier, if undefined default is used @@ -34,7 +34,7 @@ const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ externalLink: 'https://yunite.org/impressum/', // if string is defined and not empty it's dominating internalPage: { - // footerIdent: 'site.imprint', // localized string identifier, if undefined default is used + footerIdent: 'yuniteRebranding.footer.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, @@ -73,7 +73,7 @@ const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ externalLink: 'https://yunite.org/datenschutz/', // if string is defined and not empty it's dominating internalPage: { - // footerIdent: 'site.data-privacy', // localized string identifier, if undefined default is used + footerIdent: 'yuniteRebranding.footer.dataPrivacy', // 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, @@ -124,7 +124,7 @@ export default { SUPPORT, FOOTER_LINK_LIST: [ - ORGANIZATION, + // ORGANIZATION, // TERMS_AND_CONDITIONS, // CODE_OF_CONDUCT, DATA_PRIVACY, diff --git a/branding/locales/de.json b/branding/locales/de.json index 374b7a4d1..c27e5af24 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -1,8 +1,14 @@ { "yuniteRebranding": { - "about": "Über Yunite", - "myGroups": "Gruppen", - "newsFeed": "Beiträge", - "topics": "Themen" + "header": { + "about": "Über Yunite", + "myGroups": "Gruppen", + "newsFeed": "Beiträge", + "topics": "Themen" + }, + "footer": { + "dataPrivacy": "Datenschutz", + "imprint": "Impressum" + } } } diff --git a/branding/locales/en.json b/branding/locales/en.json index 2ac41ce62..93609ee38 100644 --- a/branding/locales/en.json +++ b/branding/locales/en.json @@ -1,8 +1,14 @@ { "yuniteRebranding": { - "about": "About Yunite", - "myGroups": "Groups", - "newsFeed": "News Feed", - "topics": "Topics" + "header": { + "about": "About Yunite", + "myGroups": "Groups", + "newsFeed": "News Feed", + "topics": "Topics" + }, + "footer": { + "dataPrivacy": "Data privacy", + "imprint": "Imprint" + } } } From 2b87fb2df509131a193e84566175846145cef051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sun, 23 Oct 2022 15:16:25 +0200 Subject: [PATCH 263/344] Release v2.0.0-250 --- TODO-next-update.md | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/TODO-next-update.md b/TODO-next-update.md index bc1207f20..ff808fdb9 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,7 +2,7 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … -## This Latest Version >= 2.0.0 with 'ocelotDockerVersionTag' 2.0.0-XXX +## This Latest Version >= 2.0.0 with 'ocelotDockerVersionTag' 2.0.0-250 ### Main Code PR – feat: 🍰 Implement LOGO_HEADER_CLICK As Configuration #5525 diff --git a/package.json b/package.json index 61afb1f1b..af6b6dfab 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.1.1", - "ocelotDockerVersionTag": "1.1.1-228", + "version": "2.0.0", + "ocelotDockerVersionTag": "2.0.0-250", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From c94e0dec3d60e616a5efdf56c23ec6c4eb957173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sun, 23 Oct 2022 18:55:40 +0200 Subject: [PATCH 264/344] Add database migration to auto-deployment on publish --- .github/workflows/publish.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7fa3e608a..91ca808e8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -320,16 +320,19 @@ jobs: # 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 regularely up again after 3 minutes and 10 seconds + # 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 deplyment to get ready for cleaning and seeding of the database + - 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: | From 6e419acb4615500fef92cfa1547beb5b91c6d773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sun, 23 Oct 2022 18:58:53 +0200 Subject: [PATCH 265/344] Remove auto-deploy by push on '5059-epic-groups' --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 403292450..cadddd371 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 5059-epic-groups # for testing while developing + # - 5059-epic-groups # for testing while developing jobs: ############################################################################## From 8ec8125991e48f4f1e99dde3412812f59c91224d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sun, 23 Oct 2022 19:10:23 +0200 Subject: [PATCH 266/344] Remove 'groups' from 'publish.yml' --- .github/workflows/publish.yml | 46 ++++++++++++++--------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cadddd371..71af5a061 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -83,13 +83,13 @@ jobs: ########################################################################## - name: Backend | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/backend-groups-branded:latest" -t "${DOCKER_ORGANISATION}/backend-groups-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-groups-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/backend-groups" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/backend-groups-branded" > /tmp/backend-groups-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/backend" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: docker-backend-branded - path: /tmp/backend-groups-branded.tar + path: /tmp/backend-branded.tar ############################################################################## # JOB: DOCKER BUILD BRANDED WEBAPP ########################################### @@ -125,13 +125,13 @@ jobs: ########################################################################## - name: Webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-groups-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-groups-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-groups-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/webapp-groups" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/webapp-groups-branded" > /tmp/webapp-groups-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/webapp" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: docker-webapp-branded - path: /tmp/webapp-groups-branded.tar + path: /tmp/webapp-branded.tar ############################################################################## # JOB: DOCKER BUILD BRANDED MAINTENANCE ###################################### @@ -167,13 +167,13 @@ jobs: ########################################################################## - name: Maintenance | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-groups-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-groups-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-groups-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/maintenance-groups" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/maintenance-groups-branded" > /tmp/maintenance-groups-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/maintenance" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: docker-maintenance-branded - path: /tmp/maintenance-groups-branded.tar + path: /tmp/maintenance-branded.tar ############################################################################## # JOB: UPLOAD TO DOCKERHUB ################################################### @@ -225,7 +225,7 @@ jobs: name: docker-backend-branded path: /tmp - name: Load Docker Image - run: docker load < /tmp/backend-groups-branded.tar + run: docker load < /tmp/backend-branded.tar # Webapp - name: Download Docker Image (Webapp) uses: actions/download-artifact@v2 @@ -233,7 +233,7 @@ jobs: name: docker-webapp-branded path: /tmp - name: Load Docker Image - run: docker load < /tmp/webapp-groups-branded.tar + run: docker load < /tmp/webapp-branded.tar # Maintenance - name: Download Docker Image (Maintenance) uses: actions/download-artifact@v2 @@ -241,7 +241,7 @@ jobs: name: docker-maintenance-branded path: /tmp - name: Load Docker Image - run: docker load < /tmp/maintenance-groups-branded.tar + run: docker load < /tmp/maintenance-branded.tar ########################################################################## # Upload ################################################################# ########################################################################## @@ -250,11 +250,11 @@ jobs: - name: Push Neo4j Community run: docker push --all-tags ${DOCKER_ORGANISATION}/neo4j-community-branded - name: Push Backend - run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-groups-branded + run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-branded - name: Push Webapp - run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-groups-branded + run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-branded - name: Push Maintenance - run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-groups-branded + run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-branded ############################################################################## # JOB: KUBERNETES DEPLOY ACTUAL/LATEST VERSION ###################################### @@ -297,23 +297,13 @@ jobs: ########################################################################## # 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=${DOCKER_ORGANISATION}/webapp-groups-branded:${BUILD_VERSION} + kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-webapp - kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-groups-branded:${BUILD_VERSION} + kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-backend - kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-groups-branded:${BUILD_VERSION} + kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-maintenance kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION} kubectl -n default rollout restart deployment/ocelot-neo4j From 96489e8218d6db344a1efa165a076f6bec8870cc Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 24 Oct 2022 22:27:39 +0200 Subject: [PATCH 267/344] - fixed spelling errors - detailed upgrade guide for the certmanager --- TODO-next-update.md | 29 +++++++++++++++++++++++++---- deployment/kubernetes/Backup.md | 2 +- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/TODO-next-update.md b/TODO-next-update.md index ff808fdb9..1c59a34f0 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -23,12 +23,33 @@ When you overtake this deploy and rebrand repo to your network you have to recog ### 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 envireonments and only for several stage test servers to `true`. +- 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 -- Commit: `Update cert-manager apiVersion "cert-manager.io/v1alpha2" to "cert-manager.io/v1" - - Check for `kubectl` and `helm` versions. +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. + +``` +# 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: +``` +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 @@ -39,4 +60,4 @@ When you overtake this deploy and rebrand repo to your network you have to recog ## Version 1.0.7 with 'ocelotDockerVersionTag' 1.0.7-171 -- No informations. +- No information. diff --git a/deployment/kubernetes/Backup.md b/deployment/kubernetes/Backup.md index 738cdcfee..227b5765f 100644 --- a/deployment/kubernetes/Backup.md +++ b/deployment/kubernetes/Backup.md @@ -17,7 +17,7 @@ $ kubectl config use-context $ kubectl -n default get pods -o wide ``` -The very first step is to put the webside into **maintenance mode**. +The very first step is to put the website into **maintenance mode**. ### Set Maintenance Mode From 82103939a246e5776b790377dd388a6d3bab7704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 Oct 2022 18:06:52 +0200 Subject: [PATCH 268/344] Release v2.1.0-253 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index af6b6dfab..e760e3dd1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "2.0.0", - "ocelotDockerVersionTag": "2.0.0-250", + "version": "2.1.0", + "ocelotDockerVersionTag": "2.1.0-253", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 75b447493f3d821ee7075825789e2c9734d274f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 26 Oct 2022 13:48:03 +0200 Subject: [PATCH 269/344] Change owner data etc. --- branding/constants/metadata.js | 6 +++--- package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 623612dab..62162bd94 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -2,8 +2,8 @@ export default { APPLICATION_NAME: 'yunite.me', APPLICATION_SHORT_NAME: 'yunite.me', - APPLICATION_DESCRIPTION: 'Yunite Community', - COOKIE_NAME: 'ocelot-social-token', - ORGANIZATION_NAME: 'Verein Corona-Reset', + APPLICATION_DESCRIPTION: 'yunite.me – Alternatives Netzwerk für eine freie und bunte Zukunft', + COOKIE_NAME: 'yunite-me-token', + ORGANIZATION_NAME: 'yunite – Verein für Vernetzung und Kooperation', ORGANIZATION_JURISDICTION: 'Switzerland', } diff --git a/package.json b/package.json index 5f6fa8663..7bbca6fe0 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "yunite.net", + "name": "yunite.me", "version": "2.1.0", "ocelotDockerVersionTag": "2.1.0-253", "dockerOrganisation": "tirokk", - "description": "yunite.net Branded", - "author": "yunite.net Community", + "description": "yunite.me – Alternatives Netzwerk für eine freie und bunte Zukunft", + "author": "yunite – Verein für Vernetzung und Kooperation", "license": "MIT", "private": false, "repository": { From 7578e03c6db7b6e18c71015bb35596d0b91d523c Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 28 Oct 2022 11:34:34 +0200 Subject: [PATCH 270/344] change hasttag search test color to #17b53f --- branding/assets/styles/imports/_branding.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/branding/assets/styles/imports/_branding.scss b/branding/assets/styles/imports/_branding.scss index be8a2acd6..55fbcb81e 100644 --- a/branding/assets/styles/imports/_branding.scss +++ b/branding/assets/styles/imports/_branding.scss @@ -23,6 +23,10 @@ $color-locale-menu: $color-primary-light; color: $color-primary-light; } -.main-navigation .base-button { +.main-navigation .base-button { color: $color-primary-light; } + +#nav-search-box .hc-hashtag a{ + color: #17b53f; +} From de797e94f1e6f4e1dc509693e597719b1f92ca63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 28 Oct 2022 17:25:11 +0200 Subject: [PATCH 271/344] Add all new configuration files and properties --- TODO-next-update.md | 32 +++++++++++++++++++++------- branding/constants/donation.js | 1 + branding/constants/headerMenu.js | 1 + branding/constants/links.js | 36 +++++++++++++++++++++++--------- branding/constants/logos.js | 4 ++++ 5 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 branding/constants/donation.js diff --git a/TODO-next-update.md b/TODO-next-update.md index 1c59a34f0..cab2528fa 100644 --- a/TODO-next-update.md +++ b/TODO-next-update.md @@ -2,21 +2,36 @@ When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … -## This Latest Version >= 2.0.0 with 'ocelotDockerVersionTag' 2.0.0-250 +## 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 prevered value. +- 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 prevered value. +- 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. -## This Latest Version >= 1.1.0 with 'ocelotDockerVersionTag' 1.1.0-205 +## 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 prevered value. +- 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 @@ -29,7 +44,7 @@ When you overtake this deploy and rebrand repo to your network you have to recog 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 @@ -45,7 +60,8 @@ Upgrade the cert-manager, but install CRDs of the version 1.0.0-alpha to actuall 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] @@ -55,7 +71,7 @@ ensure CRDs are installed first] ### 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 prevered value. +- 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 diff --git a/branding/constants/donation.js b/branding/constants/donation.js new file mode 100644 index 000000000..3e36ae9a8 --- /dev/null +++ b/branding/constants/donation.js @@ -0,0 +1 @@ +export const PROGRESS_BAR_COLOR_TYPE = 'gradient' // 'uni' is the other option diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index 6d0a0afad..aa87a598c 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -7,6 +7,7 @@ export default { // { // nameIdent: 'nameIdent', // url: 'https://ocelot.social', + // target: '_blank', // }, ], } diff --git a/branding/constants/links.js b/branding/constants/links.js index 9cbc605c0..7efac159f 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -3,7 +3,11 @@ import { defaultPageParamsPages } from '~/components/utils/InternalPages.js' const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ - externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + // if defined it's dominating + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, internalPage: { // footerIdent: 'site.made', // localized string identifier, if undefined default is used @@ -16,8 +20,12 @@ const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ }, }) const DONATE = defaultPageParamsPages.DONATE.overwrite({ - // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - externalLink: 'https://ocelot-social.herokuapp.com/donations', // if string is defined and not empty it's dominating + // 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 @@ -30,8 +38,12 @@ const DONATE = defaultPageParamsPages.DONATE.overwrite({ }, }) const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ - // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly - externalLink: 'https://ocelot-social.herokuapp.com/imprint', // if string is defined and not empty it's dominating + // 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 @@ -44,7 +56,7 @@ const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ }, }) const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + // externalLink: null, // if defined it's dominating internalPage: { // footerIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used @@ -57,7 +69,7 @@ const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwri }, }) const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + // externalLink: null, // if defined it's dominating internalPage: { // footerIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used @@ -70,7 +82,7 @@ const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ }, }) const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + // externalLink: null, // if defined it's dominating internalPage: { // footerIdent: 'site.data-privacy', // localized string identifier, if undefined default is used @@ -83,7 +95,7 @@ const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ }, }) const FAQ = defaultPageParamsPages.FAQ.overwrite({ - // externalLink: null, // if string is defined and not empty it's dominating + // externalLink: null, // if defined it's dominating internalPage: { // footerIdent: 'site.faq', // localized string identifier, if undefined default is used @@ -96,7 +108,11 @@ const FAQ = defaultPageParamsPages.FAQ.overwrite({ }, }) const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ - externalLink: 'https://ocelot.social', // if string is defined and not empty it's dominating + // if defined it's dominating + externalLink: { + url: 'https://ocelot.social', + target: '_blank', + }, internalPage: { // footerIdent: 'site.support', // localized string identifier, if undefined default is used diff --git a/branding/constants/logos.js b/branding/constants/logos.js index 136918762..714e78a2c 100644 --- a/branding/constants/logos.js +++ b/branding/constants/logos.js @@ -4,6 +4,10 @@ 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: { From 9790e1516601b01fe43df8a4e8234d67d7db7d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 28 Oct 2022 17:26:17 +0200 Subject: [PATCH 272/344] Release v2.2.0-267 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e760e3dd1..9625605f2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "2.1.0", - "ocelotDockerVersionTag": "2.1.0-253", + "version": "2.2.0", + "ocelotDockerVersionTag": "2.2.0-267", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 9389c3463fc08e29f3ba3cef285324648d2a98d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 28 Oct 2022 21:26:04 +0200 Subject: [PATCH 273/344] Adjust groups header menu --- branding/constants/headerMenu.js | 4 ++-- branding/locales/de.json | 2 +- branding/locales/en.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index a1f65f75e..7bd827e54 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -5,8 +5,8 @@ export default { path: '/', }, { - nameIdent: 'yuniteRebranding.header.myGroups', - path: '/my-groups', + nameIdent: 'yuniteRebranding.header.groups', + path: '/groups', }, { nameIdent: 'yuniteRebranding.header.topics', diff --git a/branding/locales/de.json b/branding/locales/de.json index c27e5af24..e23567e69 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -2,7 +2,7 @@ "yuniteRebranding": { "header": { "about": "Über Yunite", - "myGroups": "Gruppen", + "groups": "Gruppen", "newsFeed": "Beiträge", "topics": "Themen" }, diff --git a/branding/locales/en.json b/branding/locales/en.json index 93609ee38..6d91e173c 100644 --- a/branding/locales/en.json +++ b/branding/locales/en.json @@ -2,7 +2,7 @@ "yuniteRebranding": { "header": { "about": "About Yunite", - "myGroups": "Groups", + "groups": "Groups", "newsFeed": "News Feed", "topics": "Topics" }, From fb6d0ace3189f6e3db22f6dfdfd0ad2091fd1cbf Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 12:29:30 +0100 Subject: [PATCH 274/344] feat(webapp): copy fonts from assets --- docker/webapp.Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index ba7cbffb0..a07695b9a 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -17,6 +17,7 @@ COPY branding/locales/html/ locales/html/ # COPY branding/locales/index.js locales/index.js COPY branding/locales/*.json locales/tmp/ COPY branding/assets/styles/imports/ assets/styles/imports/ +COPY branding/assets/fonts/ assets/fonts/ RUN apk add --no-cache bash jq @@ -50,6 +51,7 @@ 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 From 34b22936f3bb241c7898dad38143760625bc552c Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 12:34:00 +0100 Subject: [PATCH 275/344] Update webapp.Dockerfile --- docker/webapp.Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index ba7cbffb0..a07695b9a 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -17,6 +17,7 @@ COPY branding/locales/html/ locales/html/ # COPY branding/locales/index.js locales/index.js COPY branding/locales/*.json locales/tmp/ COPY branding/assets/styles/imports/ assets/styles/imports/ +COPY branding/assets/fonts/ assets/fonts/ RUN apk add --no-cache bash jq @@ -50,6 +51,7 @@ 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 From 507f42a55a93d2bbb868d6e1c81640e1760b2859 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 1 Dec 2022 12:54:30 +0100 Subject: [PATCH 276/344] rebranding for yunite --- .../fonts/Overpass-VariableFont_wght.ttf | Bin 0 -> 315752 bytes branding/assets/styles/imports/_branding.scss | 73 ++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 branding/assets/fonts/Overpass-VariableFont_wght.ttf create mode 100644 branding/assets/styles/imports/_branding.scss diff --git a/branding/assets/fonts/Overpass-VariableFont_wght.ttf b/branding/assets/fonts/Overpass-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1cf730a5ad8e270f9b4a0cbcc4659b302f2eaef0 GIT binary patch literal 315752 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 z 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

UbDYh%;BnK&MU7iNZo|0$ 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 a(qWnG4Sv5N5dyCTL0+tI0X2f*W&Z(O?keH{ literal 0 HcmV?d00001 diff --git a/branding/assets/styles/imports/_branding.scss b/branding/assets/styles/imports/_branding.scss new file mode 100644 index 000000000..2e5633a16 --- /dev/null +++ b/branding/assets/styles/imports/_branding.scss @@ -0,0 +1,73 @@ +/* + * + * Here, all SCSS variables and classes can be adapted to your custom design. + * +*/ + + + +@font-face { + font-family: Overpass; + src: url('~@/assets/fonts/Overpass-VariableFont_wght.ttf'); +} + + +$color-primary: #6e8b87; +$color-primary-yunite: #a6ff00; +$color-primary-light: #fff; +$color-primary-active: hsla(0,0%,100%,.8); + +$font-family-heading: 'Overpass',Helvetica,Arial,Lucida,sans-serif;; +$font-family-text: 'Overpass',Helvetica,Arial,Lucida,sans-serif;; + +$color-header-background: $color-primary; +$color-footer-background: $color-primary-yunite; + +$color-locale-menu: $color-primary-yunite; + +.main-navigation a { + color: $color-primary-light; + text-transform: uppercase; + font-size: 16px; + font-weight: 500; +} +.main-navigation a:hover { + color: $color-primary-active; +} +.main-navigation .router-link-exact-active { + color: #A6FF00!important; +} + +.main-navigation .locale-menu { + color: $color-primary-light; +} + +.main-navigation .base-button { + color: $color-primary-light; +} + +#nav-search-box .hc-hashtag a{ + color: #17b53f; +} + +#footer { + background-color: $color-primary-yunite; +} + +#footer a { + color: $color-primary; +} + +.branding-menu .ds-text { + font-family: 'Overpass',Helvetica,Arial,Lucida,sans-serif; + font-weight: 500; + text-transform: uppercase; + font-size: 16px; +} + +.ds-footer { + font-family: 'Overpass',Helvetica,Arial,Lucida,sans-serif; + text-transform: uppercase; + font-size: 16px; + font-weight: 500; + } \ No newline at end of file From 6e85677b48caac0c515ac73c55b4846d559eb364 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 6 Dec 2022 10:18:33 +0100 Subject: [PATCH 277/344] adjusted ocelotDockerVersionTag --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9625605f2..b5dbca69e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "2.2.0", - "ocelotDockerVersionTag": "2.2.0-267", + "ocelotDockerVersionTag": "2.3.0-281", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 32871a8f8318a1de33f6a0eedbb3df06d61bb050 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 7 Dec 2022 00:16:00 +0100 Subject: [PATCH 278/344] Revert "V2.3.0" --- .github/workflows/publish.yml | 80 +--------------- README.md | 1 - .../fonts/Overpass-VariableFont_wght.ttf | Bin 315752 -> 0 bytes branding/assets/styles/imports/_branding.scss | 67 +------------- branding/constants/donation.js | 2 +- branding/constants/emails.js | 8 +- branding/constants/groups.js | 2 +- branding/constants/headerMenu.js | 27 ++---- branding/constants/links.js | 56 +++++------ branding/constants/logos.js | 16 +++- branding/constants/metadata.js | 12 +-- branding/locales/de.json | 12 --- branding/locales/en.json | 12 --- branding/static/favicon.ico | Bin 5558 -> 5558 bytes branding/static/icon.png | Bin 7958 -> 21631 bytes .../static/img/custom/logo-horizontal.svg | 81 ++++++++++++++-- branding/static/img/custom/logo-squared.svg | 87 ++++++++++++++++-- deployment/kubernetes/.gitignore | 2 - docker-compose.yml | 2 +- package.json | 10 +- 20 files changed, 216 insertions(+), 261 deletions(-) delete mode 100644 branding/assets/fonts/Overpass-VariableFont_wght.ttf diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 71af5a061..5cbdf9004 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - # - 5059-epic-groups # for testing while developing + # - 79-fix-implementation-of-overwriting-locales # for testing while developing jobs: ############################################################################## @@ -83,7 +83,7 @@ jobs: ########################################################################## - name: Backend | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/backend" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -125,7 +125,7 @@ jobs: ########################################################################## - name: Webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/webapp" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -167,7 +167,7 @@ jobs: ########################################################################## - name: Maintenance | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE=ocelotsocialnetwork/maintenance" --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -256,78 +256,6 @@ jobs: - name: Push Maintenance run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-branded - ############################################################################## - # 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_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $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-yunite-me - ########################################################################## - # Deploy new Docker images to DigitalOcean Kubernetes cluster ############ - ########################################################################## - - name: Deploy actual version '$BUILD_VERSION' to DigitalOcean Kubernetes - run: | - kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION} - kubectl -n default rollout restart deployment/ocelot-webapp - kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION} - kubectl -n default rollout restart deployment/ocelot-backend - kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION} - kubectl -n default rollout restart deployment/ocelot-maintenance - kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=${DOCKER_ORGANISATION}/neo4j-community-branded:${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" - ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# ############################################################################## diff --git a/README.md b/README.md index 28dcd80ef..e6fd53546 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ __Try out our deployed [development environment](https://stage.ocelot.social).__ Visit our staging networks: - central staging network: [stage.ocelot.social](https://stage.ocelot.social) -- Yunite staging network: [stage.yunite.me](https://stage.yunite.me) Logins: diff --git a/branding/assets/fonts/Overpass-VariableFont_wght.ttf b/branding/assets/fonts/Overpass-VariableFont_wght.ttf deleted file mode 100644 index 1cf730a5ad8e270f9b4a0cbcc4659b302f2eaef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315752 zcmeFac|cWHmN$C$Id?!MBJ*{YK|m&v(E*u6#R(A+5hp}M#48{oA|eV-h!YZHh#|yS zNQ|X7ma&X6i7^&2##kn0Qt4DGZKcw7+D@kv%g&cJz&(7wwa+>CUJ#Rdf4x86tBMNi z?6dcp_gZTYN5eE4jVu1rYQm-`Pn~uk^1q`r?9C+_jbrfiw7K(LcaQu(8uosjhAn(+ z`uqh+^IhYbG~&o)jmG^_N@imEGQs=L8ZojQmxu15Q0>3|mPk89Ze>jkS;$S!f?!0D#j_{om1l z4u1D7SXWlzS`t%?=M5T-+sCHjl`9Un%qY_^pYJr9{)OvSRFvrE3+ed%7TS+0TCr|b z{eM+AX;`hJM$_+pN%4lV_hT12XxP3VHJY)@OG;Oj6zKQw!gDR!8^E)6FwRj|p%L-h z0F9GI6XERTJlf0Ii?Imig+J|LiY1?YC%LiHmLJ;$M@y>U*k<`rSJ6?|rVZ{qqpj-P zNq;ngCLev>M_&ew3;MykKBAZC>LrE>{sRR=K6`M2Jvd)s`Lz5ryLQ3gJV>i^ayC#$ zEK@qo9te83s0bIAh$y%2Zn-Z*xZtND`5JVAtW2Y^!lzl`B8y^`D%_z}f&1$?Tw~B$ z*dgINdM=e|?;F(j{B=$&n)mx_?{{i`C%;d$Ib7-8zpfvfBs{W?|M+tqixEeu&+X_5 zVv%{gK>s z71sW^+|>3C*8b%7kM*bW$Dr-h+_J+j!P+0_wS%krVbBdAIY6iDy6KZg|8h?#O z=k4bwL`AwpM@NKvct%Ay`$XyW{^8NlG0vfakM}^q-ED**d~xz#eSCcVy_3~%jx(FX z-(Ed`$BL07SL~Qy`Ep)JNZ!lFZJ#hrZ7tJ$vTZ?Pbw^!w;)2%DX`{u^z-dAGFJE82 z`u!6*Duw!XE2iKS$0%R&<5o6Q;|IUu?H3gp9RoY_fxQs|9ueWuF`fejrrMp>xMJ6~ zU1W9_xdkq(O-=~#9s5+a+r(5$m7OI@err}N+7m{`NJigNrZ@C7eAn>ks7OB_Z#|I9XE(+rCYllxOi5Fs*p0`$ zL1^H_iGlc|a~M^akgz5`eoaDxX++1P-X4OL#D#`To*WVyr*g_+HaInmY#KIyLO7zr z4Mr;mbutIL;k)&*@Ka724~@o$dAY;gseeS~JAN;d*v1}QubIvGikmI=W>+cdSMylD00tx3|P2mhLdi= z?<(9I0Vxg?d`5dgvA{S#AFn9n25`AEYbd!yG z<{AH@HPQuL#oE(LbB+ZLUa>oE`oZ$)$CC@kPbr_#QkfUAGJ$Nd9X5rL!543isS^vt zzuN9jX!vSi)E^iHXu>hA`o{?o5$+J3>pz9v$&y-DY2)Su=eJ$YDY)^{@|AOAQ@771X^{tN=6VHt=QCjw_o%($K@2ejwTFKIhLEn@ z-bID?>W8sK-1Eu(kjLij;YqVq&!;=8FM~FWg`XiW1Fz!l4v%B=fqhXeetr52uIdgl%ZFgolVoZ@5htAIBy@Xp*#jVkE3(hp!3%K7ye~jAHwk70Im(H z2X}856D&pSyp$?ju{vv6s@gEl)rq{9KsHV07Ni-*BSRT3G6S~@XhDzmK}@f3*H4R4 zAqBa;i{=}LZYht%2=1@ra30AW=8+hAV;f$GF7M<0PGNxj zKH=#=kz9}d5y?67NRHFNBe|Z>b*vvna@|rdI{Rz#?C2-IAk#C3IoQ!@g~MMs$nA*^ zJHBu_9_KqEu@<}jDH4*reAB3!eUJ+s^7WD~oUJy8OeqX0M}rHXk^!?ar6K zdB%LO=KQ#0(f?~Kc)O; zn~)d08Oh5UXJd{bVadTYD2a}W@&OrckkuD2etmGt^uu2rt36xd-yF8PY~zbLfnj+s ztXqB{Rbm%*{N1?uBPQ;xW5P#Urmc_9p1OKf+j}{t8!b!H4=*2o{FM2JEyPJaGN&n% z(-g?gb4{1wq=_3r#B8>hbQP9!LRv?i zu+vh7oQ^bXJ6gM99z@*j6BQ8^;qHY$2zB{;WUyaexIk~?Z;MGdVlinwTCd=Lt)1Ue zFJi#=stsP?nv=sdCrFVj`CNNAW3#M25_m%5a(gE>8}A8xX08E7{V5}{pOuMth%X8=ED*E;AtwLS~z^H!)q$K=)$^_^)4@83O$ z_k#MHFq`N9@|a^TP%i|%!mBO>_0s`L5pefIwjcOk1aXblcMRH&?hBmD7o{@R$hj={ z<;44{N9z{b$lA{CnY?uw;GY_39+K(m*L{g&)SKP`3cX(dry_0xa(g|Es$t#VNPdi> z80eI%oRx#u_8IvtY$@ z8^UUw<;>oo*R$qzYt7>(1kdtv3&=6KF3^YeCg*h}X%?z?h%yxT%XVxHCKGtZh*CU$d8miaSN0 zgUd6XH*nU;eR;V9+jF{#&ahJ)v+nzbM|kR|sUgfXm0Ed@I1Wm^ImQHsZQWPtKwrR@ zx7KM`aCbY=hlt-E?#A#EhY#ujch-C@!>M;$KU$qoptLWuhokx_DDVv3P2CX{OV+Gi zh5;Dm{?uOc6wzjgiUF@;+zqIbv^O@IzyDr1$0XBLlW^H`=i=2%(kQqY@B`jtC*DCu zq(eQ(A7KWZX#~OzPZY=)d1QoOdc8sPm3BILIf|mWl{NKq>F40mpB-&8i_Fo-$tafj z%=aF;$hWIiSJ9R35oYupYZT2Lb>b4=#Y4Tbd==j6c5)u>1Gc1H4>;DO4eh|dolArU zM!*NueN=SX&j}`{VNOgmpR&|HHGH5TV31*h!-o%vG>YF~ko%tDgFPaRT}I+@_kD*B zF2Msdil$NrPod~sJ0G3HF*>jFa9y;A2eBmzkE01I$X0Ie#t`=?GPH*~E0t1C1@~&a zJ)#2Ci+KC89{o5m%)yW2gZTPK?vE(WB5n+mXB04^501F$2T`tW&zFJ2z?WB~NS>GL zZgvebMm)wJ{q?_aj572;a_!-m!u!?PVPv#YtRo6YLnI@|2z4;#PjQ?o7e!5EX`z0I z_+Ux;bL%WeorVGzvlY9r*yvixxYM{hr$YSPGfWm$4-sZ8J2@#bTCUsbg1M#pb3bMm zPrA6f2~@UKY6g#$ZQJhE$Hmp(Yb$G65frqdrEEjXis0ZCEp}zwZJ%_bfZL4%ZfpL_ z?=4&X{%=;Og{668&Gs+(QBcm+h870SyXOumk>)2Yp zHjvYc{{EWlc63s_E7L!Q@KX8WkgdS|wLh~0q6cdOh2kLfIkyP@9xS5J)*oL3;CRSz z%!_gS9`3)8+m;na0*1j|AlQpjUx%1 zaPE&3c}rz>@A+Gw+u_mI`&v7E@H{~o*YpKiukQcrrOf^=PU~pGMvzzbzr@LjC;d zv=FqqEisujk{|I4wpmn_1>(DIZGFRln0ZM?aLdFK~W*OH`hr2wV!*I=+Hdw zTyn0=?z-R`cwLL*}?av|avFBug zLu7BNzXYxfqsk-60@*odz9$tc)YTJtF)YSe<%PNyHo5-Z%SpvS!e^GxS&DQ?$mo(n zOJkD@Lxa{O6A#F_R)4}+?Y8be*Lb)LQWjVSxw^Odj1=#V@?QP&d&{XP4oqlvJdRoI zDGeezb04N%uh+6Ck3>lx!rXSPU3S^3J1;UQ&fq`Pve>D{|sCf4UT_IX(!Bid+i(hN~zN51mYdz^MNE9{dD z=|}4JNY!lVOLk*U`Q+$L^SO+w_>5=Npn9tF*XyCAHsvM7g~@o1#_FJd3?edKFIVP1 zZIUUvYNonuN%LRe(m92aF?fzw-p-uqlkH}~oyP|cwXI+BiO}@fanTYX7TS7ZiX( z_WN@G%<8QlJGuhBz;E|M`O{t zmj+%YN?r6)Sm=f*m)SI5@Vj)n*I1#Y`BI0Col@k`zg*YV+mDx-k{dfnnprsIRV#>o{-L6}&TA{7dU%cyc{y%L<@LQITLXW)p&F`?KBI9{O8(Wl;#bzW zA0ND{pm^JY`nfZo**d%8W8=I7*|AGEY~C=hXx50KNsD(ZUiQNB#PuoBlji4UCN4}E zF>HGN(*-pbmP5uI7cS#lii}}16ic#NM)@(aFIN#Uz9>yR7t3meEY>3BT2A%xW{~C! zt_5Y1A5jOX%00SJ1+$O#O!HSh`;|d!?Atrjd(JPq z%Z89&(|P-1)aV#5ER%U-?xfXvElr(TzJb9DiX?pgn)K7tA``zcta`m>!K)c1YyZ9C z56o%*Gt!T*6`d^})OBOo8^-5Y=-&b-xgY%N)`@9Vt7g3+UHbFCOK+cUHQhP3>ocU= zj4BXXUvL2R2VVQe48a~qmEvWoQhTSZtuqw3scl5c`IXgNK9_V*r9y5jgkX{E6Xg|f zoWH|$;WMraL7GpwBnlx>j0cIza2L%T1s>f4?q+R2s0ZAcDoNBoBx>J}6Yq~vbxykj z^b90=IP);~(Yz!+nCSoRC}+jt>eMW)$wp(OmmsXLp;AFyR;UCqLt!|aPG`qlli$QKcE?eG@!wm&aIYu1Cu-Ge7 z&2x+=JlA=%_+NUCZ2L32=aj<`UDo~)D<{a$p<8hCR=k|-@v_lD{n^n$RY{po{aCUJ z*P~#Fm|uoJrA_0x2=Lbj@LYtCk6Z(AJ|{x9#CPN(w)ZHPke}P((bxO-_~1F^B0c-> zffvt3dOp{&1Ql=H5F4Gkk!+L-ha7GCFu-0P^zByq!AG7GT!yWKkD75X2)WAY?M>0R zY7U;<%gPpkc*nl}DtxnI*V4IKgKo|F_$gD(At8a~saZ#tm{Y3LGuBVA?unwJZ0fe4 zgoLS|93-n*eROP4P{Pa4)6dN}D}6_&EwS#4BCBkpY!?{um5)$bwu+%;HX2#YSCG4q zky8wYddB@1KHnAFd=N3tjjXbXV-_7LTzh0uz{IjFc2l~3;Dt#$J~wW7`(DYXEMi6L ziJbGd>axxr$jI1#CTs5>&*z+IT_OGP(~^5{Z?IW%o0Usi(rT-fQ63;`36}zJ&4DMo z1Y8~A$xvifOLI&}kVai*sr@|r_jB*hk}pdr{&hJHo8|AHGE)2zij=qlMA+-89K~uRaVw2w_!sSFZZ$TkY*J3K{hAng6_%r#wgp&1h6vn z)%VP6mgfI{|J;VgfJwtsqQ)G4YjINLsawYOZ^f^>Ml_Yye8C1DIQfym;kd)oKkVBr z{qJ|L7m(EKIKg+SQYi}h!gAQ%W9+NT()oTK1NylQklv!=y!hkrng0IMM|C;k%{-KC zN#2P3z(ZG=hpx6C5ZNkyv0CZti)Z>hrPaGRKC16<#D-VLepk**AJPP-#DgecV@jWa#G4S$EE6a zHi`|qDs5-2?a~$Ly6~ycD(P8=CEwyLL|bk`GKl`Q=kYe;c|;uiZD%1^@@+>Qr}T;x zAoz*tmMq~^*Llll#68}gbJZYol>yQRoKf6wg%elh_G6ff+#bFi<67ZPDxC1K^$%Zq zigO#I=njM1gH$|~We8@)Ry(%hCDX#feT%)NH)X8Z-OQXZ;z7|PHrDcnTvLhiD`# zyq&{&rCArk((xQoB-W~qXg%PO0%dO@Z$kA{Tm=tuX&FMPOhi#-f*cgP-F9W!nX*|s zCYnlTypS9|=e?YZ7h7YGMo-@t9Z@@}q_)g>>GICO8h%+mt z{-iSTi1j@`ozpV1b^EuE^zn8lOohKqyf7s9?p@bU^ERtiunB8w?LCzmySKGYeZ1Yt-jv@4H7^>r_wF6kyu~i7 z*c!qfdrs6~e|)!@xM8J6uj}tdmMu%>i1L;}`?DJPQ)~TKYHuaFi} zXfDYTC5dT06u6!wrnc69X6=o)R(hj#YZ(hwZ}i&ERO?&1>*^Rpsa0!iT7jMETx(?A zzY5)V;wx_6l-yxvRCc9fHkRvfr0pKUpg;WE>bGl;n#|@^yHd9J`&Uh`IgngwWM2Q< z`k*!^rAtUFIFXXXzKWf8?LzS>sAXi~-w4fTxrl zdRsORHzLAgJoO9|TkTu8yk=|D&e)@AJKe0$j+EZ!5;yn7W_d;O^nUe*FFGt+CI}efe$jXSI_|r88fc z5RxMn#YHH%Sk)u%sC7sk~VEjl; zvSzlD{q^NcQ8`q1`Fl}#i(SDoe*7Q=?XcrMmOEK5+Pv|vUc*A#xYZpGv>@PeSX3iH)7eoIl*D&(W$2NH4BdACJbLT zc!XcT{KN%o*qzMXvkxfNrO)90V7%;eg#gvM04Gi4aO7*>a!o{3FLvo#5$%rP+#myp zaaM_^G+3Eq$N;iuSH+plVS8rOUMcwU?)JJpHB)!{_-!*rPt4M#r%OWAq}m6q-O_)Y zxOU<7cjioz{NiU3PHpfW7z1NZBAl@E^Pb(h=*-(%$lz#GlL)D0on5QIv36H zKHD?3J>jjR8Ak5ELvtGAaC)@6bziFI4OAzu?8bL~5?!n3$;!|taem>dGDz3$$y6h% ztI+#ivkG({LDc`FS%o#HcPx2qULig{)LlS@2^lrAVu&3x_po#F^b+lH{dm5gdVJWVoB=GM@AKR~w7=L)1Nws;)&L{f~-~HxsH$V!Y@o zPsO!wuU>OyTlUr<=^-0vuBtMJRwQG>bWL15spdf9X5+Sd&mQ~R<_Z3v9xY41ezfya zTIfWYn_EW22E6v-k{6b9T;VzFadM(qfpC&C4c@>hPy=s<`O{W(rp>=3LLY0O0FhcZ z1JmTmm+d%{b=#Z23U3OmUshCi(VWL>El13&`0P#*gqS3ifB3hxZ+C^-0tqSe<>%to zt=m_;j{daB!tU5HK=vwzk8L_9BxsR|%X~4!0X|scPgbJxMHU$0LRImP*Q^t6& zrTgcGhLuj3B@`^&o7$k*ruZ56vRJa^-dD~G$(ww}GbRp4uJn%8%i6VvS61MNFM&5~ zS#IxQ7h~JEXKH)Y_S|`vLhZ5BhTt^5FvFVT*xsYF8&~PM+)kFS*0YcIJJ}zsSX>&R0wZM{>T!h0cH?RuxISB4L;@esXGgeAlEoJZuVxGXRa#9Cv0Dxazm zj^5yfnShsbDaPzk$|c3}=RQ?PU9oHNyq)i?wyBpOibD>qp0qx!a70?z_<|%`W%rnX zU55ixSB))xQK|A84*d7Cir&SIz;3gRdl5*Ej2t>LIXhn6j;jrH_jg&aBH$p+$F<=2 zEoeTXN9aAUl@FC5CblhzK6a+W@%2wuub4acos;|j7IegGSN6PBOBbF$Zz|oqqM#|D zDf*%D?4FEz)L{adaR>jjryv&)x4 zhdib9nns$f^9Cs9eRB_BBAtdspTxgRlLRuWP)ozEYk4PsB;_Zb?sBDvPr_fdv}{}x zu`DDg*=JnP_uq^8O{a@0jmAbdmvIyJH+3DOUZiM!9(tiw1r&{(+ zEsbJ+*Rh^h6a-Hg`r~JogO~oqy({>5jeA#U8N)6oJ{j3UC9KI|9RX>e-JH$7%BVX# zf61BZw+hx=shP7U)I71`_d!WpM|TAN@#1G*`{2A9nEX2bhVO8q zRS>zf$*ThfNWqyM44*$PZrS#V<+Y<;ium;Ty>I7^&kRk=Gs zPyX4p3o91~OnACXs-+PSZ-{2=2;@}NFxHw{&;|u(b}2I{G;@6J+k2n?G~%U^JC;{$ zUp{%<{BTxX_Vk2+#gz-!p3UD=7M(n+dP#P1)ELvVh0=EFeEe)CxnlvvXy=HY_)Y|mo|{gd zP~i|HxtaR~Pt6=@3;7F~F2E}l_$CgQ^_ylRS+jWMN!5GqISGz>h~+!&b>KY|(LMHY za4U4?l@4ph(w7MjP^! z;yv`?qk761cSMr1AESAeoLwZ=QF*H6e6_mT%mSs)$b%I&X1VA@v)*Z4HoTlR5^gbK9(PaKtJE*E6KOrA(?P&`6_{2#aH)f^oBFdpZUrJ)j>cVWFohB z(%gUyRI0zETt0%%4%in!>}Z!Q&5i-KV#n>?Y(THgQnq*%o(#NXszkBBftS~4wNZ2l z-OYJvD%rTnEM*IW5|Y46VYcOH#gW~$LQ%&V%&d)g+l0OEBAw8oJrW|1253%j)1NYD zg~Z2)jE#>Mr7l5x2|p$#jtz;&=%?^rCPo+Kw@#U<1$ed-j=zcf-Mye)ueIC)C%ZAn z2@83A%b_}vYFXWT0NrS7tMl#?$_Oe^zhTz423>y%^)2-AHQ+`a#fb8FKkrweO@>qj z>Zb*i=78>7>?mk%_!XK%6B0tLH1i+Fh9-cvMx4hg;$zhjZ8|54>APW}tipyF&SUv< z-<%4#nb*N(n)@|U>)xCgz^i(VQij+{ClDC*Y+%g-@?MN+L?8Ef%qjN~ir7u)zJU{3 z)oATWHqiGOEg33H(Y#_;Rh~JsILdlnYq%m+3Lcm43n0v@Sg~D>vi>@Yi};jy=glh zfI6LL_s#Ap;KeaK&DBx#CsU{6)SZwrxJLG)^DiQgVxZM}dx{*>4{b94b^*yLB!04# zvC}hurFL3p$E7>^nS^>m80ly?^+Y<_&%Pf=9LO;L7VjXEk>3F(XsKxJ3wBz&2T)l* zIaJlpUQn)|-4;M=F_s^DVX;i(weBRv_Q_k(N-#X0ybx@Fqhqr_mVRX0uSo4jQCscm zU^&va7NbzuEQJ&2$j98{zUKsK1ny3_$~B@*8bsa?Jd@$hnif2lear)l&&N?uo*CRR z&gpjPW45eadU#WmEcb+A(r(6b={WNc?puyFv)dhJ!r>hLS_TerPZHyN z&J1>REFm6{I-KAyii_@v2DZT5j92i20n|r zVIwPT#q>F6X2V3iSQWi9Av-T*b>=Hizw_LhbMX~RcF$eBdQZ{b_-m($*Bx5Dws2xX z;w1mr38Ug0)|NNUot2k6F?`&N@PMUdb9OyTQVPdkUjhTJUv!cV|HnzXbC_PMs|9Ut zbFOec-BO*?oMS^WFzp?k;pINWPrAT2^A#G7*(-cI)jdW`WYFIJtMyb+65t_Vcy@U)hNqx)Lx zumySf*wPM-Wn?TPnaJ$L=R*Is>(sE}6;h!^d$%rsq`IvGxR zB8MYSeA^CgZ4a6C4QDpE&Xw2cs2{5Hp*`2`>DD^mL#_kzb0?~(!H3$tua)bBJ>TzS z?^^484|$!h$8*%qu377R4|$!h=X0Ir9bV_VKwPzsk2>EF8&@cXqqnHeXWKFGknd*T zy~%K3tJhqy?q+z%HBo-A!>&H~kndZN-{WxQJ-%-NaXMtHj)!U|xbT>Cps5))DAfu1 zC`7B;TIZ*w*hYpwC8kOpaxXeRUUTN7>o}ZbpvoGj8g1`k2P?e??Ch}U<9$19@btPe zs_pF_Sm|0Gd#wsWI}^B%k~ccY?}pp)e_k6H~el= zwg37VWRi)i{c0wiF61_9%$ipmnM5`j8B#bSRkl&elNEdSz)gSw{Jfl!AM?|4NQQ9Q zfR4(^B_a=hrcAYkMUfLrKHPgSKlDUV)P$dIA6OH{{A!+dcbB#&9AVY*3u+tPjV;Mn z%1=Gmo|M!w<;tcm>0WX&yh2iOh~4Pd!jJ=oR6E5wLq0)8ly%AQ|XI&Ku{p26( zKHR_YQv8IsHeUalRz@6;lqZ&i6vm&;DZLaI`{pLaF$&3oV_fm9El(TS@Socr)GlAX zBv-Qh+u*q2hfj_TDUY9;my?rcb(rk>;yp88M84K06>2rWlkZ`0mG|$+o|q;E0aK@{ zBOnguI~81QIXZ$WUYhD-9630C(qNa=g4pFJ4a!F~X*GzET%dCrS6e+q*(uYTu#n9; zplt1xtt%_XfU*NyL0Rxd$)x`#UDAdmg1A>6Y)c8lErGYLU3mE;B5uMw1k0#}mhd_( zAIDlNP3S+K9bif%DmQ+Hfho&RRd%x&>zDJQ8aGN3B8ym7Bo!X8Yf9Uzcg)P&5A ztL)bFsqC}lX}3>bxGIkmsl5R?4W|9K^4cSXNj(ZpSPJPeoVNVZ=^g{p0%W#rOj>^| zwHvkboV@;MKQfORg?n5>sD{B~DPRYW@UK+MSvf+3M*&b9c7o zDm)(|K~c`%e^9LM47a+~fG^;46~Xm7?{#FOb|JGyZ1wN}--LuN0X-2ux$v6_pb!%8;g9`Lfm7BRdS)f;Q`7tLzmSp` zm(E2pGIer5!o*SWN7hvwrDSAsRK%R{fMpe_d!7epXv|#B>qm;jj^bZvfl$jbu=fWk zp?sF^tBK}Vz^<}r>86x`H|G(y);A&3g~aJx%sHR|GNu0XIv2kCv3Fahv>nu=t#gvx zLs<`~Q!e4tD4Dc+c{PT73N5_Ig>Lzz961#^i=#=!&j+hBswZ=IZruE4Ud6@yfQ+OC z8)J*!*&LDWmFY5e@c5FM6L%I38M10yY0=8Pl1VrF%tuQXpDcchK3x2pYq@`j-q8GI4injii(XfsN1t^Yl_?2%w1g(G1JoBLRJ{7 z%Z2(TmYyMHH(Acjm=b;3=s|o^dJ_BupoCf7v-{KTg)&?msL$7^aNHZCIZtrOk49G7 zLo$)nOBiDQ5q40wXx=w0)4r{3roFDpTijY=mk z_mkx+YjLPW;aZO=OZ|MO`^Wi7jta@qoCEB~$*W?MmimvL?l;+g@+#^6P}kj0IVS{& z+f_E$ICGlwdG|n<#4()-*{jAVoNmE9G~C8%7?E5sew^R(6x569zUs`A*OT+oW#OS6 z&pZ@9L<%i@29mvry=37>W?wqZrK5Q_1r#{@&xyX%&+{KS=z2{5kgAq}tx6ysl^e zh)d;N>dmw(Oq5i-kQtreGcxbjMuoE9T&4o~nZgTozd7K#iIkry@TbIFo}Y0zUFIojN(x-w!;U=yh`inb#*SF)wL2Nd z*y~dLxrhA*862GYeQ%cPQBTht95!@l*kIvw7oTIP$GeDz5YHnTQmcp9_(1EMIPphr z5g`EXpKCvO%p4n+RI?^-#oC0(G>=e^+{W~*XWuox@{(}NGAuP|(X(%^Sia5qv`)L~ zY|+l2u9cGKN&se8WX$C6QoxbYdA0;r-pI;t?kS9)Ueq>eMqh5=gLK*QCBs}2LL{I9XhxDM1 z&3yUw5j&k@irAG{7#;=(*M66pnI0_euhR~6kXfu9 zU^oW0o{$+RECVym!=nce9zT?>3IvM>PZ(jr*HP$11D8K$7djRQ8%C-g6GNv9RRPY% zeg5s&PB;&D95`ao@pkDN%W8jX(6E7y!=2v}+}O8|28VkZ#|?fYd04(<-b2ES#;_sM zUG$wORf&HGEl+{Hu2y1b!D?i)wA(BV7-(=9*q;gKE#FI3tVO(MNf{bE6#ogAI%uy8 zf1gV{N|`PG$|cwfj#^{09h@XCxBpq$(~@Y}NqDGmoT+=in{LnQ*$@0}1nB{wI-_nV ztrgl~?W&$cRB-R_L^k`^ptUd8q?`6E^pSk+NeCS*%-itda@U=M63do#I#|b|Ifdf} z@BNY;&g5-nxL)&u9h^Lg4A&7H*d;(-U+HT3DhP`Ztx{qMg3CD^^fycW2Ray>`b(0o zR?6)fCR`d4LM*jl*+;&8*#wDT{nGA4qu?gF3D;?3EH=F!tHRm|*;_S6I>EV*G5Kuv z8OMy^+iY;m(a&1pCaRqZa{CTtp23Mm5o4-w%zC?d`v|N#e@^iuUv<;#LXOa=ZJ1^3 z*9bzCJ(NkX3qM+eU`2!tD-urgUI5phzVVqPE83*YUN{xaA;~4~$fiNOYVTgHx1=J6=r`@_i3Ue{-P-QoM^X8S8*FEQ5 z=bk=(wP|f$e74K(kuQmP-`)P`yZq(hF%w@rdZZ<3QgFd~(gBPj26MWwhm+GqJPrn3 z{OpCyV@!OW$O|6Z2hZMr>8%AXtgT$!&@jI^Hh zl(~CS3_B1$@ug=L?@v`mjN^1Iup2QBbQuw4kW>}1QnqbZ!c+^E?C%?1S$zAI@Q1O1Q@d_foLInaCPlFw;}VV^ zJwW#jHArnNS)2kq5OUBBFx@9C$!s`>Y)~j}6D!08kT6z*scy+4=pHQWYG`1tXYR7N z7OAsJtbk%#wlkk^EYGp-8hMu<-orlhzi7Pay}nm>t;@Xb=+1Y;^cfXi{@YXczSNL4 zKYe9G=KPFYj6G*=SVZEaNr|TpSw0iknhjN}B(1>Kt}kC@kyM>rz&W{Gz{9K7IH%WVb?q zXhL7|S2KtXgmvhOMAN$*-LSa&rMEJh*G@47zQ49)Q(i*B$l#SifcAyyi@(3M=lyl# z!ljd}`lTa>UXG2CDkn_f*juup2YTS23+zM4YY8D-4`ffF?)IXsyrcs?3aUa&=;}mx zi8qdyuR0{1idh}xou9a3^LinK9SbKfar?g)Pw#w%RZW_}c8;I)+x^eHNMp81Cxse5 zCMua26V)^*X$`1!vdK!x=pmTl`BP`dctlNEP(acsPD~1_8@;DQ@8XoF1i>*^ZM&U;@sEE?PN9*;ZKkCi^HLGVIzwm6s zvaA)k4Gm*fiFt2aW%nh~R9d`NU|p}xizNF_lunAiyw9~tpNZg}FZx8LfpE?iKeBS^ z!^1Zmp3>`|GQ8IyeMn5U+;R)>^z?TZBD-EA3};Cvwd;6q<v!ynr|4o3<-A##> zJmdyMMTOF)8s6($_CJ7>P#cOeAm?v^1ELI9+r0_wlC(ycB~53S#EL>8Z`*3i^EE({ zv_gyrf58RoibW5T^(&rwvc6%_(iN~%Z9$SWD=OxL^U@I3y>d&j3Dya1ZV)S2vV%Kv zLs_?a>^VHqFk^INQv4765)!sG0K@uHCo!g>4HDN3NVzk~nKY@!kr|n{yJg!lEWbgii~I ztX#aZDlu;UyojKn_%Y$zSCnkWc(X9}I!FN789%XVe`Gb<{>-Y#eE)K=M%Pb^gyF?a zEe1!Owx4d>!Ov@s8C>)RCx<4kCm$F?+}uMvg&4~RgF`&s#|{=^x?W@dXK?J0p_2wn zaM{Qs(9l=k&S$J%c?5{0l+rMp4UsyJ?;dFEKVZmHJ5NYIvtcKmf66$Zzj5I6;N9!& znLoOZadjKx_D5;0G~);N05{h$?mwXKL?K2@05!-XTy1%TYXo~#Bi(4Y@7gPhNE`XGKkB~-R2;gg8KMxT< zN8#+VmKLJuoMcjWk#TvNl{RE4cqSH7bSP9(G%8dIus6W#y1&6)&vY7v0sj9D-RAZS z-RAbI%)mYEw`kh2XBw6-B>NTTWJX23d6lep?FQL;|9|WFf6qDuO{U;2(u$G~KjCA) zv>FM!we5jGVE{tyk;U+v40hrmV(!t@i1mSi9@D~SZ3qqyJC>8W(LXq_*|$1)QmNPI zHGyLnL@yG&6RMZxRK*(IM&$>3x{mSL?HlUj<6kk~ayNEFczw*s7B}Ot_=qWU;mrxB zG~o2hk<}gZ?c3&aw{M>_m6n?F%gY7tZ$AF$KmYTikH0zERJZ@=(fxH)sYArTzmlnk zH6n4PY?9xSEAp=kD)%eWZMjq}#67ci-xmB%4Cum!$DHlIGmRT(`rUTyGc7TdhlZA$ zqz3J$t*xE7>k5ki6$hs#AFP;pBBglJ#G(}P0yM@k+{vS-s1)PU@BQUfM7s47UtbZY zSqkvwpUz;Vb$>%R^5cEvOHkLMuURT@=`Yb;k$4OHBk`WlWTqFtPnU*u27^=W_>P#| zGdW?%2Vbb=Be2q3Hb`ovaiq&^+9@gbCq5qD!5qZj5#{+Ao{+!ci`yj~sJ$>6cT4_N zZQU+qX>SAf!Bm0d`GS1rT)ASJ-`gg4Abg#*@xrR?Lv!n|2A29(y}NJM-CgtdpR?@Z zNMtoQW?en?+c#6HE23BYCU>*+^QXt}9!Oy?$^$_%1=4MOI_HuzM#HHdFRbN^rWg)) zEDRJy&`;l4(EilbHA-yk%&g9@9+ZF1_#z!bIdoz0&8ga~{j143dkOuQy!-uk(m-71qRgvPGBw}i|TvoKStC}X!+3e$^$ zxWVjNeb)_^q7Cc%%!1po02p826-Syv9(0sY7ZHp7^S90wRI2q*CU%~Y8qv&Jd zzpFWP_DJiOced}}U%BU~S9AFHmv`MLUb&`vXZ7EWZ`CJN6mG65KGa%m$}O)nWk&f>{)w3U#uy z;EJ~J!81k-kM|J21Qi#uA$+_Q4`8rOCi-f0KNcTOOk ztybyC-$}vm+$ypl1wm7QHJI64OR(xJ>xd4g(MU)1dTonk_9!u_)0CFECVD`=+2no# zhT2hQJUBG1b``0`)jNb6`q;_Gg2gGgUf{pyD6=@-TZmbl-xV%fBHgSlTOt@j7X0NI zOEt+(`*CNO(g)h$ovUge{9BWH+Q)$Bh0rQr{v1^_a6224{uF(BpswW~C(@BYx%7%3 z28wJ*_OkNXvEI_Kc9z}mDFX_6Z0R-0Av9yf4r8N(XIS{a_;~wL9_1?^(&hIZ z;70>=K^zvn;}0g&A9h3=-(lXrIWFD3mUd0Ld;CS_)oxTDrJOUjE;zAa!-)m0HQ&AT zoA0)5`|dX<|EpSsUDuuJ$RbX_j_4*koW#|0P8`SY_$Cu7Es!TXFwH?c74qO$+SBk~ z`<5J(_6)oteTYW;aYvov7iG;il;R!uP~{DJi(W{l|Ku0sm*f!~MxnKi_P3}$ zmyg5WGLYwe)T+E|bH4PxeII-lB2Qu+lgVS&p0T{8jLDI_F4fbh;1cQJK=O?o%RXi- z+>74lZ1v=MO1}wx`Uz)ATQsY&2b$(c=&J4;!0qNp?%w(sv5-B=dcvSjoFbtEuwsWw zJ~Arzh@a1jU#OO7_?qCF90iX0F4`;iZo|560WN=g8gVu-M9q~}#YJch*2G-o^{_s^ zIQyy4bo|%8x+)Z5=BxbmudU+jxV99d`_kxGl~Xp|(4t%@T_LUS`TYgTG=$JC7q|Ex z4?D17&9k|oW0pR*evT>Ct9j)5*J_&owLUSv?ymH{&}5vwJvDajO7$xY!E?r?#c!Bt z`wD}wr=wh1loyPG1|b9A+$QI^TucG>2NrVB2J|BNkj<()xT8^$v432(x3Zc{|pDI#B62_ z{bug}OHI9cub1KLc*iXH zLI?YDPI2T!(=^bFeXx4+0S3PQNgu@nFLfyP^Qym9{#3!kHJfqTa4C-M%zEv2zujaF zjy|cZyd_`YZESF9Y1p$z4vf})P`~$GEJdhR*kx~ph&>(+P=R^1iQ$A z&L%;7QO6|(QRZRpO0Y$X2xmR70oM9$Tj`(V8W|cE<&M1_whMuS%S;0Y9`y)~>#TrX zVn);9D>#UO-XXix_19EmHr8vhrOSqc&>kHk@TV|~xRXzpXOcc5O8r;)%&jZ($zdhU zF-=mb5ckW`rJyN7wm{LP$oFtSm;CKFQ2k1bX*6g5YLp2~Fk9XIwOCW0rQJ9Odd#6@ zo%FpqE%sv!>O5!vjXT>!+Ur|);3E8?4j(iIUAD-ax&nnF%?-{Gt|&<{p-Bk)%F=Gh zGH0;%Z;lH>g5~sALZ)yYYoB43EDGj?qUL7l9uA=gOJ?DY1^mM6rXBC<-TfJHRM%H$o)nkLIRxrG@6+b~E*R@f&Xky;;Nebl~GxKZ!CHZO>sxMeu>@>b8ZBkQNq`a)wqWu_gkt_c~prnRhg*@d5*rY1Ziy>sqL_cIAon|{8qtaii6HRD3ooU1iuo;$Jp zg?E`?{Z6S2;hb43NU)#v?^Q5lTyXFnn8bk-@ej&RT z)U+4l< zI_8-+1cYB;UlK*^*q1<2E-!5<1una)ta_xu&&R8c-O6v6J!@+AlGJC{Nw-*F^z49f z%cn^Xmag!d5h493N>etc&)6_z*ycr9d*(FxObH81@@|?kIXK=6QwSe(5XMB#i}4V@ zw+V$(vMAx+EAX8#D$~&}!5@jgIBQ8(rM!i`Lvk&MS7qDSTV{Ikr!>hMcV=NVU%D*H zJtMnU=PDY3WgwK3T4@}bju5o{q>eWbF&q-$`m_*rICAWx_7BZ{grPL zU>tqHH>3KM1yj}~EIZ(pF>J-*ypq?}RDNpd5ZW!@;*P7Qra!Y|$C1g4=1iQ5uTTBu z>??QHvSvOyMv2AT@D)ZGNYy`A=LiVjl|mDkx-)+8LTxR!FmSv>itvTm+;!=gppi=B z^us{JUH7H4@!f!9Qo%Gfty{yIgxi+SBGbV^(m1+NP)|3pslO9P`OR$DZI@|-(n(#k zqTH3A`qa_BL_OWKVHeYlhR^Ygq96j_^#XFd+!|oXZD(I3v-|BGk?d$0F#6WazLhSQ zv7=YS1k0&M_k{v%e!PFs(#H3&W*@X5EJw@_>`r61CwwHd{}(H*FaTK(g;CG`Pju6m zrq#I>rKa=e7cN~jFMF5Qk>J1WJNZs(T5kR)#%K0KXJyZuk&HX)l9Fa;WF%}kaH4wF z=26D_j6G)+?Rf~QX#X83;MG-z8#Nx7&A5d_vP25Efb306w4#9zX@9l|#^BzYN2SCs z(o25cS%G4SQ??&%pp{#i7~+z`AxZFP@49UkTsTk4z7blx1RE#h9<_la7m>Q8^#=j} z;(i8HIsDKk>S&(GY)K&ysX`NWrmtGsKNXrFl_fhJG46C+k|$h8r}>tPH7Mu6M!LV( zg4_Je3HfEdbkx`Pj)gYqYv*B3qR!mR#yh)VE2}db-)z>2PQzSXgh-#szQ$>Omb+lg zQSU$(mq2f!5bSaBOELP!`SOuKJnaOxtD;df4UTqzqk2)oxlGW@u1S3N8e~o4_O|mcH`%GcmdfLm0KIMI&~tw^lUh3=uCmDR-c|>-Dr&t*yW3v@|ZGI8VPs?y|I-=M8cW@Ad^$MY6_+;-tw*tAjYAycJqx^U4z?LSVQ`eEDD zkoHm2!meFt`*_j3k0Vp0-TIHye-0x$V578m7<5H)ULY2%@O-J0^F;Tu*mEjGP#|EWF5d1|ZSI*UB! zhh*=Y`@@SuM7SxiOHll%EKMEVv1q3Yl zkM|a>UcCq>E~LivXIADuJ+Eo`ym|bNWAvgcL@$0KIE}rod$ownph3_YZ3*Ba=227> z)LixPF=E-J-Mxq5%Gzr%$QWKgU&+U!+OR?N5bp4?fP)^_Jb~Lr+JnU_(x9BIkGTH$ znBd7B*kmaFew;vtdra6P$>H(wmD8ZGw?`OPj$2@Vuo7eq{1%NKXJBzyRo!z6TNGUW z@bCZe!S*+UT0NG}T39+^VoADum$@{UePv{WEnRHb#*MM#GnSv(Q1;5=1yiH9>|wWX zu^hhX1Yc2Y8%LcX z7-!Fx=&1`9zf!j0%<_!!u^Tr^_qr_7f6zGKZzCKLZc77wb>thKaQm2YgB4oA!Qw4c z#rd60dREK1f;;*3Zot-6IVYl)U)2cCb}K&|g*NT&f4E5PsJh0w{o_ppb3ffyL$)9O zD#4ja>HqQrVl-SUU>~EAr$fNN>#FklY|px?E2PgqAtQV*b;v5rE_5Adskfv{-~RMd zRzU$Pnty~88M1DdVnIv}*J#*o5^gEFhy64Zm{Ao~y}b`*M_e!}U&qI3p=(8jT3pse zm)PK*Abt}cF1UOBb+deFmr%;@v$><*#g~|P?;Fc^mp>x=NQQmP#3*EaoB|vBGa$`MQpsH$B0eFf~2Q)mLy}%cMZ| z_5S_R2$ac9&(BXkW;(Y!Wo3la%<^LLrtZY}{7weQo>ps68sS zk6$pueuqL%Oy9T6kbFR6B*sAKLz`O z30yhW#O|Al20Atj=ocK_MXU1N_0%(uJ`joFq;&rW_#68UFXLMYNBZC z>igtSP;ubw!V^P6`ik3S9ubO~U`P=@%>SQ_3)u~G=C4GC@(ghIm*Yb%We!>#hqBVG zWDm?Pp3~Co*EOw2RHu?x*ekk2Kk(C9x<$<{j^@6a@m&i#rHI&O7M4i4pR!|?%k2Ns z_9g&PU0L3E-S=KqvF`=ND#ccafXKedCYx*mA|fIpA|fK7A`&Hth^V-ZsNwn>{z#?Cm7V>^CM#&Mi{nS4g6=l^%_t6~$o`}@!TFILri_uY5z zId?hd+;h)4xAuy7RCFU(#OwQ+oS0;$`9L1|$`SbQUuql(>B#!+Dx6m~s)yP5AFAz6!lWr^gh_rb)?;a&thF#h`(X zmd!rAJyF70()Fa+AQBq*+=O6A=_!r4O{F^Nj0uH2qzc7APBUX(dsv%Mz5Jvxtu=W^ z?4IJc*DacHupKlEa`^7~ip+ytUjk(7V2o~fr^_~s|1;pl_!hhv&eTss(q=+EI-B*&2~~u!^*Gq3LYGFT<6| zp>nEirHf;#>6{H7u9MhRP6r5>-t7MI$LByqY3*rRBh#Wla-VWO6FbLV(DxpOY?J2_4!9w zI&D1`_lT_&X^g8IQ__)NO2>-(Tb9oF2&)(E%&<5=nNG3bwUhTWAHAQFk4a1{9b+1+ znxAM?HvL-XdH!t_YPtrZ>;BhS=~x>H+nL^lt&QY!UZkb4@x{spjbOPivE0B>jyODe zNm#3wgi#uzvP$!s#i>CL{0F0QR z`Y-A^#e=cywJ-`5ms|Vut-jkXY-)Tx+b1JDyy#%wx{vm~_~OoO(RHi+xBdJ=$y#sk zC2{ealGUl3V)&+g9~2h8yfU>0s!-#q51V&fZSL=DYwZh)6;H)xaXWUzEXxfI&YriR zt^`Au@%D7^T|WjJ<>^x0bWaj;l0kZzasmLHt-g8Zck%n{R;~9d&dsmWG)2CF2=2d>~F$vm*DY<^tS!GiD zv3Tofzk0NnUMm9$Y6>@*u9bn6A~k~hztGCic#$O>Q_B$Op$hqjz;`~7r+pEjcPXC{ z%mm2m4Hpcm83pIo@bN*9{<#BNi`vptTZ?Yp*tmDs=D4an*M85o_bOgEzj57)Z95yU ziG|ret4P|kEpdBp?zZ^8eVaCHpI5LjZbfTK**lx6NBja$x9s|8BgLKha>o?I(SRF-JYrz|Nw9VjXA=u&;rj22^ODY*d3sA`(kqRdC+6E`w zB<7Dj`atr>h7JjekO_ZmKu2dgG$EL!&}QiGsUM|+MmLo15n7VopJpQ;+6G}9+6G&k zqcRU&Ylsv>^{bLqA?(4JTUfYc4@NZ%A=pceu;y+Dz4r6|?x3L8Zfx83k3AQ9{&Cy3 z8?OZgz53?QUkmabRri1V;ptEMTL1Iyw;%4_{qXI#|Facm+7jJX}J;)+&Vl=UtZ7?iDFjIp@f<-o^ zOK&P|z`7YYV;g}J%8#!y=lM~dHx5}EMMHq{yfPp^fyUzuJe-%`(Z}Xo7?YWqk|$xPpsOdj40KJ;@#zTvn_-ea0Pat!{szDd zZSsEyAJvTkK1<3osqP64!U)VX^*=pVkIR4Uddg_j%f+X!t~s}N+Y8(3@?K2#*{80q z;S&w*I`Jf8Cn0%D~7AAz_#eh|wcZJqeG|=5AP_{Dm4II+883R>D+jZO^L- zXSIRjB971WbubMcqbHTq*TKbqaUD$8dn3;-gwdCDu0dN1e3*xm!GiiR8PknZ-9Bl; zVhX~ur2Q*{Yza-Xfj{HCvtc$Pr^}q!!J+%ln5om#nJlWG&$I1ENL>5q#4ZkH5i}Y+ zQ@VjmNyiq@Z5_$viS9X5tE9m8D-Ag1t!jP$s#kZmA8GC0v@foIkn~rG*NO}MRxkPV zmkn3cjbH3-{%o&PuEpkeEBC(j^Os*7UL3ZeHmH0L<&S985xz_Y4v*bfNh;CLVNeR1&SO{X9{(fa8QH_O9z2}R zYiJ7${i|2h>-Vdu;gX#_EYS33St>5M^`@ks~)Z z?rW{AY**L)s-C;L>BE|u4>xTY3!ZoBK>e@kx_jz#Ura+F`X27g@us?$j#4{hipSR& z1Lky13@9i80p*-BTRhPRT{soTAG+wEQIFE4QW#euPbO+PQ{-mr4@ z`txPA`WbSCjVNn6|D-kibIPQ%qhv<0(!7|hY_?-Xt(oarY$0J9YF|ZpCzWeBCDhen zQ;qVVtWXV-@FTskd#|53d3{gJiNhpX498*YzAL&mR(GwKi^JFl%1OvqoB#Zqty_Qd z=gnVg{*{{Jh zd)H^j&z?D>yXqTd?c(Yq8sy`9D^fnJWFZNrwoek$W@#P@~lD%_25JbJiloQ z);Lm%ZUtY%QZV9KO1bz7_c2S^rcX&mN(jFcZ>^^(7?0hcu{G#rmEp`i+Rp~#OACIc z?IqWC_&4=I&I$GJG|~%~#QLFatDBM>T^4OGDch0c*92-@aH{_1T+c>xVuqU4QxK0Fj+8PVQkZ9@G$fL}5_&M__L&`n#0+Tvdxu(l{qQ z9=6#;b_h~YG+>05F9d_|d7>;v<)I~e2MaUX^151fA9U-T``@F7e!sEigY|_+$`C8D z^Q)gX2m7ySTC(oI=2fY?->E#)wDaAz*x-$=dBdos3N7I)jd#k&BIxL%W|@YaA65B4S9-nX@>V_@gn zs^+qixC5`P8QQq!P5*#1J9l2#M5P$4@nIL-gi~$JX-gnDIcNfgIMG;hbZ_sQflHTk z)#M&2sp3zMxAuwy$5;E7@6G6M$8oYb9qRn9Pq$ttFA(FP9@n2;YYmCte))yHUo;M+wJzIpBCT!t zveq<;Zz`2?fiG>Ra2p$}LNqD`CIKns@;`i4m(K5KA1d`G|4L4fgTL=T*)9G;{80Sk zPEg82fSQgWS5W^bJ^hD&3Wa_WY<;Kdq4%L$R}f=++X+Sh%3KbvwQoaI?%b-gO)vba zYHn^!O-Iw;A1r9k%4jbv+_N}yPr-)W?UfbnyVP|b@7VKEfNN20{JOWw%imfTUt8oF z_}e`@KCT;B)VwTnS60@p%w^4sxbxeWuidt7?egtt-7SFA9dJ6Z)&-G;3k@YclVEZ( zz+>1?VDOQW7rr{C_CxTB-)(OGhXZeXQ86g~&a|*SBdfh&`JRllJ?eh@J%4{RBxUPo zE$vqufA-%!cg5zXGHy71_p-cQ>FK-j3U{Z0rs!z_chmDx&$2%@#V9qM+IFE!uK%5x~DQ`p;ZlctZJTi{50}lh0ZktCTO`rsI+aMka~p- zl>i~jfQcpL>|Gj}o|u-9WznvBy>aJjk?YeI7pTbbEq#r_nvD3l*{MmsWv!iC7FRCu z^;;IwK_LiwdY@}Y>DUdCxYzU97iy9S9Vy%Ly61lN%Bc9vq~wIqxX`GWkTkmv&#txG z4@U;aXTE8-bA4cXdTMlVertN*{FH>Cz`~mL%FuPr>J4c-52KwSb8=_-96jd>GjJ{y z7#M6PipiPg>T0p$!6yY=r0!AsCnS|b1J-cB+Qz3F_8cW;4P~`dJ4IR6Bqt%M6^Gn& zG-V5yuF6b{&UR=BBA<(+YPU>n(ayy8?G|Zj+=5C|lM8~qg2^WxAKBSuwPfvn8;}*E zjxN3kat)*g${U#y40aAu*;C|gw)aRH%67%qeQ|W40V7DXatuET+C>%N({+@S6$e%25y}G>8ryX z{!H=@ceLmK>cR&ZbRCipxVq6#^u#1dzW~4{PQ0AxnhC`r_|H`KLmJ!qGoyUNkJN8I z7&139EK0QNYRs*1Qx}F;wzgJ=tWdkv<}`M-?O@<&{V$kpqu=f8Z%`lretGY7l~usD5pjsymw?W@d8pp z#S6rjN~b*5wJaq`yudZHJn!mLg2Z92ouz;-usklvbCxs1Tkq*p!jY#9npq`3s!u6I zN*8C3l=t;1PIxPoocUeuI@5da*XhjHh`84GN%fWh{m7!o|yvLVMlrcLla2uI`+R>u20>eaVL$E;-x=vju%~^t+1Nxj=0u4U-p&QYZ5R80GUCK3b zjiow&%DD>>`=v(qh}xeyKp(_T#RVU@6`h+K9g~;mlph{mP!JxT&+>|QNrUVM>OpLa zt&FLBLopI<6XMH9=jVpUtO{Ex-gUD|EDGT>q7t(Ui?cg6FrJ8-_{*rt0q;+#i=T3B zs5eGmKX=9efG)^zMa!a)pe!q@L zWY7Es7W%k5=uO(9)LEII3i^-HW3g^}h)Ek)M9zpAx*@S*0$7xQvnYD8^CXpEZ5v`c zEr!(D*vQyI1J3p2G*_q_7PExoC?TJI07JslyX?GJcV<5V>?TD+mFLvODWp~EuRMW2 zIli!z9Z&<$02Db!*L0W>C92P<)CCH_E#c&Ajrok|N;QX5Kg1~^>kTD8PS!>gQSI4&h zv6|u>wQQMKU-^FB(uU=}+Jf3_U%#pYt9^qvuU@V ztg*eVGd!HjFF#W*B=;s2b=|(*Rg~15EFj@rR~M)dMiR=UXPr^zq!b7{#f_inT{q}x zf>0+mMD`NFR(d`&1jz$cgiBm?Ytuw0N3UFvwAoascOP?)p6F>3=e$52wqr_9 z7wuf-7uB}Wj}#EdRpQ8$4(I4uzQXrdWie|=jjd-y2>XQa8pOj00T}e-X{+IFHMSaJ z7kgj*UFaSAJJG$7#3}M*^aJ|`p?B@?#-5B7@5Sa5bvTGYXBR0thPVnx>F1a@)Fn2O zPO*`5qYfsBP$It}v?20x>|Ndz*!v$En307h+ zYDc`d+oFIcU*ZY&S(SK3t&Q;f$wR^F`p}SgV~9q)gp^DwsSGN>O7%%9QbLiE#8TX8 z3ZU!77H$sO%NC&O-JT;tEI8=pZJ>rHM;F$oW$#!t+$MM@m~ku7XRa`!yYK93?&WsC`LtmLe$Wv+Kix#u8qrU z?%oxS3rAab^t@m#7|+veS=F?t%2T7I{Z)wCAqCUgZDH(=x>>+n0~kJ7kn5{;pnK6+ zW>Q!R>*`927bH8V93oxvBMT3OM#Xz*y z=N^v;i$2v!2zO&($4br>T0{Vgsx+9p`bM=i|{k6IO0EPDTCfyHB{00Tai!?)vX zqoY!d5|;>P;nf+sl5j93;cj$k*vd%MI+u^h%Oy3m+6V&>e0u?vi}cl`N5SuA#y#e( ztPnNY8*2QY;>fp4IL%fWtDN=;aD-(y#Zk`(pNr757_dIY`wjZ{XZFc-8Sxo#rqoWU z3sa6uod<;xW~>9Tk6am68XcaS7sEMN+Gs8Lc8?7m*~JA}Nm1#%N20T4z6EWyEYNc5 zmnWy(9I+wbdnJAIY8(L^^a=ga_0#VQ^ox@bQG|J#;TIQyDB=8UC6Lcakoe^%^h?)I zzc0`)!<&X*U;-GpXjXzA0@D0Ug|xj;6Xzo31DN<9_)MvQr_#NsVuWlbIfpu-M z?mpk5G=W{3E2K%t8*Imv?I1`RP${H}K%ISPu;vMKG-#P130-aY?USFy`0dW?JRM!x zo`GG9+#zwiwmKuJ)-7UHWMpY%Lr}rF0`;gx%C5^tgQ8D%tvmN};mhJbe|=m0=7VLr zA4z|>SSs8O@^!E1FDrU!S>6)v$FoIeFb*ojLS;BCEF753;cqyl2b3Cdz9r!jjS)fj zTD_S}7U2MkelOZWG*O^JC%s~7O<4BZDai0(Uua;vhu_kbDOs*PaW9dN0b36~V%3&Q z#N=dh&jIn{kym$h$1jXa=xJ#Pfuj}+ z*Bz@ME$L$PxyOfi?)|;o`SkJe*o=(WGwI^q_tATOSkpD4_por&>l8yMXQMQO5)0@{QOs}Syrz# zu~97E>YkJzwkd<-_!|L9p57HFcV_KbpJp8!a&pbe?Ws0$BYymT>0ZV$+Ml`!G$I(Z zs#9y0>o>^_L)n_p1pZuLX>?U8YSmp`yfwi90`IZ7!B8W2{Mz_Elx+auG6{Tgj@2b# z9T+S0DEu(z>`~u5v^f@N*o}}3&6tU$#k9zaVH&2bgpV(mKB~J)9u8i}ttrpj8XLIb z{Z{cLX+(UU@WXq=&x!jhuV`yGh^H?q9{gl;QQow1cvV@CpW~X2+_WQ&X?@Ank&7A^ zpWIOqvNk~mt$wiVsBjVj=0e#rSq&lu9hJQ)dtdf3Z3EaNsO-?y_{BAqIcC%6DwW8@ zGV1fQAB-V53xtJ6gyZN8j1-lf1ICR~L4t7?5=><%^q{8)OH|oSRSF|WKb~nJ?BHEW znkm2cL`Ty%00LZb5t19}NSdO;B|dbi&PEG0Izho)q>tLg(!s{bA~jk8!tli}&s?># zk;|jfZ0zlPT()MBfxqnU?ShMlW^>*`=t`V-@ma0_Cxn_>hqGxna zKumb>f+%usQHa@G%T$%6H!>*cU_`u=0ijj+8j|>YS-dP;hOHp)nR`vlG==GO&>564 zu$3xnd1bIPM-AJ|l*G}VL&u;mL#EwvRdt_qEnV96NuA+0XP2ki%SG*CWf2=46J=rT zs&>_=Jz8?>&(_wSt*<{*Q*%b)5;$*;o4@~;Zhn4l?tXp)OON6G-*pufbo~zH99ue` z5$osV>glX;U9iAa2IQGqenH@F+w> zRN3M~`4w~t4pX;E=re+k1Jb$5)jca$_N-pryJ}UhxU{gZNIZV$$7W*FU(}~7=qv0W zDQIdc$Zu>U`|s$6n=cpj7m^(`|LY|sudl|t`Gx&Omz$eKpF4N9^cD3JvA?iS3~neW zXlyJfXy|NiCR^^@=_u-he+_}Inpv?(Sok~(In^-GwI`?o;}CQ;1pdYK)}E@WI#pYH zy1M%GsY7tH8y8#C8d6dk(yEUw+QPMLI8|47YW;fpy+PN;_36q;LVG*;e9_kQ#aj}O z)TVD;MCU{W_GhmP#Y|2z1+S+oLa0d*Pf2MF{ynoDLDHr{(N1pQ49sB8qoqY>HwB{F zDWFu7Z_7n5@=Z$%_2p^N-PDau1@6!^hzQel)W}n*o>IeBhmJ_TbLN;5sQz~4bd zJX#0x4>j-K@aMB<|GZ(}i-+>x+7-(mtE+Dx=&HZjGbrk4eso9I_SUaEYic@w{Z^aq&PNAnNtGz+8+k7J zOQtdAV3d5Bi^Sh4Tw%)svA>{QzXN`sEQ11C?%_qPeGuw1SYQt2Xh|O}c<|)xz#-Le z^+$_>*6DjzTE*&xB20ZfRiK&ppv&S%=NkTwn7r~CnK!tmZ*@Rgppo<9m0<;YGFQG; zpS=lNuIWmpyW4_-kUjtF_}=TUp9IzNWVWzDKlGD6O5e@@M+?yWloY2gkg->cX~30^E<@t zA671Zxi~+kxVyBptMKK`MB(hj5AqAb33t15*`Ldoo{SeS)$KXdvtr%al*KFa)Mf8& ztA4#Pr1D6?>ivtC94u~nD^0uAD%- zs>*4|POgsK@J4Rtp4=tzDT_C}Uw!<1P>0*L4W+fqjw~y9X+=zYV$_XLzo4aumL+5@ z>w8$8zQrMWo@+{MOmX@g*Yvug?0RRv{l#ncrQ#$W_oS4Rkj#a1=49?%zj%}Tg0{Rj z-s4W%EDVUqjB+(e3JzElPx}wnCyF3oV+)BbnT=O!w<---{n7_q7W0!@gBb8(VAJ6V zSxIS#>Ej_#g_^*Z^oT!wT3h=mQTFr@CA|`VI=b^@w*QKQrCVN^)9Sc1Ij=+u!{_)_ z>Sm9V&8^?Ov3&U(-?R>k|NYu)#8f@~%^p@7@oBiUqwvIzw1$G{@TC0xxrO_45*G!o z-#%3Q=C`|A|MX@thVk&Q_+KY5Ij7*{4LcL;Nn#d0gVm&+rUbWkLP|y?Mo(*)7)z7U zb5?|UWzx%Ty(lQg?Q9dVYYgFDbmDmr*!(sAuR;Y7? z7aeDjoSVEGqtq0AgR>_IQ{@LTqig`-8NW|$FmIz=akslHRebo6r7j6-(D`18Z# z$!#NNKYpvGCC;qZEG=!#+O?}PGi;B#b@P{I1d3-n(p=<&&%gM$#but6+O*dW?C(yD z2&!n-UA`xUkiU1lyR);Kekjff{C@6xMGzzkXW%?ZBPkJ?78;54l$}_$>O@&tZ%IjS zS$b({dTK=lzrVPrth}eFsHeQFr+8ppW=?r|PUbqy_(DDzCrq5CG#hQm7y91X!6$R| zx}&HQ&$tKdnG$v4Db?tcyU3!uJ&}*)C9-omGg4)g#ma$HaBfs*W}5KBM=0eS;*M4+ z=qVT|#g=Z1vFD?s+ztNtc=eNV`VB~qK?C?Dn{VjT2sxI((q@V`*1X;hJm->ZhrnaS z<5pvKV3{T2xH=ARoWJQY-5S=6+orZ;udjxZOeXwStifxZW}tzPOI zG{@Ig?dt5hDwc5ODl5eyvtTu8eRXv4@#8fk`_}u44~sqAwVK+H#k{Ows4Ta_x0XgX zH(*FLoM914U?|syJ%g!ADPgQ4*R95ji;2u`Cf;fyl$1P`*@<_7_OQ>bt5e(H>MbOl zc}&L)?BnFum^=FdR>n;$}!L!8XOmWFC#rwY!a~7`J^-@yht4sMD zk`cc=C6Ugni&*NOLNCxL2j28t2bdw#sHU_tFjWm9dAzCg_?#(qag3|6bg?A-=#Z|{ z+!fmrLIHPEJUU}4A@r$>W3a1JsG7fv2ygcsf*tKc)#K_%9Ua8)nd2B>*C)G7$^{o# zFIYh4p}Um9blziRGS>--4`J6zTIqte=r5oWffKLv0W!Fwp6i#}3KE=MecY1@gWWZA z95lY6o(^;7`aHhfQCQd&S<*Z{!WY1J^j1!=Ce+e0&U3*^;-qnO@Dwj z`HlJHme^1*T2O$2A?uSh%fA+A%w3tcF~>(E>~9a((=4=#w}?BQ>uqHz?UM(4g|n>| zFHa9a!FFu~KBAA|9{;GpBYLPo9pyskHJ&D`5kMtpTQJ8gR)(H4BcHtX{Qxab2r~*aIG0+VpjQN%EFtQ(qsYnXiY& z-`ZNEw)3#D33Lm#S4Y}MZOd6X@J|gT2Ui8k<#w)HIunETv}m0;-xV+2PTKO)lIWaB zwYI+8+AYw+#Ms>2*w`|1;cMwuk;~&3AK98r?4k;mI+@y<1&1y1*JLMUDNL;MR>WgI zS3La@l6ITyB96ECirgf3$@d1zPl-QtXiTa!T!&Gf3C~ixRAcKZCTvpdC_#kyNh77e ze3X$TsUf6qrbDBvJ?6S3z0O`kdC-1g<$@}xj*UuzQ;Mc!7Jsa02_9OPl!LygoOqcQ zK?|a(OyeQx--3~w6@r@CssR@M%+o&kNC|gqtB3QYb2Wpfy#^!d$HYS#qa>C06BA-9U!qqZunR~Fx z(lG=lvBE>w-_}|c;q08^6l~(;HP6RXX=7=>NR9)J1LEy0omSb{D2&Vmxv{C=0{@M+ zaw}A>G*;L_8Lr@QZR@Sz1Jq`2R=lHyTxlQZFxL8xsdpQ%5r^J7arOGZQ1_96N=pw^Ov6@1~{3yp_F$kC}N$ zpu#W3*(S)Fcb#J{+QiGo#oyFC&c)Qh#>^7LC(zW<#N64;!_(B*#!~HNVeX^yGd6a$G_~YmX6J5U zVv%L+V5w0UaXf~zt(UK{skN!f&%x5#Y;KUHo0W;i(n2jbFH|@H-)vOz{`yU&cw!A>tbhTh0zw^Yig?Uax-%>L$j(< zf}D)QjCpr63ny{BHA6CSPi~US4?)oquyRBFaT%?KZ5Y%V|`f&(%sd4H$b+KM!uZ0*L|l;;+n`7@raI|cake>5n6@E(29YzlQ5-W zLW2W?USXq`5nKKNc9`X)R&zW!Ga!EXP_by$Rr^l&w)PVKL*2{pnX z`auCH)|jJm94BzXlShIPOhbcoUqZDhh``fUW=D<)=L7*T8KTrnd#Ij}!04$wl7>27 zwg_?<^zg7lv8LK*YSb2@|HaX)D#_*uT4~zWQ_^WZ`ka24##;Z3zH288KDn2go|>9^ zjs9_sy3SPbp5XN4F8NMM!gneTEM+&TspJUFaws(w|Jj#xi8D=+2hmmUO-Y=5WXR7( zr3_ZsG-k9Z^pOOXGDNbJ5@fpT=*J)64Iemuk5?m5{S*HI8m=C4D>PR;^@4=&i^fAs zz&q&>c7QvI^cSLnPYL@2LuXtMM{`}VwiZXM?2YWr9*Fmdntn#5AMxG;GY6%;l{ji) zPafKvsg?5l&j-2(?%&7P=lOD_+RR?GvZr$Y)S4%%1DB+{ID()qOeD5DhoWsel;EK2p^B%E<>T@e^nbK0MYb67 z_i83TQAG!&=LznQF`$%iQG`CFyOvA`fxJ|Luth$wWqL{QzJAY;`l1_FRd_}Y z?S1q29|i}1`1?2azWnBmH(&1PzkDV*_{`=04tATA8eF$7`Dk!zQgre>EPFy?_8hYm9$qshA_l-|K3=RG8)4}pBq3L*+4+^bY zzbIzWVzK#_t|2)(DLu4q9Urt9N$cxqyTi{({;k}e>h!&(9%rphWjdu~V5Naj0)Ox} z6DQFIqQ(O!6WWd3LotwR9WO^G`dX2E3p*P$ztr$t<;Zvf>k*WHpSy#&f;Z?W1bu?N zR)`cT*#le0;rrp*eu=w7qTA_3yLgFG;Uw9xa0F}TIn)+PFOlm_8z5*&GF$`&36eNU z<0?0Q_Uf`jTS{_DD~78!jI1lmDQ)On-hKJA(cxvUezy7L9~K`A8C+L2T!F{y1{WM# z{NG3GKYO(h{vMy`;!s~P)2DR+!VthXRi6g24HcnIDnc4ecqVmXlIC_&+g4H6pRFRy&GJ(xwTN*LZpyNZ=U>eZnIKEk%5+|zcgUQXfxF6B8j^(zK zPR?Ia_3>FdZtr;93>{!lGcc}@rQ21tgdt;sL$9=-7zo0>@q3(F7dn|&0L(J^4YY%Sc1sZ&fH?^RUBhn$G$F!( z?iS8!xHZ5R4GfGA(ZKVhd0;?nr&kP@i4{Mzadgd3`6brin{;y^TlMg;9urc!|hSNi?iEHg;M=-E--efkyqHyCKhWyDYXhJGH$ zQoAhr`D^wX)UH2Q=vBC&-N6&6)dQj8jJmF=X{MRuKX0*{nyUGx>ufG4@Yr`A6wL|u+QrbH9?9AAp8uWN| zoBFaRvG~VtiJ8~upO|f~i;Y?QyLU%E$xRR6w%65OUW3k5C{4ayXrH(qJmP7^TIXkIS!WL97_Wf(% zC2*HJLejik9R{qOL)#j}AB+B4=V1O8$(n>7;T-5RC?{k&X>|{oPLg~fl}f8{$flH$ z`)IuX!?^c^Y8z zWCxokss|5)Vqk)lgO>ADEiz*yLA}F+?a`t1{gK~m2j;$2zvD>Zq1?2?4XLO4$C^$! z_c^w#t!c{Jo0Im^j*POmH(osLFt{~#)#mM6b8EBQoD)~>DQWpw)z@#krzAWkudFbk zDACn9t+K1CVW`656s0QF;z=P^PNTQEVdhIT44o-yRqQ1>D}s`BY~?7ZP!VCxv@say z_G7%2nA`T7^&2kiDt>XE_&u>0ZEhY7Y)VewskKd98MFIv;tS%*!9kL->&~k^|NKIf z_Uq#f`InAAIhz|8-JhOBPP)bV{^E_26D)#trC4qB4d|PX0Knkk)hK*}Um`1j)dBTI zqkBPsObdqwsatWuqM7KYo^a~~L zRtcPe#|Mv(N3#6R{o2_`N5F` z{&A(RtvKcwtWx=_j$vyvC#kr&4Wka!Sg>H6z#O9vWLU1Z7uQ(ZA+)ZV&(Kwnb7JcM zIeGH`;AmShe?ZqlF-sQzRm?Y(+!Z%{|Wwl~WBf+|jI zT75W2B&YZMODP>S!Z-KsJwE-y7lc2spKxF7Ox+w`oU(r1;HPCZmrs`DzqC5CZ)o&C zccP`K1q$6ARMR;GUlT*C(9I;szjR%z#8O8Zz!4M>X+$uZY{6A<4_)W%s$0L;sn7lE z!Tldqnwiz=?zey0#PcOW`1mb_;&@BLu;0L(1DANKA*Y4f!t$jt;WbBApD6W;cODwQ zzWVfT8xO0YAuBJttuJg{6qGN#(T5uOS>GX|Ew>b#x zZ5;67J3bfx`Rwxe&O2|t`7Z}GBMxhN>$jd<g=( zU=3t}fuo;mDvhK%Wo?ZR2P0`KOvcVB1i{RxyTshO{PW&@9~UIgDQa6?))c9>B5mS1 zjBH*`0>w|P3Nm=1Z~kjVM=jkfZM`O?SPM-5^90S)>x)d>79z;@TcHC5fWMDjSs0h>(kg@Y;x8(z2oZ7#5k^5*A7SS zrYHWJe_6f$_lQ-MF-nR?L+KZl!DuYHvy28}FPFw;1f4<1DJ%^T44j3dqT>fkzwbu5 z^i3Oeh?_GyKE5EzKT~7pTgC!5s@v;1cz@;>h{fHyvGin(YFGu~7%{;BZwbn#c4sJ? zuGgST#Y|$FQfT;SeZ4>Zue;4Hqgi>cy!^(uqg>8E{zqfex4KhY0pjNz@6?U3Dwt0a zTu(Uog!{0FjY`3cKng`I8K{MxBxX-z7NA9@?(E^&YI1kJ9rnwIHj!$ zMnU3Lp&D{(kz=Bp^CC4rj2*iXOW(OR>Lm4e0apbFCnEEG8mXkdMA(mDRzmtn>=1Qe zuFDvdR_UoF*sp_px6sc)A?}p;A19Jxqf(Ni1^eIp%j$vk?T-dq z#IiDSZlLAyKv__F$i{*vk4g{aqXYkGZyV+S!vxEP2~4PswAA{Z&=Y}5gp*c1Du6gnLgl8|$8}6#(l4R$#P7Qn z>Et+^!i$r>5c~EbMwXI15}=y|em(fA*N-qa>=44kVX`(%6^OueBzW3VXJ}eAJ`W2? z`O>Dugr)-VTW&{Cc>Sf;Z*&*?xaRRY{5Ru%{5M=tWOYPk8u(FPkK_K;TgEDML)_6E zodq9C zUU?SfeK#m?DtZ4!otpcuu+smD&#L#ExqCW$Tnpc_7-Y#$Bjs%v-(?uzhOw<@X4LkH z$!3hbObYpW(M<4!y^eun>xE3liP#KhIu`~iW!%=J%GK4y-EZUXdOrU9g5sn3i;v;Z zrH}U4y|YQx=eW13Zr8HTB^j^0m~~M6hx-@Ar>`eRtVxJpYGaqVAS}hkZh3rJ?U<9B zo71SPvzyapa>L8Z%}o^&=oY>qJFhm=%{gi1o|UC1Rwr&w506<|UYNK%!ObPD^5v=* zKP(Sju`MBXbws$A7Q}q+f|^>&`R1QA2RLPNpJ=^pGPic<(b zs6I%(ogL-58r4{0w#T_+P^LT1)l+=UiruR~@#orFSSd(`cx~kh?(tc-7hj4swKeH7 zwlNNFEM=sAz=e_eg*9_seC_Cin%^#^+S4ZVJI1MAUr5QZ3JP$1bG~A(U?Jw}`UMOA z*x=xJEj=?AyrB(mfXwT4sVv$WeTT9HIX-x=n13u5<5Z>4@hg0&bkgqGLDDi9JVaWC zP$xA(x{4C~sOJ#8fNb4(2OPu>3CwT-kt~qcTJTDqf^R!jEsdru>o!dP2;DnfI!`RcB7zCulV`>pnN86i&M zJ??_CgxNP@H5Ml6w&;9@Rlu#JRa&1k?>L{)h3mw7&Z-V`+azCQ!=r{3>-=N{hYy$` z?)p*5Hd1mDH+WfDb5;x2#o~4EG@pf9otd&1ub==6o5Z<~nlaMHNRd#&55cBc@7p=X zk6=Hdh|3)m3u*hvJh&Ek6)S}|^q#qe!VTb427DMcz(lwK6lhtp>q3dpPW6e7eY**zgc*uqMZqDmkJ1rE`O zYav4u6y}Ucis= zCU~t+8mkw8L#0qbcY?gB08YdBMT9^o$C?ZuQdIl{$tuDQ$fLqDMdRXF5g8J>;(HfH zPmki?>Cp?UMehI$#1W&bDR2{_8somy1@R+yMu;168xh-jrswjed2onq357-%$X&Zb zntMpghsI-eD4N(vN zAvp2ZNbjE_WkNAL7M-aCZmS>GlJG?1GfT7?%|2X zdF{TobLX|)TSr>v2kso+w&$zn=0EP<_TGyD^IJyN6?WG6`PFn579Lo#pjIIV@x+XyObCM+v0QqE$X#Y1%lSDa4MEO4|-|>jYon zlS!)gB%yfST(*LMjN^|Lgo57+I?pj50UD>3o$E}sjMxZ8n*i}j^01#g9IxSq#Ba?U zjZM^0aXj8X$fs(SczI=e0@91vFQgi9W=D!Buh3p!6x3rn>?2aEHTm7gPRLa)-UT0T zq*M)O!O&@dg|S9e%?Z$qT-U))AK??C#k<|yMXtAdNY|*#VAK#s`+^lpM_+4j&Z)IEf9>Y>b=h_<>b`%dm-jpTTD)+( z}eX^q2w`3Q6t7f1ex_RTGxT=-}`rEm1ZFE9;WX#&w`0}XnXQ7i`vrG)>6Mk{eznCE||G7 zT`*onX>YKs4V?Wn)i6Y0vCrsfgtxTm4t6AscI~AuuJ@j;vy&AUZSJ6Om-AJEg@w7b zQGMHSu4#*jwW*~EqSy)Uu$R)^aCCOE{x@27G0Bo&6AD@69smoES$UY8RiWQzR}uw3 ztTqw=%M1uf7TxFnL46JQu$}!8D;qltanx!C%-BozmSB#+5|tSX*gN3(Ca?h^+0NmyH z6$fqUN$UhTw6^+&0o>%Ct)etpLbnDxi$!`%*05ih}_}e*1dQQ2b!(4^-m0OsbS((&xJGua$gM*We?y_^6t+|o2 zCFkYjq;j~&^&Z#l-(q5AMw?!N(o@me7YwbXFJ)kkSkfViF=H|{^q>YmUg|iJ~ z$KKxAk@K>2QCiqYZEtD11y)TAYNZRH#x4aMq^TvyB-EN2V}*`*3?jXuK<#ux0p2Db zL)^rPJb>+m4U7k1dolh1W&<;kd!V-!F^ni?P$HQT0G@Jjgs+j0Pl1PZkoD{n&YF!l z*jr*i+-2i)vb5<}3p6NZqn4_Dyyg0413aGCl#@%?^ zmos~3V(2x~gKuaH6r&dV$y%O6M`$hF7^Nk;a_%Ihb`wK^JA_)ELr(Oy2(oT5RB=px z8n`ULxh;q{{#<jDVcO(?`ohD?I6Z4&Zj& zZJnFYNWU>^yJ1~Z4vGaTj`#*_k^q>Q^M{Y7lR~E+<)Wu`uP+<4g2(uw8B>FmoIF|b zq@@;H0!j)^|F4zVADOIaab^Nab=P1LI@46GNNwGhaEC1R2aTXFi2qPqC(r zoO~{NRHvTB7>I9pa?@Z7l!}=`BZK;belv|CT>+>jp@jqSq{*2f%(S&|d-;j#jVB5x zV7HsZDf{rn#_hj5oXr$ z1-a+Kz!rZ{CJq}a(gQJ-MtxU!Vq^7*<$RH$qS=6W@q^OUA2b65x~q0mpq6<~^sG?% z^C>r5|5EC0Y-vHMw;(X;9c$_6XnmjSeR4$z_27E%+fWMbp;8+tIJiG3xKPII`7X=C z74U;*b_9|`t7J(<^{vtt=<^r{1xytr+6P2q|7o3;)VMhANdMpFxL`1)nH zcha&cCo^zJ_gQ8)Rb${om7n@?X8|@s?a=Hkz|7tGit#2VzJI*biQhlo>;5cTDXqxG zUm2CYXk7-`ht(y`NJ(v?)r37WFR2XVKHkgkcN#C{`<=#{_zHJWFc>p3W@ayuuQFCc z>9g{X0WaTK@M4=c*uTM!7v0Xmf6v(@f&6P;IjuQ4t$v5T_FxzOowKpdnuiY`wvSdn z{Qmon365#Nl-15K^^_{2u6L-J{hz_fnbeox=})W7@%Z|XAG`3nM#<8I`J{yPgO2aN ze^@=*j+$#`k|)T_2Hfec$!z@!ycxbU>;pBBogo3`pF9aXZ{6s-F_RHJ7-bleK&rvg z?=>--RYOf-vx@{Oo^Gb&LmF5CGpt2vY23rXX^1jA(LtTn_3NbR`gK~Dp-l~SNi-ep zIinq^`7gyvYER%Ywf)8i7+Q?D1DR=Jv>q*L=Pg;{>T8-J?^5&PNt!u<)f6jSL!qM< zHNeUsROSy3QbBH6iR zOJDw^mOcYLn|y!5Ui10u<7Y~&t$b(Qx_2ro-(I`+?Pp3KSo?Nm^IO3Owq$my=FmzsBDjgh{KdTSl45U zP>W`T;gV*V>iaV_{r}aqRO{4Nr$R6lvg^*Cp3csmJ~`}HquEV=ojg45x_EiHIC*%B zpE`ScJI89subnj-XMA3B^z?K@Cf&d4-{4+kPYfw|m&_RoMIR`J9;8NpmcKd z>^2mJQP)ZOxeJKW&GsqLrnLKLztUc#hEo$NMXF*X{Y!RbWb9h9WOr89?(BKVT5a+? zzhqzEWYVA6Dy1%2(wfEP7#)I8Y&=-Xh+J*`|mT`W$f(Q%Vm zq+F`8n;9n;I~dTceaT8;C(+PyyeDEKNJb{q)^IBP!k4<^`WeS&8J%^TPHot5YSX6E z8#luA;PL)v=E@=Z^cU6Dzu1JFl+#tfhxPb`4=av8qMo$f1}9a>ArsG`QS>%e7;@;U z$Z0W4%+Ti)Gsqbltr_h>PY9v0&e?e;h}jJtp%z9BHewCw8X(8S+I$izUKTIw?RItk zr{NYt1Ni}(Tv95u3QlNC=2wv`1mUD1*yGS=H)K6>clfm68N5TR;jz*~y;D%*oI_7OW z5i0b7kU}cyf>I$BqJfV$5NS`kitCN#L;sf2h7d21MiFc6y*!(%}K|$_w=6~%L zlIY@=m$Is^y(Td;V!mIv)10EE(A=qo4&F!U$N9+VTvG}l1qMY&2L;9f zYcpYx`&xcdUn+!7x;Lp0Z4Ysp8hz1G!&yYGp6j*9(>t6mp1V9XdX1lFlDkhBy%7ez zY^|LF0y1l&yzQ)=<_BbMj0T9X13tr@lV>pc4E>Z3*Cm|k>Ow!_%t$<;Jt9X7Vtze& zdYojTNAL!3G9_InizAfooENe<7x^V>fk*VT0Zz)2$tXIBQU>BP$J@c$Yo2$x&6@bk zwPDUSMnYCtrkjnUxqCuFZ2GE{=oFQ?y91(q_n_ZX*=V8rUg$siC$gb-Z_0pUgN{&I zz~(mTS)S!pFEY7ahoYFS~7tv7ISgcat(Ow=kgX zg<+0U#Gwai|4|}Gy$qP#NR9+%oh-A$l7m8%fPVoWO0I)T zngIsta?XY(urAoPX4Kt3riTx0S8rPR=xqMsur%7IXT(sh`v0NsJ)o8VN1oHl` zx#k2=Z|~>*zGtm(ePR9h@0l~RXZJQU*WjsU+%30DG8g5*9>XR!-LmnjZ+@j#LpltL z-TxVWmg;J$JYLrQKi1HzrPpex5_wnqswHK<|I#+prP_^V;p#NMqp#l+zv9YuVKykZ zY=fO1$jciB#$$a|S_LP!Yu_ZHQ|{GDwJUc?%1TJi$Z2!aQiNHoy&9`9o3Y3Q1IlbdH-NbrTgF~znDGyizf&Bb>%-ASFwAhE$Er3 zH=&l`y51<_I`=>HOy!--b*1lrv1dYxo;9=8TDwglt55Rm!82FS8Sb|bZhuc>KYL?8 z_JtNler0!4SFZ1^xXt;W^)LSRRk^HK>R+xu3)jG6jFj%HM>l-%!J}7?QdqWaLoZ6D z@BiQZP)dG-nD)_5Ka_TJd{ld6KKDZrRjbss`=Q8cRqFn?eh4YC4RwAnYCInFMrry_ z?a27Qv?EJ~bopC5vSrr)W;=p=L9TeUCcylclHSli2D{mDxZ?dK+^>k`PV1677(jQO z#kJ9qb;)1W@as4D6+Q9aN(~+4FE#%ceTsMx>6%rx_Mg+0AFsvGYCz7-wezYqs?nfj z%f#@wO5T{Bji-!)A=Nl{dW8y!F)_a2z&5pNjP2TEIF;HZ7&G*~Hkw!>589&%{NlIC zPd9Y^uhi10z<#R%GmL9i@$qGl*41yYieDw7Vseiv_7jylOINYBp;mRU$0Qx-34M%7 z9D8o~stERD+ZiRI*5NQ*-QRD}?dnJrA@mpMiQ<%~(STisx zurP3X;Ddor2JQ&l8+bPG=fJB$!9mr7B7zzRr3PgMbqg98G%9FP(43&3qBJ3b?`62Wg#IUF(LUO!$Ova+#B*( z$TJ}?hrAW?amW`T--o(G8-^x_7Kd&M-5&Z{=)0kxhn@|+6c!v-JFHx7tJ1PE`A@+HcjXSMOMTM)iBEe^~uQ_3x_xRzufl zUt?H}Sv8i_xVy%~HMZ2)RpVHVZ);q@vjjD3M%8Rqvt`ZpHG9?^RP%wFn`&;axxePe zHNUKRA>0bD99}QHNqDR9F5v^hi^Hdc&kMgJ{K4=|;k&|L4}U-WSgp`nEo-%}wXW6^ zwRYCpSKHJstv$Q;vf8_AAE;yMjHq*Go%MA#*V$QTU!6mB1M8;NT~K#*-TUhvsrz-k zw)Ljgn_ushdT+Z!+;!YN-Gkht-BaB2+$-G=x}SEx;(pJ4!hP0#vA(Kbp?kcx~QE|`=Z{9`aJ5(sPj>mqXVLAM0=xKM|X_Qiyjm` zI(l;SQ_*ine;)m1OmIy7n1(UUW7@@Zi5U@78Z$fQzL-5R$70ULT!@vip|Rn3IjdQ0 zVeGirt+8*$o{0;Oi;n9TH!W^K-0Had<2J@UANOk9J8_5O&cvOMyBr@M-!pzt{OI^8 z@$=&Eh<_yhx%j>DAI2Y#KO29kfvZ7{29XV#G)QZZ-Jn;4p$$qK%x`dKgY^wIH`v+W z%?5`XoN4fDLr=pY4aYW|-f&67wGDr0RKHPvqZN%_YgE>_UgHLheT~~S?%a4}lPu`gPdh)v|CM7;4F{MXJ|CDJdb5oY4+?jHJ z%C?kGQhrGdPmRUrEAB~sJ@rhQNUM-mJ1sITE3F`HVcMN(&!>IgBDO_di;@;Ew>aJ6 zyO#A@#whXq%>O+P9g|W@ei$ZFaTU-{#%6VQss%?bWuR z?Z~!ww>{dfLc4bDCbrw!?m~J*dXw~#>08o2&M+Bq867i5W=zVMnQ?!{8ySCO#%1PZ z4#*slxhC_`%&nO_Gxud4%siZVCi8se<*dN0YFTx&;a$d>#v3&4-@AQj``PX9Z~sC2Z`=RWL3ar0P_;u$hbA3TJFM<-Z-`?EGBk-JO5$(xOXYmz7<% zb@`;r#jdhzWY?x$hj+cZ>#JSg>iT}yW4Xb()pH|q8|3t6|V9IyL-#-eYy|oKD_(5?pwNV z@BYP2aW_r5>9LzW?-AA`x<^8fRz2GH=-FdUk4Jhu*<(kKy*=LUS+Qqw&!V2|dp^a} zP47p0Z|(h3?>BpY)ca)bbG?7>WBOF;Q@2liA77t#eY*7N+h=f}DSdA3b6cO4eeUV= zV4uhPJl$tUpV#_a>Kod(W#7qtSNGl9_qTo(`}OL#6zg91_uJ6#>3%!=z1r_UzYqHz z?e}HBANu{4FY<%(tK`?okIrwBpPb(|zeD~_`T6;U`NjE@@@M7WmcJ_h-ux%>U&ud@ zeYw^v+W5#&L+%dlK_|)+| z$1fSbZT#s8RVKtwcwoW{6E03nn)vL*QxpFzNh+CJvbkh$$>$~KOI@W6O52orWmzdCTNoQ$nW1O_?%f&(x5qO{Pwm`s&p0rq!C(Zd#XVw@f=WJ#2dB z^a;~vPTw{CyIaQHvi+9#ZaF`r<&2^k#WQBkST^IX8BfgEKjX}dUuRsI89Xy`X0w^y zXU?3tdggO8_s={s^TMpkvl3^`oAvapJ+nT()q88fts`%}?bfxoZol=w?4a3AXWus` zc~09oJ?G4tvw6CqfaA5;gP|o232fzLFj-(G#EWre+R9Oiev3k@~+Om5*oB6 z@Des%nAO^U=8)KD<%(hdFKGN<&)qH-{nIh7U1ewdSRRCf_`d8LVt=04 z7o5z%9Z%a1w%Zi}KX_k!P^8!wlq2?;E&n%^UHz}eKOhQm%q(*bkl&j`kxdcYMP<9K z!3gJnVv+OPKIl}0{RzZ@)WMZ)hkw0799_f2KIkTVfBJ2(89b%vtK7+Dml?4gzk{+R z&{8NJ_ql3Q_LbTy_UU3V3fp^3mPqwu#p7DnVFrqQf!h)8fnq(m|B5T$-sg37KzM+) z2x+>LmE8YK+3tY(*ZsB)as8h$_}`9mAx-~@e>(?ujVAun?*YkT5%O=J^+MU7<~)?b z=Y`%#ptBuHio7l*RO&Uie;+CCDcb&+6=KwX1ZCX+n>9r2vRNj)@e@xky|9UR&yy9)QNB_fdi(Jo&QGRgThH{pPt@;~$P3|8sV{AW1nE|+ij3-HO zPB{S&!~K-A4Zj0>i%|jlSd9<+|HqVV|F6e37ISsJ80;K35K0sgYOTn??T-vI4A&%# zNH2H$_mMu0IQ}YfKoP#z-pB7QKlY@3{suGK_G<(7U(Y&uS= zTy}~PtN6IGB4{r5J%%vSdEs!ssd|fb>NU{#+S&+sdw(SX|dn<8pU~3dQ@H zp<)HhQbNmC!F{JXWA9sQwZq$%Sz@cT9orS``m@#bfY{)$&L0=+E8G*kF<#fjv1~mZ zU;aDt-29Iy+xBnASy?DM|G>YUqfaB8|8VVqV1#KD!sv(cbsO?ESZr_@4qc>!%Zi-s z1&+qzJMKdW`8$r?ByMuH{W=6?`*u}?^!rt05xOxe+zI}DxO0`I7L@PLa&-||NH0oX zBIG(ZwozxV{YJm9xNh5aqwQID9V`6q>yBf;2cYcx{SqkO8MvMh?O?&b^IviGviEf| z!J>lR}v;*ByH|_=-M2238bSKcJ+T08`amZmE z6sQ!DLFo6f4dh3tBTtn*tnY!p&*0owu%Gw@Zs!>FINo>$IDa6amLoroh;=qYMY;xN zr|7K5i!OQ&w#Osv#1Vl{F|+^jd$enf#E|QcQ+JCf#A&MuM?OcQoc#58Z2$EfJs&Hl z8$@q=+~$nUOexy)8;Q0swsP$fBhdGikFf%ViF|VgU!`7%KEO{r+yK^gN7!Qs8tYJh zOXDT#gE8KtKGBLszXM$8o9sR)Ppn7%-WQ0mP$2pfIv&UF3upjdxtFa7!UHZk;hh0L!@*dD;{bFw zhpW5~tc$R1KzJxj7+=zLD6aOlGlr(|ETx5iyz#fRxNZyt3&8{Z@wFBHQoQI~yH6e~ zMwF)?rQ>8V%ykCoM0r5z>x_}@zK`3D4Y~{R@Z*o11deRtayaw%x zpUH3&2ho2^>quSAn|{^mEY) zVfMOi$NAJ2aeq5l+Wm^%e>_Zmj|*@6qkgxt`=M(4a zh))sPpz}~%i~K~pkZx0oO{--G?} zwH5x@@j@F+Z4lZ|ikIC7+x`qh9QO+FH9(o+*dxJaLg&W7WuXo`L+e)zb#_0LOlh&)p>Ck4EFzS`&9)0if}IwitSt{ zjJd{z`s@--kJXtfgaE%a3=GhWc$kJU<6!*4~{ zE`kmKrC^w=2ink1h~p2K8#ffCF0517_(W=81yQQKqMh7EcMuU~kJv?+!Qys(H_9#) zeaYOQ8us@ajSTv>lgFBb%2I_5Z!W@#d%^_6@*WT*iX9c5e zV)k6;-hG|h|2yfk4&>exa1wcg`4P2y_Bdrd!u2`Y$9%93!27BbV!WwUysrj z&&PPt&*zisRiX#92-~#3C}0TE{}9GcNFUc0w0m2S?hVBn)K@<_t_Ui zT=MUFwet}B?CTxEHGowOWvYW%0`UAd?j2u3z5%n(ZVS8P-O;0jD;oQY;rD+~oI4qO z1L9G&@$PfkORS;-+*sec9?>1Y^+t<8D}L<&{p|!(K`yv_?RfG_%m-*iL@f4GD+Cqr zAI}5W*OE1$cvM!7Z$t{|?#$yeuJDh=B5 zm;3U#V=s(ZFX@?eVO2xjL#SEROX3MN6x-MTX>54>JF>F7^cH(WSXmigBPdk;I#|ei z=y!e9q7?PO!kxVmOV4YFXm(d1Ysm;1wlzJ~hiwz~JJM|#b_T%qWEkFDNfWc=t#S^Y zCB9SMEAN*N$;aeIxlQhn7w|+teU+qARJQ7(@>CzyPxV&?s!$D6Bh@%HQB6~`)I7C9 z-LCFZ52#1g<9P0SD?T*33nnh#P;bFF_c3)^8y%`E>MFX9j?mFM9)`3Mb&B4oU(&Cd z+9t}hFqvkMDKw+a6m!3M%sgqHGcTIg%t3R){9)B|g;Z!;^N8DWS9Di(N4R6$&D<&O zw(j=suDF9-=$_zS;J(BCfcpx4_BCLq25j7$rBVr?(MhuKt9C2^N6A?Qjc13&{aW+y#x*{t^R*9@0Sv%4l z*(kCD?kf+CQc;zn!lNRh;-eZxy^MRwe?|vHkBB}ST^93D%;uQqVs^yrig`Ka)tG%T zZ^Rsoc`xR(n6F|zv8`g;#b(3~#vS8fv7_T=#eLhTZlmZ%4>m4pJf?BUdNJ^D|kXgAU8ZBL9`I-ksAx;3VAnjW4(M7xv?3!u}A(6yX~>ajSSTp59Rf?b7K&4 zW2hQ|=Qb!eW+FEhAvf+sZakzmsEu}R>_Bepw{zpL`a%ml*HKYdwsRv&$Lc1?jplZ4 z>@mXBG0~=_$udLCC^ONl!aGiz%oelV>@jbf_sl7)wv!vi9qO*)_PC?*0qJCSD|eQ= zle@cnh`ZQ5+kHE7W4%Xss(NaAJjjh^9@t#u8bkA(h63;5nU7m-^bHiij zMt9`KD&)p<5idl1UY;A3ksGzjbEC-4jha!Os2Dpp-nDaMu$>$0ksHs(Y)5Xqggf{9 zV)n-zKyDnibE8FhZVZhb6*oEVn?`kz8*A*`nE3coJ2xcfhQ>p#x*PIDTz!Q8hyG#z z|2SOt**oxG*|2g~l`^zlWq3xH{>pO8X5qLm!RJ@MEW?xG_TG2O-oeNS_IFfYd;DbY zm4C`h@@M(IJSV@CU&}A$sj>rQJIkKOxpTk)KKGyhzZ!kv!Z~V#{^jpfGW~e^s{Q}x zLY%2_`X_8JKa+iWA+!%jqTf!P!f&llr=P~{a_n1rIs*GT!R0<}kL6C4oZ5D3^QlL% zcOF=MYQd?(Q`tg%k^jYVIv+0INjxTca_q@YCz>DMbbRTF%oFytPuTvSXm|q8%bf^5 zVI9ACy!x@r$No6>`>`X(K09{!*qcYIAFU$9XU&B8X!wVl$*;aIRu~u1(d9EgQ~M>C zfDNiC^5m@k8CJ4{Q5Z3zK?POJ473&d;5v$DlFndOk3Vx3oHIXQ>_}TbFt+`LYH zT&b=Wu6C{rSC%Ws)xp)t)!o(GHNZ8*Rpc6rzDT&HqE{CI9RiSR0e$Hla@mUhEPxmg zP=x!^QhTi zv}udHi$p)(1Z`R#`pUuhmf&17Oa!0 zYc}hPC?k{1YBSZ`WjdP-tB%Q33r)Ov%2YC0R;E z^auJ=l&l&;q0e;VZJ4@v1E~S*GPQ(7u^cf`j1 zgWk5Hs;a81WO)wvd1^~Mdns#+Ix?#ESY$SmoO#Ul8}oy<(d@F4oEY;#qlA zydu99ugmk|4SeZuzx+wOBmWTZ%PZm#)(qa0e~QnPg*lfIpDHc>R1L&$Dn^`EmBl3$ zFD|Gk@jEOUE7eQ}sT3J3tEhBYO=Zfe=;5SzK{S@xu!h%MbQ2$A#MsL;#q*9=#1xDm zXUh#@v;0K7D!&uQRIoT9epL0uAL6PEQ!ViX<1Oe5XVBP2_7HQ$V!0J>a*TXXG!?0`yXYe)h`Zz~qMmFnJTgtZD8CeyWE^JF%|x~wC_2j`F$OCLrSdNE zsC-vECy(Kqr@x4||{T*76ou2R|js#d0bgv4w4$uKR*=tuE-g7`wQ2eeKb;bZv|&jaIsXuC89v zG3sRfr$<88K<_fRuCT&FN-_nZn0Xv zC|;Idi|z8HcwU|mAIdUuR0WFTDnxv)T+*mSDOFRcRRS#FW{GODk*Fz~iVzto!eq3l zAY(*D87o3%lrXXm-aM=)0;F36%KCUqu&(GJ3q&VbC~lG?u^Q1&WXS#^Qw|VW@@A1P z^F@igQ%t}pW~2O2JSjgG56ZX1L-K9$uskRpk?&v(dq6xTKNU~Q&tOCJbMcHkBDToG z;+(22eo%GAd93{WtUTfu6(N4bO3+WLz6@0@WQa+kdr`kekN|eKof*7@4caBVJ7h) zo>;DLJZcWUx%Pm$*VHuO_Izfb8l#4q$(VJ_H1o`DW)YrkUT*F*E6sF_Ddw0v%q@7{ zd8xS-BjMSm)GWYw_;$0x%r}e8LbJ@wH6<7&k2cx*xIV4V=#TWr`mp{?f3A<{qj+li zgg&Xi(5EmudCBa?2zsA+-Rw0ln^(-M<}Gu`yl*}*ADWNMP*Y?+HlLVJ&0+I~dDCn& z51G5o^JXL7e;p6oYwOH?m>mr^12HNeZVJqo=3DcXIcvT)-M~C6iP7c$dogHRE zyEx2&c6Gq(YxbH+E_6BQ=CBsp-C+;(CeQ=y1w9=OLMcoHjTL)2oP<*N2ufSb1PF>c z-W}l8T^BT;k$5Xu^k+;x=m5rqL2qV^8#<6NTcCp&Qyn^(vFO|aMutO&FcSGE3K>ax zQN&0}*P)E0I1OXuSSY0Fowzwl@(y>LT52%Gju(pFG3$;426N>3=Dhx*Vr z94I^#R-z-I_!BL`0SBrtZ#(2b4?0lUe8*uV^j(Ky=z9)hp@$q2pzk}Zfl{0aO8*ZX z?t^~h@Bs8<2TC(aFM`Sur4hi)2j{RES)62K6DauwWG(0^Mn*tSGcp-^hLQ15x*m{J@4jMWDwM7bWCrvbMh<~~%g8+F zSw{ASe#gi`&~uEu14{7(atZVYMlOd^djaH1=y^uAhyKK1m05_N8A<8=3nO2L{>n%y z6BigsVZX>o%G=)iAS(94Xf4!y!CO1GXUHTc%h2H>a&o3=or))!nPh@!A&Fq7eiwQ8Q{L8 z(8dh)y;LV{mO`5{)CXdY%&dW;-68D$mGXvI45$nN>f7z|L1pA_;A5yi#N3-%4^3vo ztSyE_ z1}j~H#;NvL^%8U(qvE0C8EU_=j%0%sF(D^1)MjH9&ql>UOC1!H>Kjnapj4NLATWhd zDbT47!O&?ARiM)uMP>FDhicFnjLL-0bf^lQ#V9J*RIdP5=LC(j?Xh+=bRk1yD|s73 zb2+)lAsf1w!HS;U7ux+{bGTP9G^e4y(C!aEhOS}+mEYA2&0VnOU}Ks>?_g;Df%OO* z>aXlJ;vVE3rN*dWOcS@*#&$ppP;%ro;Lu^Br^}Lvt^?y})@i zPQjX~4OS!t)@*EOoFboQ?EZc$+yLv9LO#P#pNzFu8|q`_a}Ht9ZH#IO-NDctPwoK- zm!kZ9jZu`(dl^OfxsRbaGmRVUu|pbkzXSP0^%h{ARM2?B9#c?Wz2!jRJ-}cURbY+B zMj(B$*27TxP<;lr9i(^RCOqIhhUQ*a*JPGK-)98n!v_u&mJb;kqtUpBz)G#a8j}r; zv#|1OgVkGsH6|MxqhWo?M%93R#?W{T>rXaV;FBznh!Y)Eof=Y(Q zBQ%$`=hMh9YNPFT8fBZ>ae~%jsI9l#`+-mwL+dM8W4EDxKm{^1?^i(#wL?^I37WfO z9n}VF_dg34dVqAq+NurBrD%L_L-BSqwAP~PGq~R%s9zxj zg@w`=(0GpeCxX_@sL!+ey*^O-4ba+vYQ#{TR;U96&5vm!?KzRNfamRDv#Xh=VQ#%RnQr+=23Hg+p8D?F@~H)SUozNK#lH zVC3UaN|%SRAN`bigrRY$qB;g>EUT!T5n+JNA%eh0hQ?EB6GMHedXl03Q*CBw{I0e- zP#Qeza4U3&1Es-EhXv3V7>mm0F2S8R~7r>ZH&_Krg0Y$nK7HKeJ;d~v!m@;T6W6^agG8P?M8C1c!bZi~QLY``* z5n)w;MggROMd!r=q=7}}H33cGMti7{AB0r{+8m_7T@$*|p#+LNvMGh44(M0GB&6Znv;ih=!FjNjqdxpw|=>R(77^H>i#OQEn zXGSA`O&3N}+H_@fJ!mfIhI1pK-N8)=&t+&2hRT!a$*2p^JVw`r_F||!n%{+N3hP333}qh5pF%V;W7R7Qc?3%!rgRKC_RY9I7|hU&Cgd-4>45FX}y@B z_LbHy35~Ky_wWd6Yt3Vfrn0$-QEx(@WT=gx`%eV5$L489d!btybpZMdqm!V|GU{#U zbBw0)zMWAAp*t9Ad+2^Aq27VM!02S?E=IizeUYJd%1}NbE!BHaN;{y_pmaT;-iOjP zfNlY$O-i5ZUy&8j3WJ*(XFAMFpBnl%IG%G!wmIT<}*gO zg?`Q`I`#;o+d+>q)Tfzaj82ChXQ+QOCm5XpJ;hL8XHGLZ6MBZBKF@r~=q%`04E2HL zYer{7zhS69G~Y6s+Lg16qU(RhXli55F^a-)k-~x(oCoLt`TI8>2{nXB5Tz4@P%IA6A=DNCUdBM(A8MaZrStpfw&hT@Q#w&=f{)fl^q3 zpmSR@cm_te+c07o6!9kH^Uy3t+yTvIUOlGj}0Fb6j^ZBaTAHFf<=^k7dMh zD5VilA<*#*-79lXU}#?Jp3TsG6!#oPQNGV*q=e36XddRC&qxiWGzBydbKlO;Jq$Oc z9iX|C`vFFL1YOUFYS4!mTJLv1%!r!MM;Kb;cR$Jq3jbq_jD&7r=(!X3lGQMflV^i+%cDMm&?w=gu=b3e_{eHHgsMo_vv!_a*d_p^)$ zfIi32{T25%Mo_*`z5=@6;-*(%%jL3q%&d{2=dp{%6p>Hs> z7VmzO5hc*K7+OztA7BKPySEuye{~;Z1m)E`46WO_-(~3jzxzFg*6rMf7qN*Lac|P?;#|Go$3q_R7Q?4 zv|i|@x(5W6kz)+47rKu#^bCUg1Vd|w?vsq5vhxK)>xk}CjG%INnxQpF_ZdcMfxWCJ*W=p%Fh1>L;NQZch-S z5iUHs+gZOwVVn6c3gE$a0C-YPV)#0uTt;x{*%o7f3 zVSfx1`AQh1zo!mE^Dqzc)l(1qqoBx3!XPg^NDzYNG#)w!&^*RNzX6(SdSV$Qh43_E zH1f%lz|eTp;{{1Lz5_H3Am3=7=RtmWTEk6gLwNvbj_S!`^!v~r42|nOgBXo+>KV`I zH=q+3S}XFDf@w&fx1rM+8rynqVGQcEX9h!a0MAT-^9;(E=T=6|fzAet;m>o>B@B(1 zJxdw$0CX8ca|_RMumb*2+OJ}04bQWhq4hb>?Ti`-y@OF>pm#E~uI9N5tiyGuKpz4R z!_UdkM;JrleUvftppStKIOaC!=XUqcV4u;YOW}ILpxbM5JP9{u=3GXpS3Mk)b(mWMu|c7(`?h#ykYA&d^*x zvKB+@0g<&C^E}ke(A+w*5kqt9$PNt6#UlqZG+&QIxCyfniue!)=@Nx-612V&Rf(Z> zf~cB|84nF-%rGd*3_~$_PPo*%*{pg679D2s=S@-KU7=ySIv>p(17(i*RA46dRv<49C zVN7#q3(yMtlcDVxlLpOT4E;WsF)g9UC&J*ISd@j>VQ{yGjsm0M_Tmxp$zT@Jb14+@ zi9_1xOL%O&4nymCjp{OH0yLVTHNQqEyM!4Fy_Yd#plca34tgJBilOTmS{H0|KV$kp zA7E&Wu+f7ItuHo4StbP1tTFs0L@nq`FeaAL-$J`U(N``|M5+X zKzdx<%UC$~PYD#pW}Waj-etxl;P%!P25T7dmr6FYjwyfHXhUn6^4B;UtZD9)Wec`a z*M$Ve-AlX~PHWi$b=Gl9Q3+eTUtun`$8l?{3HXmU7|0oCzlC?y=*@ES$A$fE9Cv^i zCI>q1K;f4A9Cr}jO*`edgXMaR9QoW3(O4gK+@aUG!(=2zF?>t~*eYr0xT}gMtig`E zmZBOc{(L~ez;@|^uHQOV`_kEaj= zUE`hofuf3wzQIT52Em^tjyqUHyY6({A+W1LU!tO8LPf0W8^;|c8U|Ew+!aK8K&s=e zC>jU&uT=>R%Q9zwWzjUi$qQLU#0Jne>B!HjA~euRe>{a499Ri+zj0!`m?r4G#NlED z?p=GZR+9h{;mX6Fq0nx4=58pC87~Sj%PYa2?${b9MqzKEeNMWV1Ra5W6YbyQZNEx! zMu})4n&IDYT!D_5B!-BlIBT33gS|cALlI`a1^BHSO7SopRR{`1F@F8)bsPL`51l_8 zeiq}5iCC3tim=namYBU}i!P!!Tz~bYiG9^;XZ`he&tHD;ZO6R?p&BQ~BJS6&^4Bx} zyU!!-)G2^36YY@GcB$<@rGp3ViHJ!N_KdM(G#dNHAyqg`bOfhWW4JmZG=+$97LG2q zbI2od>@b$vSLuTIXWsB@A14nex5pygO6{Y`uPj`R^4Nn_f&%=ghx{*?%;J zxd8E`xRamcH^rvV4h@Bcb7+YD>wik~0>pxHsRSXQkW-8)r)eLb$tC{!e5BBiLwqRB zug^hBeZPO>?Rrz}#IOWgdKM_$m06 z{QGOY=z+ad=f{dZILhBQVIm!LTHCI=hQH1@I;6qQisZM3UKMJ8= zuleBLlY!qUT%-RbEKTfsOdD5GBAOC;z@vmv~ zZ^!ym>EDj|dz${+(bv+uBl42^TWUS8#RDTo`YX$#=dAwzXZf%%8gHX3sqw{7%eKD| zh>;hMWK2k zR$LKfcxTxy>q`$T7DUKM@vV%K(K1HH$~f3TXdoNPMj~Dem5pH?p();lZ)U&A?!{-# ze0ZDn@vV-ghdkCFm zXW0dB!RN|uuouu>9K?I>Jz$5RC*FI_6PIK!*dgdG`@r%-KbbH4V|BcVycwg@rm(~? zSQdz8u**;=i{wx_Ob(YL^Kw_zre$z87QV53q#rBi;%>kLOOaVejS_3G2|X*C6nQ`vq7m_zfd~v+{TO zhm^2~^QXKlugI&iObI11Ru~T(A6gkPQCZ5R0#u+1Qo*7`g{V+50agtvz;Z?+XNRvPNB157v|F<1^3^DpEzMXcYrnN^zpIidPL_J%lVJ zG(lVVDQv7aRn5d?l^~|5MCDaUVv=oHBpH^MQdOF2p<0Trs+DT3+Nidwoyb+`Dnn(e zER`*~sT|c_bx<8uC)jA}qPnVF*t_T^y2D=6P2wiiL-m9mtzNL*)JOG&{ib}?Urbd4 zP-my9o3VmJ2fm=1eeqts|sj5pTD!t&O5H39aXN>r(u zq$aB=;vqFv%!JL0>EapDQ{5td5P52b=mmRFv(&Ay=r9L19p3B`$1{Alst472 z*q3@(Jp!9wkJ;88o`8J^vhJ{1^n-N=Sg(Vf2eJ(DEG$KA6aB>iy!rn;Y#EZph@H0W zhZpf=%+2a$@wM8mUQv70tLini7f*@o5wEJ(VXx{9^(Jgq9Z+wpgX$giE?Hqv@2d~g zhw3BsF)WLHst&8q)aUAmItnXe$JGgSQhlLLsnhC=`ci$RzEHz<1g5bT8do_tAZIKb^1p>jC;^Jx~wQgLQ!(q6>AA9;%1w;d+D~sYmJ2x>%3V zWA!*aUQf^yb%`$3lk{XgMNie!^mKiTo}p*zS^8EzThGyR^*lXaFVGA1ZF-Sjte5De zdYN9XSLl^`m0qoH*LUbU^& zpMYhtP5Mc_SwE$>=%@8o{fvHAKc~0p=k<2IL+{it=w13n*n)dm@7AyAJ^EGsn%=AT z>DTps{f2&%Z1m{2^+ElPepkPz58-=sALtKlTMM7)Pj9fdaNKWk!M4WmrT&VnM8H?ntlYrTj;O0I=!>v2@jI+cT+)B) z%le9K(Fjit!kUma##qJ$dq-qlBG`nOP}nM}U@F3*P-WPmstSt~)nStY_9bk)NOfR` zs2*$?)i)m4sE9OCuu(zwD&k;;sDWu{8kxqhpw!efGYKZqcukV=ndT#FZA@EnL0p8zrF4@4Yk65F+vLE4Q3ulz){Z*E?nPHvzUXGUo107z(-XEJ zdcpofAJfgH-8TKOv!HPryRzEA_j(R=e#(i2N9ubka&$?IKCcIx*vvrIaEB1-k#WpGj3^N#7Kw#osaOIlptHq1 zGY5AR2H{PPxn`bt&CG|zjfLhm*yUIZ%N$E#abr2GZ>)qBj@7WkaR)4Q+yy%s_n0-X z>9H0zGST+H5t? zm}g;Ya2srGY=;%7ov<6S3-&@@f{l*du+p)|yebyJddFU~PuvaL9s6zT9B<+4hi}6+ z;XCGCtRMY|d$v0<5??7IM166WxD(HxJdUy0qnNSW4m-*3VNHLnxK}(T)?h_HQ0#YX ze)#Qud}iD3IBJfW2VX$yk(W+!s zwyIcFt!h?vtAtAhhL0ONbaZg~#F1l%7Zgq^ z9U73H&1wfJ+X-TV6U5X+zO*kXB(rej#KK8qh7}K;8k|`)uC$=AaOl`l`{%^e6xJL* zJTcSf$|@|N3)%^i=*8y5aRv6#iP;HuJQEUA?Ra53+sY~}7+LK2!J$vgZ0^do6V;Vn z?iJ$fq)CR8#+gnUWIA!rbRv++5%4DXg0pW3Y+`nX-wS`TCI@6Y$&<~=!vRTik~Ni+ zJ25?tW0TGYZcet?wWqlg zrsn<<;zU2&Ny*gYkZvW#1tlZO>oJmofAe~sW72)D9-NRp$`djnvAGkwME2R6XkRJ8 z%V(qE@VR=Hdy0~l5z_N7neR<>5-!;ZWSWz6sW~PO#n_d1-R1npr1&rABu}zGkhUgf zCp&&{JBr}=T)nQ(JG;gtcoXeBLUZWU!z{agVmrew{)t&m@yK@aGCSGobuDkW)Fx)< zI60W@&nqVo+1X*e{+>69$pO8byySb4$;PwS$#uOA6l#aAZLPBDO zKV_S{`q(KN(&t)A2K6Z#IdtOCl945@KEo##a5v)3O!0>FyLJ#4b+j%0$`66JPUDf| zWMq<)3puH-eETxN`8PB-iP>r1igrVvl+mJly{Ik)L(5Aqnkgr(5;(}-=8l)?nIVPOk~z5Wh6F<=mFg-g zFT;u1iGE+WZSiv7jjK5kNN^(LRIS7u|5aEMGm~9I?eujGE%z0@n!jstk~`D!Ez?Pc zOy{bZPS_Kg2M@g=oX8o!7ycAZ2^i|6(9r8js<*lGd#dAQhSNx9IT32kwaA;sB^DLL zu1#Lf!Gy#dCkV+&uHkkJLWW;UJ+64(q~PH{R(QuCv}W#}}VdFVdZS<)I5Y zIcGbWH8H!n8F8&w%n2EB<27-DKUhvpNN(;LSzeCOCOFqma8k*e6ExB;@OeEtbIr=M z(^3F8p8fn?CV!IH#ip$Fjin5bwNtvb?DNUzfr(I}} z*8a}Z@qz~m30|&yIL^t@vzNpUWf=#+0v2JGfB-N{3LOP%Z_bSe*?yy;FwN=2t|?r~r(8?Kpef}&?v(QG6g{q;W(nTZtdMEf z4(8gG)7&+!{803~&Y&X4$y-`2wh z4YRGHLwKi6h5N3>q?W>@dewzOS%+Ut#&aqVj!3{(Tf3_?8$n z)W0WaSou-I%J&T~-#5H`-^lWPqsm>Q%YPl?cR5$^295LY2^wGSnoxe`gz|mJJSR32 z{ren0d|@SpBc@!7cd7sPph@NDOe)_uxqRQ`@_keM`y3yWf~NWR1Wmu@@*nRS(G<=S z*GQI8EX6D(EK^vfvP`pue8(`z-w<+lgD=WE`<;T7Vej`Q_$#G~|_5PZ$!s z&J@$j?HabZa{8PByU%Gye9pk#$D@-3Ow{b_`kX1O&lw;3oKD^6bi+Pp2<>xfv(H&! z@HyR=55rxGmyc?mt^VtC!|!uiYhNPQexEZ<@^NE>^LS+MOXNn!m&om%FOlQvb0)n$ zr@QxgIsJTIC;XTS+1KScZ-US1<$XL{#I_SYUKPN$KU{wQo$EWjiO-q7`FI$Bbn=Ir zTQi@t?BVk|;Z1P-PjKSTGisd2jf>Bj2Kt;{%Ev1%2|k|bKpp>`4$_yxt*0-=@i)z{ zPP(Q!$EP{rPUmvub5?YG&S=x;bm=~4hUDXNmEd#AlaE)PuutFyb^CF> zUFz+!ETxpP)>4*bElVj&ZQ!QJvMwTx5m`)AL^=itF@_Lkp6~y64v6mk-1qZjKJ%Ub z{Lgi+bG`ho>s;4$&Y8qKUB=u&Phrd(9>v`0FW!ZBa|KG2=@+}ywDEAb60a>Gw{XGO7LUi>${Kk&epw|n15kNcLZQ+GL_ zFy@X{`1JDSo*fEf-kc-mEfvMQvq#Kb1S*Vq!{S)6R}RIVF1@LL%o~}+y!DcpH{^>I zd-YuG>3@)?-(s)c2YKaQ?CI89go%0M$e6d@67zrU`op>uTv6z>x*o|~~?b2JGhR+?Y4Qjd_#3n757_^JcFxZ_*d@MmK}J z{(aEEF>X67_S(&jc3E8f<#t#6m3CI_j&*Lf!{Q-d3ICOLUHp}HJ?Ja#y4Y)%H;@07 zc3%9|@TFfqUhFIBk9{S*v9F{r_LcO9E~ihuH?60g48?O%L%^ZUhjw|s7X_sZvs?{0qi zo~!fo7xh12*|NfcuJemb-|D=Xb2-&*7JF+8#U-NymGhUFj{&NhB%eB!@G0r?siw}S znkJv>D)>}W;&XI*&D_c*0}P5OR;o^*Xo!2#<WymMi$z6+L*0TX zbeEX;?iNJhP_IgddR6LPHDbG0r9+3gXp{ao=498{Q2Z7JRJqpBs>UKW{0PCYxSEP7v*pMmbk zfcU(!A5`ieJ;}|gJBa4$q1z4$-9bCwU40k2gMGfcx-E1k0ettOatFVB_o~kwG;?+F zMtolNd4uIbchE|BuZ6mUYQB5z${iFI4H-KueQx#a@>z@KlzCHJcQ{g1SUfgQ^V~Uh zg^`u#O(UQeV zLeap&LBT}}7IR59xNPq1o8E!NOw_AbhpcjwS~Sp|loiFidMO#^)(K)XgH^2b&8o6*%%r-qEVH0y$>OS6<;!NzT3k+7GAwoelINDq zRq1jKK%d3#oU5qVolEiQwuoYP?80|f2F30it!SV-2I12^e6f3_sHoVzR8UwnW^ii7 zk`;5^_Bha;333I>?MzF&?!3h7=1aV8zr^eAi`^M1ne{|`qurKxqAVGdF?$J1V-)Y) zs#%pQU8Ouwlro3qGVe=i%Gl?;lSJW-nYr5!6cxJbJ6t05R8ulGrF=oN$WgOqz&COe(yW~!Aui?0T5Z~RBE_6qU?Cx!MXL)RQ8&r|I z_*YcuwRIZ38~;$REQX8@FQDD9T2)?Fb$UyStOP=vW?d{{8HocSHKyOA}?5z+K zx)*rpqrJ3olAKjpxn#w2722O`#9@7}v{RAi8k#QGoFyxC^^5clb3L??8({{!p0XuX z^Ihw?iaCp;Uet3Im)%sK*N?g**rI`6S$S8!_#Vq-(X(>FtY>J@RnNIsUU9oMGteu_ zfnHG#^lHvqu0)(}_6NEXTE4s0%{>WjUc7}Ft}l4s-9B>A=+dAq5SF`bWYFl*;UyJw z7neO(UOu-foj%|T>r27hR1F$EBs^~cLFZJ?on6K1o0(-xs&$A#%q^-cKVAtBA}jhn z$1Ti3?i`-$I9^h`EDrKiHHf*r!qdIzvwWV#TUuH=Mwcgw3kT~mzV)Q8U3iOs*e!Ok zXVV{Z+20Ls_Komn-w1DZaYXCHvzII?o2~YSPYUL9NV?WeZJQSpr<=l9x|T?9@eVYv zrI*hVFXZR}v&tnKe5wXMrF1@3pnN`%uBBg#$=f^T?QJ(L+(@x*V91!iWXZF$%9bpr zlf4;Qy+&cNx1Lt)t)~@x^PJ+Mfl*d*%jT9ZS@FeA-lCM(5f*wKB%fZUy+x#AZ;`0j zTNEhvCiTVMB)-_4#B=3C+AAy?JuK=Lz|aA+XDyqXd9#f4)!R1umM=vE^+iK_Qlpb4 z7j`q$=ZKlkFZmDksJ`M5Le&tNZJKJJt61MlYL<5`w_;RK$A@Np0DBshha zk7sG7!l!xpcw*rhxPq6@so~{wR`c>XYn{J@-{j;g#pw8W9v}^7_%dJ@Ul-V&yZ(K4 z$37h58w!W}hQs@O_rd#p{J%%LHy=LgdlWv#J^4QVcjIKpz4efL>fvJFVp!p;fR(;V zSnVTU{C`Js#9j02;CkQp;Q#dfPxyD-3-9CqK5m8EeLLVD?r`_n{q3-h=SzM3FT5uB ziSJL4{|X6Pxx?J&`<&k@<^c!4ABMSS+{b^$i^5EQCcKL~zUQe>VOhe9cd(a<}s~xP#wU^zmQpegXf<|4)$rWe5M&|F5vs&vE^U0AA|cLeT$+#wA62KvIHKoNXA@Hm_tpscv3muGmnllN&jCol(oC-5D( zIj|Z2Ltr;|b8>?poXnHXKJFGI@7xEN!gQ-r+TGGqipaJq3WZMJ!P9}IJ*!`bf)TJA_I-O;y?9Y68z zsrrV~AD%he*!0J9AD_Pv|Froc5noZvM4U+a6mfbu63xu+l9PK|-q-SPFSw&e&#(8o zv-e$n`+ai&moo?5JL3M*apNC(Vp`dPg%#B`tJVbg*#e4%1gu~G+V)MGHZ^XVvw85A zEnBz#bjgmvJ8ED5=ba08?b@Bar)+Q0zFqtF?Ta5caNzjCg9pbQT=Q1^tub#^{We@z zSJze-s+(B%L|xgTZyY{+c=3^AN6sBd9ElxmJDPH|=g~iZ``?fCJl6YI(Xpw=)*OHS z_{+zS9sl@v+ws1~i;fRIUiwb_o#uC1-wD6-^gD}BoH!9ZdFo{MlLJoHoXS2`cxv#e zp{GWjDm^vz_aFSe@%K%?zf`}e{y=@aKBYdVKEJ+4eV_Wi^+W1M)Q^1s%=>?8$ZF`* z(61rZFz@u4)6J(lPG_FZKi%teztf{W{P0ZnnW8g;&rCS8^h_mBf@Ge}J=^`4`!@D(9MCwpaeU*9#)?0D z{D-`z6HQG`7n&|LwKlaiwKrXD@-<~P(f>en=&XTq&T+X??bN$cV zd#>W+^B;#l?(y+mANT$E;q#5>&!7MFeCzqP^C{;C;h(Pmsmq^ki@zS<8{Ze-AFqoajUSJH82>mPk2l9#;@Ww6?Zpx8}6=Z0*z9zjZ)sVQW$A z;MNJBef-(^&$@he+h^TBd$4UwTU}dY+qt%QTXS1mTYFn)TcRzcE!-Au%WlhQ%Wb>8 ztykNfZGYa@uWdlvptd1xBicrOe!ac1J>K5j-rD|o`}OujJO6jLJ=7j)&uq_X&u-6c z|5|&$_5tl9uEwukyn5wo+tq7VJFh0LCa-q6+O6ZGj`JNCI^rG89W5PKI@&s}c64-H z>*(yb-jV1?=?Hd&J2E@EbmVmO=_u?d=@@hE<7>^=E?>KH?Xzob*V?ajUQ1j{Uh`c` zy_VZ~y7NqDQ|I~4=FW?qS2|le+d4ZtuXiRolbya!e`iW(uru13)0x-Vr?YQozw4*3 zU%Yex5R%WP9;7_oKAe0 zIFmS=XiWSe(UkaO;#}f<;zHun#HGaLL`&jI;Umv|tmmB*ky_a%A!$sWfG@~@D243EcJ&hjYBS07@z!b#@VM_71##h2Z{Xjj-gw|8okv}=_?MJtZr+G~j+@Xg zxc^GqyZPL1J#W_y=k6mBK^}()^C*P-AVhcmA#@)eZy1yMNosTI#nj8GEvc=kpQV1D z+Maqf^;&9YY9cksX(EvN#m(tC!54$4f=$75!HuHHJI{&n8X}5=tg+2&1g+30Q z4_yfTDHIPihc1O$LT#b;(A7{!C=p7A{GpUkYABk1HvLliXX%~cli|kjxo~s%a=0yg zEu094!_ja~I6vGw+&3HxPmElMd>+Y-ejII!UX6A{JEMtcB$}P^X~xBjs~ORZjEuW7 z+cSfinVH#{gR?%&x}0?->+>v%F)Jr)NY;q#BiZM(FK4G_XJ^N{G<1n~xx#a5mvTCD zk~!g=XxGcRb-71!kLRAstOBfm$F9z{Kd_88G)RL|}`^Lypqx#P~9JHOsL zzjv?RBl>jj)9ub$?*g*ijFbPTV!IapJ_sCr$eH)ML|nOe>u>t;|2? z+jHhDUR+(x!z4D)^(7xkPE1ZumM51dtCK5}YxsfAzvf|xjm~Bs3i$;OiTs}PAt!e` zCvpmNp6}rd({~#b{Apcc`+DcqP0p4r&cQ9t_HE8jw@BHPj zo#ziY>kcLt@;JsJ=h)HY)5o2<Ti zc{$;%4JH?*IWOiqua9#6Wuo)9)13ca>-_LL{B|V|B`On-li`KQh0gQ5{yVQ1dD$5J zRp)P=Exdlh>j19~o%;(AUFr%Q6&NQBZoWL{Hi+LJ5FsAg8DNgC^m6hdA zDL2P1W?Rbaie(kf%xC9T@^t>9S(VQ^3l}}R=vkiIwnFpqw0w#_tGv%@rLlVKB zfKe;+GoE?LU7n*P3UUHCZP74MhEu{MJ3N(}$+qg%g|su4NA z70-w~ti2-|h39De{Y`4a2|v%9-~0)0+qPRj=du4;#pjDKSB=#0e!)BD1=RKm@2@e#>4l!}W+rd*_(`;ksm{~P z*;g=EU+vf|{rk+$H!>@?Il0ZqZ9aaKdH6}^J?7ybY6jlO%)65(=o9>pcN&BS02$1? zyXy&gX4~{0_c6z2e$DLqF=o~Fv^w)?X44hSqTOfF|B~4=GiT<_f5&`zyPg!^qvycu zY=-PTk^QO91|6+7H`bsbOi^Ys7xtclwr8I8#Pe|fDCWR_qo;shWA3}d=Df^!ne8&y zZT0?Rdw}_EH}^lZGovkHCOerK?94=j}bUU7^#L3~0i6U)Wr;#zToNSP7??GDoNAZ-us7Y~c?h_pfcO=2@v zdqz*QGyGyyqqX8EU$MyO{$-7@&#Y2$qBu>g z7M~aAh>O4M&wA0myMI|5Z&<{&CF^zjmUTef^M!2|{v*6kWSy3MF6$ECI?T>a;hmY? zU3M?Azc@-9e2YC^_7uX;%$_g1Qmhr%8N0U0eo1_dklV6%!o6LZvfpx?F3s7;_;yNL z&lURrc7g0Z;;nX}JY&RrZ?PxHenKo0%f;p5T8^=y%VycH zi2v2zL73fL_IEkV=Q~{*pwir>S>fA_IesxJ=7~MUequ}<`CsgD@=OwEi1Wk>vF6Km z&I>s|kmps7w>9Stv)#X(H*Z*MIcRpyQSqeF{d4;+&pvGDx++q*CVRtR*`p6BNIH%rXKW%o`g<_S_{p-5srnSE7%QtL7Zo0+Zev7^97JJ_< zcHIrT>+u_weRi$?;#=3oTkQBPcH0+r?oBf{eA9H&=YL`6ei6h8Xa4W~j8{8+hco(T z6k%2P_h(pX1^gwcuV$Dk0=|(cYcu+o$}Qld)}m)*Ri?g@F_Z0tOWhFN9X*9LK6P*O zgtm@PONk!Wao@scY7F?^N=wNIMK4eWz47grZz+mBIcQDbd#z^X6z{bi1ta zoG*7`jU(n)qua1v#d;5#!Yq>1jqeNCY)=0DbxmYuAhAWiy zSNPn0*(0(}zJ{ComfqOc_Y&5<+FD6CHx{!@o1~ttQVAtq9dT=`D789jT0{}}O!Yqh ze126W!0!+JB+6IR^|tRPkxqqq3aee#G^|!xuVA_5J{`+iM1Wr|`bot4hyXLzpV-(P zYdO|gSr&_q?lk)MMWhvHN?>o~q_)25|8?Y@2x{QBRSrZ>usz`K=j3`@_cJ1Thj3gS zu~hoElj_5^pZy;zn>8@oo0yD8_GYx>`y*TTXzL%@`np+x*TiGA0H(R^A7F#pT@@G@-;fVDd1#FFK>+@_? z>kky-b6dZa3me&E2V>?=vjXG&`@-#E>pAjMt8E<3)=IWYi-BJFS`@A~zGiKuX2KWD zVs7J(!UO)pSdH3R$JR5hg-=@HmwWbyrL&X+fi27l?YM`X-0)ipHNuajPD7Qc{`NLQN^fGPDXAifwa@k5=I9h+UPIWDO%DKNEX&z_3Ks*skACp=_xI*?F zrEt_#`e0d>-y&I=Y#rcQ_*7fIpA$<@^Z9O6Hf{ zLNA$5`>t~>(o89lOU`SdHL^-mPlsw`QDULxX8GDVTBWSk#JbR8ZC&TD4yj%GLhS3- zWr#gy*j9ckD-rJLTIe)S*7%!kVLb8OYd&W?dki+qZ~1j=YXId^r#-g%cZXD4{&puf z)YE*ve`a4dZ~x35ISRK4U#4r}OEJs;2tEw6QctI~xfWNwRUiKTfkfJQ`TFBKW0vm> zzJ{CDDYIA~a?(yH92!bHuC2DmQCUau9hOCyw6|ovlv8Hoh6!dKBLiu7z)c ztQ36IC;L*`X`^Ii;2U99U`R5XU)#2{wE3O1n6`%4O4~Fadr*d075=KUzS=sUQd3O_ z_F(mtZ!uPZYq3XnSqJdt%G!XXcIkf=D=Obc{|GKf@tfcBh0PbBhfAX-um)pURs(*{ zoWX=yDS22O+Uj7rDtQ^J#eBZOzQe(0?$QbP7(E6rDBL8hb7pa=FA;2XE&exLy)0B0 zJSi)N^^UBezBhx%f+yHxC_ZV3-?&QzkJ?sWBi3QF_)WS*@Gb3;gC&)4wJ#BrhWx(d zrr?`5_t>pHCX!NV$VOGc*X5&a1-Hu@gSFKxevNQ{aI<_PuwKLR`%2crzyL7?raE24 zyXARIb|2Z#7@h7$|I1>T{9}wx3QTqGFx&sC>~3ODv6omN_7yXs-}$-hJlPM4tK|ub zsq$2bUzg`=vR^X#UXjOAp6b|8((jBH>*NWWZMSOSzgK)t{@&uB$@4#C=ZklW?on=+ z-9!9_Xu0Nh>P5deP|OhT68l5H?~3>x@v_nXd)XIcTMT~Rf5=`gDtEr6W;?$!2CV%3 z&QFcLqcGLUmi;@~c7pXge=a^MPZ!x%8h&S-_!F^KRLs8rX0~sKF<`0nJ9EVI;&d^~ z7)TSX{QbVa5%(LNQn4KR99J_^h0`hj55<+@>*7L4p8y%~K)%IDB>uBFQd`YVRqp(bTRxTA>el;{vcuww;)5{N$u-+IS)L~G529($ z@3^IXkL+S`f_T5^D*rySeJUUSXY#8qe9L67(bj=t+~~K`_WPznpEJX3=YNS?TOzvUxk0wtj?>F*ze>`1!)&KrTk}P?2LDlZ zS1}-VF*@61D@RU9_N(&$TJ{g2z?c}GI8e-X!*t-K@la(!RemX^FDw-4YqOyj(&ZoE<#@~fL2#?*zW z3xoasET7wv`sF#{7s4;NG|Oyz$T^E^jg;nHK*-PFUraf7g))swq@;2+uikW+V0d)+U{U>en~Lf zUMaO%`P8^637Us+OyKLYj1jOYAF41R=(okz9`}03%~yS*!}%_jom-BCC~ZBjw$ndHE>&2B6VSO=Od?Y z8`-_qYCD{WY{)x8?4_Bt8Ksd8kqsH88E2w9VQHR|wwtYvDa&+XH5=Jr$8>EJqjGm^ zD0Ph~DbI;)$b=Tk_PuSS)g85ZZ&$eb)!X>| zdGh>f?ycvub@f6%ckx-q=YJ&EtbSUbC97w0m-u+%RSI#VFlYP=1^dFvU&ATeLG*<%C}Ri$MNkqZ0p4_ zH?8jLeycsBZzK6um+V;Gn{QRCb1cqe~E*k-oL&8uhJJZjZyuA2Btl5wUB z-x1d(cahpa;Ag~yRlC8`S$o1sA!VCt&-?%0acZ0WTg7d#Ra;tChy9xzU+r1{ zkCSiIp5ti%r#8-yLx10?uDy_wmE2Alb`f)oPD(sPt8zafSh zf!`*ZYqtgJoPM=sYzfxB&MoxUlgDc}`THdI)$Sz!FW2q~e3#?w3#@bUS9LgPzD>@h z+ATa2VcaYpGzNMaQ!~Z>Mun}eT}N2sX7Qkru#m9E{zip;zIFm(jhn@TM#4hE8v7d+ zc28|z!WuV=2aSYahA6{7*5;z{hT2U3 zPx1Hn|H3>@x-Z|}Y?@J90KRj;AU;HoWw zoyqMr=g?D2S(Cw{Drtz{FS(0JY*ylac)(f)m2T6)zzwOtE-yD zR#!Fit*&a;SzY1TrH~&RohW<1T~p6~=W7PD-|uS9(2gRj{IsJ;O`-qCEV5rBj%zhd z#Br(S0#DH3351;NRYideXG~37fP1-XIxQwAx8?wCEnHLQ|9g&i)V~$B5=VN?JJf1M zO(T1oy(igTbJ~A7*;aEt5K11c=^OYiIcc^!syXFklBWEcUG!n;HAhI({+i>&cdq6n z@oleZAik`cH%U{x29-F`nzx7*5ABYAG4S7#L#ey(CO6f@X?=Ir>_;&}Yg(KxiglV| ztyHYligk@*eL=B4tyniG)^f%A^ewTzq*ym9)_IC`Yv4L@Z%z5S*vshT`mZ=?HFLN# z(s+$LObW34R5OR?ii|-qP2`@&nkNG3vbnpItr0wr1frCEMIejv92Mv)f3C(rD~(daXR_zm{xTxt!GDA$7)}m?nnUT1)E89~L9Yww1fl zUjE8cfh^fw<I43SMng{cj~UA`W>EU3#{x%4O;lFVy?)53r{zZC(c$*Q@XON zw^3jI>KalPT>c2DGhSn!=%A*|>eopf9#Usab?&UrBz0z|iFP-$L+Z>ECj2f^7g$je zh$h=tbPr@CTdPL~x+EK`-y}uB6+20hh0K-B01msG*j?f8aJp9Sck(H(Q1wPq6s_Jt zii{n}rs@|+S6X!;rPj526RFFn-b(7&O6rWM$&ahHlRC50#1P>JlREQ+#Yi$yJ%UpE zM)hGzEmB<)$aV^lc zMmZ7>C3s=Q>!dVoMGN)Y_FSX2O~TMNA#D@VHX&`ZdK9VS%(tvB>Tg~#81);!FTM;% z(Em5C$U*()e^s8>#7)#lchqlTHj96sJiVfae~auNiCgjX=4=yRQDQA&*&P4&QRCkl?VPe=A*t?Mc8*jV zzc0Ql{*BXZMINa(|7+qVCw)Z$={3)0ku%Y<{iN4CKN2}B;o;1-q8I5h|Ifsqi#tWm zaw{rmS1l|0x@Q3AcGQ=#{2(?-md;lp8RXt5gjn|SFm&a%!J(kZTrJ<^6q!d3Xy?yx; zq|`k0w=k4EyWA9KTTvX0Bpa8HvL0o5DgEu0WsS5Aizi3n>3i9Wz8BK>Li%3z>h5%1 zK8ZB?mUCCJjrd4u-O`N#Mhc|#4(pSbo%OXRcP}mQb&3h2_0rS`z4Wqn>!l&RG^Ce? z^wL$?)=Oj4OGA2TNH4uCZoM=%y)>kkhV;^qUb=FFwAo_4bXAJ=()j76A-y!DmxlDx zkY2iSL*RBxkM-5dC^zo9U9hTXOA z9VpuR&^1+i7)`BNQbSq4mi&0xn~ac~mhESRY5r(mw@yGIS$KFN# zc3r&Nza#nkC0iNqTKIobn7y)pCGHmw$bU%o5!uJI*T0GXA)c21L-CCG2l+3`zGOt# zmcpKtb=ItUp=w1pP^7#Vh2XWm$^zb?P8kSxG*6 zRhr(@7N56P2RmpR=$*FrH2FxYe2ILdR9YRdm3$a!jWCttY_K+oO`C*_Wh&=co5ZF~ zLe9aJFR4v#Li^z*P2{8dl0D>un8`<5!!e+}~^37PqAIJiiWydC#6z8xAGA8F2w9yiIB0doUesB|P^+_YJ3pI;I;*I%I$Kh2 zbyhK-I%`|lLT(^4T4OJf`dc*B=|g|KYsnV+W8?ec2V!S((}GhzN2@wM(JuzX6fspy zQ^=5*E{4U37!@d_jlb7D--Re3(g&F(9UhsbWw}6GLLU7#1U9RLl@F#VnCIG;wwj zbHzNdo7i2<7jG8}#5=?uBE7?cGDb*O7mQ@Y-nn3gjcFE4WTb8O2@B(YSNxO6>e+(v zD8|U@*@CIoE*FeR*{#_6vMTw+qO+8#akF^PXuas7G1iMN8gISmf_>JDLV8h@OfQPg z=|vZnSueV1s`a7^_E|3q=|v&E=%N|ci(=D@LVD3fL#-FZrWb|uqKnF`7p3>37hU+K z^`Z;cSucv8UUboX>qQAkFS=+X8aA6=6w-@AdQtYJ7hTk!8YSh{m(Cw$^@{SXwB}K} z_^Dm!SdJMNkz?a#@u1OiTt3NiT>gaRc>WQ~F(k+3GcCvEqb$ee6_(@jIhN!3M=ZyX z97A$kzR+@vO^zWsE-$qlW0PY@j>{`7$K|z_;{|n=;{~r+j`5S@^5vFeLXzWhn-7~! zjv+aQey5uonuqT=(~r|7Wx5ncJW3Wxo}K%>(R^UkrjHM8<6k>Z$vj z1!t)H$ifhHZ)DuIpozNAS#W_K+hSncw%`(V&sOWP>7N<5VKZ)9VB=-88Mi^kZ3{b@A$Hr#d1{t?4%(NbR zVQ!$0r6#-eeXvJB`3fjUfeG>}7lCrK?Ml$>Ji8JExe_!x&nadea&kc~ z=e@QCrc&ek;s-`wkp3lPD-^Ti^u}gyOkSMV-&Vk9w=h3BiM=&>a&9?FZkyjpU!5^0 z+y4`V+@Acm`EB&uw%3m2`30Hi+`{~m9nsdu=Y%<%aTNcr#Qoy075;$2{6_X$I^rR1 zJtF_x@*h*2|0cd8&wt3Sm;Ju>I<4>@if6>L+WL{$DE>iv@v|u8<)Xq|5?Q;SlSio^ zojujo?&lQH?%EdQ^Ixh9lXcIu`0f`=#8PpbI9_~AoFq;br--w}+2TC0LR>4>iL`s- ze^-1@q!+V}`0f`=#8PpbI9_~AoFq;br--w}+2TC0 zLR>4>iHF2@#rH(6#BjuVu|fPuY!W{aKNXvel%M~pZIqw!nv+>pMX%XeHlALySJ_BP z5kIA9WQ7y5!U;nbl2SCAs}C?DPc-@O^S01O+EzwRWmD-LZ7VCBkQGkI3MXWR6LwGj zds%y+z*0gVnO!y}@C{>y=qED=k^apHLK zF>#VOS)3xy5@(C^#0qh(SSKD5-xc2zPl@$ngZPoyBz_`(DmEJ#r-aG|Q_|70ag?-? z74Wj&HbP-5E8t}#DDRB263Uycl(&%;@R_BQy4kFN!;poi)XioE97g0}1-xt?rEXhU z0WW)jQn#(FfJ0WmAuHgJ6>wOfkgS83O`xQ0FO?o;Z1x0EWkngAhqdyue$GfrI%9Sx zC2cGbOT}^Gc=0iDk~mqMBF++Li}S<^ajjS<9unUb-xE)X^BFYx8K+Fm5H&;847rx}l&#;HjhZ3X((pu+$7kCrf!V0} zsr9C2wxVW;njvb2s2OrC?WrG7x}*d(cbRkMQo>(ES73;)9;=AH|;wiCS zY!E*Zo5WAVPsL`V>HDdvrthcbo4#R3vVA)1*V>A{pPFI%eyYs${nUKZH$>ml=b65- z(KifPc+)pF`i2pC(Dzg8s0Z7MzUep6H(Sv+MBfm7L-Y*`6cT+uwV1NEy;ORXx7ia! zl@8Fp^d$a&I6QvaMl3I-dG}*isQub;$z|@ak4l?oF&c{=ZO{K zTCq+%B)%)YC!P}P#Rl;su}S^P>EihzzS!==O z3_3H9S~3rF=UIKJrQl!mw-t@)b=F!4Lu-Mw7D#J>v=&%k>8E~-Dq-r!>Ru7PRfP{tA1Ed}x^#IuqQV)=NfYbw|9w7AqsRu|sKH$&@ka~dB!_4Ed7K$( zxrZnS-eZ<1lf!I6`EdZ@R7Xho3B>28^ujO`k>^XnAroHGqd2Fmg3;`Z#L9Y}PIz z>v_|sQ3GZ(JDfg&8ZZy*dDExZdft<-QUm5e{ZGD34OmE4Eg`FxkX1{_swHG4Z~D{J z0BNQM(x#VF17@pisR6Smh$=~Hz&u0(%nh*6O%Cxpoqv&3v8D-Rr<*<9U>J+`(sbsF#)=jRnt54sy>t`)bRygDA9RK8a zJGVg2Es*{Xa&Cc~TOj8aNM8s!w?NJt zZ)f_cBkfENInz(=X=nOxpRzMOF>t1z)MjV;sUz)7KedmY>9IM}Pwh{=na!CVa;E?G zDLd0+bEcnaS1`=Onf}Q!)L8Ia+0*JEK9F;~nJyNRsEu{B@3U1Yrq&mCe9k@c`i2UvG9zAt_tc3RJ1 z{o%y!)*nLpLr8xJ=?@|OAq*yuf4hPH(88lZr<$p&!p(Cz&$52<-b%|mJ)QuC0Shtxcz<{>o?sd>l|AT`bozR-BrTPq3Odl72|~ zA?b&t9|n{46M9hd7Ct1Vi(xS$M#T&xjb6>)ZL#?Wi1&!B8six#{vUMlt#hV} z$KFI2q{MXb824ORE=(7Xy@f8!|5K4Qe*Aky*7&hmtDZHY=uW6S%)o`zjv)XR_VcK9_yXju>#v4g|y$F({^qtQ}8o2&Bsn zixKUWCF)s>Kv(&5#oNR@v74AL7ASl#*>}nAFZ*us9|j0Gh{3Z>3bo4FQo5<^u3V2 z7t;4a`d&!i3+a0yeJ^Cp3>h;+#>|j0Gi1yR88bu1%#blNWXud1GsD-C*B&pUAE|%* z9Q}y#eenaMofjUD^PfSY6VCd+DGm^e#i8Ob@fo9yiXVSV{XBQzvF{Q8Mkn}q!dmsi zuc8``g=&mEeermMdj8|q^FJQX?*b{mA%o8@*Et zPcb44KWMA=#uBkq94C$!9}_2ulf^0GEOE9tPplBvir;h6#y{cviAecj|5Ds9{#LA0 z$V1}0;(OvLv0iKtKN6e7Ps9s~AufI@56{hzi;MEKh+HG*xNSzeg8pbDqsCs3o@dl( z9&Po1Cfg13xoobfKibSVGCa}lNKKnS6LL}>ZDkzEUW_A+TvLZBVyct*Xa}Q7^KfMy za+l;oM;J|-O&f#UB{?z1EFdz0bG{RPcnV`m3&WN5365P^pAckZX(78hX%h<=S(<&D z$n|w>uCGI`uM;lU#GlG;yk8+jWw%#RAf7y47_lSj}YMJ?h?e(ZU6J)Dq1JmT0 zE|$w*C40HZ_51NN?fU)rloZvYv=e;vO`AXa}Mlh<1np?O-!cdGt-w&ci=2?ciay zf(PwjqaBELAliYdWm_#H4BElNoCRAoYudqsb|5ns{8h5i4j!~Ku9s=&!6T-faRt(j z|KZosjxNLw1bUyAlex> z#&)25w=MwxaVT5sBU=m(}9LZY3A?YgDeXa}Mlh;|^_AqKRAU0^9R?L0Ke zw1ej^dC(3v+JR^Xq8+GOMmx3_+QCDYimjS8?chN>uw4Es*=Pq3+8JxlRCbJg(X=!6 ztg9VHsKg3OMB>IqI}q(av;#Q;L^}}eK(qtV4n#W;?Lf2x(az{?rX9FPHsCS- z4UaeNV51!vkq7NO_=IU^j9u-HKE$(j7Qbod!AYhaLZY3A?CO-+Xa}Mlh;|^_AqKRA zjdmDwqn!uyOgnhc4j#0Fjdmc~foKP+mQ6c^K|6TR4z_C6w1WrjK(vFuN;cZTgLX#0 zZrT|=(X=yqo3s;ouqWCvmWZX|IB~rAm^ewCEKU(;iL=FdVuiR?L^}`6H|@YZBFDr= zI}q)_I)ywWzAL^bo)YWD2Js`YN&G}aJH&u?;HUC5i)aTA+JUG8qKgOSn|8*un0Ch4 zz1il`R?`l)8wTxQqn$B!w|3;geACX@Y}3wIyIY&BrX7fOAliXwXRO`pY&P0~Xy-xQ zJBf{UAli8_-};@gcCT}|WDeS~Flc9NwrOXq-Ro>2(awYYO*`0V2cjK_b|Bgz2DF1+ zKny)iJ7XG5J9zGr2kl^^9f)=y+JUNNv}1dr9XvdfjIEkA?chN>uw4Es*=Pq3+Ie8H zY3G4l)6N6)rJe9tKiV-eR)&nFAY*07SQ#=_hK#5nV`a!#88TLejFll{Wyn|=GFFCY z=YD<}SKK3VOgv}@q8-RsnUIW?A!B98SQ#=_hK!XVV`a!#88TLejFlnUAqKPqKb42E zGJdp!2kk)A0nx?%{Y^V1Z<=;W_M3L_Xsc-l+YN(uu+dJ*TWBYIzqC_w(zH`@#I$pN zf71>`I}q(av{Q22w1bUyAm^+x7p&jGMmvym*8S2>$yw9RD7(^XVbD&=Nz+b=UGuY$ zXlKkN(+)P;foKP!9f)>_0qtNjRvzm&?UZab?ciaoj0f#tqaBELAliYdWwc{q&<-BP z%Gjz|(+(cA0~sshuab>+@SvUhi%dHs>rFfN_jl$q&&nEg4(%9A#8PpbI9_~AoFq;b zr--w}+2TC0LR>3;kJfbM@f z(=1+;r$uZP+l;K;x0E!Ypo~!o6x3zZ5fl_IIf#OcpDBzR@^jfdcQEQW3Zi7}+T=(Z zF-Jz7L_vf{LFuC!P>|Uv79Ir!O7@{3^Ki8ialY;_P*B#Wsq{Xf``TGa z>lk$w1!av6v4Y=ne-9Lt81*6w3YXNQAloY!o(eoSNeB_mkaU{=3C{#6nSJg5oT^G=SpFmIhFq#fIXDN41aQZ0j`nr;8|# ztyQv@izsenjVW$eFH_veiKe*W^HChJISZ|i8(wLOgD4JiG>GCLii0Q)a!iQgAc})1 z4x%`S;vkBHC=PzliQGF1#ToaAzZCb2zZFp&AyFJeaS+8p6bDfpL~#(sK@}QG_Zoh#?c?FDeb`+w@v2qP`I! zQ{UiSroQ24OnpP!P#>{5&zky%yVv2cqCSZFAnJpt z4}OpTT*nm=agX>*aliOm5%m!g^+D7JQ6EHo5cNUS2T>nHeGv7*3yL8wqCPyR4_=gq z>)af@Rcte&zB3T@4clbu8#d3*u)}xT85Vw~FmA}tWuv}f<)*%2JWHKy8Psg*8&+v& z*x|cPeZ#8l42zv&;Z1$Tm8j2b&an7V->?_#42#Wmg26jYeM4KVzZ<;K)HiI6)VJNv zu!CMP^$oM%^01JcVcCnPMX+yEoOvQ=Sp4*N!#2|2*|AU`M?rlZo0FP{-=Bf}hRVQ=Xx40ge`c8V zn8bi)yT^jeE7FJYYY_^QolFe%^Mq5NxC6~vcz%Bd^7}LJHpS1c&|vc`G>~7RiSY= zPm_PTSgx&AvX>iCB1DPw!-H+UVPu^HG7pBVb3oQPAnP2E*)U|C15OcH=fGy21G3Hm zS?7SPbHMNMU*D}aH0}|9Dee{biTlO3#NUdne6TMoACQ#~$jS#iC9?8?-5|2^fz8SX zWaR^1Pz-UAl@C0ue87wHToNyfE#eiiRs2kBGty%QV_|yCUa@SnW*&t>Yi7G)K9|j` zHfFyn5EJx1i}0-gtDa}5cbYemlJTDJd!mzpe1-be)Fu@%)=VObxm&!Oy z94?L!xvzUbJFUn6|FCy1a6Xm!AAc_AHwI&jF)mFSlZM9qlB^^qBuPlJk~A)%sF>FY>r8s<{J{vc(*GkWH;8Av5eoOT;2+O;w~s>&5E*NPcAkN@Rb-Yudl5A(X_h4o2AO zYYufhgr{qSX)3wnUX)p3FKT*I?nCya=3>hIC}TBLgc?K+A+I2Zl2_8_FmgC~6*+>u znjA@9LyjV^CDX~#jAsnxv6RPAzK$GE&5e{NQ@(}rt>iTFXXFgJ7L#~C6KP&e{Tt*O z@=bCr`4+j3e4AWPzC&&xHIQ_7!_`-G;ms@HKpT6WWVx!A%Tlf)KoGX`Z-c*Om4M|n%~XvY$iP+UQjP+^&> z*P$IsDEy#=3bB4iJB1P|GHhND>vweAE;cV@%qoFczoY$NwB60y#iQ*$t6h|=-_a3c ze3jUGxvbyOE(YaPe8T1hF{=b(J_&@i3u65agl!@zM>(z4uCZ+)>Bk$EqG?5$XN0vp zMBhVFi}!-XmF3W0Nc~0Bv+SW1i=Tn?!}4aYpr473o>Vz`q&~$Nw5<f=ZC3UNMMXgY`;s1}{R6kei)Z6&q^mo)o#JUOJ*=jSs_hVJ84-xxTe6z5U z+cA}m|3h|E4*n52MiuH<9jE5uUy)PQuXJlz?@M%B-CjMTJLxX!Is8lVdFloJ&-x$m zU&(#ca(ywZs1^9P8vnoi3H}pu4=ki_bgBLfXZ5*0q>VnTzt*+% zQC+5E3@*ElGx+Fw#xWrsZ)%ttIsyOA9IG3cdL}_PG!0D?{PWvcriDJ!q?%T`IsU1q zqfW&?Hh0r)O?T5ncgDY>=jtDse1j)G@Ndnp>g&vF=50OEykpPMx7#yqs$OGT*^YXH z?QFZ~65G{YsJGhQcDVio|CM#MK58f0iTWEm)lSo8c7~l{w4G^Z8)FySXH8A}vR!TJ z*>~-`=5z-MHBB6R%o$FMQ^zDZ4V(rh**VQQ&7A2ZIZ39O)7$A|&cgcfcbVqSbIvkz zw)2AX0{%OzUZ|dF9ZCu%nKtTftSYd+%`mJgAjJEKU2nx4oVk- zhVod-<0xN8j;H2&rvFB2CR1|@O9r-r7 zo_vSId;4(RNWRC|Hc@_`@@Db_YDy@7NO=q8t(3QseH&y)0CsS{Y&lfw0c6wz5cL4; zNqw5TyybY*17R;}dQ;q4oxF>jPX2;KEkO)-lQYSC$XVpQKt4!5M6MuLlBkh5B5EYKntX#?L%vCFA~(CcTa3e#?)cCd}%Roh8(u-GaQ8+(FGp;k4Uh*@c?MmK@^h}ed(a-4XoFN)#un<;$ z3wJ5TC})$YWJ|IY*_s?i4kxc7N03*OBgt#YhspWmugC@DugOQqN6E*?-;j@!zaa+5)y0uA^l6qXGyH~1_GM;(UQVHdVR1LiC!Nv zdVR1jiMADTKe9hLh#W#*K@KI+>%%8{eGt7qh+ZE=uMeWv2hr<;==DML`XG9J5WPM) znnbS;c`S)uA2NDAvIE(X{Eb|3ya^?IPD+J&k@6qOm&jEl*2#qH2jnN@ zZpL3q`2gjkB&-DZgq46<;ApZoS(j`=o=u`Zh98z9>5n0!KL%N5q(6o{kQ^kbg}o}8 ziR8VKDyO#`-RUD#Zz=5_YT6AiUI;DekRdXPtU*STHOX2eR=GkbSSDZ{GM2=OSI}U^ z0ua_Zm_Rlp8yol^eUQG5QFCqJrmy!d>%gD>gp=3Hamb{+4fxMBNK;A@7ByT1sk(0@vl2gcA z$f@M5y`-cM$d*<=oxOXiUU&t|s3g*N|_Ln@GI5+B8nyTm|vwDu_2%n_^`K)u?GhdDrl?Bd{BAWnni6 znL^kNA~T(^8$@ObO}l%xHA2)9z>o;K1|}h#-szV z9z?%@#5;~jvO2tI9wqU)G@zh{0rU94X0r}aXHo^_h{25uqPzc zV)9AyDe`G@35jx zh@J|eUZV`_4QKi~eezns+7O?-7O*xXhBfs67X7bdYTqW;)Ab#416|*xexuYiycs8a zpROfz{gB7nLd{lk8)N1T-#7A7@U#CJC}`m;c3s3rtM(CKm!X#_#9h_?P$Xi6BnWl6I#+CLu3?L zgN!C?lC{X%WDHq{j3w)mab!I*fow=NA{@x1i3Pb=E^9#DK*LDnPfBa zEHZ^`PPQP=CR54QjGuiTW-R1b?DKR7cR=Di{EwF$>m2IwFH?}uCA*MasXveGN&mgb zzGOeLKRJjTLS8`*B}bEE$?@d%jBPUI8RY$LN!&<{_r$?v(OB(f=)OrA+LBU_NIXjQb8W8sZ^VSBOz*^xY#e)#`t=0}vflIM}#$n(kW z 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

UbDYh%;BnK&MU7iNZo|0$ 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 a(qWnG4Sv5N5dyCTL0+tI0X2f*W&Z(O?keH{ diff --git a/branding/assets/styles/imports/_branding.scss b/branding/assets/styles/imports/_branding.scss index e4acf1873..75058595d 100644 --- a/branding/assets/styles/imports/_branding.scss +++ b/branding/assets/styles/imports/_branding.scss @@ -2,69 +2,4 @@ * * Here, all SCSS variables and classes can be adapted to your custom design. * -*/ - -@font-face { - font-family: Overpass; - src: url('~@/assets/fonts/Overpass-VariableFont_wght.ttf'); -} - -$color-primary: #6e8b87; -$color-primary-yunite: #a6ff00; -$color-primary-light: #fff; -$color-primary-active: hsla(0,0%,100%,.8); - -$font-family-heading: 'Overpass',Helvetica,Arial,Lucida,sans-serif; -$font-family-text: 'Overpass',Helvetica,Arial,Lucida,sans-serif; - -$color-header-background: $color-primary; -$color-footer-background: $color-primary-yunite; - -$color-locale-menu: $color-primary-yunite; - -.main-navigation a { - color: $color-primary-light; - text-transform: uppercase; - font-size: 16px; - font-weight: 500; -} -.main-navigation a:hover { - color: $color-primary-active; -} -.main-navigation .router-link-exact-active { - color: #A6FF00!important; -} - -.main-navigation .locale-menu { - color: $color-primary-light; -} - -.main-navigation .base-button { - color: $color-primary-light; -} - -#nav-search-box .hc-hashtag a{ - color: #17b53f; -} - -#footer { - background-color: $color-primary-yunite; -} - -#footer a { - color: $color-primary; -} - -.branding-menu .ds-text { - font-family: 'Overpass',Helvetica,Arial,Lucida,sans-serif; - font-weight: 500; - text-transform: uppercase; - font-size: 16px; -} - -.ds-footer { - font-family: 'Overpass',Helvetica,Arial,Lucida,sans-serif; - text-transform: uppercase; - font-size: 16px; - font-weight: 500; - } +*/ \ No newline at end of file diff --git a/branding/constants/donation.js b/branding/constants/donation.js index 12582bcef..3e36ae9a8 100644 --- a/branding/constants/donation.js +++ b/branding/constants/donation.js @@ -1 +1 @@ -export const PROGRESS_BAR_COLOR_TYPE = 'uni' // 'gradient' is the other option +export const PROGRESS_BAR_COLOR_TYPE = 'gradient' // 'uni' is the other option diff --git a/branding/constants/emails.js b/branding/constants/emails.js index d64a9e772..f5bd9a4a6 100644 --- a/branding/constants/emails.js +++ b/branding/constants/emails.js @@ -1,8 +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: 'support@yunite.org', - MODERATION_EMAIL: 'hello@yunite.org', + 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://yunite.org', - SUPPORT_LINK: 'https://yunite.org', + ORGANIZATION_LINK: 'https://ocelot.social', + SUPPORT_LINK: 'https://ocelot.social', } diff --git a/branding/constants/groups.js b/branding/constants/groups.js index f54a3bc08..1c49d3ff3 100644 --- a/branding/constants/groups.js +++ b/branding/constants/groups.js @@ -2,4 +2,4 @@ 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 = false +export const SHOW_GROUP_BUTTON_IN_HEADER = true diff --git a/branding/constants/headerMenu.js b/branding/constants/headerMenu.js index 7bd827e54..aa87a598c 100644 --- a/branding/constants/headerMenu.js +++ b/branding/constants/headerMenu.js @@ -1,22 +1,13 @@ export default { MENU: [ - { - nameIdent: 'yuniteRebranding.header.newsFeed', - path: '/', - }, - { - nameIdent: 'yuniteRebranding.header.groups', - path: '/groups', - }, - { - nameIdent: 'yuniteRebranding.header.topics', - url: 'https://yunite.org/themen/', - target: '', - }, - { - nameIdent: 'yuniteRebranding.header.about', - url: 'https://yunite.org', - target: '', - }, + // { + // nameIdent: 'nameIdent', + // path: '/', + // }, + // { + // nameIdent: 'nameIdent', + // url: 'https://ocelot.social', + // target: '_blank', + // }, ], } diff --git a/branding/constants/links.js b/branding/constants/links.js index 04d68300b..7efac159f 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -5,8 +5,8 @@ import { defaultPageParamsPages } from '~/components/utils/InternalPages.js' const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ // if defined it's dominating externalLink: { - url: 'https://yunite.org', - target: '', + url: 'https://ocelot.social', + target: '_blank', }, internalPage: { @@ -16,14 +16,15 @@ const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({ hasContainer: true, hasBaseCard: true, hasLoginInHeader: true, - // in case internal page content is here 'webapp/locales/html/' + // in case internal page content is here 'branding/locales/html/' }, }) const DONATE = defaultPageParamsPages.DONATE.overwrite({ // if defined it's dominating externalLink: { - url: 'https://yunite.org/spenden/', - target: '', + // 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: { @@ -39,12 +40,13 @@ const DONATE = defaultPageParamsPages.DONATE.overwrite({ const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({ // if defined it's dominating externalLink: { - url: 'https://yunite.org/impressum/', - target: '', + // 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: 'yuniteRebranding.footer.imprint', // localized string identifier, if undefined default is used + // 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, @@ -67,11 +69,7 @@ const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwri }, }) const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ - // if defined it's dominating - externalLink: { - url: 'https://yunite.org/ueber-yunite/unsere-werte/', - target: '', - }, + // externalLink: null, // if defined it's dominating internalPage: { // footerIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used @@ -84,14 +82,10 @@ const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({ }, }) const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ - // if defined it's dominating - externalLink: { - url: 'https://yunite.org/datenschutz/', - target: '', - }, + // externalLink: null, // if defined it's dominating internalPage: { - footerIdent: 'yuniteRebranding.footer.dataPrivacy', // localized string identifier, if undefined default is used + // 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, @@ -101,11 +95,7 @@ const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({ }, }) const FAQ = defaultPageParamsPages.FAQ.overwrite({ - // if defined it's dominating - externalLink: { - url: 'https://yunite.org/ueber-yunite/faq-hilfe/', - target: '', - }, + // externalLink: null, // if defined it's dominating internalPage: { // footerIdent: 'site.faq', // localized string identifier, if undefined default is used @@ -120,8 +110,8 @@ const FAQ = defaultPageParamsPages.FAQ.overwrite({ const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({ // if defined it's dominating externalLink: { - url: 'https://yunite.org/ueber-yunite/faq-hilfe/', - target: '', + url: 'https://ocelot.social', + target: '_blank', }, internalPage: { @@ -150,13 +140,13 @@ export default { SUPPORT, FOOTER_LINK_LIST: [ - // ORGANIZATION, - // TERMS_AND_CONDITIONS, - // CODE_OF_CONDUCT, + ORGANIZATION, + TERMS_AND_CONDITIONS, + CODE_OF_CONDUCT, DATA_PRIVACY, - // FAQ, - // DONATE, - // SUPPORT, + FAQ, + DONATE, IMPRINT, + SUPPORT, ], -} \ No newline at end of file +} diff --git a/branding/constants/logos.js b/branding/constants/logos.js index 45e7831af..714e78a2c 100644 --- a/branding/constants/logos.js +++ b/branding/constants/logos.js @@ -2,13 +2,19 @@ // this are the paths in the webapp export default { LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', - LOGO_HEADER_WIDTH: '47px', + LOGO_HEADER_WIDTH: '130px', LOGO_HEADER_CLICK: { - externalLink: { - url: 'https://yunite.org', - target: '', + // externalLink: { + // url: 'https://ocelot.social', + // target: '_blank', + // }, + externalLink: null, + internalPath: { + to: { + name: 'index', + }, + scrollTo: '.main-navigation', }, - internalPath: null, }, LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 62162bd94..3d09066d5 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,9 +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: 'yunite.me', - APPLICATION_SHORT_NAME: 'yunite.me', - APPLICATION_DESCRIPTION: 'yunite.me – Alternatives Netzwerk für eine freie und bunte Zukunft', - COOKIE_NAME: 'yunite-me-token', - ORGANIZATION_NAME: 'yunite – Verein für Vernetzung und Kooperation', - ORGANIZATION_JURISDICTION: 'Switzerland', + 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/branding/locales/de.json b/branding/locales/de.json index e23567e69..2c63c0851 100644 --- a/branding/locales/de.json +++ b/branding/locales/de.json @@ -1,14 +1,2 @@ { - "yuniteRebranding": { - "header": { - "about": "Über Yunite", - "groups": "Gruppen", - "newsFeed": "Beiträge", - "topics": "Themen" - }, - "footer": { - "dataPrivacy": "Datenschutz", - "imprint": "Impressum" - } - } } diff --git a/branding/locales/en.json b/branding/locales/en.json index 6d91e173c..2c63c0851 100644 --- a/branding/locales/en.json +++ b/branding/locales/en.json @@ -1,14 +1,2 @@ { - "yuniteRebranding": { - "header": { - "about": "About Yunite", - "groups": "Groups", - "newsFeed": "News Feed", - "topics": "Topics" - }, - "footer": { - "dataPrivacy": "Data privacy", - "imprint": "Imprint" - } - } } diff --git a/branding/static/favicon.ico b/branding/static/favicon.ico index 0f8dc3ea6fe96277c031128c682cfdcbe9d67a60..430cef437289d45eaceaa1d096a3674fccbf62cc 100644 GIT binary patch literal 5558 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 literal 5558 zcmds5X=oi)6rL<%^;gnG1%DV7Bxn^}sy`H$KWbG3e~1>5RuDC7+t?&+>e7;zzASAP zu}N(bmtri1wxP}P-po^DQ&3!fsI4GM!3CwbRuHVz_Zk`!9x!mcsUGU>vr@{t+~7$-837gh%8#$2H1O7CQ4CGO-A@YAs2f zaIuKv5DS#dAkJ~k_(dJ+!p2;NB(4MQQA^%~%~S?fCU(&O)KOj7fUSInB<=&|PwqPh z+2$PI*H2+`+#}k8%_u|cm5~1vv4dW)&7!GnhfXN}r#h{aJ?Fz><@6PA^@mVK{No?L5_LN&o z&K17aEnu2^OyfbHB9JYMe?KT&yVpx=do8F&w)E6V$sfberQIktD5G}??#<*A`Q#qY z$c@JaWP7|y;vKb0y$*vG%S6k?-*Q zDS%A&cQ?83)gQ%=Qhyy;_UnFW?p&wmjyZqLSFbCP=UHs-S|>|>I{^G#IgnX@quf6! zxdrzf-?bI{9mBpa1r~`pz`5;MTk&~+jy(vtf7}@4xPKjae7Hr=9rJHP|3%}>xJm z#n6lL=NYW{h(@(z+*1gkcp)@!=2DU5Bv_!=cGsEImb1~1P!svQCp5#as;xD6yUpy zwTMLCtvk8~8OZvFi+kMPZ=QE%3^lt!iTv!{&AMSzcGeF`z%SaKtuIAW<8s#rFDsGv zueq|&;gCZYV-58;{ca*=-9VGn4K_(SJ~31lI@GlvaAP%#O)Tm(?rPNjuQ<(rBgdFh z*RDDH`_`7yQ^VTJv!4&{;dx(DH%LDvHyj_-o`8Kpa1TDCAK-sVR*l3ZhMtD>XkZU* z{LhS^t^MwEJ2%Lh12IsuY~ER)(F6P9r+eVvKS!?kZb-Uf6>|GWy-Hp9Jt4h^l#5Osl*@kDE5&EVmB=r{ez@m>Ii8Wf h)aP*XnCHj)jfycQnY%8_`Ef0{f9HCB{Wc=<{{nFHQI7xs diff --git a/branding/static/icon.png b/branding/static/icon.png index 8a3da6f6014ab8e257a8b5d3a88618216e7eab3b..1c81fa5fca1a415323627f025eb8a68fbc2a6b79 100644 GIT binary patch delta 20512 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 - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branding/static/img/custom/logo-squared.svg b/branding/static/img/custom/logo-squared.svg index 6c12acd28..15f420c79 100644 --- a/branding/static/img/custom/logo-squared.svg +++ b/branding/static/img/custom/logo-squared.svg @@ -1,15 +1,82 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deployment/kubernetes/.gitignore b/deployment/kubernetes/.gitignore index 3bcb187b9..e0473b0fd 100644 --- a/deployment/kubernetes/.gitignore +++ b/deployment/kubernetes/.gitignore @@ -1,5 +1,3 @@ /dns.values.yaml -/dns.values*-ME.yaml /nginx.values.yaml /values.yaml -/values*-ME.yaml \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 519c9a9e8..535d485be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -87,7 +87,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-branded:latest + image: ocelotsocialnetwork/neo4j-community-branded:local-production networks: - test-network volumes: diff --git a/package.json b/package.json index d970d4954..b5dbca69e 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "yunite.me", + "name": "ocelot-social-branded", "version": "2.2.0", "ocelotDockerVersionTag": "2.3.0-281", - "dockerOrganisation": "tirokk", - "description": "yunite.me – Alternatives Netzwerk für eine freie und bunte Zukunft", - "author": "yunite – Verein für Vernetzung und Kooperation", + "dockerOrganisation": "ocelotsocialnetwork", + "description": "ocelot.social Branded", + "author": "ocelot.social Community", "license": "MIT", "private": false, "repository": { "type": "git", - "url": "https://github.com/Yunite-Net/Yunite-Net-Ocelot-Social-Deploy-Rebranding" + "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding.git" } } From 6aead3f75e46948e2a3c20fbe43e94d8033767e9 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 20:22:16 +0100 Subject: [PATCH 279/344] refactor(webapp): jest to latest and vue test utils to latest --- webapp/jest.config.js | 1 + webapp/package.json | 5 +- webapp/yarn.lock | 2040 ++++++++++++++++++++++++----------------- 3 files changed, 1209 insertions(+), 837 deletions(-) diff --git a/webapp/jest.config.js b/webapp/jest.config.js index 9980c319c..eecaaa92c 100644 --- a/webapp/jest.config.js +++ b/webapp/jest.config.js @@ -30,4 +30,5 @@ module.exports = { '^~/(.*)$': '/$1', }, moduleFileExtensions: ['js', 'json', 'vue'], + testEnvironment: 'jsdom', } diff --git a/webapp/package.json b/webapp/package.json index bc3577400..dd64c0de0 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -77,7 +77,7 @@ "@vue/cli-shared-utils": "~4.3.1", "@vue/eslint-config-prettier": "~6.0.0", "@vue/server-test-utils": "~1.0.0-beta.31", - "@vue/test-utils": "~1.0.0-beta.31", + "@vue/test-utils": "1.3.4", "async-validator": "^3.2.4", "babel-core": "~7.0.0-bridge.0", "babel-eslint": "~10.1.0", @@ -100,7 +100,8 @@ "eslint-plugin-vue": "~6.2.2", "flush-promises": "^1.0.2", "identity-obj-proxy": "^3.0.0", - "jest": "~26.6.3", + "jest": "29.4", + "jest-environment-jsdom": "^29.4.2", "mutation-observer": "^1.0.3", "prettier": "~2.7.1", "sass-loader": "~10.1.1", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 9d5b415cc..e6974eb5d 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -102,6 +102,13 @@ dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" @@ -109,13 +116,6 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" @@ -200,7 +200,7 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.16.7": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== @@ -258,6 +258,15 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.7.2": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -640,6 +649,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" @@ -890,6 +904,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== +"@babel/parser@^7.14.7", "@babel/parser@^7.20.13": + 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.16.4", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" @@ -1274,6 +1293,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": 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" @@ -1386,6 +1412,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" @@ -2212,7 +2245,7 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6": +"@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== @@ -2258,6 +2291,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.7.2": + 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/types@7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" @@ -2627,144 +2676,164 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@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/types" "^26.6.2" + "@jest/types" "^29.4.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^29.4.2" + jest-util "^29.4.2" slash "^3.0.0" -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@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" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@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 "^4.0.0" + ci-info "^3.2.0" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.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@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@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" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^29.4.2" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@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" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + jest-get-type "^29.4.2" + +"@jest/expect@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.2.tgz#2d4a6a41b29380957c5094de19259f87f194578b" + integrity sha512-NUAeZVApzyaeLjfWIV/64zXjA2SS+NuUPHpAlO7IwVMGd5Vf9szTl9KEDlxY3B4liwLO31os88tYNHl6cpjtKQ== + dependencies: + expect "^29.4.2" + jest-snapshot "^29.4.2" + +"@jest/fake-timers@^29.4.2": + version "29.4.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.2.tgz#af43ee1a5720b987d0348f80df98f2cb17d45cd0" + integrity sha512-Ny1u0Wg6kCsHFWq7A/rW/tMhIedq2siiyHyLpHCmIhP7WmcAmd2cx95P+0xtTZlj5ZbJxIRQi4OPydZZUoiSQQ== + dependencies: + "@jest/types" "^29.4.2" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^29.4.2" + jest-mock "^29.4.2" + jest-util "^29.4.2" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@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" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^29.4.2" + "@jest/expect" "^29.4.2" + "@jest/types" "^29.4.2" + jest-mock "^29.4.2" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@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" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@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" - graceful-fs "^4.2.4" + glob "^7.1.3" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + 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 "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + 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 "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@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.4" - source-map "^0.6.0" + graceful-fs "^4.2.9" -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@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" "^26.6.2" - "@jest/types" "^26.6.2" + "@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@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== +"@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" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" + "@jest/test-result" "^29.4.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + slash "^3.0.0" "@jest/transform@^25.3.0": version "25.3.0" @@ -2788,26 +2857,26 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== +"@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" "^26.6.2" - babel-plugin-istanbul "^6.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 "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" + 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.3.0": version "25.3.0" @@ -2819,15 +2888,16 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@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" "^3.0.0" "@types/node" "*" - "@types/yargs" "^15.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" "@jridgewell/gen-mapping@^0.1.0": @@ -2862,7 +2932,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.9": +"@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== @@ -3750,24 +3820,29 @@ dependencies: "@sentry/cli" "^1.49.0" +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + "@sindresorhus/is@^4.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@sinonjs/commons@^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@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@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" "^1.7.0" + "@sinonjs/commons" "^2.0.0" "@storybook/addon-a11y@^6.3.6": version "6.3.6" @@ -4735,6 +4810,11 @@ dependencies: defer-to-connect "^2.0.0" +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" @@ -4742,13 +4822,13 @@ dependencies: "@types/node" "*" -"@types/babel__core@^7.0.0": - version "7.1.12" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" - integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== +"@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" "*" @@ -4786,13 +4866,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/babel__traverse@^7.0.4": - version "7.0.16" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.16.tgz#0bbbf70c7bc4193210dd27e252c51260a37cd6a7" - integrity sha512-S63Dt4CZOkuTmpLGGWtT/mQdVORJOpx6SZWGVaP56dda/0Nx5nEe82K7/LAm8zYr6SfMq+1N2OreIOrHAx656w== - dependencies: - "@babel/types" "^7.3.0" - "@types/body-parser@*", "@types/body-parser@1.19.0": version "1.19.0" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" @@ -4930,10 +5003,10 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/graceful-fs@^4.1.2": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.4.tgz#4ff9f641a7c6d1a3508ff88bc3141b152772e753" - integrity sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg== +"@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" "*" @@ -5011,6 +5084,15 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" @@ -5166,10 +5248,10 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== -"@types/prettier@^2.0.0": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.5.tgz#b6ab3bba29e16b821d84e09ecfaded462b816b00" - integrity sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ== +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/pretty-hrtime@^1.0.0": version "1.0.1" @@ -5297,6 +5379,11 @@ resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + "@types/uglify-js@*": version "3.13.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" @@ -5354,6 +5441,13 @@ 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" "*" + "@types/zen-observable@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" @@ -5613,10 +5707,10 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== -"@vue/test-utils@~1.0.0-beta.31": - version "1.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.0.0-beta.32.tgz#38c3947886236201a3f24b583c73598eb95ccc69" - integrity sha512-ywhe7PATMAk/ZGdsrcuQIliQusOyfe0OOHjKKCCERqgHh1g/kqPtmSMT5Jx4sErx53SYbNucr8QOK6/u5ianAw== +"@vue/test-utils@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.3.4.tgz#83a68179178cb3da4b2b7c5c59ac660dbdff8ef5" + integrity sha512-yh2sbosCxk5FfwjXYXdY9rUffaJqYEFjsod5sCD4oosRn2x8LfBLEzQH0scdo5n7z8VkBUThpYzbkI6DVAWimA== dependencies: dom-event-types "^1.0.0" lodash "^4.17.15" @@ -5797,12 +5891,12 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== -abab@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: +abbrev@1, 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== @@ -5828,13 +5922,13 @@ acorn-globals@^4.1.0: 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== +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 "^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" @@ -5851,6 +5945,11 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^5.5.3: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" @@ -5876,6 +5975,11 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^8.1.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + address@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -5891,6 +5995,13 @@ agent-base@5: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -6040,6 +6151,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -6067,6 +6183,11 @@ ansi-styles@^4.1.0: "@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== + ansi-to-html@^0.6.11: version "0.6.11" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.11.tgz#5093fc4962186c0e9343dec572a4f71abdc93439" @@ -6971,18 +7092,17 @@ babel-helper-vue-jsx-merge-props@^2.0.2: resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== +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" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" + "@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.4" + graceful-fs "^4.2.9" slash "^3.0.0" babel-jest@~25.3.0: @@ -7114,6 +7234,17 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + babel-plugin-jest-hoist@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909" @@ -7121,14 +7252,14 @@ babel-plugin-jest-hoist@^25.2.6: dependencies: "@types/babel__traverse" "^7.0.6" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +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.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-plugin-jsx-event-modifiers@^2.0.2: @@ -7290,12 +7421,12 @@ babel-preset-jest@^25.3.0: babel-plugin-jest-hoist "^25.2.6" babel-preset-current-node-syntax "^0.1.2" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +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 "^26.6.2" + babel-plugin-jest-hoist "^29.4.2" babel-preset-current-node-syntax "^1.0.0" babel-preset-vue@~2.0.2: @@ -7376,9 +7507,9 @@ bail@^1.0.0: integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-64@^0.1.0: version "0.1.0" @@ -7533,6 +7664,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" @@ -7549,7 +7687,7 @@ 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.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -7566,11 +7704,6 @@ browser-process-hrtime@^0.1.2: 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== - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -7936,10 +8069,10 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== can-use-dom@^0.1.0: version "0.1.0" @@ -8234,6 +8367,11 @@ 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== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -8242,10 +8380,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +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" @@ -8413,14 +8551,14 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.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-deep@^4.0.1: version "4.0.1" @@ -8559,12 +8697,12 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: +commander@^2.18.0, commander@^2.20.0, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== -commander@^2.20.3, commander@^2.9.0: +commander@^2.19.0, commander@^2.20.3, commander@^2.9.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -8627,7 +8765,7 @@ compute-scroll-into-view@^1.0.17: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.0: version "1.6.2" @@ -8642,16 +8780,16 @@ concat-stream@^1.5.0: condense-newlines@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" - integrity sha1-PemFVTE5R10yUCyDsC9gaE0kxV8= + integrity sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg== dependencies: extend-shallow "^2.0.1" is-whitespace "^0.3.0" kind-of "^3.0.2" -config-chain@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== +config-chain@^1.1.12, config-chain@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -8754,6 +8892,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, dependencies: safe-buffer "~5.1.1" +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" @@ -9029,7 +9172,7 @@ cross-fetch@^3.0.4: node-fetch "2.6.0" whatwg-fetch "3.0.0" -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1: +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -9339,10 +9482,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== -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" @@ -9356,7 +9499,7 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" -cssstyle@^2.2.0: +cssstyle@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== @@ -9394,14 +9537,14 @@ data-urls@^1.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== +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.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" @@ -9464,10 +9607,10 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== +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" @@ -9481,6 +9624,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-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -9645,10 +9793,10 @@ dicer@0.3.0: dependencies: streamsearch "0.1.2" -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +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" @@ -9713,9 +9861,9 @@ dom-converter@^0.2: utila "~0.4" dom-event-types@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae" - integrity sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.1.0.tgz#120c1f92ddea7758db1ccee0a100a33c39f4701b" + integrity sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ== dom-serializer@0, dom-serializer@~0.1.1: version "0.1.1" @@ -9761,12 +9909,12 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" -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" @@ -9990,10 +10138,10 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== +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" @@ -10080,6 +10228,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + env-ci@3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-3.2.2.tgz#06936f1fcfbc999102a2211fc2539df64062b61f" @@ -10246,18 +10399,6 @@ escape-string-regexp@2.0.0, escape-string-regexp@^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.14.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escodegen@^1.9.1: version "1.11.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" @@ -10270,6 +10411,18 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^6.0.0, eslint-config-prettier@~6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -10506,6 +10659,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -10606,19 +10764,19 @@ execa@^3.2.0, execa@^3.4.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== +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" - 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: @@ -10639,17 +10797,16 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== +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" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" + "@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.16.3, express@^4.17.1, express@~4.17.1: version "4.17.1" @@ -10690,7 +10847,7 @@ express@^4.16.3, express@^4.17.1, 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" @@ -10822,7 +10979,7 @@ fast-json-parse@^1.0.0: resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.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== @@ -11179,6 +11336,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" @@ -11318,7 +11484,7 @@ fs-write-stream-atomic@^1.0.8: 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" @@ -11333,7 +11499,7 @@ fsevents@^2.1.2, fsevents@~2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== -fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -11421,7 +11587,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.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== @@ -11475,7 +11641,7 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-stream@^6.0.1: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -11591,7 +11757,7 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -11603,6 +11769,29 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -11780,10 +11969,10 @@ graceful-fs@^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.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== graphql-anywhere@^4.1.0-alpha.0: version "4.2.1" @@ -11857,11 +12046,6 @@ grid-index@^1.1.0: resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== -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= - gud@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" @@ -12225,12 +12409,12 @@ html-encoding-sniffer@^1.0.2: 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== +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.5" + whatwg-encoding "^2.0.0" html-entities@^1.2.0: version "1.2.1" @@ -12391,6 +12575,15 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-proxy-middleware@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" @@ -12448,11 +12641,24 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + hyperlinker@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" @@ -12465,6 +12671,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -12623,7 +12836,7 @@ inflected@^2.0.3: 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" @@ -12716,11 +12929,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -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@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -12848,13 +13056,6 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - is-core-module@^2.2.0: version "2.5.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" @@ -12862,6 +13063,13 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -13107,10 +13315,10 @@ is-plain-object@^3.0.0: dependencies: isobject "^4.0.0" -is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-promise@^2.0.0: version "2.2.2" @@ -13220,7 +13428,7 @@ is-whitespace-character@^1.0.0: is-whitespace@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" - integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38= + integrity sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== is-window@^1.0.2: version "1.0.2" @@ -13242,7 +13450,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1, is-wsl@^2.2.0: +is-wsl@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -13294,6 +13502,11 @@ istanbul-lib-coverage@^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.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" @@ -13307,14 +13520,15 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== +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/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: @@ -13335,10 +13549,10 @@ istanbul-lib-source-maps@^4.0.0: 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" @@ -13368,115 +13582,143 @@ javascript-detect-element-resize@^0.5.3: resolved "https://registry.yarnpkg.com/javascript-detect-element-resize/-/javascript-detect-element-resize-0.5.3.tgz#1a71cd51dfe565907f299012fe73a294104025de" integrity sha1-GnHNUd/lZZB/KZAS/nOilBBAJd4= -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== +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" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" + execa "^5.0.0" + p-limit "^3.1.0" -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== +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" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@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.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^29.4.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^17.3.1" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +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" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@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" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" + 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@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== +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 "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + diff-sequences "^29.4.2" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== +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@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +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" "^26.6.2" + "@jest/types" "^29.4.2" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" + jest-get-type "^29.4.2" + jest-util "^29.4.2" + pretty-format "^29.4.2" -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== +jest-environment-jsdom@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.4.2.tgz#0cf95ad846949280dd58bc91a9ca463b6b232dd8" + integrity sha512-v1sH4Q0JGM+LPEGqHNM+m+uTMf3vpXpKiuDYqWUAh+0c9+nc7scGE+qTR5JuE+OOTDnwfzPgcv9sMq6zWAOaVg== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^29.4.2" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" + jest-mock "^29.4.2" + jest-util "^29.4.2" + jsdom "^20.0.0" -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== +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" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^29.4.2" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^29.4.2" + jest-util "^29.4.2" -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +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.3.0: version "25.3.0" @@ -13497,91 +13739,66 @@ jest-haste-map@^25.3.0: optionalDependencies: fsevents "^2.1.2" -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== +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" "^26.6.2" - "@types/graceful-fs" "^4.1.2" + "@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.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" + 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@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== +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" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== +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: chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-diff "^29.4.2" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^29.4.2: + version "29.4.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.2.tgz#309a2924eae6ca67cf7f25781a2af1902deee717" + integrity sha512-SElcuN4s6PNKpOEtTInjOAA8QvItu0iugkXqhYyguRvQoXapg5gN+9RQxLAkakChZA7Y26j6yUCsFWN+hlKD6g== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.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.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.2" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +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" "^26.6.2" + "@jest/types" "^29.4.2" "@types/node" "*" + jest-util "^29.4.2" jest-pnp-resolver@^1.2.2: version "1.2.2" @@ -13593,127 +13810,124 @@ jest-regex-util@^25.2.6: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +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-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== +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" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" + jest-regex-util "^29.4.2" + jest-snapshot "^29.4.2" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +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/types" "^26.6.2" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^29.4.2" + jest-validate "^29.4.2" + resolve "^1.20.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== +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" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@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.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.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@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== +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/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + "@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 "^0.6.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.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + 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.4.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-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== +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: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@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 "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + 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 "^26.6.2" - semver "^7.3.2" + pretty-format "^29.4.2" + semver "^7.3.5" jest-util@^25.3.0: version "25.3.0" @@ -13725,41 +13939,42 @@ jest-util@^25.3.0: is-ci "^2.0.0" make-dir "^3.0.0" -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== +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" "^26.6.2" + "@jest/types" "^29.4.2" "@types/node" "*" chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +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" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^29.4.2" + camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^26.3.0" + jest-get-type "^29.4.2" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^29.4.2" -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +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" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + emittery "^0.13.1" + jest-util "^29.4.2" string-length "^4.0.1" jest-worker@^25.1.0: @@ -13778,7 +13993,7 @@ jest-worker@^25.2.6: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^26.5.0, jest-worker@^26.6.2: +jest-worker@^26.5.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -13787,14 +14002,25 @@ jest-worker@^26.5.0, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@~26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== +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" "^26.6.3" + "@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 "^26.6.3" + jest-cli "^29.4.2" jimp-compact@^0.8.0: version "0.8.4" @@ -13802,15 +14028,14 @@ jimp-compact@^0.8.0: integrity sha512-9mvZ7/TJ28bWtdx0RxmfiOTzSom4zuRniFTLtJHfNL6HxQdnRtjmX8XIRjmofgVXj2TW/GgSuZKB3dSZ5hNhKg== js-beautify@^1.6.12: - version "1.10.2" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" - integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== + version "1.14.7" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.7.tgz#9206296de33f86dc106d3e50a35b7cf8729703b2" + integrity sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A== dependencies: - config-chain "^1.1.12" + config-chain "^1.1.13" editorconfig "^0.15.3" - glob "^7.1.3" - mkdirp "~0.5.1" - nopt "~4.0.1" + glob "^8.0.3" + nopt "^6.0.0" js-beautify@^1.6.14: version "1.10.0" @@ -13924,37 +14149,37 @@ jsdom@^11.5.1: ws "^5.2.0" xml-name-validator "^3.0.0" -jsdom@^16.4.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: - abab "^2.0.3" - acorn "^7.1.1" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.2.0" - data-urls "^2.0.0" - decimal.js "^10.2.0" - domexception "^2.0.1" - escodegen "^1.14.1" - html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" - nwsapi "^2.2.0" - parse5 "5.1.1" - request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" - 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.0.0" - ws "^7.2.3" - 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" @@ -13976,6 +14201,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -14695,6 +14925,13 @@ make-error@^1, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -14962,6 +15199,14 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -15063,13 +15308,27 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -15095,9 +15354,9 @@ minimist@^1.1.1, minimist@^1.2.0: 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== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minimist@^1.2.6: version "1.2.7" @@ -15186,7 +15445,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== @@ -15198,6 +15457,13 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + moment@2.24.0, moment@^2.18.1, moment@^2.22.1, moment@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" @@ -15426,18 +15692,6 @@ node-modules-regexp@^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@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - node-object-hash@^1.2.0: version "1.4.2" resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.2.tgz#385833d85b229902b75826224f6077be969a9e94" @@ -15503,7 +15757,7 @@ nodemon@^1.19.4: undefsafe "^2.0.2" update-notifier "^2.5.0" -nopt@^4.0.1, nopt@~4.0.1: +nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= @@ -15511,6 +15765,13 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -15518,6 +15779,14 @@ nopt@~1.0.10: dependencies: abbrev "1" +nopt@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -15599,6 +15868,13 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -15656,10 +15932,10 @@ nwsapi@^2.0.7: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== -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" @@ -15828,6 +16104,13 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + open@^6.3.0: version "6.4.0" resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" @@ -15905,7 +16188,7 @@ os-browserify@^0.3.0: os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-locale@^1.4.0: version "1.4.0" @@ -15917,7 +16200,7 @@ os-locale@^1.4.0: os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== osenv@^0.1.4: version "0.1.5" @@ -15944,11 +16227,6 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -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-event@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" @@ -15994,7 +16272,7 @@ p-limit@^2.2.2: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +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== @@ -16172,16 +16450,21 @@ parse-json@^5.0.0: json-parse-better-errors "^1.0.1" lines-and-columns "^1.1.6" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -16194,6 +16477,13 @@ parse5@^6.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -16265,7 +16555,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" @@ -16287,6 +16577,11 @@ path-parse@^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.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -16364,7 +16659,7 @@ picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== -picomatch@^2.2.2: +picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -16421,6 +16716,11 @@ pirates@^4.0.0, pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -17289,15 +17589,14 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" -pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== +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" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" + "@jest/schemas" "^29.4.2" + ansi-styles "^5.0.0" + react-is "^18.0.0" pretty-hrtime@^1.0.3: version "1.0.3" @@ -17312,7 +17611,7 @@ pretty-time@^1.1.0: pretty@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" - integrity sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU= + integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== dependencies: condense-newlines "^0.2.1" extend-shallow "^2.0.1" @@ -17567,7 +17866,7 @@ prosemirror-view@1.14.6, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prose proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== protocol-buffers-schema@^3.3.1: version "3.6.0" @@ -17595,13 +17894,18 @@ prr@~1.0.1: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28: version "1.1.31" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + pstree.remy@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" @@ -17810,6 +18114,11 @@ querystring@0.2.0, querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + quick-format-unescaped@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-1.1.2.tgz#0ca581de3174becef25ac3c2e8956342381db698" @@ -18032,16 +18341,16 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== - react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -18643,11 +18952,6 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -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== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -18697,6 +19001,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== + resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" @@ -18712,13 +19021,14 @@ resolve@^1.14.2, resolve@^1.15.1, resolve@^1.19.0: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.18.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve@^1.20.0: + 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.1.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^2.0.0: version "2.0.1" @@ -18787,13 +19097,6 @@ rimraf@^2.7.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" @@ -18879,7 +19182,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -18932,10 +19235,10 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.0: - 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" @@ -19032,6 +19335,13 @@ semver@^7.3.4: dependencies: lru-cache "^6.0.0" +semver@^7.3.5: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -19222,11 +19532,6 @@ shelljs@0.7.7: interpret "^1.0.0" rechoir "^0.6.2" -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== - side-channel@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" @@ -19247,13 +19552,18 @@ side-channel@^1.0.4: sigmund@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== 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= +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -19387,6 +19697,14 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@0.5.13, source-map-support@~0.5.12: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.16, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -19403,14 +19721,6 @@ source-map-support@^0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.12: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -19543,7 +19853,7 @@ stack-trace@0.0.10: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= -stack-utils@^2.0.2, stack-utils@^2.0.3: +stack-utils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== @@ -19744,6 +20054,15 @@ string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + "string.prototype.matchall@^4.0.0 || ^3.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" @@ -19848,6 +20167,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -19897,6 +20223,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== + style-loader@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -19996,6 +20327,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" @@ -20004,13 +20342,10 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.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== - 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== svg-tags@^1.0.0: version "1.0.0" @@ -20194,14 +20529,6 @@ term-size@^2.1.0: resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2" integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg== -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" - terser-webpack-plugin@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" @@ -20306,11 +20633,6 @@ thread-loader@^2.1.3: loader-utils "^1.1.0" neo-async "^2.6.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== - throttle-debounce@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" @@ -20452,6 +20774,11 @@ tmp@^0.1.0: dependencies: rimraf "^2.6.3" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -20539,14 +20866,15 @@ tough-cookie@^2.3.3, tough-cookie@^2.3.4, 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== +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: - ip-regex "^2.1.0" - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^1.0.1: version "1.0.1" @@ -20555,10 +20883,10 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +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" @@ -21012,6 +21340,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" @@ -21162,6 +21495,14 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -21269,7 +21610,7 @@ uuid@^3.1.0, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.0: +uuid@^8.0.0: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -21296,14 +21637,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@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz#b4fe00e35649ef7785a9b7fcebcea05f37c332fc" - integrity sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA== +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" validate-color@^2.1.0: version "2.1.1" @@ -21683,24 +22024,17 @@ w3c-hr-time@^1.0.1: 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-keyname@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.1.tgz#c4fe1a4b9e303c95e833b3d854b7d81070400db9" integrity sha512-j5k4xGK6k8TCna/08778KUEL98WvTogiG/TN/YStl8GNeXg5tI3Dvq3+JjwJhP4l7ogs6KWo1VYEdc1Qaioy3Q== -w3c-xmlserializer@^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== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: - xml-name-validator "^3.0.0" + xml-name-validator "^4.0.0" walker@^1.0.7, walker@~1.0.5: version "1.0.7" @@ -21709,6 +22043,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" @@ -21758,15 +22099,10 @@ webidl-conversions@^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== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-bundle-analyzer@^3.6.1: version "3.6.1" @@ -21927,23 +22263,43 @@ webpackbar@^4.0.0: text-table "^0.2.0" wrap-ansi "^6.0.0" -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" @@ -21962,25 +22318,11 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" - integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^6.1.0" - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which-module@^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= - which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -22093,10 +22435,19 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^2.0.0: version "2.4.2" @@ -22126,6 +22477,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + write-json-file@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" @@ -22159,10 +22518,10 @@ ws@^6.0.0: dependencies: async-limiter "~1.0.0" -ws@^7.2.3: - version "7.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" - integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== +ws@^8.11.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== xdg-basedir@^3.0.0: version "3.0.0" @@ -22174,6 +22533,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -22221,10 +22585,15 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.0: version "3.0.3" @@ -22253,7 +22622,7 @@ yaml@^1.7.2: dependencies: "@babel/runtime" "^7.6.3" -yargs-parser@^18.1.2, yargs-parser@^18.1.3: +yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -22261,6 +22630,11 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -22287,22 +22661,18 @@ yargs@6.6.0: y18n "^3.2.1" yargs-parser "^4.2.0" -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== +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.2" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" yargs@~1.2.6: version "1.2.6" From b2be8a301e90a3f2f489a1e4e7466ba9fdfbe20b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 20:29:16 +0100 Subject: [PATCH 280/344] first pages test working --- webapp/pages/admin.spec.js | 9 ++++++--- webapp/pages/group/_id/_slug.spec.js | 16 ++++++++++------ webapp/pages/index.spec.js | 15 +++++++++------ webapp/pages/post/_id/_slug/index.spec.js | 15 +++++++-------- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/webapp/pages/admin.spec.js b/webapp/pages/admin.spec.js index fc3849fc4..aa6eceab1 100644 --- a/webapp/pages/admin.spec.js +++ b/webapp/pages/admin.spec.js @@ -1,7 +1,9 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import admin from './admin.vue' -config.stubs['nuxt-child'] = '' +const stubs = { + 'nuxt-child': true, +} const localVue = global.localVue @@ -20,6 +22,7 @@ describe('admin.vue', () => { return mount(admin, { mocks, localVue, + stubs, }) } @@ -28,7 +31,7 @@ describe('admin.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) }) }) diff --git a/webapp/pages/group/_id/_slug.spec.js b/webapp/pages/group/_id/_slug.spec.js index 963952f5e..bb9279bce 100644 --- a/webapp/pages/group/_id/_slug.spec.js +++ b/webapp/pages/group/_id/_slug.spec.js @@ -1,15 +1,18 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import GroupProfileSlug 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, + 'router-link': true, + 'infinite-loading': true, + 'follow-list': true, +} describe('GroupProfileSlug', () => { let wrapper @@ -201,6 +204,7 @@ describe('GroupProfileSlug', () => { mocks, localVue, data, + stubs, }) } diff --git a/webapp/pages/index.spec.js b/webapp/pages/index.spec.js index 43400986c..47011f137 100644 --- a/webapp/pages/index.spec.js +++ b/webapp/pages/index.spec.js @@ -1,14 +1,16 @@ -import { config, shallowMount, mount } from '@vue/test-utils' +import { shallowMount, mount } from '@vue/test-utils' import PostIndex from './index.vue' import Vuex from 'vuex' import HashtagsFilter from '~/components/HashtagsFilter/HashtagsFilter' const localVue = global.localVue -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('PostIndex', () => { let wrapper @@ -95,7 +97,7 @@ describe('PostIndex', () => { it('clears the search when the filter menu emits clearSearch', () => { mocks.$route.query.hashtag = '#samplehashtag' wrapper = Wrapper() - wrapper.find(HashtagsFilter).vm.$emit('clearSearch') + wrapper.findComponent(HashtagsFilter).vm.$emit('clearSearch') expect(wrapper.vm.hashtag).toBeNull() }) @@ -123,6 +125,7 @@ describe('PostIndex', () => { store, mocks, localVue, + stubs, }) } 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) => { From 7d459fcea5671c287608122b570d31f078c642b5 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 21:09:24 +0100 Subject: [PATCH 281/344] get settings pages mostly running --- webapp/pages/settings/blocked-users.spec.js | 10 ++++++---- webapp/pages/settings/data-download.spec.js | 2 +- webapp/pages/settings/delete-account.spec.js | 2 +- webapp/pages/settings/embeds.spec.js | 2 +- webapp/pages/settings/index.spec.js | 2 +- webapp/pages/settings/invites.spec.js | 2 +- webapp/pages/settings/languages.spec.js | 2 +- webapp/pages/settings/muted-users.spec.js | 10 ++++++---- .../pages/settings/my-email-address/index.spec.js | 11 ++++++++--- .../pages/settings/my-email-address/verify.spec.js | 13 +++++++++---- webapp/pages/settings/my-organizations.spec.js | 2 +- webapp/pages/settings/privacy.spec.js | 11 ++++------- webapp/pages/settings/security.spec.js | 2 +- 13 files changed, 41 insertions(+), 30 deletions(-) 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..03ec610bd 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('DIV') }) describe('given form validation errors', () => { diff --git a/webapp/pages/settings/invites.spec.js b/webapp/pages/settings/invites.spec.js index cbc8d1765..6db61d853 100644 --- a/webapp/pages/settings/invites.spec.js +++ b/webapp/pages/settings/invites.spec.js @@ -26,7 +26,7 @@ describe('invites.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/settings/languages.spec.js b/webapp/pages/settings/languages.spec.js index 0e3665739..5f582e4e2 100644 --- a/webapp/pages/settings/languages.spec.js +++ b/webapp/pages/settings/languages.spec.js @@ -26,7 +26,7 @@ describe('languages.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/settings/muted-users.spec.js b/webapp/pages/settings/muted-users.spec.js index b818fa521..74caa8163 100644 --- a/webapp/pages/settings/muted-users.spec.js +++ b/webapp/pages/settings/muted-users.spec.js @@ -1,4 +1,4 @@ -import { config, mount, createLocalVue } from '@vue/test-utils' +import { mount, createLocalVue } from '@vue/test-utils' import MutedUsers from './muted-users.vue' import Styleguide from '@human-connection/styleguide' import Filters from '~/plugins/vue-filters' @@ -9,7 +9,9 @@ const localVue = createLocalVue() localVue.use(Styleguide) localVue.use(Filters) -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} describe('muted-users.vue', () => { let wrapper @@ -35,7 +37,7 @@ describe('muted-users.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(MutedUsers, { mocks, localVue }) + return mount(MutedUsers, { mocks, localVue, stubs }) } beforeEach(() => { @@ -43,7 +45,7 @@ describe('muted-users.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) describe('given a list of muted users', () => { diff --git a/webapp/pages/settings/my-email-address/index.spec.js b/webapp/pages/settings/my-email-address/index.spec.js index 808aee3be..87b85a59d 100644 --- a/webapp/pages/settings/my-email-address/index.spec.js +++ b/webapp/pages/settings/my-email-address/index.spec.js @@ -1,10 +1,12 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import EmailSettingsIndexPage from './index.vue' import Vuex from 'vuex' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' +const stubs = { + 'sweetalert-icon': true, +} describe('EmailSettingsIndexPage', () => { let store @@ -43,12 +45,15 @@ describe('EmailSettingsIndexPage', () => { store, mocks, localVue, + stubs, }) } describe('form', () => { describe('submit', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('email unchanged', () => { beforeEach(() => { diff --git a/webapp/pages/settings/my-email-address/verify.spec.js b/webapp/pages/settings/my-email-address/verify.spec.js index 66407ad1f..4edbb26bd 100644 --- a/webapp/pages/settings/my-email-address/verify.spec.js +++ b/webapp/pages/settings/my-email-address/verify.spec.js @@ -1,11 +1,13 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import EmailVerifyPage from './verify.vue' import Vuex from 'vuex' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['sweetalert-icon'] = '' +const stubs = { + 'sweetalert-icon': true, + 'client-only': true, +} describe('EmailVerifyPage', () => { let store @@ -108,12 +110,15 @@ describe('EmailVerifyPage', () => { }) describe('mount', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) const Wrapper = () => { return mount(EmailVerifyPage, { store, mocks, localVue, + stubs, }) } diff --git a/webapp/pages/settings/my-organizations.spec.js b/webapp/pages/settings/my-organizations.spec.js index 7f11b9871..6ae4cd74c 100644 --- a/webapp/pages/settings/my-organizations.spec.js +++ b/webapp/pages/settings/my-organizations.spec.js @@ -26,7 +26,7 @@ describe('my-organizations.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) }) }) diff --git a/webapp/pages/settings/privacy.spec.js b/webapp/pages/settings/privacy.spec.js index eb9cb90b3..4cabf5e50 100644 --- a/webapp/pages/settings/privacy.spec.js +++ b/webapp/pages/settings/privacy.spec.js @@ -47,22 +47,19 @@ describe('privacy.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) it('clicking on submit changes shoutsAllowed to false', async () => { - wrapper.find('#allow-shouts').trigger('click') - await wrapper.vm.$nextTick() - wrapper.find('.base-button').trigger('click') + await wrapper.find('#allow-shouts').setChecked(false) + await wrapper.find('.base-button').trigger('click') expect(wrapper.vm.shoutsAllowed).toBe(false) }) it('clicking on submit with a server error shows a toast and shoutsAllowed is still true', async () => { mocks.$apollo.mutate = jest.fn().mockRejectedValue({ message: 'Ouch!' }) - wrapper.find('#allow-shouts').trigger('click') - await wrapper.vm.$nextTick() + await wrapper.find('#allow-shouts').setChecked(false) await wrapper.find('.base-button').trigger('click') - await wrapper.vm.$nextTick() expect(mocks.$toast.error).toHaveBeenCalledWith('Ouch!') expect(wrapper.vm.shoutsAllowed).toBe(true) }) diff --git a/webapp/pages/settings/security.spec.js b/webapp/pages/settings/security.spec.js index dee9e640a..92ef93a0e 100644 --- a/webapp/pages/settings/security.spec.js +++ b/webapp/pages/settings/security.spec.js @@ -26,7 +26,7 @@ describe('security.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) From b3f50e04d88e76139355234a1f964be1dd691a98 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 21:23:36 +0100 Subject: [PATCH 282/344] all settings tests work again --- webapp/pages/settings.spec.js | 9 ++++++--- webapp/pages/settings/index.spec.js | 2 +- webapp/pages/settings/my-organizations.spec.js | 2 +- webapp/pages/settings/notifications.spec.js | 11 ++++------- 4 files changed, 12 insertions(+), 12 deletions(-) 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/index.spec.js b/webapp/pages/settings/index.spec.js index 03ec610bd..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().element.tagName).toBe('DIV') + expect(Wrapper().element.tagName).toBe('FORM') }) describe('given form validation errors', () => { diff --git a/webapp/pages/settings/my-organizations.spec.js b/webapp/pages/settings/my-organizations.spec.js index 6ae4cd74c..b6d81bc3d 100644 --- a/webapp/pages/settings/my-organizations.spec.js +++ b/webapp/pages/settings/my-organizations.spec.js @@ -26,7 +26,7 @@ describe('my-organizations.vue', () => { }) it('renders', () => { - expect(wrapper.element.tagName).toBe('DIV') + expect(wrapper.element.tagName).toBe('ARTICLE') }) }) }) diff --git a/webapp/pages/settings/notifications.spec.js b/webapp/pages/settings/notifications.spec.js index 7b43ef2c4..855505fe2 100644 --- a/webapp/pages/settings/notifications.spec.js +++ b/webapp/pages/settings/notifications.spec.js @@ -47,22 +47,19 @@ describe('notifications.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) it('clicking on submit changes notifyByEmail to false', async () => { - wrapper.find('#send-email').trigger('click') - await wrapper.vm.$nextTick() - wrapper.find('.base-button').trigger('click') + await wrapper.find('#send-email').setChecked(false) + await wrapper.find('.base-button').trigger('click') expect(wrapper.vm.notifyByEmail).toBe(false) }) it('clicking on submit with a server error shows a toast and notifyByEmail is still true', async () => { mocks.$apollo.mutate = jest.fn().mockRejectedValue({ message: 'Ouch!' }) - wrapper.find('#send-email').trigger('click') - await wrapper.vm.$nextTick() + await wrapper.find('#send-email').setChecked(false) await wrapper.find('.base-button').trigger('click') - await wrapper.vm.$nextTick() expect(mocks.$toast.error).toHaveBeenCalledWith('Ouch!') expect(wrapper.vm.notifyByEmail).toBe(true) }) From 0d5f87c2a37e052ba3b8e84c6b94f4d2bd7146e8 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 21:33:35 +0100 Subject: [PATCH 283/344] fix donations test --- webapp/pages/admin/donations.spec.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/webapp/pages/admin/donations.spec.js b/webapp/pages/admin/donations.spec.js index 57e28ff41..4a85590a9 100644 --- a/webapp/pages/admin/donations.spec.js +++ b/webapp/pages/admin/donations.spec.js @@ -57,7 +57,7 @@ describe('donations.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) describe('displays', () => { @@ -89,23 +89,19 @@ describe('donations.vue', () => { describe('form component click', () => { it('on #showDonations checkbox changes "showDonations" to true', async () => { // starts with false - wrapper.find('#showDonations').trigger('click') // set to true - await wrapper.vm.$nextTick() + await wrapper.find('#showDonations').setChecked(true) // set to true expect(wrapper.vm.showDonations).toBe(true) }) it('on #showDonations checkbox twice changes "showDonations" back to false', async () => { // starts with false - wrapper.find('#showDonations').trigger('click') // set to true - wrapper.find('#showDonations').trigger('click') // set to false - await wrapper.vm.$nextTick() + await wrapper.find('#showDonations').setChecked(true) // set to true + await wrapper.find('#showDonations').setChecked(false) // set to true expect(wrapper.vm.showDonations).toBe(false) }) it.skip('on donations-goal and enter value XXX', async () => { - wrapper.find('#donations-goal').setValue('20000') - await wrapper.vm.$nextTick() - // console.log(wrapper.find('#donations-goal').element.value) + await wrapper.find('#donations-goal').setValue('20000') expect(wrapper.vm.formData.goal).toBe('20000') }) }) @@ -141,7 +137,7 @@ describe('donations.vue', () => { }) it('calls mutation with input values once', async () => { - wrapper.find('#showDonations').trigger('click') // set to true + wrapper.find('#showDonations').setChecked(true) // set to true await wrapper.vm.$nextTick() wrapper.find('#donations-goal').setValue('20000') await wrapper.vm.$nextTick() From b2eda033ee1ee3e0c858e469a7768f1f09d39496 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 21:39:57 +0100 Subject: [PATCH 284/344] all admin pages tests are working --- webapp/pages/admin/categories.spec.js | 2 +- webapp/pages/admin/hashtags.spec.js | 2 +- webapp/pages/admin/invite.spec.js | 2 +- webapp/pages/admin/notifications.spec.js | 2 +- webapp/pages/admin/organizations.spec.js | 2 +- webapp/pages/admin/pages.spec.js | 2 +- webapp/pages/admin/settings.spec.js | 2 +- webapp/pages/admin/users.spec.js | 10 +++++++--- 8 files changed, 14 insertions(+), 10 deletions(-) diff --git a/webapp/pages/admin/categories.spec.js b/webapp/pages/admin/categories.spec.js index 55715e74b..f293dacf2 100644 --- a/webapp/pages/admin/categories.spec.js +++ b/webapp/pages/admin/categories.spec.js @@ -26,7 +26,7 @@ describe('categories.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/hashtags.spec.js b/webapp/pages/admin/hashtags.spec.js index cd2d308d1..b1a44aebf 100644 --- a/webapp/pages/admin/hashtags.spec.js +++ b/webapp/pages/admin/hashtags.spec.js @@ -26,7 +26,7 @@ describe('hashtags.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/invite.spec.js b/webapp/pages/admin/invite.spec.js index e3e882119..da0f743a2 100644 --- a/webapp/pages/admin/invite.spec.js +++ b/webapp/pages/admin/invite.spec.js @@ -29,7 +29,7 @@ describe('invite.vue', () => { }) it('renders', () => { - expect(wrapper.is('.ds-section')).toBe(true) + expect(wrapper.classes('ds-section')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/notifications.spec.js b/webapp/pages/admin/notifications.spec.js index c9acf81a6..34773058e 100644 --- a/webapp/pages/admin/notifications.spec.js +++ b/webapp/pages/admin/notifications.spec.js @@ -29,7 +29,7 @@ describe('notifications.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/organizations.spec.js b/webapp/pages/admin/organizations.spec.js index d019d9485..2045a09b3 100644 --- a/webapp/pages/admin/organizations.spec.js +++ b/webapp/pages/admin/organizations.spec.js @@ -29,7 +29,7 @@ describe('organizations.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/pages.spec.js b/webapp/pages/admin/pages.spec.js index e0c3c9fb4..91103b756 100644 --- a/webapp/pages/admin/pages.spec.js +++ b/webapp/pages/admin/pages.spec.js @@ -29,7 +29,7 @@ describe('pages.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/settings.spec.js b/webapp/pages/admin/settings.spec.js index 78a5beb94..0f83a37d5 100644 --- a/webapp/pages/admin/settings.spec.js +++ b/webapp/pages/admin/settings.spec.js @@ -29,7 +29,7 @@ describe('settings.vue', () => { }) it('renders', () => { - expect(wrapper.is('.base-card')).toBe(true) + expect(wrapper.classes('base-card')).toBe(true) }) }) }) diff --git a/webapp/pages/admin/users.spec.js b/webapp/pages/admin/users.spec.js index e8e624cc1..43c51fb52 100644 --- a/webapp/pages/admin/users.spec.js +++ b/webapp/pages/admin/users.spec.js @@ -1,9 +1,12 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import Users from './users.vue' const localVue = global.localVue -config.stubs['nuxt-link'] = '' + +const stubs = { + 'nuxt-link': true, +} describe('Users', () => { let wrapper @@ -49,12 +52,13 @@ describe('Users', () => { mocks, localVue, store, + stubs, }) } it('renders', () => { wrapper = Wrapper() - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) describe('search', () => { From 4850e456fe5b7c158f23acc7f153576472604300 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 13 Feb 2023 23:08:41 +0100 Subject: [PATCH 285/344] pages tests nearly working --- webapp/jest.config.js | 1 + webapp/package.json | 5 +- webapp/pages/code-of-conduct.spec.js | 2 +- webapp/pages/data-privacy.spec.js | 2 +- webapp/pages/donate.spec.js | 2 +- webapp/pages/faq.spec.js | 2 +- webapp/pages/group/_id.spec.js | 9 +- webapp/pages/groups.spec.js | 11 +- webapp/pages/imprint.spec.js | 2 +- webapp/pages/login.spec.js | 9 +- webapp/pages/logout.spec.js | 2 +- webapp/pages/map.spec.js | 2 + webapp/pages/moderation.spec.js | 9 +- webapp/pages/moderation/index.spec.js | 11 +- webapp/pages/notifications/index.spec.js | 20 +- webapp/pages/organization.spec.js | 2 +- webapp/pages/password-reset.spec.js | 11 +- .../pages/password-reset/enter-nonce.spec.js | 8 +- webapp/pages/password-reset/request.spec.js | 9 +- webapp/pages/profile/_id.spec.js | 9 +- webapp/pages/profile/_id/_slug.spec.js | 15 +- webapp/pages/registration.spec.js | 15 +- webapp/pages/search/search-results.spec.js | 8 +- webapp/pages/support.spec.js | 2 +- .../terms-and-conditions-confirm.spec.js | 9 +- webapp/pages/terms-and-conditions.spec.js | 2 +- webapp/yarn.lock | 1888 ++++++++++------- 27 files changed, 1248 insertions(+), 819 deletions(-) diff --git a/webapp/jest.config.js b/webapp/jest.config.js index eecaaa92c..1b3f4d03e 100644 --- a/webapp/jest.config.js +++ b/webapp/jest.config.js @@ -20,6 +20,7 @@ module.exports = { transform: { '.*\\.(vue)$': 'vue-jest', '^.+\\.js$': 'babel-jest', + '/node_modules/@mapbox/mapbox-gl-geocoder/dist/*': 'babel-jest', }, testMatch: ['**/?(*.)+(spec|test).js?(x)'], modulePathIgnorePatterns: ['/build/'], diff --git a/webapp/package.json b/webapp/package.json index dd64c0de0..40cacbae7 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -67,7 +67,8 @@ "devDependencies": { "@babel/core": "~7.12.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/preset-env": "~7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.20.11", + "@babel/preset-env": "^7.20.2", "@faker-js/faker": "5.1.0", "@nuxtjs/composition-api": "0.32.0", "@storybook/addon-a11y": "^6.3.6", @@ -81,7 +82,7 @@ "async-validator": "^3.2.4", "babel-core": "~7.0.0-bridge.0", "babel-eslint": "~10.1.0", - "babel-jest": "~25.3.0", + "babel-jest": "29.4", "babel-loader": "~8.1.0", "babel-plugin-require-context-hook": "^1.0.0", "babel-preset-vue": "~2.0.2", diff --git a/webapp/pages/code-of-conduct.spec.js b/webapp/pages/code-of-conduct.spec.js index c050f65ba..e914ceaee 100644 --- a/webapp/pages/code-of-conduct.spec.js +++ b/webapp/pages/code-of-conduct.spec.js @@ -33,7 +33,7 @@ describe('code-of-conduct.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/pages/data-privacy.spec.js b/webapp/pages/data-privacy.spec.js index c5e4e4d62..a1fdf4afc 100644 --- a/webapp/pages/data-privacy.spec.js +++ b/webapp/pages/data-privacy.spec.js @@ -33,7 +33,7 @@ describe('data-privacy.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/pages/donate.spec.js b/webapp/pages/donate.spec.js index 719cdbf77..2eff7d8d0 100644 --- a/webapp/pages/donate.spec.js +++ b/webapp/pages/donate.spec.js @@ -37,7 +37,7 @@ describe('donate.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/pages/faq.spec.js b/webapp/pages/faq.spec.js index 3e92d3f7f..9d3c776cc 100644 --- a/webapp/pages/faq.spec.js +++ b/webapp/pages/faq.spec.js @@ -33,7 +33,7 @@ describe('faq.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/pages/group/_id.spec.js b/webapp/pages/group/_id.spec.js index bafd5c392..1a9a7203a 100644 --- a/webapp/pages/group/_id.spec.js +++ b/webapp/pages/group/_id.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import _id from './_id.vue' const localVue = global.localVue -config.stubs['nuxt-child'] = '' +const stubs = { + 'nuxt-child': true, +} describe('Group profile _id.vue', () => { let wrapper @@ -19,6 +21,7 @@ describe('Group profile _id.vue', () => { return mount(_id, { mocks, localVue, + stubs, }) } @@ -27,7 +30,7 @@ describe('Group 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/groups.spec.js b/webapp/pages/groups.spec.js index 0fbacd6b3..3761f7ec2 100644 --- a/webapp/pages/groups.spec.js +++ b/webapp/pages/groups.spec.js @@ -1,10 +1,12 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import groups from './groups.vue' const localVue = global.localVue -config.stubs['nuxt-link'] = '' -config.stubs['client-only'] = '' +const stubs = { + 'nuxt-link': true, + 'client-only': true, +} describe('groups', () => { let wrapper @@ -21,6 +23,7 @@ describe('groups', () => { return mount(groups, { mocks, localVue, + stubs, }) } @@ -29,7 +32,7 @@ describe('groups', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) }) }) diff --git a/webapp/pages/imprint.spec.js b/webapp/pages/imprint.spec.js index 011e847db..5e8b57064 100644 --- a/webapp/pages/imprint.spec.js +++ b/webapp/pages/imprint.spec.js @@ -37,7 +37,7 @@ describe('imprint.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { 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 index dd2e1e8b0..5dbb34cf8 100644 --- a/webapp/pages/map.spec.js +++ b/webapp/pages/map.spec.js @@ -5,6 +5,8 @@ import VueMeta from 'vue-meta' import Vuex from 'vuex' import Map from './map' +jest.mock('@mapbox/mapbox-gl-geocoder') + jest.mock('mapbox-gl', () => { return { GeolocateControl: jest.fn(), 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 ce18c6a3b..b55426456 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' @@ -7,7 +7,9 @@ import PaginationButtons from '~/components/_new/generic/PaginationButtons/Pagin const localVue = global.localVue -config.stubs['client-only'] = '' +const stubs = { + 'client-only': true, +} describe('PostIndex', () => { let wrapper, Wrapper, mocks, propsData @@ -42,6 +44,7 @@ describe('PostIndex', () => { mocks, localVue, propsData, + stubs, }) } wrapper = Wrapper() @@ -67,6 +70,7 @@ describe('PostIndex', () => { mocks, localVue, propsData, + stubs, }) } }) @@ -79,7 +83,7 @@ describe('PostIndex', () => { { label: 'Unread', value: false }, ] wrapper = Wrapper() - wrapper.find(DropdownFilter).vm.$emit('filter', propsData.filterOptions[1]) + wrapper.findComponent(DropdownFilter).vm.$emit('filter', propsData.filterOptions[1]) }) it('sets `notificationRead` to value of received option', () => { @@ -98,7 +102,9 @@ describe('PostIndex', () => { describe('markNotificationAsRead', () => { beforeEach(() => { wrapper = Wrapper() - wrapper.find(NotificationsTable).vm.$emit('markNotificationAsRead', 'notificationSourceId') + wrapper + .findComponent(NotificationsTable) + .vm.$emit('markNotificationAsRead', 'notificationSourceId') }) it('calls markNotificationAsRead mutation', () => { @@ -112,7 +118,7 @@ describe('PostIndex', () => { mocks.$apollo.mutate = jest.fn().mockRejectedValueOnce({ message: 'Some error message' }) wrapper = Wrapper() wrapper - .find(NotificationsTable) + .findComponent(NotificationsTable) .vm.$emit('markNotificationAsRead', 'notificationSourceId') }) @@ -129,7 +135,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) }) }) @@ -137,7 +143,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 413e6218b..1829ac065 100644 --- a/webapp/pages/organization.spec.js +++ b/webapp/pages/organization.spec.js @@ -37,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/profile/_id.spec.js b/webapp/pages/profile/_id.spec.js index aab216569..db65f403e 100644 --- a/webapp/pages/profile/_id.spec.js +++ b/webapp/pages/profile/_id.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import _id from './_id.vue' const localVue = global.localVue -config.stubs['nuxt-child'] = '' +const stubs = { + 'nuxt-child': true, +} describe('Profile _id.vue', () => { 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..8516d5e38 100644 --- a/webapp/pages/profile/_id/_slug.spec.js +++ b/webapp/pages/profile/_id/_slug.spec.js @@ -1,15 +1,17 @@ -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, +} describe('ProfileSlug', () => { let wrapper @@ -51,6 +53,7 @@ describe('ProfileSlug', () => { return mount(ProfileSlug, { mocks, localVue, + stubs, }) } 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/support.spec.js b/webapp/pages/support.spec.js index bda88a898..57e729796 100644 --- a/webapp/pages/support.spec.js +++ b/webapp/pages/support.spec.js @@ -37,7 +37,7 @@ describe('support.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/pages/terms-and-conditions-confirm.spec.js b/webapp/pages/terms-and-conditions-confirm.spec.js index 098e73a92..c8faeb6f1 100644 --- a/webapp/pages/terms-and-conditions-confirm.spec.js +++ b/webapp/pages/terms-and-conditions-confirm.spec.js @@ -1,12 +1,14 @@ import Vuex from 'vuex' -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import TermsAndConditionsConfirm from './terms-and-conditions-confirm.vue' import VueMeta from 'vue-meta' const localVue = global.localVue localVue.use(VueMeta, { keyName: 'head' }) -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': true, +} describe('terms-and-conditions-confirm.vue', () => { let wrapper @@ -45,12 +47,13 @@ describe('terms-and-conditions-confirm.vue', () => { return mount(TermsAndConditionsConfirm, { mocks, localVue, + stubs, }) } it('renders', async () => { wrapper = await Wrapper() - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', async () => { diff --git a/webapp/pages/terms-and-conditions.spec.js b/webapp/pages/terms-and-conditions.spec.js index 6046c2e41..cc3b5b435 100644 --- a/webapp/pages/terms-and-conditions.spec.js +++ b/webapp/pages/terms-and-conditions.spec.js @@ -33,7 +33,7 @@ describe('terms-and-conditions.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { diff --git a/webapp/yarn.lock b/webapp/yarn.lock index e6974eb5d..f7ac510f5 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -95,14 +95,14 @@ dependencies: xss "^1.0.6" -"@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": +"@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -121,6 +121,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1": + 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.20.5": version "7.20.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" @@ -157,28 +162,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@^7.9.0", "@babel/core@~7.12.3": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" - integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.1" - "@babel/parser" "^7.12.3" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/core@^7.1.6", "@babel/core@^7.12.10": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.8.tgz#20cdf7c84b5d86d83fac8710a8bc605a7ba3f010" @@ -221,6 +204,49 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/core@^7.9.0": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@~7.12.3": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2" + integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-module-transforms" "^7.12.17" + "@babel/helpers" "^7.12.17" + "@babel/parser" "^7.12.17" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@7.6.4": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" @@ -231,14 +257,14 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== +"@babel/generator@^7.12.1", "@babel/generator@^7.12.17", "@babel/generator@^7.12.5", "@babel/generator@^7.7.2": + 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.12.5" + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" - source-map "^0.5.0" "@babel/generator@^7.12.11", "@babel/generator@^7.14.8": version "7.14.8" @@ -258,15 +284,6 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.7.2": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -274,6 +291,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" @@ -289,6 +313,14 @@ "@babel/helper-explode-assignable-expression" "^7.14.5" "@babel/types" "^7.14.5" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" @@ -316,7 +348,7 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.20.7": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@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== @@ -350,6 +382,20 @@ "@babel/helper-replace-supers" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" @@ -370,6 +416,14 @@ "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + "@babel/helper-create-regexp-features-plugin@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" @@ -424,6 +478,18 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" @@ -436,6 +502,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-explode-assignable-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" @@ -444,14 +517,13 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/helper-function-name@^7.14.5": version "7.14.5" @@ -462,14 +534,6 @@ "@babel/template" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -479,13 +543,6 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-get-function-arity@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" @@ -521,13 +578,6 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" - integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== - dependencies: - "@babel/types" "^7.12.1" - "@babel/helper-member-expression-to-functions@^7.14.5", "@babel/helper-member-expression-to-functions@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" @@ -535,6 +585,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + "@babel/helper-member-expression-to-functions@^7.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" @@ -549,12 +606,12 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== +"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.18.6" "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": version "7.14.5" @@ -563,27 +620,19 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.12.17", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + 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/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.9.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - lodash "^4.17.19" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.14.8": version "7.14.8" @@ -599,26 +648,20 @@ "@babel/traverse" "^7.14.8" "@babel/types" "^7.14.8" -"@babel/helper-module-transforms@^7.20.11": - 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== +"@babel/helper-module-transforms@^7.9.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" @@ -627,6 +670,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -639,21 +689,16 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.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.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - "@babel/helper-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" @@ -670,6 +715,16 @@ "@babel/helper-wrap-function" "^7.14.5" "@babel/types" "^7.14.5" +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-remap-async-to-generator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" @@ -681,15 +736,17 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" - integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== +"@babel/helper-replace-supers@^7.12.1", "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" "@babel/helper-replace-supers@^7.14.5": version "7.14.5" @@ -721,12 +778,12 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/helper-simple-access@^7.12.1", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.20.2" "@babel/helper-simple-access@^7.14.5", "@babel/helper-simple-access@^7.14.8": version "7.14.8" @@ -735,13 +792,6 @@ dependencies: "@babel/types" "^7.14.8" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - "@babel/helper-simple-access@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" @@ -757,12 +807,19 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.14.5": version "7.14.5" @@ -771,13 +828,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -790,21 +840,16 @@ 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.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.8": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" @@ -825,6 +870,16 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -835,14 +890,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.12.17": + 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.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" "@babel/helpers@^7.12.5", "@babel/helpers@^7.14.8": version "7.14.8" @@ -862,12 +917,12 @@ "@babel/traverse" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" @@ -880,16 +935,12 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.17", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13": + 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.1.0", "@babel/parser@^7.1.3", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.7.0", "@babel/parser@^7.7.5": +"@babel/parser@^7.1.3", "@babel/parser@^7.7.0": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== @@ -904,16 +955,18 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== -"@babel/parser@^7.14.7", "@babel/parser@^7.20.13": - 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.16.4", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" @@ -923,6 +976,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" @@ -932,6 +994,16 @@ "@babel/helper-remap-async-to-generator" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" @@ -949,6 +1021,14 @@ "@babel/helper-create-class-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-class-properties@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" @@ -966,6 +1046,15 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-proposal-decorators@^7.12.12": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz#59bc4dfc1d665b5a6749cf798ff42297ed1b2c1d" @@ -992,6 +1081,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" @@ -1016,6 +1113,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" @@ -1024,6 +1129,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" @@ -1040,6 +1153,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" @@ -1048,6 +1169,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" @@ -1064,6 +1193,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" @@ -1092,6 +1229,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.14.5" +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/plugin-proposal-object-rest-spread@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" @@ -1108,6 +1256,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" @@ -1125,6 +1281,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-optional-chaining@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" @@ -1141,6 +1306,14 @@ "@babel/helper-create-class-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" @@ -1151,6 +1324,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" @@ -1159,6 +1342,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-proposal-unicode-property-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" @@ -1188,20 +1379,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" @@ -1251,6 +1435,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-import-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" @@ -1300,20 +1491,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz#5d8f24ecffa4ae74164e53264953c5ea8ba6d149" @@ -1328,14 +1512,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@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== @@ -1426,6 +1610,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@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" @@ -1442,6 +1633,15 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-transform-async-to-generator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" @@ -1458,6 +1658,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" @@ -1472,6 +1679,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz#3e1b2aa9cbbe1eb8d644c823141a9c5c2a22392d" + integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-block-scoping@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" @@ -1493,6 +1707,21 @@ "@babel/helper-split-export-declaration" "^7.14.5" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + "@babel/plugin-transform-classes@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" @@ -1514,6 +1743,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/plugin-transform-computed-properties@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" @@ -1528,6 +1765,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-destructuring@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" @@ -1543,6 +1787,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-dotall-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" @@ -1558,6 +1810,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-duplicate-keys@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" @@ -1573,6 +1832,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-exponentiation-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" @@ -1596,6 +1863,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-for-of@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" @@ -1611,6 +1885,15 @@ "@babel/helper-function-name" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" @@ -1626,6 +1909,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" @@ -1640,6 +1930,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-member-expression-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" @@ -1656,6 +1953,14 @@ "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-modules-amd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" @@ -1675,6 +1980,15 @@ "@babel/helper-simple-access" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + "@babel/plugin-transform-modules-commonjs@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" @@ -1696,6 +2010,16 @@ "@babel/helper-validator-identifier" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/plugin-transform-modules-systemjs@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" @@ -1714,6 +2038,14 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-modules-umd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" @@ -1729,6 +2061,14 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" @@ -1743,6 +2083,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-new-target@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" @@ -1758,6 +2105,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5" +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + "@babel/plugin-transform-object-super@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" @@ -1773,6 +2128,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-parameters@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.7.tgz#66fa2f1de4129b4e0447509223ac71bda4955395" @@ -1789,6 +2151,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-property-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" @@ -1836,6 +2205,14 @@ dependencies: regenerator-transform "^0.14.2" +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + "@babel/plugin-transform-regenerator@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" @@ -1850,6 +2227,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-reserved-words@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" @@ -1874,6 +2258,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-shorthand-properties@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" @@ -1889,6 +2280,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-transform-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" @@ -1903,6 +2302,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-sticky-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" @@ -1918,6 +2324,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-template-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" @@ -1933,6 +2346,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-typeof-symbol@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" @@ -1956,6 +2376,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-unicode-regex@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" @@ -1964,6 +2391,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-unicode-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" @@ -2051,7 +2486,88 @@ core-js-compat "^3.15.0" semver "^6.3.0" -"@babel/preset-env@^7.9.0", "@babel/preset-env@~7.9.0": +"@babel/preset-env@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-env@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== @@ -2148,6 +2664,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + "@babel/preset-react@^7.12.10": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" @@ -2180,6 +2707,11 @@ pirates "^4.0.0" source-map-support "^0.5.16" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "@babel/runtime-corejs3@^7.8.3": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.8.4.tgz#ccc4e042e2fae419c67fa709567e5d2179ed3940" @@ -2209,14 +2741,14 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.7.4", "@babel/template@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== +"@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.18.10", "@babel/template@^7.20.7": + 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.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@babel/template@^7.12.7", "@babel/template@^7.14.5": version "7.14.5" @@ -2227,15 +2759,6 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@babel/template@^7.3.3": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -2245,20 +2768,30 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" -"@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" - integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== +"@babel/template@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.12.1", "@babel/traverse@^7.12.17", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": + 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" - lodash "^4.17.19" "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.14.8": version "7.14.8" @@ -2291,21 +2824,20 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.7.2": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== +"@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" + integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== 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" + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.5" + "@babel/types" "^7.12.5" debug "^4.1.0" globals "^11.1.0" + lodash "^4.17.19" "@babel/types@7.6.3": version "7.6.3" @@ -2316,13 +2848,13 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.6.3", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": - version "7.12.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" - integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.12.1", "@babel/types@^7.12.17", "@babel/types@^7.12.5", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.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-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@babel/types@^7.12.0", "@babel/types@^7.12.11", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.6.1", "@babel/types@^7.9.6": @@ -2342,13 +2874,13 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.4.4", "@babel/types@^7.6.3", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": + version "7.12.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -2366,14 +2898,6 @@ openurl "1.1.1" yargs "6.6.0" -"@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== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -2662,19 +3186,20 @@ vue "^2.6.10" "@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@^29.4.2": version "29.4.2" @@ -2835,28 +3360,6 @@ jest-haste-map "^29.4.2" slash "^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== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^25.3.0" - babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.3" - jest-haste-map "^25.3.0" - jest-regex-util "^25.2.6" - jest-util "^25.3.0" - micromatch "^4.0.2" - pirates "^4.0.1" - realpath-native "^2.0.0" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - "@jest/transform@^29.4.2": version "29.4.2" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.2.tgz#b24b72dbab4c8675433a80e222d6a8ef4656fb81" @@ -2878,16 +3381,6 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.3.0.tgz#88f94b277a1d028fd7117bc1f74451e0fc2131e7" - integrity sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - "@jest/types@^29.4.2": version "29.4.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.2.tgz#8f724a414b1246b2bfd56ca5225d9e1f39540d82" @@ -4833,36 +5326,25 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__core@^7.1.7": - version "7.1.7" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" - integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - "@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - 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.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" - integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + 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" @@ -4903,7 +5385,7 @@ dependencies: "@types/color-name" "*" -"@types/color-name@*", "@types/color-name@^1.1.1": +"@types/color-name@*": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== @@ -5057,26 +5539,23 @@ resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83" integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== "@types/istanbul-lib-report@*": - version "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== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/istanbul-reports@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" @@ -5430,16 +5909,9 @@ "@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== - -"@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== - dependencies: - "@types/yargs-parser" "*" + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": version "17.0.22" @@ -6176,11 +6648,10 @@ ansi-styles@^4.0.0: color-convert "^2.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: @@ -6221,7 +6692,15 @@ anymatch@^3.0.0, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -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== @@ -6763,7 +7242,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" @@ -6773,7 +7252,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= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-equal@^1.0.0: version "1.0.0" @@ -6828,7 +7307,7 @@ array-uniq@^1.0.1: 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.1" @@ -6910,7 +7389,7 @@ assert@^2.0.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" @@ -6988,7 +7467,7 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.1: +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== @@ -7092,7 +7571,7 @@ babel-helper-vue-jsx-merge-props@^2.0.2: resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== -babel-jest@^29.4.2: +babel-jest@29.4, 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== @@ -7105,19 +7584,6 @@ babel-jest@^29.4.2: graceful-fs "^4.2.9" slash "^3.0.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== - 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" - slash "^3.0.0" - babel-loader@^8.1.0, babel-loader@~8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" @@ -7223,17 +7689,6 @@ babel-plugin-extract-import-names@1.6.22: dependencies: "@babel/helper-plugin-utils" "7.10.4" -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== - 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" - test-exclude "^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" @@ -7245,13 +7700,6 @@ babel-plugin-istanbul@^6.1.1: 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== - dependencies: - "@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" @@ -7312,6 +7760,15 @@ babel-plugin-polyfill-corejs2@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" @@ -7328,6 +7785,14 @@ babel-plugin-polyfill-corejs3@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.14.0" +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + babel-plugin-polyfill-regenerator@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" @@ -7335,6 +7800,13 @@ babel-plugin-polyfill-regenerator@^0.2.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + babel-plugin-require-context-hook@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-require-context-hook/-/babel-plugin-require-context-hook-1.0.0.tgz#3f0e7cce87c338f53639b948632fd4e73834632d" @@ -7379,22 +7851,6 @@ babel-polyfill@6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-current-node-syntax@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" - integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - babel-preset-current-node-syntax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" @@ -7413,14 +7869,6 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz#9ab40aee52a19bdc52b8b1ec2403d5914ac3d86b" - integrity sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw== - dependencies: - babel-plugin-jest-hoist "^25.2.6" - babel-preset-current-node-syntax "^0.1.2" - babel-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" @@ -7803,10 +8251,20 @@ browserslist@^4.21.3: node-releases "^2.0.6" update-browserslist-db "^1.0.9" -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -8119,12 +8577,10 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" +caniuse-lite@^1.0.30001449: + version "1.0.30001451" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" + integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== capture-stack-trace@^1.0.0: version "1.0.1" @@ -8362,11 +8818,6 @@ ci-info@^1.5.0, ci-info@^1.6.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - ci-info@^3.2.0: version "3.8.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" @@ -8618,7 +9069,7 @@ collect-v8-coverage@^1.0.0: 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" @@ -8640,7 +9091,7 @@ color-convert@^2.0.0, 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.0.0, color-name@~1.1.4: version "1.1.4" @@ -8885,13 +9336,18 @@ content-type@^1.0.4, 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.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.6.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.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" @@ -8943,7 +9399,7 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== copy-to-clipboard@^3.0.8: version "3.2.0" @@ -8967,6 +9423,13 @@ core-js-compat@^3.14.0, core-js-compat@^3.15.0, core-js-compat@^3.8.1: browserslist "^4.16.6" semver "7.0.0" +core-js-compat@^3.25.1: + version "3.28.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.28.0.tgz#c08456d854608a7264530a2afa281fadf20ecee6" + integrity sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg== + dependencies: + browserslist "^4.21.5" + core-js-compat@^3.6.2: version "3.6.3" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.3.tgz#41e281ca771209d5f2eb63ce34f96037d0928538" @@ -9573,7 +10036,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, 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== @@ -9594,6 +10057,13 @@ debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" +debug@^4.1.0: + 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" + decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -9613,9 +10083,9 @@ decimal.js@^10.4.2: 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@^6.0.0: version "6.0.0" @@ -9671,14 +10141,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" @@ -10113,6 +10583,11 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.284: + version "1.4.295" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" + integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -10193,13 +10668,20 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -10392,7 +10874,7 @@ escape-html@~1.0.3: escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" @@ -10717,11 +11199,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -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== - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -10787,7 +11264,7 @@ exit@^0.1.2: 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" @@ -10854,7 +11331,7 @@ extend-shallow@^2.0.1: 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" @@ -11016,11 +11493,11 @@ fault@^1.0.2: format "^0.2.2" 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" fbjs@^0.8.0: version "0.8.17" @@ -11107,7 +11584,7 @@ filesize@^3.6.1: 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" @@ -11288,7 +11765,7 @@ follow-redirects@^1.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" @@ -11367,7 +11844,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" @@ -11494,16 +11971,16 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" -fsevents@^2.1.2, fsevents@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -11567,12 +12044,7 @@ generic-names@^2.0.1: dependencies: loader-utils "^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.2: +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== @@ -11610,6 +12082,11 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -11649,7 +12126,7 @@ get-stream@^6.0.0, get-stream@^6.0.1: 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== getpass@^0.1.1: version "0.1.7" @@ -11757,7 +12234,7 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.6, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -11769,7 +12246,7 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3: +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== @@ -11964,11 +12441,6 @@ graceful-fs@^4.2.0, graceful-fs@^4.2.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== -graceful-fs@^4.2.3: - 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.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -12129,7 +12601,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" @@ -12166,7 +12638,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" @@ -12175,7 +12647,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" @@ -12184,12 +12656,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" @@ -12806,7 +13278,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.0.0, indent-string@^3.2.0: version "3.2.0" @@ -12947,7 +13419,7 @@ is-absolute-url@^2.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" @@ -13037,13 +13509,6 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -13073,7 +13538,7 @@ is-core-module@^2.9.0: 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" @@ -13141,7 +13606,7 @@ is-expression@^4.0.0: 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" @@ -13258,7 +13723,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" @@ -13301,7 +13766,7 @@ is-plain-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -13403,7 +13868,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.1" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -13465,19 +13930,19 @@ 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== 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" @@ -13497,29 +13962,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^3.0.0: - 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.2.0: +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== - dependencies: - "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - 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" @@ -13720,25 +14167,6 @@ jest-get-type@^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.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.3.0.tgz#b7683031c9c9ddc0521d311564108b244b11e4c6" - integrity sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A== - dependencies: - "@jest/types" "^25.3.0" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.3" - jest-serializer "^25.2.6" - jest-util "^25.3.0" - jest-worker "^25.2.6" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - which "^2.0.2" - optionalDependencies: - fsevents "^2.1.2" - jest-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" @@ -13805,11 +14233,6 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" - integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== - jest-regex-util@^29.4.2: version "29.4.2" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.2.tgz#19187cca35d301f8126cf7a021dd4dcb7b58a1ca" @@ -13894,11 +14317,6 @@ jest-runtime@^29.4.2: slash "^3.0.0" strip-bom "^4.0.0" -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@^29.4.2: version "29.4.2" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.2.tgz#ba1fb9abb279fd2c85109ff1757bc56b503bbb3a" @@ -13929,16 +14347,6 @@ jest-snapshot@^29.4.2: pretty-format "^29.4.2" semver "^7.3.5" -jest-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.3.0.tgz#e3b0064165818f10d78514696fd25efba82cf049" - integrity sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA== - dependencies: - "@jest/types" "^25.3.0" - chalk "^3.0.0" - is-ci "^2.0.0" - make-dir "^3.0.0" - jest-util@^29.4.2: version "29.4.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.2.tgz#3db8580b295df453a97de4a1b42dd2578dabd2c2" @@ -13985,14 +14393,6 @@ jest-worker@^25.1.0: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" - integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - jest-worker@^26.5.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -14080,7 +14480,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.0: +js-yaml@^3.13.0, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -14088,6 +14488,14 @@ js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -14238,12 +14646,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -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== json5@^2.1.3: version "2.2.0" @@ -14252,11 +14658,6 @@ json5@^2.1.3: dependencies: minimist "^1.2.5" -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -14356,14 +14757,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" @@ -14372,12 +14773,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -14906,14 +15302,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" 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== - dependencies: - semver "^6.0.0" - -make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -14932,17 +15321,10 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - 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-obj@^1.0.0: version "1.0.1" @@ -14967,7 +15349,7 @@ map-promisified@^0.4.0: 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" @@ -15191,15 +15573,7 @@ micromatch@^4.0.0: braces "^3.0.1" picomatch "^2.2.3" -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== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -micromatch@^4.0.4: +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== @@ -15348,12 +15722,7 @@ minimist@^0.1.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4= -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: +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== @@ -15484,13 +15853,23 @@ move-concurrently@^1.0.1: 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, ms@^2.1.1: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + murmurhash-js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" @@ -15638,7 +16017,7 @@ node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1: 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-ipc@^9.1.1: version "9.1.1" @@ -15690,7 +16069,7 @@ node-loggly-bulk@^2.2.4: 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= + integrity sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ== node-object-hash@^1.2.0: version "1.4.2" @@ -15730,6 +16109,11 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + node-res@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/node-res/-/node-res-5.0.1.tgz#ffaa462e206509d66d0ba28a4daf1f032daa6460" @@ -15800,7 +16184,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: 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" @@ -15850,7 +16234,7 @@ npm-packlist@^1.1.6: 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" @@ -15950,7 +16334,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" @@ -15994,7 +16378,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" @@ -16057,7 +16441,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" @@ -16086,7 +16470,7 @@ on-headers@^1.0.2, on-headers@~1.0.2: 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" @@ -16244,7 +16628,7 @@ p-filter@^2.1.0: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-finally@^2.0.0: version "2.0.1" @@ -16258,13 +16642,20 @@ 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.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== dependencies: p-try "^2.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" @@ -16508,7 +16899,7 @@ pascal-case@^3.1.2: 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== password-prompt@^1.0.7, password-prompt@^1.1.2: version "1.1.2" @@ -16565,19 +16956,14 @@ 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.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.7: +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== @@ -16644,12 +17030,12 @@ picocolors@^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: - version "2.0.7" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^2.0.5, picomatch@^2.0.7: +picomatch@^2.0.7: version "2.2.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== @@ -16659,11 +17045,6 @@ picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== -picomatch@^2.2.2, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -16709,7 +17090,7 @@ pino@4.10.2: quick-format-unescaped "^1.1.1" split2 "^2.2.0" -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== @@ -16797,7 +17178,7 @@ popper.js@^1.14.4, popper.js@^1.14.7, popper.js@^1.16.1: 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-attribute-case-insensitive@^4.0.1: version "4.0.1" @@ -18586,11 +18967,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -realpath-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" - integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== - recast@0.20.4: version "0.20.4" resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.4.tgz#db55983eac70c46b3fff96c8e467d65ffb4a7abc" @@ -18668,6 +19044,13 @@ refractor@^3.1.0: parse-entities "^2.0.0" prismjs "~1.24.0" +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -18687,6 +19070,11 @@ regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" @@ -18715,6 +19103,13 @@ regenerator-transform@^0.14.2: "@babel/runtime" "^7.8.4" private "^0.1.8" +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -18777,6 +19172,18 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +regexpu-core@^5.2.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.0.tgz#4d0d044b76fedbad6238703ae84bfdedee2cf074" + integrity sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -18816,6 +19223,13 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + relateurl@0.2.x, relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -18872,7 +19286,7 @@ remark-squeeze-paragraphs@4.0.0: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== renderkid@^2.0.1: version "2.0.3" @@ -18886,14 +19300,14 @@ renderkid@^2.0.1: utila "^0.4.0" 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.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== request-promise-core@1.1.3: version "1.1.3" @@ -18999,14 +19413,14 @@ resolve-protobuf-schema@^2.1.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.exports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.2.0, resolve@^1.5.0, resolve@^1.8.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -19021,7 +19435,7 @@ resolve@^1.14.2, resolve@^1.15.1, resolve@^1.19.0: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.20.0: +resolve@^1.20.0, resolve@^1.3.2: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -19117,11 +19531,6 @@ rope-sequence@^1.3.0: resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b" integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg== -rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -19178,7 +19587,7 @@ safe-buffer@^5.0.1: 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" @@ -19187,21 +19596,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - sass-loader@~10.1.1: version "10.1.1" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" @@ -19424,20 +19818,10 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -19487,7 +19871,7 @@ shallowequal@1.1.0, shallowequal@^1.1.0: 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" @@ -19501,7 +19885,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" @@ -19554,12 +19938,7 @@ sigmund@^1.0.1: resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -signal-exit@^3.0.3, signal-exit@^3.0.7: +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== @@ -19686,7 +20065,18 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.5.2: 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== @@ -19722,9 +20112,9 @@ 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" @@ -19734,7 +20124,7 @@ source-map@0.5.6: source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" @@ -19804,7 +20194,7 @@ split2@^2.2.0: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.16.1" @@ -19873,7 +20263,7 @@ state-toggle@^1.0.0: 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" @@ -20199,7 +20589,7 @@ strip-color@^0.1.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" @@ -20321,9 +20711,9 @@ 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" @@ -20779,11 +21169,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -20797,19 +21182,19 @@ to-fast-properties@^1.0.3: 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" 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" @@ -21113,13 +21498,6 @@ typed-styles@^0.0.7: resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -21191,6 +21569,11 @@ unicode-canonical-property-names-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + unicode-match-property-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" @@ -21199,6 +21582,14 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" @@ -21209,11 +21600,21 @@ unicode-match-property-value-ecmascript@^1.2.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + unicode-property-aliases-ecmascript@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + unified@9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" @@ -21227,14 +21628,14 @@ unified@9.2.0: vfile "^4.0.0" union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" uniq@^1.0.1: version "1.0.1" @@ -21397,7 +21798,7 @@ unquote@^1.1.0, unquote@~1.1.1: 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" @@ -21422,7 +21823,7 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.0.9: +update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== @@ -21468,7 +21869,7 @@ uri-js@^4.2.2: 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-loader@^2.3.0: version "2.3.0" @@ -22036,13 +22437,6 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" -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= - dependencies: - makeerror "1.0.x" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -22330,7 +22724,7 @@ which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -22467,16 +22861,6 @@ write-file-atomic@^2.3.0: imurmurhash "^0.1.4" 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== - 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" From 038bae557184bfab1499426b844131e0ae58dec7 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 15 Feb 2023 07:56:48 +0100 Subject: [PATCH 286/344] stub router link --- webapp/pages/profile/_id/_slug.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/pages/profile/_id/_slug.spec.js b/webapp/pages/profile/_id/_slug.spec.js index 8516d5e38..5ab87ad3a 100644 --- a/webapp/pages/profile/_id/_slug.spec.js +++ b/webapp/pages/profile/_id/_slug.spec.js @@ -11,6 +11,7 @@ const stubs = { 'nuxt-link': true, 'infinite-loading': true, 'follow-list': true, + 'router-link': true, } describe('ProfileSlug', () => { From 4ce5bdd6fa6d6acc6a8e95bcdaaa6537d5a4c706 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 15 Feb 2023 10:23:34 +0100 Subject: [PATCH 287/344] get most components working --- .../components/AvatarMenu/AvatarMenu.spec.js | 10 +- .../CommentCard/CommentCard.spec.js | 11 ++- .../CommentList/CommentList.spec.js | 15 +-- .../ComponentSlider/ComponentSlider.spec.js | 2 +- .../ContentMenu/ContentMenu.spec.js | 97 ++++++++++--------- .../ContributionForm/ContributionForm.spec.js | 11 ++- .../components/DeleteData/DeleteData.spec.js | 8 +- webapp/components/Editor/Editor.spec.js | 2 +- .../components/Embed/EmbedComponent.spec.js | 2 +- .../components/EnterNonce/EnterNonce.spec.js | 4 +- webapp/components/Group/GroupForm.spec.js | 8 +- webapp/components/Hashtag/Hashtag.spec.js | 7 +- .../HashtagsFilter/HashtagsFilter.spec.js | 2 +- .../InviteButton/InviteButton.spec.js | 8 +- .../LocaleSwitch/LocaleSwitch.spec.js | 8 +- .../LoginButton/LoginButton.spec.js | 8 +- webapp/components/LoginForm/LoginForm.spec.js | 12 ++- .../MasonryGrid/MasonryGridItem.spec.js | 16 +-- webapp/components/Modal/ConfirmModal.spec.js | 12 ++- .../components/Modal/DeleteUserModal.spec.js | 15 ++- webapp/components/Modal/DisableModal.spec.js | 4 +- webapp/components/Modal/ReportModal.spec.js | 14 ++- .../Notification/Notification.spec.js | 5 +- .../NotificationList/NotificationList.spec.js | 8 +- .../NotificationMenu/NotificationMenu.spec.js | 38 ++++++-- .../NotificationsTable.spec.js | 5 +- .../components/PageFooter/PageFooter.spec.js | 10 +- webapp/components/Password/Change.spec.js | 3 +- .../PasswordReset/ChangePassword.spec.js | 11 ++- .../components/PasswordReset/Request.spec.js | 13 +-- .../components/PostTeaser/PostTeaser.spec.js | 11 ++- webapp/components/Registration/Signup.spec.js | 13 ++- webapp/components/RelativeDateTime/spec.js | 2 +- .../ReleaseModal/ReleaseModal.spec.js | 4 +- .../SocialMedia/SocialMedia.spec.js | 10 +- .../SearchResults/SearchResults.spec.js | 10 +- .../TabNavigation/TabNavigation.spec.js | 8 +- .../FiledReportsTable.spec.js | 5 +- .../features/ProfileList/FollowList.spec.js | 15 +-- .../features/ReportList/ReportList.spec.js | 10 +- .../features/ReportRow/ReportRow.spec.js | 5 +- .../ReportsTable/ReportsTable.spec.js | 10 +- .../features/SearchField/SearchField.spec.js | 9 +- .../generic/SearchPost/SearchPost.spec.js | 4 +- .../SearchableInput/SearchableInput.spec.js | 9 +- 45 files changed, 300 insertions(+), 194 deletions(-) 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/CommentCard/CommentCard.spec.js b/webapp/components/CommentCard/CommentCard.spec.js index 0ebcb2649..7764afd1e 100644 --- a/webapp/components/CommentCard/CommentCard.spec.js +++ b/webapp/components/CommentCard/CommentCard.spec.js @@ -1,13 +1,10 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import CommentCard from './CommentCard.vue' import Vuex from 'vuex' const localVue = global.localVue localVue.directive('scrollTo', jest.fn()) -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' - describe('CommentCard.vue', () => { let propsData, mocks, stubs, getters, wrapper, Wrapper @@ -46,6 +43,8 @@ describe('CommentCard.vue', () => { } stubs = { ContentViewer: true, + 'client-only': true, + 'nuxt-link': true, } getters = { 'auth/user': () => { @@ -56,7 +55,9 @@ describe('CommentCard.vue', () => { }) describe('mount', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) Wrapper = () => { const store = new Vuex.Store({ diff --git a/webapp/components/CommentList/CommentList.spec.js b/webapp/components/CommentList/CommentList.spec.js index 39f76ff12..f4195aa41 100644 --- a/webapp/components/CommentList/CommentList.spec.js +++ b/webapp/components/CommentList/CommentList.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import CommentList from './CommentList' import Vuex from 'vuex' import Vue from 'vue' @@ -8,10 +8,6 @@ const localVue = global.localVue localVue.filter('truncate', (string) => string) localVue.directive('scrollTo', jest.fn()) -config.stubs['v-popover'] = '' -config.stubs['nuxt-link'] = '' -config.stubs['client-only'] = '' - describe('CommentList.vue', () => { let mocks, store, wrapper, propsData, stubs @@ -72,7 +68,10 @@ describe('CommentList.vue', () => { }, } stubs = { - EditorContent: "

", + EditorContent: true, + 'v-popover': true, + 'nuxt-link': true, + 'client-only': true, } }) @@ -92,7 +91,9 @@ describe('CommentList.vue', () => { }) describe('scrollToAnchor mixin', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('$route.hash !== `#comments`', () => { it('skips $scrollTo', () => { diff --git a/webapp/components/ComponentSlider/ComponentSlider.spec.js b/webapp/components/ComponentSlider/ComponentSlider.spec.js index 25bf3e7f4..0f1f345e9 100644 --- a/webapp/components/ComponentSlider/ComponentSlider.spec.js +++ b/webapp/components/ComponentSlider/ComponentSlider.spec.js @@ -52,7 +52,7 @@ describe('ComponentSlider.vue', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBe(true) + expect(wrapper.element.tagName).toBe('DIV') }) it('click on next Button', async () => { diff --git a/webapp/components/ContentMenu/ContentMenu.spec.js b/webapp/components/ContentMenu/ContentMenu.spec.js index 37bef14f6..0bd398e41 100644 --- a/webapp/components/ContentMenu/ContentMenu.spec.js +++ b/webapp/components/ContentMenu/ContentMenu.spec.js @@ -1,4 +1,4 @@ -import { config, mount, createLocalVue } from '@vue/test-utils' +import { mount, createLocalVue } from '@vue/test-utils' import Vuex from 'vuex' import VTooltip from 'v-tooltip' import Styleguide from '@human-connection/styleguide' @@ -10,7 +10,11 @@ localVue.use(Styleguide) localVue.use(VTooltip) localVue.use(Vuex) -config.stubs['router-link'] = '' +const stubs = { + 'router-link': { + template: '', + }, +} let getters, mutations, mocks, menuToggle, openModalSpy @@ -36,7 +40,7 @@ describe('ContentMenu.vue', () => { 'auth/isAdmin': () => false, } - const openContentMenu = (values = {}) => { + const openContentMenu = async (values = {}) => { const store = new Vuex.Store({ mutations, getters }) const wrapper = mount(ContentMenu, { propsData: { @@ -45,16 +49,17 @@ describe('ContentMenu.vue', () => { mocks, store, localVue, + stubs, }) menuToggle = wrapper.find('[data-test="content-menu-button"]') - menuToggle.trigger('click') + await menuToggle.trigger('click') return wrapper } describe('owner of contribution', () => { let wrapper - beforeEach(() => { - wrapper = openContentMenu({ + beforeEach(async () => { + wrapper = await openContentMenu({ isOwner: true, resourceType: 'contribution', resource: { @@ -86,9 +91,9 @@ describe('ContentMenu.vue', () => { }) describe('admin can', () => { - it('pin unpinned post', () => { + it('pin unpinned post', async () => { getters['auth/isAdmin'] = () => true - const wrapper = openContentMenu({ + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'contribution', resource: { @@ -111,8 +116,8 @@ describe('ContentMenu.vue', () => { ]) }) - it('unpin pinned post', () => { - const wrapper = openContentMenu({ + it('unpin pinned post', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'contribution', resource: { @@ -135,11 +140,11 @@ describe('ContentMenu.vue', () => { ]) }) - it('can delete another user', () => { + it('can delete another user', async () => { getters['auth/user'] = () => { return { id: 'some-user', slug: 'some-user' } } - const wrapper = openContentMenu({ + const wrapper = await openContentMenu({ resourceType: 'user', resource: { id: 'another-user', @@ -161,8 +166,8 @@ describe('ContentMenu.vue', () => { ]) }) - it('can not delete the own account', () => { - const wrapper = openContentMenu({ + it('can not delete the own account', async () => { + const wrapper = await openContentMenu({ resourceType: 'user', resource: { id: 'some-user', @@ -179,8 +184,8 @@ describe('ContentMenu.vue', () => { describe('owner of comment can', () => { let wrapper - beforeEach(() => { - wrapper = openContentMenu({ + beforeEach(async () => { + wrapper = await openContentMenu({ isOwner: true, resourceType: 'comment', resource: { @@ -208,10 +213,10 @@ describe('ContentMenu.vue', () => { }) describe('reporting', () => { - it('a post of another user is possible', () => { + it('a post of another user is possible', async () => { getters['auth/isAdmin'] = () => false getters['auth/isModerator'] = () => false - const wrapper = openContentMenu({ + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'contribution', resource: { @@ -227,8 +232,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('report') }) - it('a comment of another user is possible', () => { - const wrapper = openContentMenu({ + it('a comment of another user is possible', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'comment', resource: { @@ -244,8 +249,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('report') }) - it('another user is possible', () => { - const wrapper = openContentMenu({ + it('another user is possible', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'user', resource: { @@ -261,8 +266,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('report') }) - it('another organization is possible', () => { - const wrapper = openContentMenu({ + it('another organization is possible', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'organization', resource: { @@ -280,10 +285,10 @@ describe('ContentMenu.vue', () => { }) describe('moderator', () => { - it('can disable posts', () => { + it('can disable posts', async () => { getters['auth/isAdmin'] = () => false getters['auth/isModerator'] = () => true - const wrapper = openContentMenu({ + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'contribution', resource: { @@ -300,8 +305,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('disable') }) - it('can disable comments', () => { - const wrapper = openContentMenu({ + it('can disable comments', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'comment', resource: { @@ -318,8 +323,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('disable') }) - it('can disable users', () => { - const wrapper = openContentMenu({ + it('can disable users', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'user', resource: { @@ -336,8 +341,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('disable') }) - it('can disable organizations', () => { - const wrapper = openContentMenu({ + it('can disable organizations', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'organization', resource: { @@ -354,8 +359,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('disable') }) - it('can release posts', () => { - const wrapper = openContentMenu({ + it('can release posts', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'contribution', resource: { @@ -372,8 +377,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('release') }) - it('can release comments', () => { - const wrapper = openContentMenu({ + it('can release comments', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'comment', resource: { @@ -390,8 +395,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('release') }) - it('can release users', () => { - const wrapper = openContentMenu({ + it('can release users', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'user', resource: { @@ -408,8 +413,8 @@ describe('ContentMenu.vue', () => { expect(openModalSpy).toHaveBeenCalledWith('release') }) - it('can release organizations', () => { - const wrapper = openContentMenu({ + it('can release organizations', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'organization', resource: { @@ -428,10 +433,10 @@ describe('ContentMenu.vue', () => { }) describe('user', () => { - it('can access settings', () => { + it('can access settings', async () => { getters['auth/isAdmin'] = () => false getters['auth/isModerator'] = () => false - const wrapper = openContentMenu({ + const wrapper = await openContentMenu({ isOwner: true, resourceType: 'user', resource: { @@ -448,8 +453,8 @@ describe('ContentMenu.vue', () => { ).toBe('/settings') }) - it('can mute other users', () => { - const wrapper = openContentMenu({ + it('can mute other users', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'user', resource: { @@ -472,8 +477,8 @@ describe('ContentMenu.vue', () => { ]) }) - it('can unmute muted users', () => { - const wrapper = openContentMenu({ + it('can unmute muted users', async () => { + const wrapper = await openContentMenu({ isOwner: false, resourceType: 'user', resource: { diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 1ef1777fe..8ebd7d4de 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import ContributionForm from './ContributionForm.vue' import Vuex from 'vuex' @@ -11,9 +11,11 @@ global.MutationObserver = MutationObserver const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' -config.stubs['v-popover'] = '' +const stubs = { + 'client-only': true, + 'nuxt-link': true, + 'v-popover': true, +} describe('ContributionForm.vue', () => { let wrapper, postTitleInput, expectedParams, cancelBtn, mocks, propsData @@ -88,6 +90,7 @@ describe('ContributionForm.vue', () => { localVue, store, propsData, + stubs, }) } diff --git a/webapp/components/DeleteData/DeleteData.spec.js b/webapp/components/DeleteData/DeleteData.spec.js index c540c9832..f34b2fe6f 100644 --- a/webapp/components/DeleteData/DeleteData.spec.js +++ b/webapp/components/DeleteData/DeleteData.spec.js @@ -115,9 +115,9 @@ describe('DeleteData.vue', () => { enableContributionDeletionCheckbox = wrapper.find( '[data-test="contributions-deletion-checkbox"]', ) - enableContributionDeletionCheckbox.trigger('click') + enableContributionDeletionCheckbox.setChecked(true) enableCommentDeletionCheckbox = wrapper.find('[data-test="comments-deletion-checkbox"]') - enableCommentDeletionCheckbox.trigger('click') + enableCommentDeletionCheckbox.setChecked(true) deleteAccountBtn.trigger('click') expect(mocks.$apollo.mutate).toHaveBeenCalledWith( expect.objectContaining({ @@ -133,7 +133,7 @@ describe('DeleteData.vue', () => { enableContributionDeletionCheckbox = wrapper.find( '[data-test="contributions-deletion-checkbox"]', ) - enableContributionDeletionCheckbox.trigger('click') + enableContributionDeletionCheckbox.setChecked(true) deleteAccountBtn.trigger('click') expect(mocks.$apollo.mutate).toHaveBeenCalledWith( expect.objectContaining({ @@ -147,7 +147,7 @@ describe('DeleteData.vue', () => { it("deletes a user's comments if requested", () => { enableCommentDeletionCheckbox = wrapper.find('[data-test="comments-deletion-checkbox"]') - enableCommentDeletionCheckbox.trigger('click') + enableCommentDeletionCheckbox.setChecked(true) deleteAccountBtn.trigger('click') expect(mocks.$apollo.mutate).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/webapp/components/Editor/Editor.spec.js b/webapp/components/Editor/Editor.spec.js index f51c5782f..98c287ced 100644 --- a/webapp/components/Editor/Editor.spec.js +++ b/webapp/components/Editor/Editor.spec.js @@ -35,7 +35,7 @@ describe('Editor.vue', () => { describe('mount', () => { it('renders', () => { - expect(Wrapper().is('div')).toBe(true) + expect(Wrapper().element.tagName).toBe('DIV') }) describe('given a piece of text', () => { diff --git a/webapp/components/Embed/EmbedComponent.spec.js b/webapp/components/Embed/EmbedComponent.spec.js index cd3526368..0d20f969f 100644 --- a/webapp/components/Embed/EmbedComponent.spec.js +++ b/webapp/components/Embed/EmbedComponent.spec.js @@ -160,7 +160,7 @@ describe('EmbedComponent.vue', () => { describe('sets permanently', () => { beforeEach(() => { - wrapper.find('input[type=checkbox]').trigger('click') + wrapper.find('input[type=checkbox]').setChecked(true) wrapper.find('[data-test="play-now-button"]').trigger('click') }) diff --git a/webapp/components/EnterNonce/EnterNonce.spec.js b/webapp/components/EnterNonce/EnterNonce.spec.js index a1f2e6b94..e75c8cf49 100644 --- a/webapp/components/EnterNonce/EnterNonce.spec.js +++ b/webapp/components/EnterNonce/EnterNonce.spec.js @@ -19,7 +19,9 @@ describe('EnterNonce ', () => { }) describe('mount', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) Wrapper = () => { return mount(EnterNonce, { 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/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/InviteButton/InviteButton.spec.js b/webapp/components/InviteButton/InviteButton.spec.js index f28045612..fde1afd1d 100644 --- a/webapp/components/InviteButton/InviteButton.spec.js +++ b/webapp/components/InviteButton/InviteButton.spec.js @@ -1,7 +1,9 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import InviteButton from './InviteButton.vue' -config.stubs['v-popover'] = '' +const stubs = { + 'v-popover': true, +} describe('InviteButton.vue', () => { let wrapper @@ -22,7 +24,7 @@ describe('InviteButton.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(InviteButton, { mocks, propsData }) + return mount(InviteButton, { mocks, propsData, stubs }) } beforeEach(() => { diff --git a/webapp/components/LocaleSwitch/LocaleSwitch.spec.js b/webapp/components/LocaleSwitch/LocaleSwitch.spec.js index 800309bfc..158624f18 100644 --- a/webapp/components/LocaleSwitch/LocaleSwitch.spec.js +++ b/webapp/components/LocaleSwitch/LocaleSwitch.spec.js @@ -1,11 +1,13 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import LocaleSwitch from './LocaleSwitch.vue' import Vuex from 'vuex' const localVue = global.localVue -config.stubs['client-only'] = '' +const stubs = { + 'client-only': true, +} describe('LocaleSwitch.vue', () => { let wrapper, mocks, computed, deutschLanguageItem, getters @@ -65,7 +67,7 @@ describe('LocaleSwitch.vue', () => { const store = new Vuex.Store({ getters, }) - return mount(LocaleSwitch, { mocks, localVue, computed, store }) + return mount(LocaleSwitch, { mocks, localVue, computed, store, stubs }) } describe('with current user', () => { diff --git a/webapp/components/LoginButton/LoginButton.spec.js b/webapp/components/LoginButton/LoginButton.spec.js index 62e663714..c288b73d3 100644 --- a/webapp/components/LoginButton/LoginButton.spec.js +++ b/webapp/components/LoginButton/LoginButton.spec.js @@ -1,7 +1,9 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import LoginButton from './LoginButton.vue' -config.stubs['v-popover'] = '' +const stubs = { + 'v-popover': true, +} describe('LoginButton.vue', () => { let wrapper @@ -22,7 +24,7 @@ describe('LoginButton.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(LoginButton, { mocks, propsData }) + return mount(LoginButton, { mocks, propsData, stubs }) } beforeEach(() => { diff --git a/webapp/components/LoginForm/LoginForm.spec.js b/webapp/components/LoginForm/LoginForm.spec.js index 10fc2c622..e0972b453 100644 --- a/webapp/components/LoginForm/LoginForm.spec.js +++ b/webapp/components/LoginForm/LoginForm.spec.js @@ -2,15 +2,17 @@ import Vue from 'vue' import LoginForm from './LoginForm.vue' import Styleguide from '@human-connection/styleguide' import Vuex from 'vuex' -import { config, mount, createLocalVue } from '@vue/test-utils' +import { mount, createLocalVue } from '@vue/test-utils' const localVue = createLocalVue() localVue.use(Vuex) localVue.use(Styleguide) -config.stubs['nuxt-link'] = '' -config.stubs['locale-switch'] = '' -config.stubs['client-only'] = '' +const stubs = { + 'nuxt-link': true, + 'locale-switch': true, + 'client-only': true, +} const authUserMock = jest.fn().mockReturnValue({ activeCategories: [] }) @@ -46,7 +48,7 @@ describe('LoginForm', () => { error: jest.fn(), }, } - return mount(LoginForm, { mocks, localVue, propsData, store }) + return mount(LoginForm, { mocks, localVue, propsData, store, stubs }) } describe('fill in email and password and submit', () => { diff --git a/webapp/components/MasonryGrid/MasonryGridItem.spec.js b/webapp/components/MasonryGrid/MasonryGridItem.spec.js index 86233efc9..26309f00d 100644 --- a/webapp/components/MasonryGrid/MasonryGridItem.spec.js +++ b/webapp/components/MasonryGrid/MasonryGridItem.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import MasonryGridItem from './MasonryGridItem' const localVue = global.localVue -config.stubs['ds-grid-item'] = '' +const stubs = { + 'ds-grid-item': true, +} describe('MasonryGridItem', () => { let wrapper @@ -11,34 +13,34 @@ describe('MasonryGridItem', () => { describe('given an imageAspectRatio', () => { it('sets the initial rowSpan to 13 when the ratio is higher than 1.3', () => { const propsData = { imageAspectRatio: 2 } - wrapper = mount(MasonryGridItem, { localVue, propsData }) + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) expect(wrapper.vm.rowSpan).toBe(13) }) it('sets the initial rowSpan to 15 when the ratio is between 1.3 and 1', () => { const propsData = { imageAspectRatio: 1.1 } - wrapper = mount(MasonryGridItem, { localVue, propsData }) + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) expect(wrapper.vm.rowSpan).toBe(15) }) it('sets the initial rowSpan to 18 when the ratio is between 1 and 0.7', () => { const propsData = { imageAspectRatio: 0.7 } - wrapper = mount(MasonryGridItem, { localVue, propsData }) + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) expect(wrapper.vm.rowSpan).toBe(18) }) it('sets the initial rowSpan to 25 when the ratio is lower than 0.7', () => { const propsData = { imageAspectRatio: 0.3 } - wrapper = mount(MasonryGridItem, { localVue, propsData }) + wrapper = mount(MasonryGridItem, { localVue, propsData, stubs }) expect(wrapper.vm.rowSpan).toBe(25) }) describe('given no aspect ratio', () => { it('sets the initial rowSpan to 8 when not given an imageAspectRatio', () => { - wrapper = mount(MasonryGridItem, { localVue }) + wrapper = mount(MasonryGridItem, { localVue, stubs }) expect(wrapper.vm.rowSpan).toBe(8) }) }) diff --git a/webapp/components/Modal/ConfirmModal.spec.js b/webapp/components/Modal/ConfirmModal.spec.js index 6d7d0ccf6..28fef3058 100644 --- a/webapp/components/Modal/ConfirmModal.spec.js +++ b/webapp/components/Modal/ConfirmModal.spec.js @@ -1,11 +1,13 @@ -import { config, shallowMount, mount } from '@vue/test-utils' +import { shallowMount, mount } from '@vue/test-utils' import ConfirmModal from './ConfirmModal.vue' import { postMenuModalsData } from '~/components/utils/PostHelpers' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' +const stubs = { + 'sweetalert-icon': true, +} describe('ConfirmModal.vue', () => { let Wrapper @@ -41,6 +43,7 @@ describe('ConfirmModal.vue', () => { propsData, mocks, localVue, + stubs, }) } @@ -90,10 +93,13 @@ describe('ConfirmModal.vue', () => { propsData, mocks, localVue, + stubs, }) } - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('given post id', () => { beforeEach(() => { diff --git a/webapp/components/Modal/DeleteUserModal.spec.js b/webapp/components/Modal/DeleteUserModal.spec.js index d2f28e8b0..1a1c152cd 100644 --- a/webapp/components/Modal/DeleteUserModal.spec.js +++ b/webapp/components/Modal/DeleteUserModal.spec.js @@ -1,9 +1,12 @@ -import { config, mount, shallowMount } from '@vue/test-utils' +import { mount, shallowMount } from '@vue/test-utils' import Vuex from 'vuex' import DeleteUserModal from './DeleteUserModal.vue' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' -config.stubs['nuxt-link'] = '' + +const stubs = { + 'sweetalert-icon': true, + 'nuxt-link': true, +} localVue.use(DeleteUserModal) @@ -49,6 +52,7 @@ describe('DeleteUserModal.vue', () => { mocks, store, localVue, + stubs, }) } @@ -74,9 +78,12 @@ describe('DeleteUserModal.vue', () => { mocks, store, localVue, + stubs, }) } - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('given another user', () => { beforeEach(() => { diff --git a/webapp/components/Modal/DisableModal.spec.js b/webapp/components/Modal/DisableModal.spec.js index b7e52b5a0..0a7ffe25b 100644 --- a/webapp/components/Modal/DisableModal.spec.js +++ b/webapp/components/Modal/DisableModal.spec.js @@ -102,7 +102,9 @@ describe('DisableModal.vue', () => { localVue, }) } - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('given id', () => { beforeEach(() => { diff --git a/webapp/components/Modal/ReportModal.spec.js b/webapp/components/Modal/ReportModal.spec.js index 999adacb4..d993e8103 100644 --- a/webapp/components/Modal/ReportModal.spec.js +++ b/webapp/components/Modal/ReportModal.spec.js @@ -1,10 +1,12 @@ -import { config, shallowMount, mount } from '@vue/test-utils' +import { shallowMount, mount } from '@vue/test-utils' import ReportModal from './ReportModal.vue' import Vue from 'vue' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' +const stubs = { + 'sweetalert-icon': true, +} describe('ReportModal.vue', () => { let wrapper @@ -39,6 +41,7 @@ describe('ReportModal.vue', () => { propsData, mocks, localVue, + stubs, }) } @@ -109,13 +112,16 @@ describe('ReportModal.vue', () => { propsData, mocks, localVue, + stubs, }) } - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) it('renders', () => { - expect(Wrapper().is('div')).toBe(true) + expect(Wrapper().element.tagName).toBe('DIV') }) describe('given id', () => { diff --git a/webapp/components/Notification/Notification.spec.js b/webapp/components/Notification/Notification.spec.js index 879bbfb7d..844f78e71 100644 --- a/webapp/components/Notification/Notification.spec.js +++ b/webapp/components/Notification/Notification.spec.js @@ -1,12 +1,10 @@ -import { config, mount, RouterLinkStub } from '@vue/test-utils' +import { mount, RouterLinkStub } from '@vue/test-utils' import Notification from './Notification.vue' import Vuex from 'vuex' const localVue = global.localVue -config.stubs['client-only'] = '' - describe('Notification', () => { let stubs let getters @@ -20,6 +18,7 @@ describe('Notification', () => { } stubs = { NuxtLink: RouterLinkStub, + 'client-only': true, } getters = { 'auth/user': () => { diff --git a/webapp/components/NotificationList/NotificationList.spec.js b/webapp/components/NotificationList/NotificationList.spec.js index 219c1fdbb..4c6d3690a 100644 --- a/webapp/components/NotificationList/NotificationList.spec.js +++ b/webapp/components/NotificationList/NotificationList.spec.js @@ -1,4 +1,4 @@ -import { config, shallowMount, mount, RouterLinkStub } from '@vue/test-utils' +import { shallowMount, mount, RouterLinkStub } from '@vue/test-utils' import NotificationList from './NotificationList' import Notification from '../Notification/Notification' import Vuex from 'vuex' @@ -9,9 +9,6 @@ const localVue = global.localVue localVue.filter('truncate', (string) => string) -config.stubs['client-only'] = '' -config.stubs['v-popover'] = '' - describe('NotificationList.vue', () => { let wrapper let mocks @@ -33,6 +30,8 @@ describe('NotificationList.vue', () => { } stubs = { NuxtLink: RouterLinkStub, + 'client-only': true, + 'v-popover': true, } propsData = { notifications } }) @@ -44,6 +43,7 @@ describe('NotificationList.vue', () => { mocks, store, localVue, + stubs, }) } diff --git a/webapp/components/NotificationMenu/NotificationMenu.spec.js b/webapp/components/NotificationMenu/NotificationMenu.spec.js index 3986471fd..448ea37e4 100644 --- a/webapp/components/NotificationMenu/NotificationMenu.spec.js +++ b/webapp/components/NotificationMenu/NotificationMenu.spec.js @@ -1,12 +1,10 @@ -import { config, mount, RouterLinkStub } from '@vue/test-utils' +import { mount, RouterLinkStub } from '@vue/test-utils' import NotificationMenu from './NotificationMenu' const localVue = global.localVue localVue.filter('truncate', (string) => string) -config.stubs.dropdown = '' - describe('NotificationMenu.vue', () => { let wrapper let mocks @@ -23,6 +21,8 @@ describe('NotificationMenu.vue', () => { } stubs = { NuxtLink: RouterLinkStub, + UserTeaser: true, + 'client-only': true, } }) @@ -38,13 +38,13 @@ describe('NotificationMenu.vue', () => { it('renders as link without counter', () => { wrapper = Wrapper() - expect(wrapper.is('a.notifications-menu')).toBe(true) + expect(wrapper.classes('notifications-menu')).toBe(true) expect(() => wrapper.get('.count')).toThrow() }) it('no dropdown is rendered', () => { wrapper = Wrapper() - expect(wrapper.contains('.dropdown')).toBe(false) + expect(wrapper.find('.dropdown').exists()).toBe(false) }) describe('given only read notifications', () => { @@ -73,13 +73,13 @@ describe('NotificationMenu.vue', () => { it('renders as link without counter', () => { wrapper = Wrapper() - expect(wrapper.is('a.notifications-menu')).toBe(true) + expect(wrapper.classes('notifications-menu')).toBe(true) expect(() => wrapper.get('.count')).toThrow() }) it('no dropdown is rendered', () => { wrapper = Wrapper() - expect(wrapper.contains('.dropdown')).toBe(false) + expect(wrapper.find('.dropdown').exists()).toBe(false) }) }) @@ -101,6 +101,14 @@ describe('NotificationMenu.vue', () => { name: 'John Doe', }, }, + from: { + title: 'Title', + author: { + id: 'reporter', + slug: 'reporter', + name: 'reporter', + }, + }, }, { id: 'notification-42', @@ -115,6 +123,14 @@ describe('NotificationMenu.vue', () => { name: 'John Doe', }, }, + from: { + title: 'Title', + author: { + id: 'reporter', + slug: 'reporter', + name: 'reporter', + }, + }, }, { id: 'notification-43', @@ -129,6 +145,14 @@ describe('NotificationMenu.vue', () => { name: 'John Doe', }, }, + from: { + title: 'Title', + author: { + id: 'reporter', + slug: 'reporter', + name: 'reporter', + }, + }, }, ], } diff --git a/webapp/components/NotificationsTable/NotificationsTable.spec.js b/webapp/components/NotificationsTable/NotificationsTable.spec.js index b502b5982..e48610034 100644 --- a/webapp/components/NotificationsTable/NotificationsTable.spec.js +++ b/webapp/components/NotificationsTable/NotificationsTable.spec.js @@ -1,4 +1,4 @@ -import { config, mount, RouterLinkStub } from '@vue/test-utils' +import { mount, RouterLinkStub } from '@vue/test-utils' import Vuex from 'vuex' import NotificationsTable from './NotificationsTable' @@ -8,8 +8,6 @@ const localVue = global.localVue localVue.filter('truncate', (string) => string) -config.stubs['client-only'] = '' - describe('NotificationsTable.vue', () => { let wrapper, mocks, propsData, stubs const postNotification = notifications[0] @@ -21,6 +19,7 @@ describe('NotificationsTable.vue', () => { } stubs = { NuxtLink: RouterLinkStub, + 'client-only': true, } propsData = {} }) diff --git a/webapp/components/PageFooter/PageFooter.spec.js b/webapp/components/PageFooter/PageFooter.spec.js index 53302192a..b02541fbf 100644 --- a/webapp/components/PageFooter/PageFooter.spec.js +++ b/webapp/components/PageFooter/PageFooter.spec.js @@ -1,10 +1,14 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import PageFooter from './PageFooter.vue' import linksDefault from '~/constants/links.js' const localVue = global.localVue -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': { + template: '', + }, +} describe('PageFooter.vue', () => { let mocks @@ -21,7 +25,7 @@ describe('PageFooter.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(PageFooter, { mocks, localVue }) + return mount(PageFooter, { mocks, localVue, stubs }) } describe('links.js', () => { diff --git a/webapp/components/Password/Change.spec.js b/webapp/components/Password/Change.spec.js index 95b7c1a3a..ea5c392a9 100644 --- a/webapp/components/Password/Change.spec.js +++ b/webapp/components/Password/Change.spec.js @@ -90,9 +90,8 @@ describe('ChangePassword.vue', () => { }) describe('submit form', () => { - beforeEach(async (done) => { + beforeEach(async () => { await wrapper.find('form').trigger('submit') - done() }) it('calls changePassword mutation', () => { diff --git a/webapp/components/PasswordReset/ChangePassword.spec.js b/webapp/components/PasswordReset/ChangePassword.spec.js index cef110798..f885203c8 100644 --- a/webapp/components/PasswordReset/ChangePassword.spec.js +++ b/webapp/components/PasswordReset/ChangePassword.spec.js @@ -1,9 +1,11 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import ChangePassword from './ChangePassword' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' +const stubs = { + 'sweetalert-icon': true, +} describe('ChangePassword ', () => { let wrapper @@ -27,13 +29,16 @@ describe('ChangePassword ', () => { }) describe('mount', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) Wrapper = () => { return mount(ChangePassword, { mocks, propsData, localVue, + stubs, }) } diff --git a/webapp/components/PasswordReset/Request.spec.js b/webapp/components/PasswordReset/Request.spec.js index e601030c6..a30ba70b4 100644 --- a/webapp/components/PasswordReset/Request.spec.js +++ b/webapp/components/PasswordReset/Request.spec.js @@ -1,12 +1,8 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Request from './Request' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' - describe('Request', () => { let wrapper, Wrapper, mocks, stubs @@ -27,11 +23,16 @@ describe('Request', () => { } stubs = { LocaleSwitch: "
", + 'sweetalert-icon': true, + 'client-only': true, + 'nuxt-link': true, } }) describe('mount', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) Wrapper = () => { return mount(Request, { diff --git a/webapp/components/PostTeaser/PostTeaser.spec.js b/webapp/components/PostTeaser/PostTeaser.spec.js index 546c4581d..7791c62f0 100644 --- a/webapp/components/PostTeaser/PostTeaser.spec.js +++ b/webapp/components/PostTeaser/PostTeaser.spec.js @@ -1,4 +1,4 @@ -import { config, shallowMount, mount, RouterLinkStub } from '@vue/test-utils' +import { shallowMount, mount, RouterLinkStub } from '@vue/test-utils' import Vuex from 'vuex' @@ -6,9 +6,6 @@ import PostTeaser from './PostTeaser.vue' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['v-popover'] = '' - describe('PostTeaser', () => { let store let stubs @@ -35,6 +32,8 @@ describe('PostTeaser', () => { } stubs = { NuxtLink: RouterLinkStub, + 'client-only': true, + 'v-popover': true, } mocks = { $t: jest.fn(), @@ -77,7 +76,9 @@ describe('PostTeaser', () => { spy.mockReset() }) - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('test Post callbacks', () => { beforeEach(() => { diff --git a/webapp/components/Registration/Signup.spec.js b/webapp/components/Registration/Signup.spec.js index dda0cbb9d..7ef2dc994 100644 --- a/webapp/components/Registration/Signup.spec.js +++ b/webapp/components/Registration/Signup.spec.js @@ -1,10 +1,12 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Signup, { SignupMutation } from './Signup' const localVue = global.localVue -config.stubs['sweetalert-icon'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'sweetalert-icon': true, + 'nuxt-link': true, +} describe('Signup', () => { let wrapper @@ -28,13 +30,16 @@ describe('Signup', () => { }) describe('mount', () => { - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) Wrapper = () => { return mount(Signup, { mocks, propsData, localVue, + stubs, }) } diff --git a/webapp/components/RelativeDateTime/spec.js b/webapp/components/RelativeDateTime/spec.js index 833baae3a..b0dd687b2 100644 --- a/webapp/components/RelativeDateTime/spec.js +++ b/webapp/components/RelativeDateTime/spec.js @@ -42,7 +42,7 @@ describe('RelativeDateTime', () => { }) it('renders', () => { - expect(Wrapper().is('span')).toBe(true) + expect(Wrapper().element.tagName).toBe('SPAN') }) describe("locale == 'en'", () => { diff --git a/webapp/components/ReleaseModal/ReleaseModal.spec.js b/webapp/components/ReleaseModal/ReleaseModal.spec.js index 9cded646f..a976e37e5 100644 --- a/webapp/components/ReleaseModal/ReleaseModal.spec.js +++ b/webapp/components/ReleaseModal/ReleaseModal.spec.js @@ -100,7 +100,9 @@ describe('ReleaseModal.vue', () => { }) } - beforeEach(jest.useFakeTimers) + beforeEach(() => { + jest.useFakeTimers() + }) describe('given id', () => { beforeEach(() => { diff --git a/webapp/components/SocialMedia/SocialMedia.spec.js b/webapp/components/SocialMedia/SocialMedia.spec.js index 420fbeaf2..5aa8220ae 100644 --- a/webapp/components/SocialMedia/SocialMedia.spec.js +++ b/webapp/components/SocialMedia/SocialMedia.spec.js @@ -1,8 +1,10 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import SocialMedia from './SocialMedia.vue' -config.stubs['ds-space'] = '' -config.stubs['ds-text'] = '' +const stubs = { + 'ds-space': true, + 'ds-text': true, +} describe('SocialMedia.vue', () => { let propsData @@ -18,7 +20,7 @@ describe('SocialMedia.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(SocialMedia, { propsData, mocks }) + return mount(SocialMedia, { propsData, mocks, stubs }) } describe('socialMedia card title', () => { diff --git a/webapp/components/_new/features/SearchResults/SearchResults.spec.js b/webapp/components/_new/features/SearchResults/SearchResults.spec.js index 19653fcac..ace02bd46 100644 --- a/webapp/components/_new/features/SearchResults/SearchResults.spec.js +++ b/webapp/components/_new/features/SearchResults/SearchResults.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import SearchResults from './SearchResults' import helpers from '~/storybook/helpers' @@ -9,8 +9,10 @@ const localVue = global.localVue localVue.directive('scrollTo', jest.fn()) -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} describe('SearchResults', () => { let mocks, getters, propsData, wrapper @@ -18,7 +20,7 @@ describe('SearchResults', () => { const store = new Vuex.Store({ getters, }) - return mount(SearchResults, { mocks, localVue, propsData, store }) + return mount(SearchResults, { mocks, localVue, propsData, store, stubs }) } beforeEach(() => { diff --git a/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js b/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js index 76ce9665a..f545839ef 100644 --- a/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js +++ b/webapp/components/_new/generic/TabNavigation/TabNavigation.spec.js @@ -1,14 +1,16 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import TabNavigation from './TabNavigation' const localVue = global.localVue -config.stubs['client-only'] = '' +const stubs = { + 'client-only': true, +} describe('TabNavigation', () => { let mocks, propsData, wrapper const Wrapper = () => { - return mount(TabNavigation, { mocks, localVue, propsData }) + return mount(TabNavigation, { mocks, localVue, propsData, stubs }) } beforeEach(() => { diff --git a/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js b/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js index 4931ea6c6..7a99e85aa 100644 --- a/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js +++ b/webapp/components/features/FiledReportsTable/FiledReportsTable.spec.js @@ -1,4 +1,4 @@ -import { config, mount, RouterLinkStub } from '@vue/test-utils' +import { mount, RouterLinkStub } from '@vue/test-utils' import Vuex from 'vuex' import FiledReportsTable from './FiledReportsTable' import { reports } from '~/components/features/ReportList/ReportList.story.js' @@ -7,8 +7,6 @@ const localVue = global.localVue localVue.filter('truncate', (string) => string) -config.stubs['client-only'] = '' - describe('FiledReportsTable.vue', () => { let wrapper, mocks, propsData, stubs, filed @@ -18,6 +16,7 @@ describe('FiledReportsTable.vue', () => { } stubs = { NuxtLink: RouterLinkStub, + 'client-only': true, } propsData = {} }) diff --git a/webapp/components/features/ProfileList/FollowList.spec.js b/webapp/components/features/ProfileList/FollowList.spec.js index 44a855eed..07214ae38 100644 --- a/webapp/components/features/ProfileList/FollowList.spec.js +++ b/webapp/components/features/ProfileList/FollowList.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import helpers from '~/storybook/helpers' @@ -6,9 +6,11 @@ import FollowList from './FollowList.vue' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['ds-space'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'client-only': true, + 'ds-space': true, + 'nuxt-link': true, +} const user = { ...helpers.fakeUser()[0], @@ -45,6 +47,7 @@ describe('FollowList.vue', () => { $t: jest.fn((str) => str), }, localVue, + stubs, }) beforeAll(() => { @@ -138,11 +141,11 @@ describe('FollowList.vue', () => { }) it('renders the user-teasers as an overflowing list', () => { - expect(wrapper.find('.--overflow').is('ul')).toBe(true) + expect(wrapper.find('.--overflow').element.tagName).toBe('UL') }) it('renders a filter text input', () => { - expect(wrapper.find('[name="followingFilter"]').is('input')).toBe(true) + expect(wrapper.find('[name="followingFilter"]').element.tagName).toBe('INPUT') }) }) }) diff --git a/webapp/components/features/ReportList/ReportList.spec.js b/webapp/components/features/ReportList/ReportList.spec.js index d4dbc7132..84848ce82 100644 --- a/webapp/components/features/ReportList/ReportList.spec.js +++ b/webapp/components/features/ReportList/ReportList.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import ReportList from './ReportList' import { reports } from './ReportList.story' @@ -7,8 +7,10 @@ import DropdownFilter from '~/components/DropdownFilter/DropdownFilter' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} describe('ReportList', () => { let mocks, mutations, getters, wrapper @@ -45,7 +47,7 @@ describe('ReportList', () => { mutations, getters, }) - return mount(ReportList, { mocks, localVue, store }) + return mount(ReportList, { mocks, localVue, store, stubs }) } describe('renders children components', () => { diff --git a/webapp/components/features/ReportRow/ReportRow.spec.js b/webapp/components/features/ReportRow/ReportRow.spec.js index b541a40d9..6a4bf922e 100644 --- a/webapp/components/features/ReportRow/ReportRow.spec.js +++ b/webapp/components/features/ReportRow/ReportRow.spec.js @@ -1,4 +1,4 @@ -import { config, mount, RouterLinkStub } from '@vue/test-utils' +import { mount, RouterLinkStub } from '@vue/test-utils' import Vuex from 'vuex' import ReportRow from './ReportRow.vue' import BaseIcon from '~/components/_new/generic/BaseIcon/BaseIcon' @@ -6,8 +6,6 @@ import { reports } from '~/components/features/ReportList/ReportList.story.js' const localVue = global.localVue -config.stubs['client-only'] = '' - describe('ReportRow', () => { let propsData, mocks, stubs, getters, wrapper @@ -18,6 +16,7 @@ describe('ReportRow', () => { } stubs = { NuxtLink: RouterLinkStub, + 'client-only': true, } getters = { 'auth/user': () => { diff --git a/webapp/components/features/ReportsTable/ReportsTable.spec.js b/webapp/components/features/ReportsTable/ReportsTable.spec.js index c80e4fea5..688139eec 100644 --- a/webapp/components/features/ReportsTable/ReportsTable.spec.js +++ b/webapp/components/features/ReportsTable/ReportsTable.spec.js @@ -1,12 +1,14 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import ReportsTable from './ReportsTable.vue' import { reports } from '~/components/features/ReportList/ReportList.story.js' const localVue = global.localVue -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + 'client-only': true, + 'nuxt-link': true, +} describe('ReportsTable', () => { let propsData, mocks, getters, wrapper, reportsTable @@ -29,7 +31,7 @@ describe('ReportsTable', () => { const store = new Vuex.Store({ getters, }) - return mount(ReportsTable, { propsData, mocks, localVue, store }) + return mount(ReportsTable, { propsData, mocks, localVue, store, stubs }) } describe('given no reports', () => { diff --git a/webapp/components/features/SearchField/SearchField.spec.js b/webapp/components/features/SearchField/SearchField.spec.js index 140b55caa..ec5276212 100644 --- a/webapp/components/features/SearchField/SearchField.spec.js +++ b/webapp/components/features/SearchField/SearchField.spec.js @@ -1,4 +1,4 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Vuex from 'vuex' import SearchField from './SearchField.vue' import SearchableInput from '~/components/generic/SearchableInput/SearchableInput' @@ -7,7 +7,10 @@ const localVue = global.localVue localVue.filter('truncate', () => 'truncated string') localVue.filter('dateTime', () => Date.now) -config.stubs['nuxt-link'] = '' + +const stubs = { + 'nuxt-link': true, +} describe('SearchField.vue', () => { let mocks, wrapper, getters @@ -26,7 +29,7 @@ describe('SearchField.vue', () => { const store = new Vuex.Store({ getters, }) - return mount(SearchField, { mocks, localVue, store }) + return mount(SearchField, { mocks, localVue, store, stubs }) } describe('mount', () => { diff --git a/webapp/components/generic/SearchPost/SearchPost.spec.js b/webapp/components/generic/SearchPost/SearchPost.spec.js index 3e05c9d74..3c690e39c 100644 --- a/webapp/components/generic/SearchPost/SearchPost.spec.js +++ b/webapp/components/generic/SearchPost/SearchPost.spec.js @@ -37,11 +37,11 @@ describe('SearchPost.vue', () => { }) it('renders post commentsCount', () => { - expect(counts.text()).toContain(propsData.option.commentsCount) + expect(counts.text()).toContain(propsData.option.commentsCount.toString()) }) it('renders post shoutedCount', () => { - expect(counts.text()).toContain(propsData.option.shoutedCount) + expect(counts.text()).toContain(propsData.option.shoutedCount.toString()) }) it('renders post author', () => { diff --git a/webapp/components/generic/SearchableInput/SearchableInput.spec.js b/webapp/components/generic/SearchableInput/SearchableInput.spec.js index e0e9f9831..cda9150b8 100644 --- a/webapp/components/generic/SearchableInput/SearchableInput.spec.js +++ b/webapp/components/generic/SearchableInput/SearchableInput.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 SearchableInput from './SearchableInput' @@ -8,7 +8,10 @@ const localVue = global.localVue localVue.filter('truncate', () => 'truncated string') localVue.filter('dateTime', () => Date.now) -config.stubs['nuxt-link'] = '' + +const stubs = { + 'nuxt-link': true, +} describe('SearchableInput.vue', () => { let mocks, propsData, getters, wrapper @@ -28,7 +31,7 @@ describe('SearchableInput.vue', () => { const store = new Vuex.Store({ getters, }) - return mount(SearchableInput, { mocks, localVue, propsData, store }) + return mount(SearchableInput, { mocks, localVue, propsData, store, stubs }) } describe('mount', () => { From 6eb5ad25af59e20ac462d0d309de870d861b5c2a Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 15 Feb 2023 11:12:19 +0100 Subject: [PATCH 288/344] get all components tests running --- webapp/components/Badges.spec.js | 4 ++-- webapp/components/Category/index.spec.js | 9 ++++---- .../ContentMenu/GroupContentMenu.spec.js | 10 ++++++--- .../ContributionForm/ContributionForm.spec.js | 2 +- webapp/components/Editor/nodes/Embed.spec.js | 2 +- .../InviteButton/InviteButton.spec.js | 8 ++++--- .../LoginButton/LoginButton.spec.js | 5 +++-- webapp/components/Modal.spec.js | 22 +++++++++---------- .../NotificationList/NotificationList.spec.js | 4 ++-- .../components/PasswordReset/Request.spec.js | 2 +- .../generic/CounterIcon/CounterIcon.spec.js | 4 ++-- .../ProfileAvatar/ProfileAvatar.spec.js | 6 ++--- .../features/ReportList/ReportList.spec.js | 6 ++--- .../features/ReportRow/ReportRow.spec.js | 12 +++++----- .../features/SearchField/SearchField.spec.js | 2 +- 15 files changed, 54 insertions(+), 44 deletions(-) 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/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/ContentMenu/GroupContentMenu.spec.js b/webapp/components/ContentMenu/GroupContentMenu.spec.js index 8b17b24b1..49a66aaac 100644 --- a/webapp/components/ContentMenu/GroupContentMenu.spec.js +++ b/webapp/components/ContentMenu/GroupContentMenu.spec.js @@ -1,9 +1,13 @@ -import { config, mount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import GroupContentMenu from './GroupContentMenu.vue' const localVue = global.localVue -config.stubs['router-link'] = '' +const stubs = { + 'router-link': { + template: '', + }, +} const propsData = { usage: 'groupTeaser', @@ -24,7 +28,7 @@ describe('GroupContentMenu', () => { describe('mount', () => { const Wrapper = () => { - return mount(GroupContentMenu, { propsData, mocks, localVue }) + return mount(GroupContentMenu, { propsData, mocks, localVue, stubs }) } beforeEach(() => { diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 8ebd7d4de..ef3b47c37 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -166,7 +166,7 @@ describe('ContributionForm.vue', () => { .mockImplementation(function () { this.onload({ target: { result: 'someUrlToImage' } }) }) - wrapper.find(ImageUploader).vm.$emit('addHeroImage', imageUpload) + wrapper.findComponent(ImageUploader).vm.$emit('addHeroImage', imageUpload) await wrapper.find('form').trigger('submit') expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) expect(spy).toHaveBeenCalledWith(imageUpload) diff --git a/webapp/components/Editor/nodes/Embed.spec.js b/webapp/components/Editor/nodes/Embed.spec.js index 372b189f9..05edb1296 100644 --- a/webapp/components/Editor/nodes/Embed.spec.js +++ b/webapp/components/Editor/nodes/Embed.spec.js @@ -42,7 +42,7 @@ describe('Embed.vue', () => { propsData.node = { attrs: { href: 'https://www.youtube.com/watch?v=qkdXAtO40Fo' } } const wrapper = Wrapper({ propsData }) await wrapper.html() - expect(wrapper.contains('embed-component-stub')).toBe(true) + expect(wrapper.find('embed-component-stub').exists()).toBe(true) }) }) diff --git a/webapp/components/InviteButton/InviteButton.spec.js b/webapp/components/InviteButton/InviteButton.spec.js index fde1afd1d..cb73ecfd1 100644 --- a/webapp/components/InviteButton/InviteButton.spec.js +++ b/webapp/components/InviteButton/InviteButton.spec.js @@ -2,7 +2,9 @@ import { mount } from '@vue/test-utils' import InviteButton from './InviteButton.vue' const stubs = { - 'v-popover': true, + 'v-popover': { + template: '', + }, } describe('InviteButton.vue', () => { @@ -32,12 +34,12 @@ describe('InviteButton.vue', () => { }) it('renders', () => { - expect(wrapper.contains('.invite-button')).toBe(true) + expect(wrapper.find('.invite-button').exists()).toBe(true) }) it('open popup', () => { wrapper.find('.base-button').trigger('click') - expect(wrapper.contains('.invite-button')).toBe(true) + expect(wrapper.find('.invite-button').exists()).toBe(true) }) it('invite codes not available', async () => { diff --git a/webapp/components/LoginButton/LoginButton.spec.js b/webapp/components/LoginButton/LoginButton.spec.js index c288b73d3..d529dbfb6 100644 --- a/webapp/components/LoginButton/LoginButton.spec.js +++ b/webapp/components/LoginButton/LoginButton.spec.js @@ -3,6 +3,7 @@ import LoginButton from './LoginButton.vue' const stubs = { 'v-popover': true, + 'nuxt-link': true, } describe('LoginButton.vue', () => { @@ -32,12 +33,12 @@ describe('LoginButton.vue', () => { }) it('renders', () => { - expect(wrapper.contains('.login-button')).toBe(true) + expect(wrapper.find('.login-button').exists()).toBe(true) }) it('open popup', () => { wrapper.find('.base-button').trigger('click') - expect(wrapper.contains('.login-button')).toBe(true) + expect(wrapper.find('.login-button').exists()).toBe(true) }) }) }) diff --git a/webapp/components/Modal.spec.js b/webapp/components/Modal.spec.js index c08c90f51..037e84497 100644 --- a/webapp/components/Modal.spec.js +++ b/webapp/components/Modal.spec.js @@ -57,9 +57,9 @@ describe('Modal.vue', () => { it('initially empty', () => { wrapper = Wrapper() - expect(wrapper.contains(ConfirmModal)).toBe(false) - expect(wrapper.contains(DisableModal)).toBe(false) - expect(wrapper.contains(ReportModal)).toBe(false) + expect(wrapper.findComponent(ConfirmModal).exists()).toBe(false) + expect(wrapper.findComponent(DisableModal).exists()).toBe(false) + expect(wrapper.findComponent(ReportModal).exists()).toBe(false) }) describe('store/modal holds data to disable', () => { @@ -78,11 +78,11 @@ describe('Modal.vue', () => { }) it('renders disable modal', () => { - expect(wrapper.contains(DisableModal)).toBe(true) + expect(wrapper.findComponent(DisableModal).exists()).toBe(true) }) it('passes data to disable modal', () => { - expect(wrapper.find(DisableModal).props()).toEqual({ + expect(wrapper.findComponent(DisableModal).props()).toEqual({ type: 'contribution', name: 'some title', id: 'c456', @@ -91,9 +91,9 @@ describe('Modal.vue', () => { describe('child component emits close', () => { it('turns empty', async () => { - wrapper.find(DisableModal).vm.$emit('close') + wrapper.findComponent(DisableModal).vm.$emit('close') await Vue.nextTick() - expect(wrapper.contains(DisableModal)).toBe(false) + expect(wrapper.findComponent(DisableModal).exists()).toBe(false) }) }) @@ -109,7 +109,7 @@ describe('Modal.vue', () => { }, } wrapper = Wrapper() - expect(wrapper.find(DisableModal).props()).toEqual({ + expect(wrapper.findComponent(DisableModal).props()).toEqual({ type: 'comment', name: 'Author name', id: 'c456', @@ -124,7 +124,7 @@ describe('Modal.vue', () => { }, } wrapper = Wrapper() - expect(wrapper.find(DisableModal).props()).toEqual({ + expect(wrapper.findComponent(DisableModal).props()).toEqual({ type: 'comment', name: '', id: 'c456', @@ -142,7 +142,7 @@ describe('Modal.vue', () => { }, } wrapper = Wrapper() - expect(wrapper.find(DisableModal).props()).toEqual({ + expect(wrapper.findComponent(DisableModal).props()).toEqual({ type: 'user', name: 'Username', id: 'u456', @@ -160,7 +160,7 @@ describe('Modal.vue', () => { }, } wrapper = Wrapper() - expect(wrapper.find(DisableModal).props()).toEqual({ + expect(wrapper.findComponent(DisableModal).props()).toEqual({ type: 'something', name: null, id: 's456', diff --git a/webapp/components/NotificationList/NotificationList.spec.js b/webapp/components/NotificationList/NotificationList.spec.js index 4c6d3690a..7f7038d59 100644 --- a/webapp/components/NotificationList/NotificationList.spec.js +++ b/webapp/components/NotificationList/NotificationList.spec.js @@ -52,7 +52,7 @@ describe('NotificationList.vue', () => { }) it('renders Notification.vue for each notification of the user', () => { - expect(wrapper.findAll(Notification)).toHaveLength(2) + expect(wrapper.findAllComponents(Notification)).toHaveLength(2) }) }) @@ -97,7 +97,7 @@ describe('NotificationList.vue', () => { }) it('renders Notification.vue zero times', () => { - expect(wrapper.findAll(Notification)).toHaveLength(0) + expect(wrapper.findAllComponents(Notification)).toHaveLength(0) }) }) }) diff --git a/webapp/components/PasswordReset/Request.spec.js b/webapp/components/PasswordReset/Request.spec.js index a30ba70b4..50d6495bd 100644 --- a/webapp/components/PasswordReset/Request.spec.js +++ b/webapp/components/PasswordReset/Request.spec.js @@ -22,7 +22,7 @@ describe('Request', () => { }, } stubs = { - LocaleSwitch: "
", + LocaleSwitch: true, 'sweetalert-icon': true, 'client-only': true, 'nuxt-link': true, diff --git a/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js b/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js index 49be22bde..584a971c4 100644 --- a/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js +++ b/webapp/components/_new/generic/CounterIcon/CounterIcon.spec.js @@ -19,7 +19,7 @@ describe('CounterIcon.vue', () => { }) it('renders the icon', () => { - expect(wrapper.find(BaseIcon).exists()).toBe(true) + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) }) it('renders the count', () => { @@ -35,7 +35,7 @@ describe('CounterIcon.vue', () => { }) it('renders the icon', () => { - expect(wrapper.find(BaseIcon).exists()).toBe(true) + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) }) it('renders the capped count with a plus', () => { diff --git a/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js b/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js index 44d35bd71..413af5047 100644 --- a/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js +++ b/webapp/components/_new/generic/ProfileAvatar/ProfileAvatar.spec.js @@ -20,7 +20,7 @@ describe('ProfileAvatar', () => { }) it('renders an icon', () => { - expect(wrapper.find(BaseIcon).exists()).toBe(true) + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) }) describe('given a profile', () => { @@ -38,7 +38,7 @@ describe('ProfileAvatar', () => { it('renders an icon', () => { propsData = { profile: { name: null } } wrapper = Wrapper() - expect(wrapper.find(BaseIcon).exists()).toBe(true) + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) }) }) @@ -46,7 +46,7 @@ describe('ProfileAvatar', () => { it('renders an icon', () => { propsData = { profile: { name: 'Anonymous' } } wrapper = Wrapper() - expect(wrapper.find(BaseIcon).exists()).toBe(true) + expect(wrapper.findComponent(BaseIcon).exists()).toBe(true) }) }) diff --git a/webapp/components/features/ReportList/ReportList.spec.js b/webapp/components/features/ReportList/ReportList.spec.js index 84848ce82..17c609115 100644 --- a/webapp/components/features/ReportList/ReportList.spec.js +++ b/webapp/components/features/ReportList/ReportList.spec.js @@ -56,11 +56,11 @@ describe('ReportList', () => { }) it('renders DropdownFilter', () => { - expect(wrapper.find(DropdownFilter).exists()).toBe(true) + expect(wrapper.findComponent(DropdownFilter).exists()).toBe(true) }) it('renders ReportsTable', () => { - expect(wrapper.find(ReportsTable).exists()).toBe(true) + expect(wrapper.findComponent(ReportsTable).exists()).toBe(true) }) }) @@ -68,7 +68,7 @@ describe('ReportList', () => { beforeEach(async () => { wrapper = Wrapper() wrapper.setData({ reports }) - wrapper.find(ReportsTable).vm.$emit('confirm', reports[0]) + wrapper.findComponent(ReportsTable).vm.$emit('confirm', reports[0]) }) it('calls modal/SET_OPEN', () => { diff --git a/webapp/components/features/ReportRow/ReportRow.spec.js b/webapp/components/features/ReportRow/ReportRow.spec.js index 6a4bf922e..a1b405edc 100644 --- a/webapp/components/features/ReportRow/ReportRow.spec.js +++ b/webapp/components/features/ReportRow/ReportRow.spec.js @@ -84,7 +84,9 @@ describe('ReportRow', () => { wrapper = Wrapper() }) it('renders the disabled icon', () => { - expect(wrapper.find('.status-line').find(BaseIcon).props().name).toEqual('eye-slash') + expect(wrapper.find('.status-line').findComponent(BaseIcon).props().name).toEqual( + 'eye-slash', + ) }) it('renders its current status', () => { @@ -98,7 +100,7 @@ describe('ReportRow', () => { wrapper = Wrapper() }) it('renders the enabled icon', () => { - expect(wrapper.find('.status-line').find(BaseIcon).props().name).toEqual('eye') + expect(wrapper.find('.status-line').findComponent(BaseIcon).props().name).toEqual('eye') }) it('renders its current status', () => { @@ -119,7 +121,7 @@ describe('ReportRow', () => { }) it('renders a comments icon', () => { - const commentsIcon = wrapper.find(BaseIcon).props().name + const commentsIcon = wrapper.findComponent(BaseIcon).props().name expect(commentsIcon).toEqual('comments') }) @@ -141,7 +143,7 @@ describe('ReportRow', () => { }) it('renders a bookmark icon', () => { - const postIcon = wrapper.find(BaseIcon).props().name + const postIcon = wrapper.findComponent(BaseIcon).props().name expect(postIcon).toEqual('bookmark') }) @@ -163,7 +165,7 @@ describe('ReportRow', () => { }) it('renders a user icon', () => { - const userIcon = wrapper.find(BaseIcon).props().name + const userIcon = wrapper.findComponent(BaseIcon).props().name expect(userIcon).toEqual('user') }) diff --git a/webapp/components/features/SearchField/SearchField.spec.js b/webapp/components/features/SearchField/SearchField.spec.js index ec5276212..e66c31938 100644 --- a/webapp/components/features/SearchField/SearchField.spec.js +++ b/webapp/components/features/SearchField/SearchField.spec.js @@ -36,7 +36,7 @@ describe('SearchField.vue', () => { describe('Emitted events', () => { let searchableInputComponent beforeEach(() => { - searchableInputComponent = wrapper.find(SearchableInput) + searchableInputComponent = wrapper.findComponent(SearchableInput) }) describe('query event', () => { From 0eddfd3aa09216abe5475de77a068c43b5eddd32 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 15 Feb 2023 11:19:29 +0100 Subject: [PATCH 289/344] layouts tests working --- webapp/layouts/basic.spec.js | 11 ++++++++--- webapp/layouts/blank.spec.js | 11 ++++++++--- webapp/layouts/default.spec.js | 19 ++++++++++++++----- webapp/layouts/error.spec.js | 10 +++++++--- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/webapp/layouts/basic.spec.js b/webapp/layouts/basic.spec.js index f84195246..c87fc103b 100644 --- a/webapp/layouts/basic.spec.js +++ b/webapp/layouts/basic.spec.js @@ -1,10 +1,14 @@ import Vuex from 'vuex' -import { config, shallowMount } from '@vue/test-utils' +import { shallowMount } from '@vue/test-utils' import Basic from './basic.vue' const localVue = global.localVue -config.stubs.nuxt = '' +const stubs = { + nuxt: { + template: '', + }, +} describe('basic.vue', () => { let wrapper @@ -28,6 +32,7 @@ describe('basic.vue', () => { store, mocks, localVue, + stubs, }) } @@ -36,7 +41,7 @@ describe('basic.vue', () => { }) it('renders', () => { - expect(wrapper.is('.layout-blank')).toBe(true) + expect(wrapper.classes('layout-blank')).toBe(true) }) }) }) diff --git a/webapp/layouts/blank.spec.js b/webapp/layouts/blank.spec.js index a3ea3120c..f4c33cd9c 100644 --- a/webapp/layouts/blank.spec.js +++ b/webapp/layouts/blank.spec.js @@ -1,9 +1,13 @@ -import { config, shallowMount } from '@vue/test-utils' +import { shallowMount } from '@vue/test-utils' import Blank from './blank.vue' const localVue = global.localVue -config.stubs.nuxt = '' +const stubs = { + nuxt: { + template: '', + }, +} describe('blank.vue', () => { let wrapper @@ -20,6 +24,7 @@ describe('blank.vue', () => { return shallowMount(Blank, { mocks, localVue, + stubs, }) } @@ -28,7 +33,7 @@ describe('blank.vue', () => { }) it('renders', () => { - expect(wrapper.is('.layout-blank')).toBe(true) + expect(wrapper.classes('layout-blank')).toBe(true) }) }) }) diff --git a/webapp/layouts/default.spec.js b/webapp/layouts/default.spec.js index 3d465ce76..bf54d3581 100644 --- a/webapp/layouts/default.spec.js +++ b/webapp/layouts/default.spec.js @@ -1,13 +1,21 @@ import Vuex from 'vuex' -import { config, shallowMount } from '@vue/test-utils' +import { shallowMount } from '@vue/test-utils' import Default from './default.vue' const localVue = global.localVue localVue.directive('scrollTo', jest.fn()) -config.stubs.nuxt = '' -config.stubs['client-only'] = '' -config.stubs['nuxt-link'] = '' +const stubs = { + nuxt: { + template: '', + }, + 'client-only': { + template: '', + }, + 'nuxt-link': { + template: '', + }, +} describe('default.vue', () => { let wrapper @@ -38,6 +46,7 @@ describe('default.vue', () => { store, mocks, localVue, + stubs, }) } @@ -46,7 +55,7 @@ describe('default.vue', () => { }) it('renders', () => { - expect(wrapper.is('.layout-default')).toBe(true) + expect(wrapper.classes('layout-default')).toBe(true) }) }) }) diff --git a/webapp/layouts/error.spec.js b/webapp/layouts/error.spec.js index dccb5eb49..95b54c965 100644 --- a/webapp/layouts/error.spec.js +++ b/webapp/layouts/error.spec.js @@ -1,9 +1,13 @@ -import { config, shallowMount } from '@vue/test-utils' +import { shallowMount } from '@vue/test-utils' import Error from './error.vue' const localVue = global.localVue -config.stubs['nuxt-link'] = '' +const stubs = { + 'nuxt-link': { + template: '', + }, +} describe('error.vue', () => { let mocks, wrapper @@ -15,7 +19,7 @@ describe('error.vue', () => { }) const Wrapper = (propsData = {}) => { - return shallowMount(Error, { mocks, propsData, localVue }) + return shallowMount(Error, { mocks, propsData, localVue, stubs }) } describe('shallowMount', () => { From c4c5a8f6a066e6c0ff8da9f08d8358cc2d7e1e69 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 12:00:25 +0100 Subject: [PATCH 290/344] delete github issue templates --- .../.github/ISSUE_TEMPLATE/---bug-report.md | 11 ----------- .../.github/ISSUE_TEMPLATE/---devops-ticket.md | 11 ----------- deployment/.github/ISSUE_TEMPLATE/---epic.md | 15 --------------- .../.github/ISSUE_TEMPLATE/---feature-request.md | 11 ----------- deployment/.github/ISSUE_TEMPLATE/---question.md | 15 --------------- deployment/.github/ISSUE_TEMPLATE/---refactor.md | 11 ----------- deployment/.github/ISSUE_TEMPLATE/custom.md | 10 ---------- 7 files changed, 84 deletions(-) delete mode 100644 deployment/.github/ISSUE_TEMPLATE/---bug-report.md delete mode 100644 deployment/.github/ISSUE_TEMPLATE/---devops-ticket.md delete mode 100644 deployment/.github/ISSUE_TEMPLATE/---epic.md delete mode 100644 deployment/.github/ISSUE_TEMPLATE/---feature-request.md delete mode 100644 deployment/.github/ISSUE_TEMPLATE/---question.md delete mode 100644 deployment/.github/ISSUE_TEMPLATE/---refactor.md delete mode 100644 deployment/.github/ISSUE_TEMPLATE/custom.md diff --git a/deployment/.github/ISSUE_TEMPLATE/---bug-report.md b/deployment/.github/ISSUE_TEMPLATE/---bug-report.md deleted file mode 100644 index 602283ac7..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/---bug-report.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: "\U0001F41B Bug Report" -about: Create a report to help us improve -title: "\U0001F41B [Bug] XXX" -labels: bug -assignees: '' - ---- - -## :bug: Bug Report - diff --git a/deployment/.github/ISSUE_TEMPLATE/---devops-ticket.md b/deployment/.github/ISSUE_TEMPLATE/---devops-ticket.md deleted file mode 100644 index a382d1f19..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/---devops-ticket.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: "\U0001F4A5 DevOps Ticket" -about: Help us manage our deployed app. -title: "\U0001F4A5 [DevOps] XXX" -labels: '' -assignees: '' - ---- - -## 💥 DevOps Ticket - diff --git a/deployment/.github/ISSUE_TEMPLATE/---epic.md b/deployment/.github/ISSUE_TEMPLATE/---epic.md deleted file mode 100644 index 8dcb1952c..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/---epic.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: "\U0001F31F Epic" -about: Define a big development step. -title: "\U0001F31F [EPIC] XXX" -labels: '' -assignees: '' - ---- - - - - -## 🌟 EPIC - diff --git a/deployment/.github/ISSUE_TEMPLATE/---feature-request.md b/deployment/.github/ISSUE_TEMPLATE/---feature-request.md deleted file mode 100644 index f387d7703..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/---feature-request.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: "\U0001F680 Feature Request" -about: Suggest an idea for this project. -title: "\U0001F680 [Feature] XXX" -labels: enhancement -assignees: '' - ---- - -## :rocket: Feature Request - diff --git a/deployment/.github/ISSUE_TEMPLATE/---question.md b/deployment/.github/ISSUE_TEMPLATE/---question.md deleted file mode 100644 index cbbcaaa9c..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/---question.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: "\U0001F4AC Question" -about: If you need help understanding ocelot.social. -title: "\U0001F4AC [Question] XXX" -labels: '' -assignees: '' - ---- - - - - -## 💬 Question - diff --git a/deployment/.github/ISSUE_TEMPLATE/---refactor.md b/deployment/.github/ISSUE_TEMPLATE/---refactor.md deleted file mode 100644 index fb1ac4e61..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/---refactor.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: "\U0001F527 Refactor" -about: Help us improve our code by refactoring it. -title: "\U0001F527 [Refactor] XXX" -labels: enhancement -assignees: '' - ---- - -## 🔧 Refactor - diff --git a/deployment/.github/ISSUE_TEMPLATE/custom.md b/deployment/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 48d5f81fa..000000000 --- a/deployment/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' -labels: '' -assignees: '' - ---- - - From f9ca4cf675b4a6eca6cc1177b69d2cbba5ece3fc Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 12:02:23 +0100 Subject: [PATCH 291/344] moved kubernetes & old folders --- .../maintenance-worker/binaries/.env | 6 ------ .../maintenance-worker/migration/mongo/.env | 17 ----------------- .../maintenance-worker/migration/neo4j/.env | 16 ---------------- .../{deployment => }/kubernetes/.gitignore | 0 .../{deployment => }/kubernetes/Backup.md | 0 .../{deployment => }/kubernetes/Chart.yaml | 0 .../kubernetes/DigitalOcean.md | 0 .../{deployment => }/kubernetes/README.md | 0 .../kubernetes/charts/.gitkeep | 0 .../{deployment => }/kubernetes/crds/.gitkeep | 0 .../kubernetes/dns.values.template.yaml | 0 .../kubernetes/nginx.values.template.yaml | 0 .../kubernetes/templates/NOTES.txt | 0 .../kubernetes/templates/backend/ConfigMap.yml | 0 .../templates/backend/Deployment.yaml | 0 .../backend/PersistentVolumeClaim.yaml | 0 .../kubernetes/templates/backend/Secret.yaml | 0 .../kubernetes/templates/backend/Service.yaml | 0 .../issuer/letsencrypt-production.yaml | 0 .../templates/issuer/letsencrypt-staging.yaml | 0 .../kubernetes/templates/jobs/job-db-init.yaml | 0 .../templates/jobs/job-db-migrate.yaml | 0 .../templates/maintenance/ConfigMap.yml | 0 .../templates/maintenance/Deployment.yaml | 0 .../templates/maintenance/Secret.yaml | 0 .../templates/maintenance/Service.yaml | 0 .../kubernetes/templates/neo4j/ConfigMap.yml | 0 .../kubernetes/templates/neo4j/Deployment.yaml | 0 .../templates/neo4j/PersistentVolumeClaim.yaml | 0 .../kubernetes/templates/neo4j/Secret.yaml | 0 .../kubernetes/templates/neo4j/Service.yaml | 0 .../templates/storage/persistent.yml | 0 .../kubernetes/templates/webapp/ConfigMap.yml | 0 .../templates/webapp/Deployment.yaml | 0 .../kubernetes/templates/webapp/Ingress.yaml | 0 .../kubernetes/templates/webapp/Secret.yaml | 0 .../kubernetes/templates/webapp/Service.yaml | 0 .../kubernetes/values.template.yaml | 0 deployment/{deployment => }/old/Maintenance.md | 0 .../old/digital-ocean/README.md | 0 .../old/digital-ocean/dashboard/README.md | 0 .../digital-ocean/dashboard/admin-user.yaml | 0 .../dashboard/dashboard-screenshot.png | Bin .../digital-ocean/dashboard/role-binding.yaml | 0 .../old/digital-ocean/https/README.md | 0 .../old/digital-ocean/https/ip-address.png | Bin .../old/legacy-migration/README.md | 0 .../legacy-migration/maintenance-worker.yaml | 0 .../maintenance-worker/.dockerignore | 0 .../maintenance-worker/.gitignore | 0 .../maintenance-worker/Dockerfile | 0 .../maintenance-worker/binaries/idle | 0 .../binaries/import_legacy_db | 0 .../binaries/import_legacy_uploads | 0 .../maintenance-worker/known_hosts | 0 .../migration/mongo/export.sh | 0 .../migration/neo4j/badges/badges.cql | 0 .../migration/neo4j/badges/delete.cql | 0 .../migration/neo4j/categories/categories.cql | 0 .../migration/neo4j/categories/delete.cql | 0 .../migration/neo4j/comments/comments.cql | 0 .../migration/neo4j/comments/delete.cql | 0 .../neo4j/contributions/contributions.cql | 0 .../migration/neo4j/contributions/delete.cql | 0 .../migration/neo4j/delete_all.cql | 0 .../migration/neo4j/emotions/delete.cql | 0 .../migration/neo4j/emotions/emotions.cql | 0 .../migration/neo4j/follows/delete.cql | 0 .../migration/neo4j/follows/follows.cql | 0 .../migration/neo4j/import.sh | 0 .../migration/neo4j/invites/delete.cql | 0 .../migration/neo4j/invites/invites.cql | 0 .../migration/neo4j/notifications/delete.cql | 0 .../neo4j/notifications/notifications.cql | 0 .../migration/neo4j/organizations/delete.cql | 0 .../neo4j/organizations/organizations.cql | 0 .../migration/neo4j/pages/delete.cql | 0 .../migration/neo4j/pages/pages.cql | 0 .../migration/neo4j/projects/delete.cql | 0 .../migration/neo4j/projects/projects.cql | 0 .../migration/neo4j/settings/delete.cql | 0 .../migration/neo4j/settings/settings.cql | 0 .../migration/neo4j/shouts/delete.cql | 0 .../migration/neo4j/shouts/shouts.cql | 0 .../migration/neo4j/status/delete.cql | 0 .../migration/neo4j/status/status.cql | 0 .../neo4j/systemnotifications/delete.cql | 0 .../systemnotifications.cql | 0 .../migration/neo4j/users/delete.cql | 0 .../migration/neo4j/users/users.cql | 0 .../migration/neo4j/userscandos/delete.cql | 0 .../neo4j/userscandos/userscandos.cql | 0 .../migration/neo4j/usersettings/delete.cql | 0 .../neo4j/usersettings/usersettings.cql | 0 .../old/mailserver/Deployment.yaml | 0 .../{deployment => }/old/mailserver/README.md | 0 .../old/mailserver/Service.yaml | 0 .../old/mailserver/ingress.yaml | 0 .../{deployment => }/old/monitoring/README.md | 0 .../old/monitoring/grafana/config.yml | 0 .../old/monitoring/grafana/metrics.png | Bin .../old/monitoring/grafana/values.yml | 0 .../{deployment => }/old/volumes/README.md | 0 .../old/volumes/neo4j-offline-backup/README.md | 0 .../old/volumes/neo4j-online-backup/README.md | 0 .../{deployment => }/old/volumes/uploads.yaml | 0 .../old/volumes/velero/README.md | 0 .../old/volumes/volume-snapshots/README.md | 0 .../backen-uploads-snapshot.yaml | 0 .../digital-ocean-volume-snapshots.png | Bin .../neo4j-data-provision-snapshot.yaml | 0 .../volume-snapshots/neo4j-data-snapshot.yaml | 0 112 files changed, 39 deletions(-) delete mode 100644 deployment/deployment/old/legacy-migration/maintenance-worker/binaries/.env delete mode 100644 deployment/deployment/old/legacy-migration/maintenance-worker/migration/mongo/.env delete mode 100644 deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/.env rename deployment/{deployment => }/kubernetes/.gitignore (100%) rename deployment/{deployment => }/kubernetes/Backup.md (100%) rename deployment/{deployment => }/kubernetes/Chart.yaml (100%) rename deployment/{deployment => }/kubernetes/DigitalOcean.md (100%) rename deployment/{deployment => }/kubernetes/README.md (100%) rename deployment/{deployment => }/kubernetes/charts/.gitkeep (100%) rename deployment/{deployment => }/kubernetes/crds/.gitkeep (100%) rename deployment/{deployment => }/kubernetes/dns.values.template.yaml (100%) rename deployment/{deployment => }/kubernetes/nginx.values.template.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/NOTES.txt (100%) rename deployment/{deployment => }/kubernetes/templates/backend/ConfigMap.yml (100%) rename deployment/{deployment => }/kubernetes/templates/backend/Deployment.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/backend/PersistentVolumeClaim.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/backend/Secret.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/backend/Service.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/issuer/letsencrypt-production.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/issuer/letsencrypt-staging.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/jobs/job-db-init.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/jobs/job-db-migrate.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/maintenance/ConfigMap.yml (100%) rename deployment/{deployment => }/kubernetes/templates/maintenance/Deployment.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/maintenance/Secret.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/maintenance/Service.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/neo4j/ConfigMap.yml (100%) rename deployment/{deployment => }/kubernetes/templates/neo4j/Deployment.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/neo4j/Secret.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/neo4j/Service.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/storage/persistent.yml (100%) rename deployment/{deployment => }/kubernetes/templates/webapp/ConfigMap.yml (100%) rename deployment/{deployment => }/kubernetes/templates/webapp/Deployment.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/webapp/Ingress.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/webapp/Secret.yaml (100%) rename deployment/{deployment => }/kubernetes/templates/webapp/Service.yaml (100%) rename deployment/{deployment => }/kubernetes/values.template.yaml (100%) rename deployment/{deployment => }/old/Maintenance.md (100%) rename deployment/{deployment => }/old/digital-ocean/README.md (100%) rename deployment/{deployment => }/old/digital-ocean/dashboard/README.md (100%) rename deployment/{deployment => }/old/digital-ocean/dashboard/admin-user.yaml (100%) rename deployment/{deployment => }/old/digital-ocean/dashboard/dashboard-screenshot.png (100%) rename deployment/{deployment => }/old/digital-ocean/dashboard/role-binding.yaml (100%) rename deployment/{deployment => }/old/digital-ocean/https/README.md (100%) rename deployment/{deployment => }/old/digital-ocean/https/ip-address.png (100%) rename deployment/{deployment => }/old/legacy-migration/README.md (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker.yaml (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/.dockerignore (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/.gitignore (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/Dockerfile (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/binaries/idle (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/binaries/import_legacy_db (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/known_hosts (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/mongo/export.sh (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql (100%) rename deployment/{deployment => }/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql (100%) rename deployment/{deployment => }/old/mailserver/Deployment.yaml (100%) rename deployment/{deployment => }/old/mailserver/README.md (100%) rename deployment/{deployment => }/old/mailserver/Service.yaml (100%) rename deployment/{deployment => }/old/mailserver/ingress.yaml (100%) rename deployment/{deployment => }/old/monitoring/README.md (100%) rename deployment/{deployment => }/old/monitoring/grafana/config.yml (100%) rename deployment/{deployment => }/old/monitoring/grafana/metrics.png (100%) rename deployment/{deployment => }/old/monitoring/grafana/values.yml (100%) rename deployment/{deployment => }/old/volumes/README.md (100%) rename deployment/{deployment => }/old/volumes/neo4j-offline-backup/README.md (100%) rename deployment/{deployment => }/old/volumes/neo4j-online-backup/README.md (100%) rename deployment/{deployment => }/old/volumes/uploads.yaml (100%) rename deployment/{deployment => }/old/volumes/velero/README.md (100%) rename deployment/{deployment => }/old/volumes/volume-snapshots/README.md (100%) rename deployment/{deployment => }/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml (100%) rename deployment/{deployment => }/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png (100%) rename deployment/{deployment => }/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml (100%) rename deployment/{deployment => }/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml (100%) diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/binaries/.env b/deployment/deployment/old/legacy-migration/maintenance-worker/binaries/.env deleted file mode 100644 index 773918095..000000000 --- a/deployment/deployment/old/legacy-migration/maintenance-worker/binaries/.env +++ /dev/null @@ -1,6 +0,0 @@ -# SSH Access -# SSH_USERNAME='username' -# SSH_HOST='example.org' - -# UPLOADS_DIRECTORY=/var/www/api/uploads -OUTPUT_DIRECTORY='/uploads/' \ No newline at end of file diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/mongo/.env b/deployment/deployment/old/legacy-migration/maintenance-worker/migration/mongo/.env deleted file mode 100644 index 376cb56d0..000000000 --- a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/mongo/.env +++ /dev/null @@ -1,17 +0,0 @@ -# SSH Access -# SSH_USERNAME='username' -# SSH_HOST='example.org' - -# Mongo DB on Remote Maschine -# MONGODB_USERNAME='mongouser' -# MONGODB_PASSWORD='mongopassword' -# MONGODB_DATABASE='mongodatabase' -# MONGODB_AUTH_DB='admin' - -# Export Settings -# On Windows this resolves to C:\Users\dornhoeschen\AppData\Local\Temp\mongo-export (MinGW) -EXPORT_PATH='/tmp/mongo-export/' -EXPORT_MONGOEXPORT_BIN='mongoexport' -MONGO_EXPORT_SPLIT_SIZE=6000 -# On Windows use something like this -# EXPORT_MONGOEXPORT_BIN='C:\Program Files\MongoDB\Server\3.6\bin\mongoexport.exe' diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/.env b/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/.env deleted file mode 100644 index 16220f3e6..000000000 --- a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/.env +++ /dev/null @@ -1,16 +0,0 @@ -# Neo4J Settings -# NEO4J_USERNAME='neo4j' -# NEO4J_PASSWORD='letmein' - -# Import Settings -# On Windows this resolves to C:\Users\dornhoeschen\AppData\Local\Temp\mongo-export (MinGW) -IMPORT_PATH='/tmp/mongo-export/' -IMPORT_CHUNK_PATH='/tmp/mongo-export/splits/' - -IMPORT_CHUNK_PATH_CQL='/tmp/mongo-export/splits/' -# On Windows this path needs to be windows style since the cypher-shell runs native - note the forward slash -# IMPORT_CHUNK_PATH_CQL='C:/Users/dornhoeschen/AppData/Local/Temp/mongo-export/splits/' - -IMPORT_CYPHERSHELL_BIN='cypher-shell' -# On Windows use something like this -# IMPORT_CYPHERSHELL_BIN='C:\Program Files\neo4j-community\bin\cypher-shell.bat' \ No newline at end of file diff --git a/deployment/deployment/kubernetes/.gitignore b/deployment/kubernetes/.gitignore similarity index 100% rename from deployment/deployment/kubernetes/.gitignore rename to deployment/kubernetes/.gitignore diff --git a/deployment/deployment/kubernetes/Backup.md b/deployment/kubernetes/Backup.md similarity index 100% rename from deployment/deployment/kubernetes/Backup.md rename to deployment/kubernetes/Backup.md diff --git a/deployment/deployment/kubernetes/Chart.yaml b/deployment/kubernetes/Chart.yaml similarity index 100% rename from deployment/deployment/kubernetes/Chart.yaml rename to deployment/kubernetes/Chart.yaml diff --git a/deployment/deployment/kubernetes/DigitalOcean.md b/deployment/kubernetes/DigitalOcean.md similarity index 100% rename from deployment/deployment/kubernetes/DigitalOcean.md rename to deployment/kubernetes/DigitalOcean.md diff --git a/deployment/deployment/kubernetes/README.md b/deployment/kubernetes/README.md similarity index 100% rename from deployment/deployment/kubernetes/README.md rename to deployment/kubernetes/README.md diff --git a/deployment/deployment/kubernetes/charts/.gitkeep b/deployment/kubernetes/charts/.gitkeep similarity index 100% rename from deployment/deployment/kubernetes/charts/.gitkeep rename to deployment/kubernetes/charts/.gitkeep diff --git a/deployment/deployment/kubernetes/crds/.gitkeep b/deployment/kubernetes/crds/.gitkeep similarity index 100% rename from deployment/deployment/kubernetes/crds/.gitkeep rename to deployment/kubernetes/crds/.gitkeep diff --git a/deployment/deployment/kubernetes/dns.values.template.yaml b/deployment/kubernetes/dns.values.template.yaml similarity index 100% rename from deployment/deployment/kubernetes/dns.values.template.yaml rename to deployment/kubernetes/dns.values.template.yaml diff --git a/deployment/deployment/kubernetes/nginx.values.template.yaml b/deployment/kubernetes/nginx.values.template.yaml similarity index 100% rename from deployment/deployment/kubernetes/nginx.values.template.yaml rename to deployment/kubernetes/nginx.values.template.yaml diff --git a/deployment/deployment/kubernetes/templates/NOTES.txt b/deployment/kubernetes/templates/NOTES.txt similarity index 100% rename from deployment/deployment/kubernetes/templates/NOTES.txt rename to deployment/kubernetes/templates/NOTES.txt diff --git a/deployment/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/kubernetes/templates/backend/ConfigMap.yml similarity index 100% rename from deployment/deployment/kubernetes/templates/backend/ConfigMap.yml rename to deployment/kubernetes/templates/backend/ConfigMap.yml diff --git a/deployment/deployment/kubernetes/templates/backend/Deployment.yaml b/deployment/kubernetes/templates/backend/Deployment.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/backend/Deployment.yaml rename to deployment/kubernetes/templates/backend/Deployment.yaml diff --git a/deployment/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml b/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml rename to deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml diff --git a/deployment/deployment/kubernetes/templates/backend/Secret.yaml b/deployment/kubernetes/templates/backend/Secret.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/backend/Secret.yaml rename to deployment/kubernetes/templates/backend/Secret.yaml diff --git a/deployment/deployment/kubernetes/templates/backend/Service.yaml b/deployment/kubernetes/templates/backend/Service.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/backend/Service.yaml rename to deployment/kubernetes/templates/backend/Service.yaml diff --git a/deployment/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml rename to deployment/kubernetes/templates/issuer/letsencrypt-production.yaml diff --git a/deployment/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml rename to deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml diff --git a/deployment/deployment/kubernetes/templates/jobs/job-db-init.yaml b/deployment/kubernetes/templates/jobs/job-db-init.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/jobs/job-db-init.yaml rename to deployment/kubernetes/templates/jobs/job-db-init.yaml diff --git a/deployment/deployment/kubernetes/templates/jobs/job-db-migrate.yaml b/deployment/kubernetes/templates/jobs/job-db-migrate.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/jobs/job-db-migrate.yaml rename to deployment/kubernetes/templates/jobs/job-db-migrate.yaml diff --git a/deployment/deployment/kubernetes/templates/maintenance/ConfigMap.yml b/deployment/kubernetes/templates/maintenance/ConfigMap.yml similarity index 100% rename from deployment/deployment/kubernetes/templates/maintenance/ConfigMap.yml rename to deployment/kubernetes/templates/maintenance/ConfigMap.yml diff --git a/deployment/deployment/kubernetes/templates/maintenance/Deployment.yaml b/deployment/kubernetes/templates/maintenance/Deployment.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/maintenance/Deployment.yaml rename to deployment/kubernetes/templates/maintenance/Deployment.yaml diff --git a/deployment/deployment/kubernetes/templates/maintenance/Secret.yaml b/deployment/kubernetes/templates/maintenance/Secret.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/maintenance/Secret.yaml rename to deployment/kubernetes/templates/maintenance/Secret.yaml diff --git a/deployment/deployment/kubernetes/templates/maintenance/Service.yaml b/deployment/kubernetes/templates/maintenance/Service.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/maintenance/Service.yaml rename to deployment/kubernetes/templates/maintenance/Service.yaml diff --git a/deployment/deployment/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/kubernetes/templates/neo4j/ConfigMap.yml similarity index 100% rename from deployment/deployment/kubernetes/templates/neo4j/ConfigMap.yml rename to deployment/kubernetes/templates/neo4j/ConfigMap.yml diff --git a/deployment/deployment/kubernetes/templates/neo4j/Deployment.yaml b/deployment/kubernetes/templates/neo4j/Deployment.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/neo4j/Deployment.yaml rename to deployment/kubernetes/templates/neo4j/Deployment.yaml diff --git a/deployment/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml b/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml rename to deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml diff --git a/deployment/deployment/kubernetes/templates/neo4j/Secret.yaml b/deployment/kubernetes/templates/neo4j/Secret.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/neo4j/Secret.yaml rename to deployment/kubernetes/templates/neo4j/Secret.yaml diff --git a/deployment/deployment/kubernetes/templates/neo4j/Service.yaml b/deployment/kubernetes/templates/neo4j/Service.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/neo4j/Service.yaml rename to deployment/kubernetes/templates/neo4j/Service.yaml diff --git a/deployment/deployment/kubernetes/templates/storage/persistent.yml b/deployment/kubernetes/templates/storage/persistent.yml similarity index 100% rename from deployment/deployment/kubernetes/templates/storage/persistent.yml rename to deployment/kubernetes/templates/storage/persistent.yml diff --git a/deployment/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/kubernetes/templates/webapp/ConfigMap.yml similarity index 100% rename from deployment/deployment/kubernetes/templates/webapp/ConfigMap.yml rename to deployment/kubernetes/templates/webapp/ConfigMap.yml diff --git a/deployment/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/kubernetes/templates/webapp/Deployment.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/webapp/Deployment.yaml rename to deployment/kubernetes/templates/webapp/Deployment.yaml diff --git a/deployment/deployment/kubernetes/templates/webapp/Ingress.yaml b/deployment/kubernetes/templates/webapp/Ingress.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/webapp/Ingress.yaml rename to deployment/kubernetes/templates/webapp/Ingress.yaml diff --git a/deployment/deployment/kubernetes/templates/webapp/Secret.yaml b/deployment/kubernetes/templates/webapp/Secret.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/webapp/Secret.yaml rename to deployment/kubernetes/templates/webapp/Secret.yaml diff --git a/deployment/deployment/kubernetes/templates/webapp/Service.yaml b/deployment/kubernetes/templates/webapp/Service.yaml similarity index 100% rename from deployment/deployment/kubernetes/templates/webapp/Service.yaml rename to deployment/kubernetes/templates/webapp/Service.yaml diff --git a/deployment/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml similarity index 100% rename from deployment/deployment/kubernetes/values.template.yaml rename to deployment/kubernetes/values.template.yaml diff --git a/deployment/deployment/old/Maintenance.md b/deployment/old/Maintenance.md similarity index 100% rename from deployment/deployment/old/Maintenance.md rename to deployment/old/Maintenance.md diff --git a/deployment/deployment/old/digital-ocean/README.md b/deployment/old/digital-ocean/README.md similarity index 100% rename from deployment/deployment/old/digital-ocean/README.md rename to deployment/old/digital-ocean/README.md diff --git a/deployment/deployment/old/digital-ocean/dashboard/README.md b/deployment/old/digital-ocean/dashboard/README.md similarity index 100% rename from deployment/deployment/old/digital-ocean/dashboard/README.md rename to deployment/old/digital-ocean/dashboard/README.md diff --git a/deployment/deployment/old/digital-ocean/dashboard/admin-user.yaml b/deployment/old/digital-ocean/dashboard/admin-user.yaml similarity index 100% rename from deployment/deployment/old/digital-ocean/dashboard/admin-user.yaml rename to deployment/old/digital-ocean/dashboard/admin-user.yaml diff --git a/deployment/deployment/old/digital-ocean/dashboard/dashboard-screenshot.png b/deployment/old/digital-ocean/dashboard/dashboard-screenshot.png similarity index 100% rename from deployment/deployment/old/digital-ocean/dashboard/dashboard-screenshot.png rename to deployment/old/digital-ocean/dashboard/dashboard-screenshot.png diff --git a/deployment/deployment/old/digital-ocean/dashboard/role-binding.yaml b/deployment/old/digital-ocean/dashboard/role-binding.yaml similarity index 100% rename from deployment/deployment/old/digital-ocean/dashboard/role-binding.yaml rename to deployment/old/digital-ocean/dashboard/role-binding.yaml diff --git a/deployment/deployment/old/digital-ocean/https/README.md b/deployment/old/digital-ocean/https/README.md similarity index 100% rename from deployment/deployment/old/digital-ocean/https/README.md rename to deployment/old/digital-ocean/https/README.md diff --git a/deployment/deployment/old/digital-ocean/https/ip-address.png b/deployment/old/digital-ocean/https/ip-address.png similarity index 100% rename from deployment/deployment/old/digital-ocean/https/ip-address.png rename to deployment/old/digital-ocean/https/ip-address.png diff --git a/deployment/deployment/old/legacy-migration/README.md b/deployment/old/legacy-migration/README.md similarity index 100% rename from deployment/deployment/old/legacy-migration/README.md rename to deployment/old/legacy-migration/README.md diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker.yaml b/deployment/old/legacy-migration/maintenance-worker.yaml similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker.yaml rename to deployment/old/legacy-migration/maintenance-worker.yaml diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/.dockerignore b/deployment/old/legacy-migration/maintenance-worker/.dockerignore similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/.dockerignore rename to deployment/old/legacy-migration/maintenance-worker/.dockerignore diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/.gitignore b/deployment/old/legacy-migration/maintenance-worker/.gitignore similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/.gitignore rename to deployment/old/legacy-migration/maintenance-worker/.gitignore diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/Dockerfile b/deployment/old/legacy-migration/maintenance-worker/Dockerfile similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/Dockerfile rename to deployment/old/legacy-migration/maintenance-worker/Dockerfile diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/binaries/idle b/deployment/old/legacy-migration/maintenance-worker/binaries/idle similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/binaries/idle rename to deployment/old/legacy-migration/maintenance-worker/binaries/idle diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db b/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db rename to deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads b/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads rename to deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/known_hosts b/deployment/old/legacy-migration/maintenance-worker/known_hosts similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/known_hosts rename to deployment/old/legacy-migration/maintenance-worker/known_hosts diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh b/deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh rename to deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql diff --git a/deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql b/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql similarity index 100% rename from deployment/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql rename to deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql diff --git a/deployment/deployment/old/mailserver/Deployment.yaml b/deployment/old/mailserver/Deployment.yaml similarity index 100% rename from deployment/deployment/old/mailserver/Deployment.yaml rename to deployment/old/mailserver/Deployment.yaml diff --git a/deployment/deployment/old/mailserver/README.md b/deployment/old/mailserver/README.md similarity index 100% rename from deployment/deployment/old/mailserver/README.md rename to deployment/old/mailserver/README.md diff --git a/deployment/deployment/old/mailserver/Service.yaml b/deployment/old/mailserver/Service.yaml similarity index 100% rename from deployment/deployment/old/mailserver/Service.yaml rename to deployment/old/mailserver/Service.yaml diff --git a/deployment/deployment/old/mailserver/ingress.yaml b/deployment/old/mailserver/ingress.yaml similarity index 100% rename from deployment/deployment/old/mailserver/ingress.yaml rename to deployment/old/mailserver/ingress.yaml diff --git a/deployment/deployment/old/monitoring/README.md b/deployment/old/monitoring/README.md similarity index 100% rename from deployment/deployment/old/monitoring/README.md rename to deployment/old/monitoring/README.md diff --git a/deployment/deployment/old/monitoring/grafana/config.yml b/deployment/old/monitoring/grafana/config.yml similarity index 100% rename from deployment/deployment/old/monitoring/grafana/config.yml rename to deployment/old/monitoring/grafana/config.yml diff --git a/deployment/deployment/old/monitoring/grafana/metrics.png b/deployment/old/monitoring/grafana/metrics.png similarity index 100% rename from deployment/deployment/old/monitoring/grafana/metrics.png rename to deployment/old/monitoring/grafana/metrics.png diff --git a/deployment/deployment/old/monitoring/grafana/values.yml b/deployment/old/monitoring/grafana/values.yml similarity index 100% rename from deployment/deployment/old/monitoring/grafana/values.yml rename to deployment/old/monitoring/grafana/values.yml diff --git a/deployment/deployment/old/volumes/README.md b/deployment/old/volumes/README.md similarity index 100% rename from deployment/deployment/old/volumes/README.md rename to deployment/old/volumes/README.md diff --git a/deployment/deployment/old/volumes/neo4j-offline-backup/README.md b/deployment/old/volumes/neo4j-offline-backup/README.md similarity index 100% rename from deployment/deployment/old/volumes/neo4j-offline-backup/README.md rename to deployment/old/volumes/neo4j-offline-backup/README.md diff --git a/deployment/deployment/old/volumes/neo4j-online-backup/README.md b/deployment/old/volumes/neo4j-online-backup/README.md similarity index 100% rename from deployment/deployment/old/volumes/neo4j-online-backup/README.md rename to deployment/old/volumes/neo4j-online-backup/README.md diff --git a/deployment/deployment/old/volumes/uploads.yaml b/deployment/old/volumes/uploads.yaml similarity index 100% rename from deployment/deployment/old/volumes/uploads.yaml rename to deployment/old/volumes/uploads.yaml diff --git a/deployment/deployment/old/volumes/velero/README.md b/deployment/old/volumes/velero/README.md similarity index 100% rename from deployment/deployment/old/volumes/velero/README.md rename to deployment/old/volumes/velero/README.md diff --git a/deployment/deployment/old/volumes/volume-snapshots/README.md b/deployment/old/volumes/volume-snapshots/README.md similarity index 100% rename from deployment/deployment/old/volumes/volume-snapshots/README.md rename to deployment/old/volumes/volume-snapshots/README.md diff --git a/deployment/deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml b/deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml similarity index 100% rename from deployment/deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml rename to deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml diff --git a/deployment/deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png b/deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png similarity index 100% rename from deployment/deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png rename to deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png diff --git a/deployment/deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml b/deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml similarity index 100% rename from deployment/deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml rename to deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml diff --git a/deployment/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml similarity index 100% rename from deployment/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml rename to deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml From ebf3f2c8952c1bbe5ecf99a3092f893179703bf9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 12:16:09 +0100 Subject: [PATCH 292/344] moved files into src folder --- deployment/{ => src}/docker/backend.Dockerfile | 0 deployment/{ => src}/docker/maintenance.Dockerfile | 0 deployment/{ => src}/docker/neo4j.Dockerfile | 0 deployment/{ => src}/docker/webapp.Dockerfile | 0 deployment/{ => src}/kubernetes/.gitignore | 0 deployment/{ => src}/kubernetes/Backup.md | 0 deployment/{ => src}/kubernetes/Chart.yaml | 0 deployment/{ => src}/kubernetes/DigitalOcean.md | 0 deployment/{ => src}/kubernetes/README.md | 0 deployment/{ => src}/kubernetes/charts/.gitkeep | 0 deployment/{ => src}/kubernetes/crds/.gitkeep | 0 .../{ => src}/kubernetes/dns.values.template.yaml | 0 .../{ => src}/kubernetes/nginx.values.template.yaml | 0 deployment/{ => src}/kubernetes/templates/NOTES.txt | 0 .../kubernetes/templates/backend/ConfigMap.yml | 0 .../kubernetes/templates/backend/Deployment.yaml | 0 .../templates/backend/PersistentVolumeClaim.yaml | 0 .../kubernetes/templates/backend/Secret.yaml | 0 .../kubernetes/templates/backend/Service.yaml | 0 .../templates/issuer/letsencrypt-production.yaml | 0 .../templates/issuer/letsencrypt-staging.yaml | 0 .../kubernetes/templates/jobs/job-db-init.yaml | 0 .../kubernetes/templates/jobs/job-db-migrate.yaml | 0 .../kubernetes/templates/maintenance/ConfigMap.yml | 0 .../templates/maintenance/Deployment.yaml | 0 .../kubernetes/templates/maintenance/Secret.yaml | 0 .../kubernetes/templates/maintenance/Service.yaml | 0 .../kubernetes/templates/neo4j/ConfigMap.yml | 0 .../kubernetes/templates/neo4j/Deployment.yaml | 0 .../templates/neo4j/PersistentVolumeClaim.yaml | 0 .../kubernetes/templates/neo4j/Secret.yaml | 0 .../kubernetes/templates/neo4j/Service.yaml | 0 .../kubernetes/templates/storage/persistent.yml | 0 .../kubernetes/templates/webapp/ConfigMap.yml | 0 .../kubernetes/templates/webapp/Deployment.yaml | 0 .../kubernetes/templates/webapp/Ingress.yaml | 0 .../kubernetes/templates/webapp/Secret.yaml | 0 .../kubernetes/templates/webapp/Service.yaml | 0 .../{ => src}/kubernetes/values.template.yaml | 0 deployment/{ => src}/old/Maintenance.md | 0 deployment/{ => src}/old/digital-ocean/README.md | 0 .../{ => src}/old/digital-ocean/dashboard/README.md | 0 .../old/digital-ocean/dashboard/admin-user.yaml | 0 .../dashboard/dashboard-screenshot.png | Bin .../old/digital-ocean/dashboard/role-binding.yaml | 0 .../{ => src}/old/digital-ocean/https/README.md | 0 .../old/digital-ocean/https/ip-address.png | Bin deployment/{ => src}/old/legacy-migration/README.md | 0 .../old/legacy-migration/maintenance-worker.yaml | 0 .../maintenance-worker/.dockerignore | 0 .../legacy-migration/maintenance-worker/.gitignore | 0 .../legacy-migration/maintenance-worker/Dockerfile | 0 .../maintenance-worker/binaries/idle | 0 .../maintenance-worker/binaries/import_legacy_db | 0 .../binaries/import_legacy_uploads | 0 .../legacy-migration/maintenance-worker/known_hosts | 0 .../maintenance-worker/migration/mongo/export.sh | 0 .../migration/neo4j/badges/badges.cql | 0 .../migration/neo4j/badges/delete.cql | 0 .../migration/neo4j/categories/categories.cql | 0 .../migration/neo4j/categories/delete.cql | 0 .../migration/neo4j/comments/comments.cql | 0 .../migration/neo4j/comments/delete.cql | 0 .../migration/neo4j/contributions/contributions.cql | 0 .../migration/neo4j/contributions/delete.cql | 0 .../migration/neo4j/delete_all.cql | 0 .../migration/neo4j/emotions/delete.cql | 0 .../migration/neo4j/emotions/emotions.cql | 0 .../migration/neo4j/follows/delete.cql | 0 .../migration/neo4j/follows/follows.cql | 0 .../maintenance-worker/migration/neo4j/import.sh | 0 .../migration/neo4j/invites/delete.cql | 0 .../migration/neo4j/invites/invites.cql | 0 .../migration/neo4j/notifications/delete.cql | 0 .../migration/neo4j/notifications/notifications.cql | 0 .../migration/neo4j/organizations/delete.cql | 0 .../migration/neo4j/organizations/organizations.cql | 0 .../migration/neo4j/pages/delete.cql | 0 .../migration/neo4j/pages/pages.cql | 0 .../migration/neo4j/projects/delete.cql | 0 .../migration/neo4j/projects/projects.cql | 0 .../migration/neo4j/settings/delete.cql | 0 .../migration/neo4j/settings/settings.cql | 0 .../migration/neo4j/shouts/delete.cql | 0 .../migration/neo4j/shouts/shouts.cql | 0 .../migration/neo4j/status/delete.cql | 0 .../migration/neo4j/status/status.cql | 0 .../migration/neo4j/systemnotifications/delete.cql | 0 .../systemnotifications/systemnotifications.cql | 0 .../migration/neo4j/users/delete.cql | 0 .../migration/neo4j/users/users.cql | 0 .../migration/neo4j/userscandos/delete.cql | 0 .../migration/neo4j/userscandos/userscandos.cql | 0 .../migration/neo4j/usersettings/delete.cql | 0 .../migration/neo4j/usersettings/usersettings.cql | 0 deployment/{ => src}/old/mailserver/Deployment.yaml | 0 deployment/{ => src}/old/mailserver/README.md | 0 deployment/{ => src}/old/mailserver/Service.yaml | 0 deployment/{ => src}/old/mailserver/ingress.yaml | 0 deployment/{ => src}/old/monitoring/README.md | 0 .../{ => src}/old/monitoring/grafana/config.yml | 0 .../{ => src}/old/monitoring/grafana/metrics.png | Bin .../{ => src}/old/monitoring/grafana/values.yml | 0 deployment/{ => src}/old/volumes/README.md | 0 .../old/volumes/neo4j-offline-backup/README.md | 0 .../old/volumes/neo4j-online-backup/README.md | 0 deployment/{ => src}/old/volumes/uploads.yaml | 0 deployment/{ => src}/old/volumes/velero/README.md | 0 .../old/volumes/volume-snapshots/README.md | 0 .../volume-snapshots/backen-uploads-snapshot.yaml | 0 .../digital-ocean-volume-snapshots.png | Bin .../neo4j-data-provision-snapshot.yaml | 0 .../volume-snapshots/neo4j-data-snapshot.yaml | 0 deployment/{ => src}/tools/merge-locales.sh | 0 114 files changed, 0 insertions(+), 0 deletions(-) rename deployment/{ => src}/docker/backend.Dockerfile (100%) rename deployment/{ => src}/docker/maintenance.Dockerfile (100%) rename deployment/{ => src}/docker/neo4j.Dockerfile (100%) rename deployment/{ => src}/docker/webapp.Dockerfile (100%) rename deployment/{ => src}/kubernetes/.gitignore (100%) rename deployment/{ => src}/kubernetes/Backup.md (100%) rename deployment/{ => src}/kubernetes/Chart.yaml (100%) rename deployment/{ => src}/kubernetes/DigitalOcean.md (100%) rename deployment/{ => src}/kubernetes/README.md (100%) rename deployment/{ => src}/kubernetes/charts/.gitkeep (100%) rename deployment/{ => src}/kubernetes/crds/.gitkeep (100%) rename deployment/{ => src}/kubernetes/dns.values.template.yaml (100%) rename deployment/{ => src}/kubernetes/nginx.values.template.yaml (100%) rename deployment/{ => src}/kubernetes/templates/NOTES.txt (100%) rename deployment/{ => src}/kubernetes/templates/backend/ConfigMap.yml (100%) rename deployment/{ => src}/kubernetes/templates/backend/Deployment.yaml (100%) rename deployment/{ => src}/kubernetes/templates/backend/PersistentVolumeClaim.yaml (100%) rename deployment/{ => src}/kubernetes/templates/backend/Secret.yaml (100%) rename deployment/{ => src}/kubernetes/templates/backend/Service.yaml (100%) rename deployment/{ => src}/kubernetes/templates/issuer/letsencrypt-production.yaml (100%) rename deployment/{ => src}/kubernetes/templates/issuer/letsencrypt-staging.yaml (100%) rename deployment/{ => src}/kubernetes/templates/jobs/job-db-init.yaml (100%) rename deployment/{ => src}/kubernetes/templates/jobs/job-db-migrate.yaml (100%) rename deployment/{ => src}/kubernetes/templates/maintenance/ConfigMap.yml (100%) rename deployment/{ => src}/kubernetes/templates/maintenance/Deployment.yaml (100%) rename deployment/{ => src}/kubernetes/templates/maintenance/Secret.yaml (100%) rename deployment/{ => src}/kubernetes/templates/maintenance/Service.yaml (100%) rename deployment/{ => src}/kubernetes/templates/neo4j/ConfigMap.yml (100%) rename deployment/{ => src}/kubernetes/templates/neo4j/Deployment.yaml (100%) rename deployment/{ => src}/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml (100%) rename deployment/{ => src}/kubernetes/templates/neo4j/Secret.yaml (100%) rename deployment/{ => src}/kubernetes/templates/neo4j/Service.yaml (100%) rename deployment/{ => src}/kubernetes/templates/storage/persistent.yml (100%) rename deployment/{ => src}/kubernetes/templates/webapp/ConfigMap.yml (100%) rename deployment/{ => src}/kubernetes/templates/webapp/Deployment.yaml (100%) rename deployment/{ => src}/kubernetes/templates/webapp/Ingress.yaml (100%) rename deployment/{ => src}/kubernetes/templates/webapp/Secret.yaml (100%) rename deployment/{ => src}/kubernetes/templates/webapp/Service.yaml (100%) rename deployment/{ => src}/kubernetes/values.template.yaml (100%) rename deployment/{ => src}/old/Maintenance.md (100%) rename deployment/{ => src}/old/digital-ocean/README.md (100%) rename deployment/{ => src}/old/digital-ocean/dashboard/README.md (100%) rename deployment/{ => src}/old/digital-ocean/dashboard/admin-user.yaml (100%) rename deployment/{ => src}/old/digital-ocean/dashboard/dashboard-screenshot.png (100%) rename deployment/{ => src}/old/digital-ocean/dashboard/role-binding.yaml (100%) rename deployment/{ => src}/old/digital-ocean/https/README.md (100%) rename deployment/{ => src}/old/digital-ocean/https/ip-address.png (100%) rename deployment/{ => src}/old/legacy-migration/README.md (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker.yaml (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/.dockerignore (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/.gitignore (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/Dockerfile (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/binaries/idle (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/binaries/import_legacy_db (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/known_hosts (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/mongo/export.sh (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql (100%) rename deployment/{ => src}/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql (100%) rename deployment/{ => src}/old/mailserver/Deployment.yaml (100%) rename deployment/{ => src}/old/mailserver/README.md (100%) rename deployment/{ => src}/old/mailserver/Service.yaml (100%) rename deployment/{ => src}/old/mailserver/ingress.yaml (100%) rename deployment/{ => src}/old/monitoring/README.md (100%) rename deployment/{ => src}/old/monitoring/grafana/config.yml (100%) rename deployment/{ => src}/old/monitoring/grafana/metrics.png (100%) rename deployment/{ => src}/old/monitoring/grafana/values.yml (100%) rename deployment/{ => src}/old/volumes/README.md (100%) rename deployment/{ => src}/old/volumes/neo4j-offline-backup/README.md (100%) rename deployment/{ => src}/old/volumes/neo4j-online-backup/README.md (100%) rename deployment/{ => src}/old/volumes/uploads.yaml (100%) rename deployment/{ => src}/old/volumes/velero/README.md (100%) rename deployment/{ => src}/old/volumes/volume-snapshots/README.md (100%) rename deployment/{ => src}/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml (100%) rename deployment/{ => src}/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png (100%) rename deployment/{ => src}/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml (100%) rename deployment/{ => src}/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml (100%) rename deployment/{ => src}/tools/merge-locales.sh (100%) diff --git a/deployment/docker/backend.Dockerfile b/deployment/src/docker/backend.Dockerfile similarity index 100% rename from deployment/docker/backend.Dockerfile rename to deployment/src/docker/backend.Dockerfile diff --git a/deployment/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile similarity index 100% rename from deployment/docker/maintenance.Dockerfile rename to deployment/src/docker/maintenance.Dockerfile diff --git a/deployment/docker/neo4j.Dockerfile b/deployment/src/docker/neo4j.Dockerfile similarity index 100% rename from deployment/docker/neo4j.Dockerfile rename to deployment/src/docker/neo4j.Dockerfile diff --git a/deployment/docker/webapp.Dockerfile b/deployment/src/docker/webapp.Dockerfile similarity index 100% rename from deployment/docker/webapp.Dockerfile rename to deployment/src/docker/webapp.Dockerfile diff --git a/deployment/kubernetes/.gitignore b/deployment/src/kubernetes/.gitignore similarity index 100% rename from deployment/kubernetes/.gitignore rename to deployment/src/kubernetes/.gitignore diff --git a/deployment/kubernetes/Backup.md b/deployment/src/kubernetes/Backup.md similarity index 100% rename from deployment/kubernetes/Backup.md rename to deployment/src/kubernetes/Backup.md diff --git a/deployment/kubernetes/Chart.yaml b/deployment/src/kubernetes/Chart.yaml similarity index 100% rename from deployment/kubernetes/Chart.yaml rename to deployment/src/kubernetes/Chart.yaml diff --git a/deployment/kubernetes/DigitalOcean.md b/deployment/src/kubernetes/DigitalOcean.md similarity index 100% rename from deployment/kubernetes/DigitalOcean.md rename to deployment/src/kubernetes/DigitalOcean.md diff --git a/deployment/kubernetes/README.md b/deployment/src/kubernetes/README.md similarity index 100% rename from deployment/kubernetes/README.md rename to deployment/src/kubernetes/README.md diff --git a/deployment/kubernetes/charts/.gitkeep b/deployment/src/kubernetes/charts/.gitkeep similarity index 100% rename from deployment/kubernetes/charts/.gitkeep rename to deployment/src/kubernetes/charts/.gitkeep diff --git a/deployment/kubernetes/crds/.gitkeep b/deployment/src/kubernetes/crds/.gitkeep similarity index 100% rename from deployment/kubernetes/crds/.gitkeep rename to deployment/src/kubernetes/crds/.gitkeep diff --git a/deployment/kubernetes/dns.values.template.yaml b/deployment/src/kubernetes/dns.values.template.yaml similarity index 100% rename from deployment/kubernetes/dns.values.template.yaml rename to deployment/src/kubernetes/dns.values.template.yaml diff --git a/deployment/kubernetes/nginx.values.template.yaml b/deployment/src/kubernetes/nginx.values.template.yaml similarity index 100% rename from deployment/kubernetes/nginx.values.template.yaml rename to deployment/src/kubernetes/nginx.values.template.yaml diff --git a/deployment/kubernetes/templates/NOTES.txt b/deployment/src/kubernetes/templates/NOTES.txt similarity index 100% rename from deployment/kubernetes/templates/NOTES.txt rename to deployment/src/kubernetes/templates/NOTES.txt diff --git a/deployment/kubernetes/templates/backend/ConfigMap.yml b/deployment/src/kubernetes/templates/backend/ConfigMap.yml similarity index 100% rename from deployment/kubernetes/templates/backend/ConfigMap.yml rename to deployment/src/kubernetes/templates/backend/ConfigMap.yml diff --git a/deployment/kubernetes/templates/backend/Deployment.yaml b/deployment/src/kubernetes/templates/backend/Deployment.yaml similarity index 100% rename from deployment/kubernetes/templates/backend/Deployment.yaml rename to deployment/src/kubernetes/templates/backend/Deployment.yaml diff --git a/deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml b/deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml similarity index 100% rename from deployment/kubernetes/templates/backend/PersistentVolumeClaim.yaml rename to deployment/src/kubernetes/templates/backend/PersistentVolumeClaim.yaml diff --git a/deployment/kubernetes/templates/backend/Secret.yaml b/deployment/src/kubernetes/templates/backend/Secret.yaml similarity index 100% rename from deployment/kubernetes/templates/backend/Secret.yaml rename to deployment/src/kubernetes/templates/backend/Secret.yaml diff --git a/deployment/kubernetes/templates/backend/Service.yaml b/deployment/src/kubernetes/templates/backend/Service.yaml similarity index 100% rename from deployment/kubernetes/templates/backend/Service.yaml rename to deployment/src/kubernetes/templates/backend/Service.yaml diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-production.yaml b/deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml similarity index 100% rename from deployment/kubernetes/templates/issuer/letsencrypt-production.yaml rename to deployment/src/kubernetes/templates/issuer/letsencrypt-production.yaml diff --git a/deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml b/deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml similarity index 100% rename from deployment/kubernetes/templates/issuer/letsencrypt-staging.yaml rename to deployment/src/kubernetes/templates/issuer/letsencrypt-staging.yaml diff --git a/deployment/kubernetes/templates/jobs/job-db-init.yaml b/deployment/src/kubernetes/templates/jobs/job-db-init.yaml similarity index 100% rename from deployment/kubernetes/templates/jobs/job-db-init.yaml rename to deployment/src/kubernetes/templates/jobs/job-db-init.yaml diff --git a/deployment/kubernetes/templates/jobs/job-db-migrate.yaml b/deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml similarity index 100% rename from deployment/kubernetes/templates/jobs/job-db-migrate.yaml rename to deployment/src/kubernetes/templates/jobs/job-db-migrate.yaml diff --git a/deployment/kubernetes/templates/maintenance/ConfigMap.yml b/deployment/src/kubernetes/templates/maintenance/ConfigMap.yml similarity index 100% rename from deployment/kubernetes/templates/maintenance/ConfigMap.yml rename to deployment/src/kubernetes/templates/maintenance/ConfigMap.yml diff --git a/deployment/kubernetes/templates/maintenance/Deployment.yaml b/deployment/src/kubernetes/templates/maintenance/Deployment.yaml similarity index 100% rename from deployment/kubernetes/templates/maintenance/Deployment.yaml rename to deployment/src/kubernetes/templates/maintenance/Deployment.yaml diff --git a/deployment/kubernetes/templates/maintenance/Secret.yaml b/deployment/src/kubernetes/templates/maintenance/Secret.yaml similarity index 100% rename from deployment/kubernetes/templates/maintenance/Secret.yaml rename to deployment/src/kubernetes/templates/maintenance/Secret.yaml diff --git a/deployment/kubernetes/templates/maintenance/Service.yaml b/deployment/src/kubernetes/templates/maintenance/Service.yaml similarity index 100% rename from deployment/kubernetes/templates/maintenance/Service.yaml rename to deployment/src/kubernetes/templates/maintenance/Service.yaml diff --git a/deployment/kubernetes/templates/neo4j/ConfigMap.yml b/deployment/src/kubernetes/templates/neo4j/ConfigMap.yml similarity index 100% rename from deployment/kubernetes/templates/neo4j/ConfigMap.yml rename to deployment/src/kubernetes/templates/neo4j/ConfigMap.yml diff --git a/deployment/kubernetes/templates/neo4j/Deployment.yaml b/deployment/src/kubernetes/templates/neo4j/Deployment.yaml similarity index 100% rename from deployment/kubernetes/templates/neo4j/Deployment.yaml rename to deployment/src/kubernetes/templates/neo4j/Deployment.yaml diff --git a/deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml b/deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml similarity index 100% rename from deployment/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml rename to deployment/src/kubernetes/templates/neo4j/PersistentVolumeClaim.yaml diff --git a/deployment/kubernetes/templates/neo4j/Secret.yaml b/deployment/src/kubernetes/templates/neo4j/Secret.yaml similarity index 100% rename from deployment/kubernetes/templates/neo4j/Secret.yaml rename to deployment/src/kubernetes/templates/neo4j/Secret.yaml diff --git a/deployment/kubernetes/templates/neo4j/Service.yaml b/deployment/src/kubernetes/templates/neo4j/Service.yaml similarity index 100% rename from deployment/kubernetes/templates/neo4j/Service.yaml rename to deployment/src/kubernetes/templates/neo4j/Service.yaml diff --git a/deployment/kubernetes/templates/storage/persistent.yml b/deployment/src/kubernetes/templates/storage/persistent.yml similarity index 100% rename from deployment/kubernetes/templates/storage/persistent.yml rename to deployment/src/kubernetes/templates/storage/persistent.yml diff --git a/deployment/kubernetes/templates/webapp/ConfigMap.yml b/deployment/src/kubernetes/templates/webapp/ConfigMap.yml similarity index 100% rename from deployment/kubernetes/templates/webapp/ConfigMap.yml rename to deployment/src/kubernetes/templates/webapp/ConfigMap.yml diff --git a/deployment/kubernetes/templates/webapp/Deployment.yaml b/deployment/src/kubernetes/templates/webapp/Deployment.yaml similarity index 100% rename from deployment/kubernetes/templates/webapp/Deployment.yaml rename to deployment/src/kubernetes/templates/webapp/Deployment.yaml diff --git a/deployment/kubernetes/templates/webapp/Ingress.yaml b/deployment/src/kubernetes/templates/webapp/Ingress.yaml similarity index 100% rename from deployment/kubernetes/templates/webapp/Ingress.yaml rename to deployment/src/kubernetes/templates/webapp/Ingress.yaml diff --git a/deployment/kubernetes/templates/webapp/Secret.yaml b/deployment/src/kubernetes/templates/webapp/Secret.yaml similarity index 100% rename from deployment/kubernetes/templates/webapp/Secret.yaml rename to deployment/src/kubernetes/templates/webapp/Secret.yaml diff --git a/deployment/kubernetes/templates/webapp/Service.yaml b/deployment/src/kubernetes/templates/webapp/Service.yaml similarity index 100% rename from deployment/kubernetes/templates/webapp/Service.yaml rename to deployment/src/kubernetes/templates/webapp/Service.yaml diff --git a/deployment/kubernetes/values.template.yaml b/deployment/src/kubernetes/values.template.yaml similarity index 100% rename from deployment/kubernetes/values.template.yaml rename to deployment/src/kubernetes/values.template.yaml diff --git a/deployment/old/Maintenance.md b/deployment/src/old/Maintenance.md similarity index 100% rename from deployment/old/Maintenance.md rename to deployment/src/old/Maintenance.md diff --git a/deployment/old/digital-ocean/README.md b/deployment/src/old/digital-ocean/README.md similarity index 100% rename from deployment/old/digital-ocean/README.md rename to deployment/src/old/digital-ocean/README.md diff --git a/deployment/old/digital-ocean/dashboard/README.md b/deployment/src/old/digital-ocean/dashboard/README.md similarity index 100% rename from deployment/old/digital-ocean/dashboard/README.md rename to deployment/src/old/digital-ocean/dashboard/README.md diff --git a/deployment/old/digital-ocean/dashboard/admin-user.yaml b/deployment/src/old/digital-ocean/dashboard/admin-user.yaml similarity index 100% rename from deployment/old/digital-ocean/dashboard/admin-user.yaml rename to deployment/src/old/digital-ocean/dashboard/admin-user.yaml diff --git a/deployment/old/digital-ocean/dashboard/dashboard-screenshot.png b/deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png similarity index 100% rename from deployment/old/digital-ocean/dashboard/dashboard-screenshot.png rename to deployment/src/old/digital-ocean/dashboard/dashboard-screenshot.png diff --git a/deployment/old/digital-ocean/dashboard/role-binding.yaml b/deployment/src/old/digital-ocean/dashboard/role-binding.yaml similarity index 100% rename from deployment/old/digital-ocean/dashboard/role-binding.yaml rename to deployment/src/old/digital-ocean/dashboard/role-binding.yaml diff --git a/deployment/old/digital-ocean/https/README.md b/deployment/src/old/digital-ocean/https/README.md similarity index 100% rename from deployment/old/digital-ocean/https/README.md rename to deployment/src/old/digital-ocean/https/README.md diff --git a/deployment/old/digital-ocean/https/ip-address.png b/deployment/src/old/digital-ocean/https/ip-address.png similarity index 100% rename from deployment/old/digital-ocean/https/ip-address.png rename to deployment/src/old/digital-ocean/https/ip-address.png diff --git a/deployment/old/legacy-migration/README.md b/deployment/src/old/legacy-migration/README.md similarity index 100% rename from deployment/old/legacy-migration/README.md rename to deployment/src/old/legacy-migration/README.md diff --git a/deployment/old/legacy-migration/maintenance-worker.yaml b/deployment/src/old/legacy-migration/maintenance-worker.yaml similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker.yaml rename to deployment/src/old/legacy-migration/maintenance-worker.yaml diff --git a/deployment/old/legacy-migration/maintenance-worker/.dockerignore b/deployment/src/old/legacy-migration/maintenance-worker/.dockerignore similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/.dockerignore rename to deployment/src/old/legacy-migration/maintenance-worker/.dockerignore diff --git a/deployment/old/legacy-migration/maintenance-worker/.gitignore b/deployment/src/old/legacy-migration/maintenance-worker/.gitignore similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/.gitignore rename to deployment/src/old/legacy-migration/maintenance-worker/.gitignore diff --git a/deployment/old/legacy-migration/maintenance-worker/Dockerfile b/deployment/src/old/legacy-migration/maintenance-worker/Dockerfile similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/Dockerfile rename to deployment/src/old/legacy-migration/maintenance-worker/Dockerfile diff --git a/deployment/old/legacy-migration/maintenance-worker/binaries/idle b/deployment/src/old/legacy-migration/maintenance-worker/binaries/idle similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/binaries/idle rename to deployment/src/old/legacy-migration/maintenance-worker/binaries/idle diff --git a/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db b/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_db rename to deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_db diff --git a/deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads b/deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads rename to deployment/src/old/legacy-migration/maintenance-worker/binaries/import_legacy_uploads diff --git a/deployment/old/legacy-migration/maintenance-worker/known_hosts b/deployment/src/old/legacy-migration/maintenance-worker/known_hosts similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/known_hosts rename to deployment/src/old/legacy-migration/maintenance-worker/known_hosts diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh b/deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/mongo/export.sh rename to deployment/src/old/legacy-migration/maintenance-worker/migration/mongo/export.sh diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/import.sh diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql diff --git a/deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql b/deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql similarity index 100% rename from deployment/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql rename to deployment/src/old/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql diff --git a/deployment/old/mailserver/Deployment.yaml b/deployment/src/old/mailserver/Deployment.yaml similarity index 100% rename from deployment/old/mailserver/Deployment.yaml rename to deployment/src/old/mailserver/Deployment.yaml diff --git a/deployment/old/mailserver/README.md b/deployment/src/old/mailserver/README.md similarity index 100% rename from deployment/old/mailserver/README.md rename to deployment/src/old/mailserver/README.md diff --git a/deployment/old/mailserver/Service.yaml b/deployment/src/old/mailserver/Service.yaml similarity index 100% rename from deployment/old/mailserver/Service.yaml rename to deployment/src/old/mailserver/Service.yaml diff --git a/deployment/old/mailserver/ingress.yaml b/deployment/src/old/mailserver/ingress.yaml similarity index 100% rename from deployment/old/mailserver/ingress.yaml rename to deployment/src/old/mailserver/ingress.yaml diff --git a/deployment/old/monitoring/README.md b/deployment/src/old/monitoring/README.md similarity index 100% rename from deployment/old/monitoring/README.md rename to deployment/src/old/monitoring/README.md diff --git a/deployment/old/monitoring/grafana/config.yml b/deployment/src/old/monitoring/grafana/config.yml similarity index 100% rename from deployment/old/monitoring/grafana/config.yml rename to deployment/src/old/monitoring/grafana/config.yml diff --git a/deployment/old/monitoring/grafana/metrics.png b/deployment/src/old/monitoring/grafana/metrics.png similarity index 100% rename from deployment/old/monitoring/grafana/metrics.png rename to deployment/src/old/monitoring/grafana/metrics.png diff --git a/deployment/old/monitoring/grafana/values.yml b/deployment/src/old/monitoring/grafana/values.yml similarity index 100% rename from deployment/old/monitoring/grafana/values.yml rename to deployment/src/old/monitoring/grafana/values.yml diff --git a/deployment/old/volumes/README.md b/deployment/src/old/volumes/README.md similarity index 100% rename from deployment/old/volumes/README.md rename to deployment/src/old/volumes/README.md diff --git a/deployment/old/volumes/neo4j-offline-backup/README.md b/deployment/src/old/volumes/neo4j-offline-backup/README.md similarity index 100% rename from deployment/old/volumes/neo4j-offline-backup/README.md rename to deployment/src/old/volumes/neo4j-offline-backup/README.md diff --git a/deployment/old/volumes/neo4j-online-backup/README.md b/deployment/src/old/volumes/neo4j-online-backup/README.md similarity index 100% rename from deployment/old/volumes/neo4j-online-backup/README.md rename to deployment/src/old/volumes/neo4j-online-backup/README.md diff --git a/deployment/old/volumes/uploads.yaml b/deployment/src/old/volumes/uploads.yaml similarity index 100% rename from deployment/old/volumes/uploads.yaml rename to deployment/src/old/volumes/uploads.yaml diff --git a/deployment/old/volumes/velero/README.md b/deployment/src/old/volumes/velero/README.md similarity index 100% rename from deployment/old/volumes/velero/README.md rename to deployment/src/old/volumes/velero/README.md diff --git a/deployment/old/volumes/volume-snapshots/README.md b/deployment/src/old/volumes/volume-snapshots/README.md similarity index 100% rename from deployment/old/volumes/volume-snapshots/README.md rename to deployment/src/old/volumes/volume-snapshots/README.md diff --git a/deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml similarity index 100% rename from deployment/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml rename to deployment/src/old/volumes/volume-snapshots/backen-uploads-snapshot.yaml diff --git a/deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png b/deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png similarity index 100% rename from deployment/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png rename to deployment/src/old/volumes/volume-snapshots/digital-ocean-volume-snapshots.png diff --git a/deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml similarity index 100% rename from deployment/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml rename to deployment/src/old/volumes/volume-snapshots/neo4j-data-provision-snapshot.yaml diff --git a/deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml b/deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml similarity index 100% rename from deployment/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml rename to deployment/src/old/volumes/volume-snapshots/neo4j-data-snapshot.yaml diff --git a/deployment/tools/merge-locales.sh b/deployment/src/tools/merge-locales.sh similarity index 100% rename from deployment/tools/merge-locales.sh rename to deployment/src/tools/merge-locales.sh From b4b82bacd07cef09b39d7cea831c59fd13e44905 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 12:17:32 +0100 Subject: [PATCH 293/344] moved brading into configuration/example --- .../{ => configurations/example}/branding/README.md | 0 .../branding/assets/styles/imports/_branding.scss | 0 .../example}/branding/constants/donation.js | 0 .../example}/branding/constants/emails.js | 0 .../example}/branding/constants/groups.js | 0 .../example}/branding/constants/headerMenu.js | 0 .../example}/branding/constants/links.js | 0 .../example}/branding/constants/logos.js | 0 .../example}/branding/constants/metadata.js | 0 .../example}/branding/email/.gitkeep | 0 .../example}/branding/email/templates/de/.gitkeep | 0 .../example}/branding/email/templates/en/.gitkeep | 0 .../example}/branding/locales/de.json | 0 .../example}/branding/locales/en.json | 0 .../branding/locales/html/de/code-of-conduct.html | 0 .../branding/locales/html/de/data-privacy.html | 0 .../example}/branding/locales/html/de/donate.html | 0 .../example}/branding/locales/html/de/faq.html | 0 .../example}/branding/locales/html/de/imprint.html | 0 .../branding/locales/html/de/organization.html | 0 .../example}/branding/locales/html/de/support.html | 0 .../locales/html/de/terms-and-conditions.html | 0 .../branding/locales/html/en/code-of-conduct.html | 0 .../branding/locales/html/en/data-privacy.html | 0 .../example}/branding/locales/html/en/donate.html | 0 .../example}/branding/locales/html/en/faq.html | 0 .../example}/branding/locales/html/en/imprint.html | 0 .../branding/locales/html/en/organization.html | 0 .../example}/branding/locales/html/en/support.html | 0 .../locales/html/en/terms-and-conditions.html | 0 .../example}/branding/static/favicon.ico | Bin .../example}/branding/static/icon.png | Bin .../branding/static/img/custom/logo-horizontal.svg | 0 .../branding/static/img/custom/logo-squared.svg | 0 .../templates/locales/html/general/de/faq.html | 0 .../templates/locales/html/general/en/faq.html | 0 .../locales/html/hc-y2020/de/code-of-conduct.html | 0 .../locales/html/hc-y2020/de/data-privacy.html | 0 .../html/hc-y2020/de/terms-and-conditions.html | 0 .../locales/html/hc-y2020/en/code-of-conduct.html | 0 .../html/hc-y2020/en/terms-and-conditions.html | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename deployment/{ => configurations/example}/branding/README.md (100%) rename deployment/{ => configurations/example}/branding/assets/styles/imports/_branding.scss (100%) rename deployment/{ => configurations/example}/branding/constants/donation.js (100%) rename deployment/{ => configurations/example}/branding/constants/emails.js (100%) rename deployment/{ => configurations/example}/branding/constants/groups.js (100%) rename deployment/{ => configurations/example}/branding/constants/headerMenu.js (100%) rename deployment/{ => configurations/example}/branding/constants/links.js (100%) rename deployment/{ => configurations/example}/branding/constants/logos.js (100%) rename deployment/{ => configurations/example}/branding/constants/metadata.js (100%) rename deployment/{ => configurations/example}/branding/email/.gitkeep (100%) rename deployment/{ => configurations/example}/branding/email/templates/de/.gitkeep (100%) rename deployment/{ => configurations/example}/branding/email/templates/en/.gitkeep (100%) rename deployment/{ => configurations/example}/branding/locales/de.json (100%) rename deployment/{ => configurations/example}/branding/locales/en.json (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/code-of-conduct.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/data-privacy.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/donate.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/faq.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/imprint.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/organization.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/support.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/de/terms-and-conditions.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/code-of-conduct.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/data-privacy.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/donate.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/faq.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/imprint.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/organization.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/support.html (100%) rename deployment/{ => configurations/example}/branding/locales/html/en/terms-and-conditions.html (100%) rename deployment/{ => configurations/example}/branding/static/favicon.ico (100%) rename deployment/{ => configurations/example}/branding/static/icon.png (100%) rename deployment/{ => configurations/example}/branding/static/img/custom/logo-horizontal.svg (100%) rename deployment/{ => configurations/example}/branding/static/img/custom/logo-squared.svg (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/general/de/faq.html (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/general/en/faq.html (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/hc-y2020/de/data-privacy.html (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html (100%) rename deployment/{ => configurations/example}/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html (100%) diff --git a/deployment/branding/README.md b/deployment/configurations/example/branding/README.md similarity index 100% rename from deployment/branding/README.md rename to deployment/configurations/example/branding/README.md diff --git a/deployment/branding/assets/styles/imports/_branding.scss b/deployment/configurations/example/branding/assets/styles/imports/_branding.scss similarity index 100% rename from deployment/branding/assets/styles/imports/_branding.scss rename to deployment/configurations/example/branding/assets/styles/imports/_branding.scss diff --git a/deployment/branding/constants/donation.js b/deployment/configurations/example/branding/constants/donation.js similarity index 100% rename from deployment/branding/constants/donation.js rename to deployment/configurations/example/branding/constants/donation.js diff --git a/deployment/branding/constants/emails.js b/deployment/configurations/example/branding/constants/emails.js similarity index 100% rename from deployment/branding/constants/emails.js rename to deployment/configurations/example/branding/constants/emails.js diff --git a/deployment/branding/constants/groups.js b/deployment/configurations/example/branding/constants/groups.js similarity index 100% rename from deployment/branding/constants/groups.js rename to deployment/configurations/example/branding/constants/groups.js diff --git a/deployment/branding/constants/headerMenu.js b/deployment/configurations/example/branding/constants/headerMenu.js similarity index 100% rename from deployment/branding/constants/headerMenu.js rename to deployment/configurations/example/branding/constants/headerMenu.js diff --git a/deployment/branding/constants/links.js b/deployment/configurations/example/branding/constants/links.js similarity index 100% rename from deployment/branding/constants/links.js rename to deployment/configurations/example/branding/constants/links.js diff --git a/deployment/branding/constants/logos.js b/deployment/configurations/example/branding/constants/logos.js similarity index 100% rename from deployment/branding/constants/logos.js rename to deployment/configurations/example/branding/constants/logos.js diff --git a/deployment/branding/constants/metadata.js b/deployment/configurations/example/branding/constants/metadata.js similarity index 100% rename from deployment/branding/constants/metadata.js rename to deployment/configurations/example/branding/constants/metadata.js diff --git a/deployment/branding/email/.gitkeep b/deployment/configurations/example/branding/email/.gitkeep similarity index 100% rename from deployment/branding/email/.gitkeep rename to deployment/configurations/example/branding/email/.gitkeep diff --git a/deployment/branding/email/templates/de/.gitkeep b/deployment/configurations/example/branding/email/templates/de/.gitkeep similarity index 100% rename from deployment/branding/email/templates/de/.gitkeep rename to deployment/configurations/example/branding/email/templates/de/.gitkeep diff --git a/deployment/branding/email/templates/en/.gitkeep b/deployment/configurations/example/branding/email/templates/en/.gitkeep similarity index 100% rename from deployment/branding/email/templates/en/.gitkeep rename to deployment/configurations/example/branding/email/templates/en/.gitkeep diff --git a/deployment/branding/locales/de.json b/deployment/configurations/example/branding/locales/de.json similarity index 100% rename from deployment/branding/locales/de.json rename to deployment/configurations/example/branding/locales/de.json diff --git a/deployment/branding/locales/en.json b/deployment/configurations/example/branding/locales/en.json similarity index 100% rename from deployment/branding/locales/en.json rename to deployment/configurations/example/branding/locales/en.json diff --git a/deployment/branding/locales/html/de/code-of-conduct.html b/deployment/configurations/example/branding/locales/html/de/code-of-conduct.html similarity index 100% rename from deployment/branding/locales/html/de/code-of-conduct.html rename to deployment/configurations/example/branding/locales/html/de/code-of-conduct.html diff --git a/deployment/branding/locales/html/de/data-privacy.html b/deployment/configurations/example/branding/locales/html/de/data-privacy.html similarity index 100% rename from deployment/branding/locales/html/de/data-privacy.html rename to deployment/configurations/example/branding/locales/html/de/data-privacy.html diff --git a/deployment/branding/locales/html/de/donate.html b/deployment/configurations/example/branding/locales/html/de/donate.html similarity index 100% rename from deployment/branding/locales/html/de/donate.html rename to deployment/configurations/example/branding/locales/html/de/donate.html diff --git a/deployment/branding/locales/html/de/faq.html b/deployment/configurations/example/branding/locales/html/de/faq.html similarity index 100% rename from deployment/branding/locales/html/de/faq.html rename to deployment/configurations/example/branding/locales/html/de/faq.html diff --git a/deployment/branding/locales/html/de/imprint.html b/deployment/configurations/example/branding/locales/html/de/imprint.html similarity index 100% rename from deployment/branding/locales/html/de/imprint.html rename to deployment/configurations/example/branding/locales/html/de/imprint.html diff --git a/deployment/branding/locales/html/de/organization.html b/deployment/configurations/example/branding/locales/html/de/organization.html similarity index 100% rename from deployment/branding/locales/html/de/organization.html rename to deployment/configurations/example/branding/locales/html/de/organization.html diff --git a/deployment/branding/locales/html/de/support.html b/deployment/configurations/example/branding/locales/html/de/support.html similarity index 100% rename from deployment/branding/locales/html/de/support.html rename to deployment/configurations/example/branding/locales/html/de/support.html diff --git a/deployment/branding/locales/html/de/terms-and-conditions.html b/deployment/configurations/example/branding/locales/html/de/terms-and-conditions.html similarity index 100% rename from deployment/branding/locales/html/de/terms-and-conditions.html rename to deployment/configurations/example/branding/locales/html/de/terms-and-conditions.html diff --git a/deployment/branding/locales/html/en/code-of-conduct.html b/deployment/configurations/example/branding/locales/html/en/code-of-conduct.html similarity index 100% rename from deployment/branding/locales/html/en/code-of-conduct.html rename to deployment/configurations/example/branding/locales/html/en/code-of-conduct.html diff --git a/deployment/branding/locales/html/en/data-privacy.html b/deployment/configurations/example/branding/locales/html/en/data-privacy.html similarity index 100% rename from deployment/branding/locales/html/en/data-privacy.html rename to deployment/configurations/example/branding/locales/html/en/data-privacy.html diff --git a/deployment/branding/locales/html/en/donate.html b/deployment/configurations/example/branding/locales/html/en/donate.html similarity index 100% rename from deployment/branding/locales/html/en/donate.html rename to deployment/configurations/example/branding/locales/html/en/donate.html diff --git a/deployment/branding/locales/html/en/faq.html b/deployment/configurations/example/branding/locales/html/en/faq.html similarity index 100% rename from deployment/branding/locales/html/en/faq.html rename to deployment/configurations/example/branding/locales/html/en/faq.html diff --git a/deployment/branding/locales/html/en/imprint.html b/deployment/configurations/example/branding/locales/html/en/imprint.html similarity index 100% rename from deployment/branding/locales/html/en/imprint.html rename to deployment/configurations/example/branding/locales/html/en/imprint.html diff --git a/deployment/branding/locales/html/en/organization.html b/deployment/configurations/example/branding/locales/html/en/organization.html similarity index 100% rename from deployment/branding/locales/html/en/organization.html rename to deployment/configurations/example/branding/locales/html/en/organization.html diff --git a/deployment/branding/locales/html/en/support.html b/deployment/configurations/example/branding/locales/html/en/support.html similarity index 100% rename from deployment/branding/locales/html/en/support.html rename to deployment/configurations/example/branding/locales/html/en/support.html diff --git a/deployment/branding/locales/html/en/terms-and-conditions.html b/deployment/configurations/example/branding/locales/html/en/terms-and-conditions.html similarity index 100% rename from deployment/branding/locales/html/en/terms-and-conditions.html rename to deployment/configurations/example/branding/locales/html/en/terms-and-conditions.html diff --git a/deployment/branding/static/favicon.ico b/deployment/configurations/example/branding/static/favicon.ico similarity index 100% rename from deployment/branding/static/favicon.ico rename to deployment/configurations/example/branding/static/favicon.ico diff --git a/deployment/branding/static/icon.png b/deployment/configurations/example/branding/static/icon.png similarity index 100% rename from deployment/branding/static/icon.png rename to deployment/configurations/example/branding/static/icon.png diff --git a/deployment/branding/static/img/custom/logo-horizontal.svg b/deployment/configurations/example/branding/static/img/custom/logo-horizontal.svg similarity index 100% rename from deployment/branding/static/img/custom/logo-horizontal.svg rename to deployment/configurations/example/branding/static/img/custom/logo-horizontal.svg diff --git a/deployment/branding/static/img/custom/logo-squared.svg b/deployment/configurations/example/branding/static/img/custom/logo-squared.svg similarity index 100% rename from deployment/branding/static/img/custom/logo-squared.svg rename to deployment/configurations/example/branding/static/img/custom/logo-squared.svg diff --git a/deployment/branding/templates/locales/html/general/de/faq.html b/deployment/configurations/example/branding/templates/locales/html/general/de/faq.html similarity index 100% rename from deployment/branding/templates/locales/html/general/de/faq.html rename to deployment/configurations/example/branding/templates/locales/html/general/de/faq.html diff --git a/deployment/branding/templates/locales/html/general/en/faq.html b/deployment/configurations/example/branding/templates/locales/html/general/en/faq.html similarity index 100% rename from deployment/branding/templates/locales/html/general/en/faq.html rename to deployment/configurations/example/branding/templates/locales/html/general/en/faq.html diff --git a/deployment/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 similarity index 100% rename from deployment/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html rename to deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/code-of-conduct.html diff --git a/deployment/branding/templates/locales/html/hc-y2020/de/data-privacy.html b/deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/data-privacy.html similarity index 100% rename from deployment/branding/templates/locales/html/hc-y2020/de/data-privacy.html rename to deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/data-privacy.html diff --git a/deployment/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 similarity index 100% rename from deployment/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html rename to deployment/configurations/example/branding/templates/locales/html/hc-y2020/de/terms-and-conditions.html diff --git a/deployment/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 similarity index 100% rename from deployment/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html rename to deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/code-of-conduct.html diff --git a/deployment/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 similarity index 100% rename from deployment/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html rename to deployment/configurations/example/branding/templates/locales/html/hc-y2020/en/terms-and-conditions.html From 0d138f5e1158807f8cd277280534690aae3a263b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 12:22:47 +0100 Subject: [PATCH 294/344] add gitignore to configuration folder --- deployment/configurations/.gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 deployment/configurations/.gitignore 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 From de3b5d2817e767d87f95f011972c0fb18a9c71f3 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 12:23:11 +0100 Subject: [PATCH 295/344] moved docu --- deployment/{docker => }/DOCKER_MORE_CLOSELY.md | 0 deployment/LICENSE.md | 11 ----------- deployment/{deployment => }/Minikube.md | 0 .../{deployment/README.md => README.deployment.md} | 0 4 files changed, 11 deletions(-) rename deployment/{docker => }/DOCKER_MORE_CLOSELY.md (100%) delete mode 100644 deployment/LICENSE.md rename deployment/{deployment => }/Minikube.md (100%) rename deployment/{deployment/README.md => README.deployment.md} (100%) diff --git a/deployment/docker/DOCKER_MORE_CLOSELY.md b/deployment/DOCKER_MORE_CLOSELY.md similarity index 100% rename from deployment/docker/DOCKER_MORE_CLOSELY.md rename to deployment/DOCKER_MORE_CLOSELY.md diff --git a/deployment/LICENSE.md b/deployment/LICENSE.md deleted file mode 100644 index 69cc340af..000000000 --- a/deployment/LICENSE.md +++ /dev/null @@ -1,11 +0,0 @@ -# LICENSE - -MIT License - -Copyright \(c\) 2022 by the [Ocelot.Social Community](https://github.com/Ocelot-Social-Community) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deployment/deployment/Minikube.md b/deployment/Minikube.md similarity index 100% rename from deployment/deployment/Minikube.md rename to deployment/Minikube.md diff --git a/deployment/deployment/README.md b/deployment/README.deployment.md similarity index 100% rename from deployment/deployment/README.md rename to deployment/README.deployment.md From c98127b82e47dd58a7268c8182928e384dd96faa Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 13:56:52 +0100 Subject: [PATCH 296/344] keep font folder to prevent error on docker build --- deployment/configurations/example/branding/assets/fonts/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 deployment/configurations/example/branding/assets/fonts/.gitkeep 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 From 925da6c8ed539fb5f376b43ed02cb00f7230ff27 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 13:57:20 +0100 Subject: [PATCH 297/344] docker build arg for branding folder --- deployment/src/docker/backend.Dockerfile | 10 ++++++---- deployment/src/docker/maintenance.Dockerfile | 8 +++++--- deployment/src/docker/webapp.Dockerfile | 18 ++++++++++-------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/deployment/src/docker/backend.Dockerfile b/deployment/src/docker/backend.Dockerfile index 542632c97..aa73e5c7d 100644 --- a/deployment/src/docker/backend.Dockerfile +++ b/deployment/src/docker/backend.Dockerfile @@ -9,11 +9,13 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code +ARG CONFIGURATION_FOLDER=configurations/example + # copy public constants and email templates into the Docker image to brand it -COPY branding/constants/emails.js src/config/ -COPY branding/constants/logos.js src/config/ -COPY branding/constants/metadata.js src/config/ -COPY branding/email/ src/middleware/helpers/email/ +COPY ${CONFIGURATION_FOLDER}/branding/constants/emails.js src/config/ +COPY ${CONFIGURATION_FOLDER}/branding/constants/logos.js src/config/ +COPY ${CONFIGURATION_FOLDER}/branding/constants/metadata.js src/config/ +COPY ${CONFIGURATION_FOLDER}/branding/email/ src/middleware/helpers/email/ ################################################################################## # BUILD ########################################################################## diff --git a/deployment/src/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile index e7771c533..7050d1aee 100644 --- a/deployment/src/docker/maintenance.Dockerfile +++ b/deployment/src/docker/maintenance.Dockerfile @@ -9,10 +9,12 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code +ARG CONFIGURATION_FOLDER=configurations/example + # copy public constants into the Docker image to brand it -COPY branding/static/ static/ -COPY branding/constants/ constants/ -COPY branding/locales/ locales/ +COPY ${CONFIGURATION_FOLDER}/branding/static/ static/ +COPY ${CONFIGURATION_FOLDER}/branding/constants/ constants/ +COPY ${CONFIGURATION_FOLDER}/branding/locales/ locales/ ################################################################################## # BUILD ########################################################################## diff --git a/deployment/src/docker/webapp.Dockerfile b/deployment/src/docker/webapp.Dockerfile index a07695b9a..830779b71 100644 --- a/deployment/src/docker/webapp.Dockerfile +++ b/deployment/src/docker/webapp.Dockerfile @@ -9,15 +9,17 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code +ARG CONFIGURATION_FOLDER=configurations/example + # copy public constants into the Docker image to brand it -COPY tools/ tools/ -COPY branding/static/ static/ -COPY branding/constants/ constants/ -COPY branding/locales/html/ locales/html/ -# COPY branding/locales/index.js locales/index.js -COPY branding/locales/*.json locales/tmp/ -COPY branding/assets/styles/imports/ assets/styles/imports/ -COPY branding/assets/fonts/ assets/fonts/ +COPY src/tools/ tools/ +COPY ${CONFIGURATION_FOLDER}/branding/static/ static/ +COPY ${CONFIGURATION_FOLDER}/branding/constants/ constants/ +COPY ${CONFIGURATION_FOLDER}/branding/locales/html/ locales/html/ +# COPY ${CONFIGURATION_FOLDER}/branding/locales/index.js locales/index.js +COPY ${CONFIGURATION_FOLDER}/branding/locales/*.json locales/tmp/ +COPY ${CONFIGURATION_FOLDER}/branding/assets/styles/imports/ assets/styles/imports/ +COPY ${CONFIGURATION_FOLDER}/branding/assets/fonts/ assets/fonts/ RUN apk add --no-cache bash jq From de87d9347a59341b49fbcbcf5c58444f00f4c015 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 13:57:43 +0100 Subject: [PATCH 298/344] removed duplicate gitignore --- deployment/.gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 deployment/.gitignore diff --git a/deployment/.gitignore b/deployment/.gitignore deleted file mode 100644 index e43b0f988..000000000 --- a/deployment/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store From f9fd5bfcafad1b81cc7cd722c9b1452f82e1053e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 13:58:41 +0100 Subject: [PATCH 299/344] docker-compose propagate build arg for branding folder --- deployment/.env.dist | 1 + deployment/docker-compose.yml | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 deployment/.env.dist diff --git a/deployment/.env.dist b/deployment/.env.dist new file mode 100644 index 000000000..f268ac77c --- /dev/null +++ b/deployment/.env.dist @@ -0,0 +1 @@ +CONFIGURATION_FOLDER=configurations/example \ No newline at end of file diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 535d485be..2eeae4ca3 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -11,15 +11,19 @@ services: # 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-branded:local-production build: - dockerfile: docker/webapp.Dockerfile + dockerfile: src/docker/webapp.Dockerfile target: branded context: . + args: + - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER ports: - 3000:3000 networks: - test-network depends_on: - backend + env_file: + - .env environment: - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 @@ -36,9 +40,11 @@ services: # 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-branded:local-production build: - dockerfile: docker/backend.Dockerfile + dockerfile: src/docker/backend.Dockerfile target: branded context: . + args: + - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER networks: - test-network depends_on: @@ -65,6 +71,8 @@ services: - SMTP_HOST=mailserver - SMTP_PORT=25 - SMTP_IGNORE_TLS=true + # env_file: + # - .env ######################################################## # MAINTENANCE ########################################## @@ -74,9 +82,11 @@ services: image: ocelotsocialnetwork/maintenance-branded:local-production build: # TODO: Separate from webapp, this must be independent - dockerfile: docker/maintenance.Dockerfile + dockerfile: src/docker/maintenance.Dockerfile target: branded context: . + args: + - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER networks: - test-network ports: @@ -88,6 +98,10 @@ 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-branded:local-production + build: + dockerfile: src/docker/neo4j.Dockerfile + target: community-branded + context: . networks: - test-network volumes: From 34588912b1b8aa580f4ad3915e5e1b59068f6957 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Feb 2023 15:52:25 +0100 Subject: [PATCH 300/344] allow to build locally including the ocelot image --- deployment/build.docker.sh | 35 +++++++++++++++++++++++++++++++++++ deployment/docker-compose.yml | 19 ++++++------------- 2 files changed, 41 insertions(+), 13 deletions(-) create mode 100755 deployment/build.docker.sh diff --git a/deployment/build.docker.sh b/deployment/build.docker.sh new file mode 100755 index 000000000..23a5cce21 --- /dev/null +++ b/deployment/build.docker.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + + +# DOCKER_BUILDKIT=0 +# TODO this must be somehow defined as service within docker-compose and build order must be defined accordingly +#services: +# basething: +# image: unimportantlocalnameusedinfromstatement +# build: +# dockerfile: src/docker/baseimage +# target: production +# context: . +# command: sleep 60 +# webapp: +# image: myimage/webapp:local-production +# depends_on: +# - basething +# build: +# dockerfile: src/docker/webapp.Dockerfile +# target: production +# context: . + +# Webapp +docker build --target base -t "ocelotsocialnetwork/webapp:local-base" $SCRIPT_DIR/../webapp/ +docker build --target code -t "ocelotsocialnetwork/webapp:local-code" $SCRIPT_DIR/../webapp/ +# Backend +docker build --target base -t "ocelotsocialnetwork/backend:local-base" $SCRIPT_DIR/../backend/ +docker build --target code -t "ocelotsocialnetwork/backend:local-code" $SCRIPT_DIR/../backend/ +# Maintenance +docker build --target base -t "ocelotsocialnetwork/maintenance:local-base" $SCRIPT_DIR/../webapp/ -f $SCRIPT_DIR/../webapp/Dockerfile.maintenance +docker build --target code -t "ocelotsocialnetwork/maintenance:local-code" $SCRIPT_DIR/../webapp/ -f $SCRIPT_DIR/../webapp/Dockerfile.maintenance \ No newline at end of file diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 2eeae4ca3..108e87bd3 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -4,11 +4,7 @@ version: "3.4" services: - ######################################################## - # WEBAPP ############################################### - ######################################################## webapp: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/webapp-branded:local-production build: dockerfile: src/docker/webapp.Dockerfile @@ -16,6 +12,8 @@ services: context: . args: - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code ports: - 3000:3000 networks: @@ -33,11 +31,7 @@ services: - INVITE_REGISTRATION=true - CATEGORIES_ACTIVE=true - ######################################################## - # BACKEND ############################################## - ######################################################## backend: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/backend-branded:local-production build: dockerfile: src/docker/backend.Dockerfile @@ -45,6 +39,8 @@ services: context: . args: - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code networks: - test-network depends_on: @@ -71,12 +67,7 @@ services: - SMTP_HOST=mailserver - SMTP_PORT=25 - SMTP_IGNORE_TLS=true - # env_file: - # - .env - ######################################################## - # MAINTENANCE ########################################## - ######################################################## maintenance: # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there image: ocelotsocialnetwork/maintenance-branded:local-production @@ -87,6 +78,8 @@ services: context: . args: - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER + - APP_IMAGE_TAG_BASE=local-base + - APP_IMAGE_TAG_CODE=local-code networks: - test-network ports: From fd223635d3733d5cf0bbafc1904ddceac8417ef7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 16 Feb 2023 02:20:42 +0100 Subject: [PATCH 301/344] have things working in docker-compose --- deployment/build.docker.sh | 35 -------------- deployment/docker-compose.yml | 63 ++++++++++++++++++++------ deployment/src/docker/neo4j.Dockerfile | 14 ------ 3 files changed, 49 insertions(+), 63 deletions(-) delete mode 100755 deployment/build.docker.sh delete mode 100644 deployment/src/docker/neo4j.Dockerfile diff --git a/deployment/build.docker.sh b/deployment/build.docker.sh deleted file mode 100755 index 23a5cce21..000000000 --- a/deployment/build.docker.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - - -SCRIPT_PATH=$(realpath $0) -SCRIPT_DIR=$(dirname $SCRIPT_PATH) - - -# DOCKER_BUILDKIT=0 -# TODO this must be somehow defined as service within docker-compose and build order must be defined accordingly -#services: -# basething: -# image: unimportantlocalnameusedinfromstatement -# build: -# dockerfile: src/docker/baseimage -# target: production -# context: . -# command: sleep 60 -# webapp: -# image: myimage/webapp:local-production -# depends_on: -# - basething -# build: -# dockerfile: src/docker/webapp.Dockerfile -# target: production -# context: . - -# Webapp -docker build --target base -t "ocelotsocialnetwork/webapp:local-base" $SCRIPT_DIR/../webapp/ -docker build --target code -t "ocelotsocialnetwork/webapp:local-code" $SCRIPT_DIR/../webapp/ -# Backend -docker build --target base -t "ocelotsocialnetwork/backend:local-base" $SCRIPT_DIR/../backend/ -docker build --target code -t "ocelotsocialnetwork/backend:local-code" $SCRIPT_DIR/../backend/ -# Maintenance -docker build --target base -t "ocelotsocialnetwork/maintenance:local-base" $SCRIPT_DIR/../webapp/ -f $SCRIPT_DIR/../webapp/Dockerfile.maintenance -docker build --target code -t "ocelotsocialnetwork/maintenance:local-code" $SCRIPT_DIR/../webapp/ -f $SCRIPT_DIR/../webapp/Dockerfile.maintenance \ No newline at end of file diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 108e87bd3..923bd51c6 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -1,8 +1,19 @@ # 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 + + webapp-code: + image: ocelotsocialnetwork/webapp:local-code + build: + dockerfile: ../webapp/Dockerfile + context: ../webapp + target: code webapp: image: ocelotsocialnetwork/webapp-branded:local-production @@ -20,6 +31,8 @@ services: - test-network depends_on: - backend + - webapp-base + - webapp-code env_file: - .env environment: @@ -31,6 +44,20 @@ services: - INVITE_REGISTRATION=true - CATEGORIES_ACTIVE=true + backend-base: + image: ocelotsocialnetwork/backend:local-base + build: + dockerfile: ../backend/Dockerfile + context: ../backend + target: base + + backend-code: + image: ocelotsocialnetwork/backend:local-code + build: + dockerfile: ../backend/Dockerfile + context: ../backend + target: code + backend: image: ocelotsocialnetwork/backend-branded:local-production build: @@ -45,6 +72,8 @@ services: - test-network depends_on: - neo4j + - backend-base + - backend-code ports: - 4000:4000 volumes: @@ -68,6 +97,20 @@ services: - SMTP_PORT=25 - SMTP_IGNORE_TLS=true + maintenance-base: + image: ocelotsocialnetwork/maintenance:local-base + build: + dockerfile: ../webapp/Dockerfile.maintenance + context: ../webapp + target: base + + maintenance-code: + image: ocelotsocialnetwork/maintenance:local-code + build: + dockerfile: ../webapp/Dockerfile.maintenance + context: ../webapp + target: code + 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-production @@ -82,19 +125,14 @@ services: - APP_IMAGE_TAG_CODE=local-code networks: - test-network + depends_on: + - maintenance-base + - maintenance-code ports: - 3001:80 - ######################################################## - # NEO4J ################################################ - ######################################################## neo4j: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: ocelotsocialnetwork/neo4j-community-branded:local-production - build: - dockerfile: src/docker/neo4j.Dockerfile - target: community-branded - context: . + image: ocelotsocialnetwork/neo4j-community:latest networks: - test-network volumes: @@ -106,9 +144,6 @@ services: ports: - 7687:7687 - ######################################################## - # MAILSERVER TO FAKE SMTP ############################## - ######################################################## mailserver: image: djfarrelly/maildev ports: diff --git a/deployment/src/docker/neo4j.Dockerfile b/deployment/src/docker/neo4j.Dockerfile deleted file mode 100644 index eddc7be38..000000000 --- a/deployment/src/docker/neo4j.Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j-community -ARG APP_IMAGE_TAG=latest -ARG APP_IMAGE_COMMUNITY=${APP_IMAGE}:${APP_IMAGE_TAG} - -################################################################################## -# COMMUNITY ###################################################################### -################################################################################## -FROM $APP_IMAGE_COMMUNITY as community-branded - -################################################################################## -# ENTERPRISE ##################################################################### -################################################################################## -# Todo: refactor this with 'APP_IMAGE', 'APP_IMAGE_TAG', and similar to 'APP_IMAGE_COMMUNITY', Neo4j 'dockerfile' from main code -FROM ocelotsocialnetwork/neo4j-enterprise:latest as enterprise-branded From 101fd1bb41940cd035cc2833d723f6af6b5c2869 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 16 Feb 2023 02:53:15 +0100 Subject: [PATCH 302/344] automatically rebuild when switching config, allow reuse of already built images --- deployment/.env.dist | 2 +- deployment/docker-compose.yml | 12 ++++++------ deployment/src/docker/backend.Dockerfile | 10 +++++----- deployment/src/docker/maintenance.Dockerfile | 8 ++++---- deployment/src/docker/webapp.Dockerfile | 16 ++++++++-------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/deployment/.env.dist b/deployment/.env.dist index f268ac77c..8b8901647 100644 --- a/deployment/.env.dist +++ b/deployment/.env.dist @@ -1 +1 @@ -CONFIGURATION_FOLDER=configurations/example \ No newline at end of file +CONFIGURATION=example \ No newline at end of file diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 923bd51c6..d2bb377a3 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -16,13 +16,13 @@ services: target: code webapp: - image: ocelotsocialnetwork/webapp-branded:local-production + image: ocelotsocialnetwork/webapp-branded:local-${CONFIGURATION} build: dockerfile: src/docker/webapp.Dockerfile target: branded context: . args: - - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER + - CONFIGURATION=$CONFIGURATION - APP_IMAGE_TAG_BASE=local-base - APP_IMAGE_TAG_CODE=local-code ports: @@ -59,13 +59,13 @@ services: target: code backend: - image: ocelotsocialnetwork/backend-branded:local-production + image: ocelotsocialnetwork/backend-branded:local-${CONFIGURATION} build: dockerfile: src/docker/backend.Dockerfile target: branded context: . args: - - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER + - CONFIGURATION=$CONFIGURATION - APP_IMAGE_TAG_BASE=local-base - APP_IMAGE_TAG_CODE=local-code networks: @@ -113,14 +113,14 @@ 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-branded:local-production + image: ocelotsocialnetwork/maintenance-branded:local-${CONFIGURATION} build: # TODO: Separate from webapp, this must be independent dockerfile: src/docker/maintenance.Dockerfile target: branded context: . args: - - CONFIGURATION_FOLDER=$CONFIGURATION_FOLDER + - CONFIGURATION=$CONFIGURATION - APP_IMAGE_TAG_BASE=local-base - APP_IMAGE_TAG_CODE=local-code networks: diff --git a/deployment/src/docker/backend.Dockerfile b/deployment/src/docker/backend.Dockerfile index aa73e5c7d..6d458c9d7 100644 --- a/deployment/src/docker/backend.Dockerfile +++ b/deployment/src/docker/backend.Dockerfile @@ -9,13 +9,13 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code -ARG CONFIGURATION_FOLDER=configurations/example +ARG CONFIGURATION=example # copy public constants and email templates into the Docker image to brand it -COPY ${CONFIGURATION_FOLDER}/branding/constants/emails.js src/config/ -COPY ${CONFIGURATION_FOLDER}/branding/constants/logos.js src/config/ -COPY ${CONFIGURATION_FOLDER}/branding/constants/metadata.js src/config/ -COPY ${CONFIGURATION_FOLDER}/branding/email/ src/middleware/helpers/email/ +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 ########################################################################## diff --git a/deployment/src/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile index 7050d1aee..1df6c551b 100644 --- a/deployment/src/docker/maintenance.Dockerfile +++ b/deployment/src/docker/maintenance.Dockerfile @@ -9,12 +9,12 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code -ARG CONFIGURATION_FOLDER=configurations/example +ARG CONFIGURATION=example # copy public constants into the Docker image to brand it -COPY ${CONFIGURATION_FOLDER}/branding/static/ static/ -COPY ${CONFIGURATION_FOLDER}/branding/constants/ constants/ -COPY ${CONFIGURATION_FOLDER}/branding/locales/ locales/ +COPY configurations/${CONFIGURATION}/branding/static/ static/ +COPY configurations/${CONFIGURATION}/branding/constants/ constants/ +COPY configurations/${CONFIGURATION}/branding/locales/ locales/ ################################################################################## # BUILD ########################################################################## diff --git a/deployment/src/docker/webapp.Dockerfile b/deployment/src/docker/webapp.Dockerfile index 830779b71..ad5b7c769 100644 --- a/deployment/src/docker/webapp.Dockerfile +++ b/deployment/src/docker/webapp.Dockerfile @@ -9,17 +9,17 @@ ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} ################################################################################## FROM $APP_IMAGE_CODE as code -ARG CONFIGURATION_FOLDER=configurations/example +ARG CONFIGURATION=example # copy public constants into the Docker image to brand it COPY src/tools/ tools/ -COPY ${CONFIGURATION_FOLDER}/branding/static/ static/ -COPY ${CONFIGURATION_FOLDER}/branding/constants/ constants/ -COPY ${CONFIGURATION_FOLDER}/branding/locales/html/ locales/html/ -# COPY ${CONFIGURATION_FOLDER}/branding/locales/index.js locales/index.js -COPY ${CONFIGURATION_FOLDER}/branding/locales/*.json locales/tmp/ -COPY ${CONFIGURATION_FOLDER}/branding/assets/styles/imports/ assets/styles/imports/ -COPY ${CONFIGURATION_FOLDER}/branding/assets/fonts/ assets/fonts/ +COPY configurations/${CONFIGURATION}/branding/static/ static/ +COPY configurations/${CONFIGURATION}/branding/constants/ constants/ +COPY configurations/${CONFIGURATION}/branding/locales/html/ locales/html/ +# COPY configurations/${CONFIGURATION}/branding/locales/index.js locales/index.js +COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ +COPY configurations/${CONFIGURATION}/branding/assets/styles/imports/ assets/styles/imports/ +COPY configurations/${CONFIGURATION}/branding/assets/fonts/ assets/fonts/ RUN apk add --no-cache bash jq From ff1ef56ea6c8aa7d84e925a7868c452213fa43fc Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 20 Feb 2023 15:42:07 +0100 Subject: [PATCH 303/344] first version of build-branded-images.sh --- deployment/build-branded-images.sh | 47 ++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 deployment/build-branded-images.sh diff --git a/deployment/build-branded-images.sh b/deployment/build-branded-images.sh new file mode 100755 index 000000000..04a724bb4 --- /dev/null +++ b/deployment/build-branded-images.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# 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:-${OCELOT_VERSION}} +BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')} +BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-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:${BRANDED_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:${BRANDED_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:${BRANDED_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}/." From 64c28f9feba2ea7c681b7081c3613ccbd299568b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 20 Feb 2023 15:49:43 +0100 Subject: [PATCH 304/344] comment to explain what to override for custom brandings --- deployment/build-branded-images.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deployment/build-branded-images.sh b/deployment/build-branded-images.sh index 04a724bb4..90e6729c0 100755 --- a/deployment/build-branded-images.sh +++ b/deployment/build-branded-images.sh @@ -1,5 +1,10 @@ #!/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-291 + # base setup SCRIPT_PATH=$(realpath $0) SCRIPT_DIR=$(dirname $SCRIPT_PATH) From 92f28c81f8cbd295dcaf6adcde6733cde23fdcf9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 20 Feb 2023 15:58:37 +0100 Subject: [PATCH 305/344] corrected example configuration --- deployment/build-branded-images.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/build-branded-images.sh b/deployment/build-branded-images.sh index 90e6729c0..7b3bb3a00 100755 --- a/deployment/build-branded-images.sh +++ b/deployment/build-branded-images.sh @@ -3,7 +3,7 @@ # 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-291 +# OCELOT_VERSION - specify the specific tag to build upon e.g. 2.4.0-300 # base setup SCRIPT_PATH=$(realpath $0) From 8192fac98fe59e4a0b6443ed15a9ea833b9c8beb Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 20 Feb 2023 16:09:59 +0100 Subject: [PATCH 306/344] publish-branded workflow --- .github/workflows/publish-branded.yml | 81 ++++++ deployment/.github/workflows/publish.yml | 315 ----------------------- 2 files changed, 81 insertions(+), 315 deletions(-) create mode 100644 .github/workflows/publish-branded.yml delete mode 100644 deployment/.github/workflows/publish.yml diff --git a/.github/workflows/publish-branded.yml b/.github/workflows/publish-branded.yml new file mode 100644 index 000000000..a52547e92 --- /dev/null +++ b/.github/workflows/publish-branded.yml @@ -0,0 +1,81 @@ +name: ocelot.social publish branded CI + +on: + push: + branches: + - master + - deployment +jobs: + build_branded: + name: Docker Build Branded + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Build branded images + run: | + deployment/build-branded-images.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: login to dockerhub + run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin + + - name: Push Backend + run: docker push --all-tags ocelotsocialnetwork/backend-branded + - name: Push Webapp + run: docker push --all-tags ocelotsocialnetwork/webapp-branded + - name: Push Maintenance + run: docker push --all-tags ocelotsocialnetwork/maintenance-branded \ No newline at end of file diff --git a/deployment/.github/workflows/publish.yml b/deployment/.github/workflows/publish.yml deleted file mode 100644 index 5cbdf9004..000000000 --- a/deployment/.github/workflows/publish.yml +++ /dev/null @@ -1,315 +0,0 @@ -name: ocelot.social publish branded CI - -on: - push: - branches: - - master - # - 79-fix-implementation-of-overwriting-locales # for testing while developing - -jobs: - ############################################################################## - # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## - ############################################################################## - build_branded_neo4j: - name: Docker Build Branded - Neo4j Community - runs-on: ubuntu-latest - #needs: [nothing] - 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 - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD NEO4J DOCKER IMAGE (community-branded) ########################### - ########################################################################## - - name: Neo4j | Build `community-branded` image - run: | - docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg "APP_IMAGE_TAG=${OCELOT_DOCKER_VERSION_TAG}" . - docker save "${DOCKER_ORGANISATION}/neo4j-community-branded" > /tmp/neo4j-community-branded.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-neo4j-community-branded - path: /tmp/neo4j-community-branded.tar - - ############################################################################## - # JOB: DOCKER BUILD BRANDED BACKEND ########################################## - ############################################################################## - build_branded_backend: - name: Docker Build Branded - Backend - runs-on: ubuntu-latest - #needs: [nothing] - 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 - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD BACKEND DOCKER IMAGE (branded) ################################ - ########################################################################## - - name: Backend | Build `branded` image - run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-backend-branded - path: /tmp/backend-branded.tar - - ############################################################################## - # JOB: DOCKER BUILD BRANDED WEBAPP ########################################### - ############################################################################## - build_branded_webapp: - name: Docker Build Branded - WebApp - runs-on: ubuntu-latest - #needs: [nothing] - 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 - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD WEBAPP DOCKER IMAGE (build) ###################################### - ########################################################################## - - name: Webapp | Build `branded` image - run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-webapp-branded - path: /tmp/webapp-branded.tar - - ############################################################################## - # JOB: DOCKER BUILD BRANDED MAINTENANCE ###################################### - ############################################################################## - build_branded_maintenance: - name: Docker Build Branded - Maintenance - runs-on: ubuntu-latest - #needs: [nothing] - 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 - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # BUILD MAINTENANCE DOCKER IMAGE (build) ################################# - ########################################################################## - - name: Maintenance | Build `branded` image - run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . - docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-maintenance-branded - path: /tmp/maintenance-branded.tar - - ############################################################################## - # JOB: UPLOAD TO DOCKERHUB ################################################### - ############################################################################## - upload_to_dockerhub: - name: Upload to Dockerhub - runs-on: ubuntu-latest - needs: [build_branded_neo4j,build_branded_backend,build_branded_webapp,build_branded_maintenance] - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} - 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 - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # DOWNLOAD DOCKER IMAGES ################################################# - ########################################################################## - # Neo4j Community - - name: Download Docker Image (Neo4j Community) - uses: actions/download-artifact@v2 - with: - name: docker-neo4j-community-branded - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/neo4j-community-branded.tar - # Backend - - 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 - # Webapp - - 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 - # Maintenance - - 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 - ########################################################################## - # Upload ################################################################# - ########################################################################## - - name: login to dockerhub - run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin - - name: Push Neo4j Community - run: docker push --all-tags ${DOCKER_ORGANISATION}/neo4j-community-branded - - name: Push Backend - run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-branded - - name: Push Webapp - run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-branded - - name: Push Maintenance - run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-branded - - ############################################################################## - # JOB: GITHUB TAG LATEST VERSION ############################################# - ############################################################################## - github_tag: - name: Tag latest version on Github - runs-on: ubuntu-latest - needs: [upload_to_dockerhub] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - 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 - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # Push build tag to GitHub ############################################### - ########################################################################## - - name: package-version-to-git-tag + build number - uses: pkgdeps/git-tag-action@v2 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - github_repo: ${{ github.repository }} - version: ${{ env.BUILD_VERSION }} - git_commit_sha: ${{ github.sha }} - git_tag_prefix: "b" - ########################################################################## - # Push release tag to GitHub ############################################# - ########################################################################## - - name: package-version-to-git-release - continue-on-error: true # Will fail if tag exists - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token - with: - tag_name: ${{ env.VERSION }} - release_name: ${{ env.VERSION }} - #body_path: ./CHANGELOG.md - draft: false - prerelease: false \ No newline at end of file From 30e79e7312bcca3c912ac055eeadd10769ba7d76 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 20 Feb 2023 16:31:15 +0100 Subject: [PATCH 307/344] properly set build version for branded images --- deployment/build-branded-images.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/build-branded-images.sh b/deployment/build-branded-images.sh index 7b3bb3a00..36eb2b585 100755 --- a/deployment/build-branded-images.sh +++ b/deployment/build-branded-images.sh @@ -13,9 +13,9 @@ SCRIPT_DIR=$(dirname $SCRIPT_PATH) 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:-${OCELOT_VERSION}} +BRANDED_VERSION=${BRANDED_VERSION:-${OCELOT_VERSION}-${GITHUB_RUN_NUMBER:-0}} BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')} -BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_VERSION} +BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION} BUILD_COMMIT=${GITHUB_SHA:-"0000000"} # backend From 7673c78ba898321facacccf1867a947f82f6ba73 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 20 Feb 2023 16:37:27 +0100 Subject: [PATCH 308/344] use build number for branded deployment version - local if not provided --- deployment/build-branded-images.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment/build-branded-images.sh b/deployment/build-branded-images.sh index 36eb2b585..82a8f461e 100755 --- a/deployment/build-branded-images.sh +++ b/deployment/build-branded-images.sh @@ -13,7 +13,7 @@ SCRIPT_DIR=$(dirname $SCRIPT_PATH) 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:-${OCELOT_VERSION}-${GITHUB_RUN_NUMBER:-0}} +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"} @@ -22,7 +22,7 @@ BUILD_COMMIT=${GITHUB_SHA:-"0000000"} docker build --target branded \ -t "${DOCKERHUB_ORGANISATION}/backend-branded:latest" \ -t "${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION}" \ - -t "${DOCKERHUB_ORGANISATION}/backend-branded:${BRANDED_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" \ @@ -33,7 +33,7 @@ docker build --target branded \ docker build --target branded \ -t "${DOCKERHUB_ORGANISATION}/webapp-branded:latest" \ -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION}" \ - -t "${DOCKERHUB_ORGANISATION}/webapp-branded:${BRANDED_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" \ @@ -44,7 +44,7 @@ docker build --target branded \ docker build --target branded \ -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:latest" \ -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION}" \ - -t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${BRANDED_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" \ From afc96fec88884a18a6c2844891f0b58c505d969b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 01:22:01 +0100 Subject: [PATCH 309/344] upload branded script --- .github/workflows/publish-branded.yml | 20 ++++++++------- deployment/upload-branded-images.sh | 35 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 9 deletions(-) create mode 100755 deployment/upload-branded-images.sh diff --git a/.github/workflows/publish-branded.yml b/.github/workflows/publish-branded.yml index a52547e92..3557a4854 100644 --- a/.github/workflows/publish-branded.yml +++ b/.github/workflows/publish-branded.yml @@ -69,13 +69,15 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/maintenance-branded.tar - - - name: login to dockerhub - run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin - - name: Push Backend - run: docker push --all-tags ocelotsocialnetwork/backend-branded - - name: Push Webapp - run: docker push --all-tags ocelotsocialnetwork/webapp-branded - - name: Push Maintenance - run: docker push --all-tags ocelotsocialnetwork/maintenance-branded \ No newline at end of file + - name: Upload to dockerhub + run: deployment/upload-branded-images.sh +# - name: login to dockerhub +# run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin +# +# - name: Push Backend +# run: docker push --all-tags ocelotsocialnetwork/backend-branded +# - name: Push Webapp +# run: docker push --all-tags ocelotsocialnetwork/webapp-branded +# - name: Push Maintenance +# run: docker push --all-tags ocelotsocialnetwork/maintenance-branded \ No newline at end of file diff --git a/deployment/upload-branded-images.sh b/deployment/upload-branded-images.sh new file mode 100755 index 000000000..e138b7be2 --- /dev/null +++ b/deployment/upload-branded-images.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 From dfc8db74d67d190bc387af4b97858e69c021b2a6 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 01:56:27 +0100 Subject: [PATCH 310/344] moved deployscripts, checkout code on workflow, new upgrade script --- .github/workflows/publish-branded.yml | 7 +++++-- deployment/{ => scripts}/build-branded-images.sh | 14 +++++++------- deployment/scripts/upgrade.sh | 16 ++++++++++++++++ .../{ => scripts}/upload-branded-images.sh | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) rename deployment/{ => scripts}/build-branded-images.sh (87%) create mode 100644 deployment/scripts/upgrade.sh rename deployment/{ => scripts}/upload-branded-images.sh (97%) diff --git a/.github/workflows/publish-branded.yml b/.github/workflows/publish-branded.yml index 3557a4854..01d879417 100644 --- a/.github/workflows/publish-branded.yml +++ b/.github/workflows/publish-branded.yml @@ -15,7 +15,7 @@ jobs: - name: Build branded images run: | - deployment/build-branded-images.sh + deployment/scripts/build-branded-images.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 @@ -46,6 +46,9 @@ jobs: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Download Docker Image (Backend) uses: actions/download-artifact@v2 with: @@ -71,7 +74,7 @@ jobs: run: docker load < /tmp/maintenance-branded.tar - name: Upload to dockerhub - run: deployment/upload-branded-images.sh + run: deployment/scripts/upload-branded-images.sh # - name: login to dockerhub # run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin # diff --git a/deployment/build-branded-images.sh b/deployment/scripts/build-branded-images.sh similarity index 87% rename from deployment/build-branded-images.sh rename to deployment/scripts/build-branded-images.sh index 82a8f461e..099ba460a 100755 --- a/deployment/build-branded-images.sh +++ b/deployment/scripts/build-branded-images.sh @@ -12,7 +12,7 @@ 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")} +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} @@ -23,30 +23,30 @@ 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" \ + -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}/." + "${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" \ + -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}/." + "${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" \ + -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}/." + "${SCRIPT_DIR}/../." diff --git a/deployment/scripts/upgrade.sh b/deployment/scripts/upgrade.sh new file mode 100644 index 000000000..7437de6cb --- /dev/null +++ b/deployment/scripts/upgrade.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +CONFIGURATION=${CONFIGURATION:-"example"} +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yml} +VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubenertes/values.yaml + +# constants +CHART=${SCRIPT_DIR}/../src/kubernetes/Chart.yaml + +# upgrade with helm +helm --kubeconfig=... upgrade ocelot --values ${VALUES} ${CHART} \ No newline at end of file diff --git a/deployment/upload-branded-images.sh b/deployment/scripts/upload-branded-images.sh similarity index 97% rename from deployment/upload-branded-images.sh rename to deployment/scripts/upload-branded-images.sh index e138b7be2..3891fe474 100755 --- a/deployment/upload-branded-images.sh +++ b/deployment/scripts/upload-branded-images.sh @@ -12,7 +12,7 @@ SCRIPT_DIR=$(dirname $SCRIPT_PATH) # configuration DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"} -OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../package.json').version")} +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} From de788d9e34ac8187d7159e96e91a2f03ff55ae09 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 02:04:52 +0100 Subject: [PATCH 311/344] upgrade script for helm upgrade --- deployment/scripts/upgrade.sh | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) mode change 100644 => 100755 deployment/scripts/upgrade.sh diff --git a/deployment/scripts/upgrade.sh b/deployment/scripts/upgrade.sh old mode 100644 new mode 100755 index 7437de6cb..cfec11770 --- a/deployment/scripts/upgrade.sh +++ b/deployment/scripts/upgrade.sh @@ -6,11 +6,8 @@ SCRIPT_DIR=$(dirname $SCRIPT_PATH) # configuration CONFIGURATION=${CONFIGURATION:-"example"} -KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yml} -VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubenertes/values.yaml - -# constants -CHART=${SCRIPT_DIR}/../src/kubernetes/Chart.yaml +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} +VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml # upgrade with helm -helm --kubeconfig=... upgrade ocelot --values ${VALUES} ${CHART} \ No newline at end of file +helm --kubeconfig=${KUBECONFIG} upgrade ocelot --values ${VALUES} ${SCRIPT_DIR}/../src/kubernetes/ \ No newline at end of file From 1c69c6f7b3bad388d993dd4cd906567f2b84bfa2 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 02:12:23 +0100 Subject: [PATCH 312/344] more renames of scripts --- .github/workflows/publish-branded.yml | 6 +++--- .../{build-branded-images.sh => branded-images.build.sh} | 0 .../{upload-branded-images.sh => branded-images.upload.sh} | 0 deployment/scripts/{upgrade.sh => cluster.upgrade.sh} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename deployment/scripts/{build-branded-images.sh => branded-images.build.sh} (100%) rename deployment/scripts/{upload-branded-images.sh => branded-images.upload.sh} (100%) rename deployment/scripts/{upgrade.sh => cluster.upgrade.sh} (87%) diff --git a/.github/workflows/publish-branded.yml b/.github/workflows/publish-branded.yml index 01d879417..21df00306 100644 --- a/.github/workflows/publish-branded.yml +++ b/.github/workflows/publish-branded.yml @@ -15,7 +15,7 @@ jobs: - name: Build branded images run: | - deployment/scripts/build-branded-images.sh + 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 @@ -48,7 +48,7 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v2 - + - name: Download Docker Image (Backend) uses: actions/download-artifact@v2 with: @@ -74,7 +74,7 @@ jobs: run: docker load < /tmp/maintenance-branded.tar - name: Upload to dockerhub - run: deployment/scripts/upload-branded-images.sh + run: deployment/scripts/branded-images.upload.sh # - name: login to dockerhub # run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin # diff --git a/deployment/scripts/build-branded-images.sh b/deployment/scripts/branded-images.build.sh similarity index 100% rename from deployment/scripts/build-branded-images.sh rename to deployment/scripts/branded-images.build.sh diff --git a/deployment/scripts/upload-branded-images.sh b/deployment/scripts/branded-images.upload.sh similarity index 100% rename from deployment/scripts/upload-branded-images.sh rename to deployment/scripts/branded-images.upload.sh diff --git a/deployment/scripts/upgrade.sh b/deployment/scripts/cluster.upgrade.sh similarity index 87% rename from deployment/scripts/upgrade.sh rename to deployment/scripts/cluster.upgrade.sh index cfec11770..c42345696 100755 --- a/deployment/scripts/upgrade.sh +++ b/deployment/scripts/cluster.upgrade.sh @@ -10,4 +10,4 @@ KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeco VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml # upgrade with helm -helm --kubeconfig=${KUBECONFIG} upgrade ocelot --values ${VALUES} ${SCRIPT_DIR}/../src/kubernetes/ \ No newline at end of file +helm --kubeconfig=${KUBECONFIG} upgrade ocelot --values ${VALUES} ${SCRIPT_DIR}/../src/kubernetes/ # --debug --timeout 10m \ No newline at end of file From 370045e238f04e24b4c63f648643894b0472295b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 02:19:45 +0100 Subject: [PATCH 313/344] apply changes from yunite --- deployment/src/kubernetes/templates/backend/Secret.yaml | 2 +- deployment/src/kubernetes/templates/webapp/Secret.yaml | 1 + deployment/src/kubernetes/values.template.yaml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/deployment/src/kubernetes/templates/backend/Secret.yaml b/deployment/src/kubernetes/templates/backend/Secret.yaml index 51e5516c2..512505694 100644 --- a/deployment/src/kubernetes/templates/backend/Secret.yaml +++ b/deployment/src/kubernetes/templates/backend/Secret.yaml @@ -12,7 +12,7 @@ metadata: helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" stringData: JWT_SECRET: "{{ .Values.BACKEND.JWT_SECRET }}" - MAPBOX_TOKEN: "{{ .Values.BACKEND.MAPBOX_TOKEN }}" + 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 }}" diff --git a/deployment/src/kubernetes/templates/webapp/Secret.yaml b/deployment/src/kubernetes/templates/webapp/Secret.yaml index 15b1db4f6..8c0fd9d39 100644 --- a/deployment/src/kubernetes/templates/webapp/Secret.yaml +++ b/deployment/src/kubernetes/templates/webapp/Secret.yaml @@ -11,3 +11,4 @@ metadata: 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/values.template.yaml b/deployment/src/kubernetes/values.template.yaml index e601f1ae6..86c02310c 100644 --- a/deployment/src/kubernetes/values.template.yaml +++ b/deployment/src/kubernetes/values.template.yaml @@ -1,6 +1,7 @@ # 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 @@ -15,7 +16,6 @@ BACKEND: CLIENT_URI: "https://staging.ocelot.social" # create a new one for your network JWT_SECRET: "b/&&7b78BF&fv/Vd" - MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" PRIVATE_KEY_PASSPHRASE: "a7dsf78sadg87ad87sfagsadg78" # ocelot.social mail dummy EMAIL_DEFAULT_SENDER: "devops@ocelot.social" From 34b32d0b400f617634718bd82c2fff15998ed5b4 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 02:30:50 +0100 Subject: [PATCH 314/344] have debug and timeout commands present in helm upgrade till we fix the migrations --- deployment/scripts/cluster.upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/scripts/cluster.upgrade.sh b/deployment/scripts/cluster.upgrade.sh index c42345696..2502a778a 100755 --- a/deployment/scripts/cluster.upgrade.sh +++ b/deployment/scripts/cluster.upgrade.sh @@ -10,4 +10,4 @@ KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeco 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 +helm --kubeconfig=${KUBECONFIG} upgrade ocelot --values ${VALUES} ${SCRIPT_DIR}/../src/kubernetes/ --debug --timeout 10m \ No newline at end of file From d322e3d36154e903bed280695113d79acb71e4e7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 02:59:17 +0100 Subject: [PATCH 315/344] deleted package.json --- deployment/package.json | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 deployment/package.json diff --git a/deployment/package.json b/deployment/package.json deleted file mode 100644 index b5dbca69e..000000000 --- a/deployment/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "ocelot-social-branded", - "version": "2.2.0", - "ocelotDockerVersionTag": "2.3.0-281", - "dockerOrganisation": "ocelotsocialnetwork", - "description": "ocelot.social Branded", - "author": "ocelot.social Community", - "license": "MIT", - "private": false, - "repository": { - "type": "git", - "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding.git" - } -} From 876674ad58442553fcf059de547723f22ed0ddbe Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 21 Feb 2023 03:03:00 +0100 Subject: [PATCH 316/344] moved values.template.yaml --- .../example}/kubernetes/values.template.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename deployment/{src => configurations/example}/kubernetes/values.template.yaml (100%) diff --git a/deployment/src/kubernetes/values.template.yaml b/deployment/configurations/example/kubernetes/values.template.yaml similarity index 100% rename from deployment/src/kubernetes/values.template.yaml rename to deployment/configurations/example/kubernetes/values.template.yaml From 9bdc9fe2efee4978aff5ee5990173e3054f1ad00 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 22 Feb 2023 07:56:13 +0100 Subject: [PATCH 317/344] Add align center to the user profile slug. --- webapp/pages/profile/_id/_slug.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue index 1939dcd9f..e706b6ef3 100644 --- a/webapp/pages/profile/_id/_slug.vue +++ b/webapp/pages/profile/_id/_slug.vue @@ -83,7 +83,7 @@ From 97c87e2f9311b7f7454d679acc1ad261e96d45d1 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 22 Feb 2023 09:01:09 +0100 Subject: [PATCH 318/344] Fix linting. --- webapp/pages/profile/_id/_slug.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue index e706b6ef3..a2b959b6d 100644 --- a/webapp/pages/profile/_id/_slug.vue +++ b/webapp/pages/profile/_id/_slug.vue @@ -83,7 +83,9 @@ From 8df83adc2f6f1105b2229d052401c24d41c13558 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 23 Feb 2023 07:18:14 +0100 Subject: [PATCH 319/344] Remove markers from MapboxGeocoder the users and groups marks are not affected. --- webapp/pages/map.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/pages/map.vue b/webapp/pages/map.vue index 424061203..afdc80e83 100644 --- a/webapp/pages/map.vue +++ b/webapp/pages/map.vue @@ -209,6 +209,7 @@ export default { new MapboxGeocoder({ accessToken: this.$env.MAPBOX_TOKEN, mapboxgl: this.mapboxgl, + marker: false, }), ) From 9d3cd891dea92f118a444f8a050161eab1d3abf1 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 23 Feb 2023 11:07:02 +0100 Subject: [PATCH 320/344] remove deployment branch from workflow - no longer needed --- .github/workflows/publish-branded.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/publish-branded.yml b/.github/workflows/publish-branded.yml index 21df00306..2877aa213 100644 --- a/.github/workflows/publish-branded.yml +++ b/.github/workflows/publish-branded.yml @@ -4,7 +4,6 @@ on: push: branches: - master - - deployment jobs: build_branded: name: Docker Build Branded From 14426b43974aa3a49e9ed1e32711452474cfcf37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 23 Feb 2023 13:23:23 +0100 Subject: [PATCH 321/344] Add node gyp dependencies --- backend/Dockerfile | 2 +- webapp/Dockerfile | 2 +- webapp/Dockerfile.maintenance | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 39dcb54ea..c04cd9bc9 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -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 b/webapp/Dockerfile index 479080e0b..7952d02c1 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -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 256d7b601..e148da555 100644 --- a/webapp/Dockerfile.maintenance +++ b/webapp/Dockerfile.maintenance @@ -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 From 99bea1d83517224fb25b104f15ed88154af3a145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 23 Feb 2023 13:56:24 +0100 Subject: [PATCH 322/344] Set amd64 image for Neo4j --- neo4j/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From d7619c1ffbc86b27887fb0f073ef6c53ff7ef864 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 23 Feb 2023 14:30:02 +0100 Subject: [PATCH 323/344] document that we need to disable build kit in docker --- deployment/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deployment/README.md b/deployment/README.md index e6fd53546..030eb8a44 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -131,3 +131,6 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/) ## 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 From d292952768ba971b9d9d7393980aaef2b3b45449 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 23 Feb 2023 17:23:46 +0100 Subject: [PATCH 324/344] docu regarding docker-compose exec does not work - use docker exec --- backend/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/README.md b/backend/README.md index a70c4a10d..4ce74dc40 100644 --- a/backend/README.md +++ b/backend/README.md @@ -89,7 +89,7 @@ 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 ``` {% endtab %} @@ -116,18 +116,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 +$ docker exec backend yarn run db:migrate init ``` {% endtab %} @@ -170,7 +170,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 %} @@ -206,7 +206,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 %} From 8ca2ee65df1119699cfd1c99b5026d19dca589b2 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 23 Feb 2023 17:25:03 +0100 Subject: [PATCH 325/344] define container names explicitly --- deployment/docker-compose.yml | 8 +++++++- docker-compose.override.yml | 1 + docker-compose.yml | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index d2bb377a3..6239be6c7 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -17,6 +17,7 @@ services: webapp: image: ocelotsocialnetwork/webapp-branded:local-${CONFIGURATION} + container_name: webapp build: dockerfile: src/docker/webapp.Dockerfile target: branded @@ -60,6 +61,7 @@ services: backend: image: ocelotsocialnetwork/backend-branded:local-${CONFIGURATION} + container_name: backend build: dockerfile: src/docker/backend.Dockerfile target: branded @@ -87,7 +89,6 @@ services: - 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 @@ -96,6 +97,8 @@ services: - 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 @@ -114,6 +117,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-branded:local-${CONFIGURATION} + container_name: maintenance build: # TODO: Separate from webapp, this must be independent dockerfile: src/docker/maintenance.Dockerfile @@ -133,6 +137,7 @@ services: neo4j: image: ocelotsocialnetwork/neo4j-community:latest + container_name: neo4j networks: - test-network volumes: @@ -146,6 +151,7 @@ services: mailserver: image: djfarrelly/maildev + container_name: mailserver ports: - 1080:80 networks: 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 From 7fe2d9df7340dedc4b5d116ece052f9cf916db24 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 23 Feb 2023 17:56:12 +0100 Subject: [PATCH 326/344] neo4j browser exposed --- deployment/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 6239be6c7..0653d58f3 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -148,6 +148,7 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 + - 7474:7474 mailserver: image: djfarrelly/maildev From b75c7c69776ff82f6fa7b11529d98fd69d7001e5 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 23 Feb 2023 18:13:19 +0100 Subject: [PATCH 327/344] hack MapboxGeocoder in unit tests by simply stubbing the import --- webapp/jest.config.js | 4 ++-- webapp/pages/map.spec.js | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/webapp/jest.config.js b/webapp/jest.config.js index 1b3f4d03e..42110ba3b 100644 --- a/webapp/jest.config.js +++ b/webapp/jest.config.js @@ -20,16 +20,16 @@ module.exports = { transform: { '.*\\.(vue)$': 'vue-jest', '^.+\\.js$': 'babel-jest', - '/node_modules/@mapbox/mapbox-gl-geocoder/dist/*': 'babel-jest', }, testMatch: ['**/?(*.)+(spec|test).js?(x)'], modulePathIgnorePatterns: ['/build/'], moduleNameMapper: { '\\.(svg)$': '/test/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', + '@mapbox/mapbox-gl-geocoder': 'identity-obj-proxy', '^@/(.*)$': '/src/$1', '^~/(.*)$': '/$1', }, moduleFileExtensions: ['js', 'json', 'vue'], - testEnvironment: 'jsdom', + testEnvironment: 'jest-environment-jsdom', } diff --git a/webapp/pages/map.spec.js b/webapp/pages/map.spec.js index 5dbb34cf8..a9e21c876 100644 --- a/webapp/pages/map.spec.js +++ b/webapp/pages/map.spec.js @@ -4,8 +4,11 @@ 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') +jest.mock('@mapbox/mapbox-gl-geocoder', () => { + return jest.fn().mockImplementation(jest.fn()) +}) jest.mock('mapbox-gl', () => { return { @@ -70,6 +73,7 @@ describe('map', () => { let mocks beforeEach(() => { + MapboxGeocoder.mockClear() mocks = { $t: (t) => t, $env: { @@ -97,7 +101,7 @@ describe('map', () => { }) it('renders', () => { - expect(wrapper.is('div')).toBeTruthy() + expect(wrapper.element.tagName).toBe('DIV') }) it('has correct content', () => { From 119d4c4e82fb6c66fd48f9fc3c6d526509c4bc56 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 23 Feb 2023 18:13:47 +0100 Subject: [PATCH 328/344] coverage webapp to 83% --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4b310a20b..660ee56ea 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -269,7 +269,7 @@ jobs: report_name: Coverage Webapp type: lcov result_path: ./coverage/lcov.info - min_coverage: 63 + min_coverage: 83 token: ${{ github.token }} ############################################################################## From 7600d0166579ec4a56b3fad24d239b626efcbfbb Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 23 Feb 2023 19:33:29 +0100 Subject: [PATCH 329/344] newest next update readme --- deployment/TODO-next-update.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/deployment/TODO-next-update.md b/deployment/TODO-next-update.md index cab2528fa..769fe4d67 100644 --- a/deployment/TODO-next-update.md +++ b/deployment/TODO-next-update.md @@ -1,6 +1,13 @@ # Todo For Next Update -When you overtake this deploy and rebrand repo to your network you have to recognize the following changes and doings … +When you 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 From e8ca65c040cdbe249fc3375c187234b60dd11136 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 23 Feb 2023 21:13:18 +0100 Subject: [PATCH 330/344] remove comments --- webapp/pages/admin/donations.spec.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/webapp/pages/admin/donations.spec.js b/webapp/pages/admin/donations.spec.js index 4a85590a9..37a20393f 100644 --- a/webapp/pages/admin/donations.spec.js +++ b/webapp/pages/admin/donations.spec.js @@ -88,15 +88,13 @@ describe('donations.vue', () => { describe('form component click', () => { it('on #showDonations checkbox changes "showDonations" to true', async () => { - // starts with false - await wrapper.find('#showDonations').setChecked(true) // set to true + await wrapper.find('#showDonations').setChecked(true) expect(wrapper.vm.showDonations).toBe(true) }) it('on #showDonations checkbox twice changes "showDonations" back to false', async () => { - // starts with false - await wrapper.find('#showDonations').setChecked(true) // set to true - await wrapper.find('#showDonations').setChecked(false) // set to true + await wrapper.find('#showDonations').setChecked(true) + await wrapper.find('#showDonations').setChecked(false) expect(wrapper.vm.showDonations).toBe(false) }) @@ -137,7 +135,7 @@ describe('donations.vue', () => { }) it('calls mutation with input values once', async () => { - wrapper.find('#showDonations').setChecked(true) // set to true + wrapper.find('#showDonations').setChecked(true) await wrapper.vm.$nextTick() wrapper.find('#donations-goal').setValue('20000') await wrapper.vm.$nextTick() From d284f7b122e3a3a79d22cad2adcf6272658cbe81 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 00:20:32 +0100 Subject: [PATCH 331/344] override command for intermediate containers to prevent execution of the container if command is defined --- deployment/docker-compose.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 0653d58f3..1fdfd9086 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -7,6 +7,7 @@ services: dockerfile: ../webapp/Dockerfile context: ../webapp target: base + command: sleep 0 webapp-code: image: ocelotsocialnetwork/webapp:local-code @@ -14,6 +15,7 @@ services: dockerfile: ../webapp/Dockerfile context: ../webapp target: code + command: sleep 0 webapp: image: ocelotsocialnetwork/webapp-branded:local-${CONFIGURATION} @@ -51,6 +53,7 @@ services: dockerfile: ../backend/Dockerfile context: ../backend target: base + command: sleep 0 backend-code: image: ocelotsocialnetwork/backend:local-code @@ -58,6 +61,7 @@ services: dockerfile: ../backend/Dockerfile context: ../backend target: code + command: sleep 0 backend: image: ocelotsocialnetwork/backend-branded:local-${CONFIGURATION} @@ -106,6 +110,7 @@ services: dockerfile: ../webapp/Dockerfile.maintenance context: ../webapp target: base + command: sleep 0 maintenance-code: image: ocelotsocialnetwork/maintenance:local-code @@ -113,6 +118,7 @@ services: 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 From 31e7be8ac97cd77184d03c00eec94d5e409e7663 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 01:00:41 +0100 Subject: [PATCH 332/344] conflict with container naming in main docker-compose --- deployment/docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 1fdfd9086..a0dda4dc0 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -19,7 +19,7 @@ services: webapp: image: ocelotsocialnetwork/webapp-branded:local-${CONFIGURATION} - container_name: webapp + container_name: webapp-branded build: dockerfile: src/docker/webapp.Dockerfile target: branded @@ -68,7 +68,7 @@ services: container_name: backend build: dockerfile: src/docker/backend.Dockerfile - target: branded + target: branded-branded context: . args: - CONFIGURATION=$CONFIGURATION @@ -123,7 +123,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-branded:local-${CONFIGURATION} - container_name: maintenance + container_name: maintenance-branded build: # TODO: Separate from webapp, this must be independent dockerfile: src/docker/maintenance.Dockerfile @@ -158,7 +158,7 @@ services: mailserver: image: djfarrelly/maildev - container_name: mailserver + container_name: mailserver-branded ports: - 1080:80 networks: From 8082bb0188be0128982afce59a9bc4b794e09558 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 01:00:54 +0100 Subject: [PATCH 333/344] fix broken maintenance translation --- deployment/src/docker/maintenance.Dockerfile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/deployment/src/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile index 1df6c551b..4ce817ae3 100644 --- a/deployment/src/docker/maintenance.Dockerfile +++ b/deployment/src/docker/maintenance.Dockerfile @@ -11,10 +11,17 @@ FROM $APP_IMAGE_CODE as code ARG CONFIGURATION=example +COPY src/tools/ tools/ + # 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/ locales/ +COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ +# COPY configurations/${CONFIGURATION}/branding/locales/ locales/ + +RUN apk add --no-cache bash jq + +RUN tools/merge-locales.sh ################################################################################## # BUILD ########################################################################## From 18ccddeaf8f3d501b5e80810bfb7d8e65fc8aa40 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 01:16:59 +0100 Subject: [PATCH 334/344] fix translatability of maintenance page --- webapp/plugins/i18n.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/plugins/i18n.js b/webapp/plugins/i18n.js index f162408f6..1382c2728 100644 --- a/webapp/plugins/i18n.js +++ b/webapp/plugins/i18n.js @@ -36,7 +36,7 @@ export default ({ app, req, cookie, store }) => { } const expires = new Date() - expires.setDate(expires.getDate() + app.$env.COOKIE_EXPIRE_TIME) + expires.setDate(expires.getDate() + app.$env && app.$env.COOKIE_EXPIRE_TIME) app.$cookies.set(key, localeInStore, { expires, // maxAge: app.$env.COOKIE_EXPIRE_TIME * 60 * 60 * 24, // days to seconds From ea3ac6f24dd5aeda4db99ce82b19f90a7e3b2ce5 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 01:19:21 +0100 Subject: [PATCH 335/344] order file dockerfile commands correctly --- deployment/src/docker/maintenance.Dockerfile | 8 +++----- deployment/src/docker/webapp.Dockerfile | 7 +++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/deployment/src/docker/maintenance.Dockerfile b/deployment/src/docker/maintenance.Dockerfile index 4ce817ae3..b699e7f20 100644 --- a/deployment/src/docker/maintenance.Dockerfile +++ b/deployment/src/docker/maintenance.Dockerfile @@ -11,16 +11,14 @@ FROM $APP_IMAGE_CODE as code ARG CONFIGURATION=example -COPY src/tools/ tools/ - # 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 configurations/${CONFIGURATION}/branding/locales/ locales/ - +COPY src/tools/ tools/ RUN apk add --no-cache bash jq - RUN tools/merge-locales.sh ################################################################################## diff --git a/deployment/src/docker/webapp.Dockerfile b/deployment/src/docker/webapp.Dockerfile index ad5b7c769..f0c75e392 100644 --- a/deployment/src/docker/webapp.Dockerfile +++ b/deployment/src/docker/webapp.Dockerfile @@ -12,17 +12,16 @@ FROM $APP_IMAGE_CODE as code ARG CONFIGURATION=example # copy public constants into the Docker image to brand it -COPY src/tools/ tools/ COPY configurations/${CONFIGURATION}/branding/static/ static/ COPY configurations/${CONFIGURATION}/branding/constants/ constants/ COPY configurations/${CONFIGURATION}/branding/locales/html/ locales/html/ -# COPY configurations/${CONFIGURATION}/branding/locales/index.js locales/index.js -COPY configurations/${CONFIGURATION}/branding/locales/*.json locales/tmp/ 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 ################################################################################## From 9c6511bf3622774df24f24d78f4a57379a64394e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 10:40:30 +0100 Subject: [PATCH 336/344] security write permission - in hope this fixes the dependabot issues --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 96aaf53a1..e15313549 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -168,6 +168,8 @@ jobs: name: Unit tests - backend runs-on: ubuntu-latest needs: [build_test_neo4j,build_test_backend] + permissions: + security-events: write steps: ########################################################################## # CHECKOUT CODE ########################################################## @@ -225,6 +227,8 @@ jobs: name: Unit tests - webapp runs-on: ubuntu-latest needs: [build_test_webapp] + permissions: + security-events: write steps: ########################################################################## # CHECKOUT CODE ########################################################## From 3ce739f68fe7df1d34fb2442de4f53cbdc415e2e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 10:48:16 +0100 Subject: [PATCH 337/344] dependabot schedule & remove ignores --- .github/dependabot.yml | 198 +++++++++-------------------------------- 1 file changed, 42 insertions(+), 156 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c5433c921..585710358 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,177 +3,63 @@ updates: - package-ecosystem: npm directory: "/" 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" + # open-pull-requests-limit: 10 + # ignore: - package-ecosystem: npm directory: "/backend" 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" + # open-pull-requests-limit: 10 + # ignore: - package-ecosystem: npm directory: "/webapp" 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 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" + # open-pull-requests-limit: 10 + # ignore: - 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" + # open-pull-requests-limit: 10 + # ignore: - package-ecosystem: docker directory: "/backend" 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" + # open-pull-requests-limit: 10 + # ignore: - package-ecosystem: docker directory: "/neo4j" 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" + # open-pull-requests-limit: 10 + # ignore: - package-ecosystem: docker directory: "/deployment/legacy-migration/maintenance-worker" schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" + # open-pull-requests-limit: 10 + # ignore: From 9a0b9a34c3ca117493bdc7b8bf63dc682430df19 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 11:33:29 +0100 Subject: [PATCH 338/344] fix dependabot configuration --- .github/dependabot.yml | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 585710358..085fedb18 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,6 +1,6 @@ version: 2 updates: -- package-ecosystem: npm +- package-ecosystem: "github-actions" directory: "/" schedule: interval: weekly @@ -9,6 +9,14 @@ updates: time: "03:00" # open-pull-requests-limit: 10 # ignore: + +- package-ecosystem: npm + directory: "/" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" - package-ecosystem: npm directory: "/backend" schedule: @@ -16,8 +24,6 @@ updates: day: "saturday" timezone: "Europe/Berlin" time: "03:00" - # open-pull-requests-limit: 10 - # ignore: - package-ecosystem: npm directory: "/webapp" schedule: @@ -25,17 +31,7 @@ updates: day: "saturday" timezone: "Europe/Berlin" time: "03:00" - # open-pull-requests-limit: 10 - # ignore: -- package-ecosystem: docker - directory: "/webapp" - schedule: - interval: weekly - day: "saturday" - timezone: "Europe/Berlin" - time: "03:00" - # open-pull-requests-limit: 10 - # ignore: + - package-ecosystem: docker directory: "/backend" schedule: @@ -43,8 +39,13 @@ updates: day: "saturday" timezone: "Europe/Berlin" time: "03:00" - # open-pull-requests-limit: 10 - # ignore: +- package-ecosystem: docker + directory: "/webapp" + schedule: + interval: weekly + day: "saturday" + timezone: "Europe/Berlin" + time: "03:00" - package-ecosystem: docker directory: "/neo4j" schedule: @@ -52,14 +53,10 @@ updates: day: "saturday" timezone: "Europe/Berlin" time: "03:00" - # open-pull-requests-limit: 10 - # ignore: - package-ecosystem: docker - directory: "/deployment/legacy-migration/maintenance-worker" + directory: "/deployment/src/docker" schedule: interval: weekly day: "saturday" timezone: "Europe/Berlin" time: "03:00" - # open-pull-requests-limit: 10 - # ignore: From 9cf32201feff43734206b18c89420194bfc2fe2e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 12:37:24 +0100 Subject: [PATCH 339/344] allow write-all --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e15313549..ea298bc11 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -168,8 +168,8 @@ jobs: name: Unit tests - backend runs-on: ubuntu-latest needs: [build_test_neo4j,build_test_backend] - permissions: - security-events: write + permissions: write-all + # security-events: write steps: ########################################################################## # CHECKOUT CODE ########################################################## @@ -227,8 +227,8 @@ jobs: name: Unit tests - webapp runs-on: ubuntu-latest needs: [build_test_webapp] - permissions: - security-events: write + permissions: write-all + # security-events: write steps: ########################################################################## # CHECKOUT CODE ########################################################## From f95d6d63f953461788b35c406356d2906f46d62f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Fri, 24 Feb 2023 12:45:47 +0100 Subject: [PATCH 340/344] remove unused package, ignore dist for unit tests --- webapp/jest.config.js | 2 +- webapp/package.json | 1 - webapp/yarn.lock | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/webapp/jest.config.js b/webapp/jest.config.js index 42110ba3b..538f72bc7 100644 --- a/webapp/jest.config.js +++ b/webapp/jest.config.js @@ -22,7 +22,7 @@ module.exports = { '^.+\\.js$': 'babel-jest', }, testMatch: ['**/?(*.)+(spec|test).js?(x)'], - modulePathIgnorePatterns: ['/build/'], + modulePathIgnorePatterns: ['/dist/'], moduleNameMapper: { '\\.(svg)$': '/test/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', diff --git a/webapp/package.json b/webapp/package.json index 40cacbae7..9b9dbdf72 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -67,7 +67,6 @@ "devDependencies": { "@babel/core": "~7.12.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.20.11", "@babel/preset-env": "^7.20.2", "@faker-js/faker": "5.1.0", "@nuxtjs/composition-api": "0.32.0", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index f7ac510f5..8ee3e501f 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -1980,7 +1980,7 @@ "@babel/helper-simple-access" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.20.11": +"@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== From f3a95120bb9691ea113d05be71f0895f4574a042 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 13:01:49 +0100 Subject: [PATCH 341/344] try limit permissions to statusses --- .github/workflows/test.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea298bc11..f4f1e141e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -168,7 +168,8 @@ jobs: name: Unit tests - backend runs-on: ubuntu-latest needs: [build_test_neo4j,build_test_backend] - permissions: write-all + permissions: + statuses: write # security-events: write steps: ########################################################################## @@ -227,7 +228,8 @@ jobs: name: Unit tests - webapp runs-on: ubuntu-latest needs: [build_test_webapp] - permissions: write-all + permissions: + statuses: write # security-events: write steps: ########################################################################## From 2b30527ef0225c5da3e118db94156ba278033369 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 13:23:04 +0100 Subject: [PATCH 342/344] try checks permission --- .github/workflows/test.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f4f1e141e..824b519d7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -169,7 +169,8 @@ jobs: runs-on: ubuntu-latest needs: [build_test_neo4j,build_test_backend] permissions: - statuses: write + #statuses: write + checks: write # security-events: write steps: ########################################################################## @@ -229,7 +230,9 @@ jobs: runs-on: ubuntu-latest needs: [build_test_webapp] permissions: - statuses: write + #statuses: write + #actions: write + checks: write # security-events: write steps: ########################################################################## From 6016a8b85a5c07a0912cef6edfd3e747965f85f7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Feb 2023 13:45:43 +0100 Subject: [PATCH 343/344] remove comments, checks permissions are working --- .github/workflows/test.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 824b519d7..8560aef0b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -169,9 +169,7 @@ jobs: runs-on: ubuntu-latest needs: [build_test_neo4j,build_test_backend] permissions: - #statuses: write checks: write - # security-events: write steps: ########################################################################## # CHECKOUT CODE ########################################################## @@ -230,10 +228,7 @@ jobs: runs-on: ubuntu-latest needs: [build_test_webapp] permissions: - #statuses: write - #actions: write checks: write - # security-events: write steps: ########################################################################## # CHECKOUT CODE ########################################################## From b5bbf5164d2220eb9697bd3d54b39e4939b7817d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 27 Feb 2023 10:52:34 +0100 Subject: [PATCH 344/344] script to set a cluster in maintenance mode --- deployment/scripts/cluster.maintenance.sh | 22 +++++++++++++++++++ .../patch.ingress.maintenance.off.yaml | 12 ++++++++++ .../patches/patch.ingress.maintenance.on.yaml | 12 ++++++++++ 3 files changed, 46 insertions(+) create mode 100755 deployment/scripts/cluster.maintenance.sh create mode 100644 deployment/src/kubernetes/patches/patch.ingress.maintenance.off.yaml create mode 100644 deployment/src/kubernetes/patches/patch.ingress.maintenance.on.yaml 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/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