diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index cc84c6e3e..81c56761c 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -81,7 +81,7 @@ jobs: type=sha - name: Build and push Docker images id: push - uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 + uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 with: context: ${{ matrix.app.context }} target: ${{ matrix.app.target }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 425da269b..6ff90d8ba 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -64,7 +64,7 @@ jobs: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV #- name: Repository Dispatch - # uses: peter-evans/repository-dispatch@44966f0098fd4ab26380bb099e1edf6d57eb2c90 # v3.0.0 + # uses: peter-evans/repository-dispatch@63fb3226c1bffa7d9e09d27eef4ecb0c3cf51143 # v3.0.0 # with: # token: ${{ github.token }} # event-type: trigger-ocelot-build-success @@ -72,7 +72,7 @@ jobs: # client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' - name: Repository Dispatch stage.ocelot.social - uses: peter-evans/repository-dispatch@44966f0098fd4ab26380bb099e1edf6d57eb2c90 # v3.0.0 + uses: peter-evans/repository-dispatch@63fb3226c1bffa7d9e09d27eef4ecb0c3cf51143 # v3.0.0 with: token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository event-type: trigger-ocelot-build-success @@ -80,7 +80,7 @@ jobs: client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' - name: Repository Dispatch stage.yunite.me - uses: peter-evans/repository-dispatch@44966f0098fd4ab26380bb099e1edf6d57eb2c90 # v3.0.0 + uses: peter-evans/repository-dispatch@63fb3226c1bffa7d9e09d27eef4ecb0c3cf51143 # v3.0.0 with: token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository event-type: trigger-ocelot-build-success diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f16f921c..829a5d6dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,19 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [3.6.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.6.0...3.6.1) + +- fix(webapp): fix flickering? [`#8549`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8549) +- fix(backend): fix statistics and introduce new values [`#8550`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8550) +- Fix typo in german translation [`#8548`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8548) +- feat(webapp): default language configurable [`#8546`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8546) +- fix(webapp): query categories on login to get the count [`#8542`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8542) + #### [3.6.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/3.5.3...3.6.0) +> 10 May 2025 + +- v3.6.0 [`#8541`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8541) - Show invititation dropdown until user clicks somewhere else [`#8539`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8539) - feat(webapp): redirect to group after registration with invite to group [`#8540`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8540) - fix(webapp): fix layout break and hidden group name appearance [`#8538`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8538) diff --git a/backend/.env.template b/backend/.env.template index eb710101e..52acdcc31 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -7,7 +7,7 @@ GRAPHQL_URI=http://localhost:4000 CLIENT_URI=http://localhost:3000 # E-Mail default settings -EMAIL_SUPPORT="devops@ocelot.social" +SUPPORT_EMAIL="devops@ocelot.social" EMAIL_DEFAULT_SENDER="devops@ocelot.social" SMTP_HOST= SMTP_PORT= diff --git a/backend/.env.test_e2e b/backend/.env.test_e2e index e21ce3057..20d1263c0 100644 --- a/backend/.env.test_e2e +++ b/backend/.env.test_e2e @@ -7,7 +7,7 @@ GRAPHQL_URI=http://localhost:4000 CLIENT_URI=http://localhost:3000 # E-Mail default settings -EMAIL_SUPPORT="devops@ocelot.social" +SUPPORT_EMAIL="devops@ocelot.social" EMAIL_DEFAULT_SENDER="devops@ocelot.social" SMTP_HOST=mailserver SMTP_PORT=1025 diff --git a/backend/Dockerfile b/backend/Dockerfile index 697277a00..c1ce678ce 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:23.11.0-alpine AS base +FROM node:24.0.2-alpine AS base LABEL org.label-schema.name="ocelot.social:backend" LABEL org.label-schema.description="Backend of the Social Network Software ocelot.social" LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md" diff --git a/backend/package.json b/backend/package.json index a91a8a77f..77b52fa8f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-backend", - "version": "3.6.0", + "version": "3.6.1", "description": "GraphQL Backend for ocelot.social", "repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social", "author": "ocelot.social Community", @@ -28,10 +28,12 @@ "prod:db:data:categories": "node build/src/db/categories.js" }, "dependencies": { + "@aws-sdk/client-s3": "^3.796.0", + "@aws-sdk/lib-storage": "^3.797.0", "@sentry/node": "^5.15.4", + "@types/mime-types": "^2.1.4", "apollo-server": "~2.14.2", "apollo-server-express": "^2.14.2", - "aws-sdk": "^2.1692.0", "bcryptjs": "~3.0.2", "body-parser": "^1.20.3", "cheerio": "~1.0.0", @@ -51,7 +53,7 @@ "ioredis": "^5.6.1", "jsonwebtoken": "~8.5.1", "languagedetect": "^2.0.0", - "linkify-html": "^4.2.0", + "linkify-html": "^4.3.1", "linkifyjs": "^4.2.0", "lodash": "~4.17.21", "merge-graphql-schemas": "^1.7.8", @@ -82,7 +84,7 @@ "preview-email": "^3.1.0", "pug": "^3.0.3", "request": "~2.88.2", - "sanitize-html": "~2.16.0", + "sanitize-html": "~2.17.0", "slug": "~9.1.0", "trunc-html": "~1.1.2", "uuid": "~9.0.1", @@ -91,18 +93,18 @@ }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", - "@faker-js/faker": "9.7.0", + "@faker-js/faker": "9.8.0", "@types/email-templates": "^10.0.4", "@types/jest": "^29.5.14", "@types/lodash": "^4.17.16", - "@types/node": "^22.15.3", + "@types/node": "^22.15.18", "@types/slug": "^5.0.9", "@types/uuid": "~9.0.1", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "apollo-server-testing": "~2.11.0", "eslint": "^8.57.1", - "eslint-config-prettier": "^10.1.2", + "eslint-config-prettier": "^10.1.5", "eslint-config-standard": "^17.1.0", "eslint-import-resolver-typescript": "^4.3.4", "eslint-plugin-import": "^2.31.0", @@ -110,7 +112,7 @@ "eslint-plugin-jsonc": "^2.20.0", "eslint-plugin-n": "^17.17.0", "eslint-plugin-no-catch-all": "^1.1.0", - "eslint-plugin-prettier": "^5.2.6", + "eslint-plugin-prettier": "^5.4.0", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-security": "^3.0.1", "jest": "^29.7.0", @@ -118,9 +120,9 @@ "prettier": "^3.5.3", "require-json5": "^1.3.0", "rosie": "^2.1.1", - "ts-jest": "^29.3.2", + "ts-jest": "^29.3.4", "ts-node": "^10.9.2", - "tsc-alias": "^1.8.15", + "tsc-alias": "^1.8.16", "tsconfig-paths": "^4.2.0", "typescript": "^5.8.3" }, diff --git a/backend/src/config/emails.ts b/backend/src/config/emails.ts index da0d04790..abfc61986 100644 --- a/backend/src/config/emails.ts +++ b/backend/src/config/emails.ts @@ -1,8 +1,5 @@ // 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@reformer.network', - MODERATION_EMAIL: 'support@reformer.network', - // 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://reformer.network/organization', SUPPORT_LINK: 'https://reformer.network/support', } diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index a079c2ae5..1aa7991eb 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -112,6 +112,7 @@ const s3 = { const options = { EMAIL_DEFAULT_SENDER: env.EMAIL_DEFAULT_SENDER, + SUPPORT_EMAIL: env.SUPPORT_EMAIL, SUPPORT_URL: emails.SUPPORT_LINK, APPLICATION_NAME: metadata.APPLICATION_NAME, ORGANIZATION_URL: emails.ORGANIZATION_LINK, @@ -124,6 +125,10 @@ const options = { CATEGORIES_ACTIVE: process.env.CATEGORIES_ACTIVE === 'true' || false, } +const language = { + LANGUAGE_DEFAULT: process.env.LANGUAGE_DEFAULT ?? 'en', +} + // Check if all required configs are present Object.entries(required).map((entry) => { if (!entry[1]) { @@ -141,6 +146,7 @@ export default { ...redis, ...s3, ...options, + ...language, } export { nodemailerTransportOptions } diff --git a/backend/src/emails/__snapshots__/sendChatMessageMail.spec.ts.snap b/backend/src/emails/__snapshots__/sendChatMessageMail.spec.ts.snap index 67c141c0e..86e2c22ec 100644 --- a/backend/src/emails/__snapshots__/sendChatMessageMail.spec.ts.snap +++ b/backend/src/emails/__snapshots__/sendChatMessageMail.spec.ts.snap @@ -99,6 +99,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -121,6 +124,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -226,6 +232,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -248,6 +257,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", diff --git a/backend/src/emails/__snapshots__/sendEmailVerification.spec.ts.snap b/backend/src/emails/__snapshots__/sendEmailVerification.spec.ts.snap index 7f718d936..63ae9c98f 100644 --- a/backend/src/emails/__snapshots__/sendEmailVerification.spec.ts.snap +++ b/backend/src/emails/__snapshots__/sendEmailVerification.spec.ts.snap @@ -99,6 +99,9 @@ footer {

– The ocelot.social Team

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -124,6 +127,9 @@ See you soon on ocelot.social [https://ocelot.social]! – The ocelot.social Team +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -229,6 +235,9 @@ footer {

– Dein ocelot.social Team

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -254,6 +263,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! – Dein ocelot.social Team +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", diff --git a/backend/src/emails/__snapshots__/sendNotificationMail.spec.ts.snap b/backend/src/emails/__snapshots__/sendNotificationMail.spec.ts.snap index 05ec17e94..3770d9bdb 100644 --- a/backend/src/emails/__snapshots__/sendNotificationMail.spec.ts.snap +++ b/backend/src/emails/__snapshots__/sendNotificationMail.spec.ts.snap @@ -98,6 +98,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -120,6 +123,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -225,6 +231,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -248,6 +257,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -353,6 +365,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -376,6 +391,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -481,6 +499,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -504,6 +525,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -609,6 +633,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -631,6 +658,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -735,6 +765,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -757,6 +790,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -861,6 +897,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -880,6 +919,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -985,6 +1027,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -1007,6 +1052,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1112,6 +1160,9 @@ footer {

PS: If you don't want to receive e-mails anymore, change your notification settings!

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -1134,6 +1185,9 @@ See you soon on ocelot.social [https://ocelot.social]! PS: If you don't want to receive e-mails anymore, change your notification settings [http://webapp:3000/settings/notifications]! +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1238,6 +1292,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -1260,6 +1317,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1365,6 +1425,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -1388,6 +1451,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1493,6 +1559,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -1516,6 +1585,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1621,6 +1693,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -1644,6 +1719,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1749,6 +1827,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -1771,6 +1852,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -1875,6 +1959,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -1897,6 +1984,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -2001,6 +2091,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -2020,6 +2113,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -2125,6 +2221,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -2147,6 +2246,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -2252,6 +2354,9 @@ footer {

PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen!

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -2274,6 +2379,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine Benachrichtigungseinstellungen [http://webapp:3000/settings/notifications]! +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", diff --git a/backend/src/emails/__snapshots__/sendRegistrationMail.spec.ts.snap b/backend/src/emails/__snapshots__/sendRegistrationMail.spec.ts.snap index 16f7584e5..562e3b16c 100644 --- a/backend/src/emails/__snapshots__/sendRegistrationMail.spec.ts.snap +++ b/backend/src/emails/__snapshots__/sendRegistrationMail.spec.ts.snap @@ -102,6 +102,9 @@ footer {

– The ocelot.social Team

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -133,6 +136,9 @@ See you soon on ocelot.social [https://ocelot.social]! – The ocelot.social Team +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -241,6 +247,9 @@ footer {

– Dein ocelot.social Team

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -273,6 +282,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! – Dein ocelot.social Team +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -381,6 +393,9 @@ footer {

– The ocelot.social Team

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -412,6 +427,9 @@ See you soon on ocelot.social [https://ocelot.social]! – The ocelot.social Team +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -520,6 +538,9 @@ footer {

– Dein ocelot.social Team

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -552,6 +573,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! – Dein ocelot.social Team +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", diff --git a/backend/src/emails/__snapshots__/sendResetPasswordMail.spec.ts.snap b/backend/src/emails/__snapshots__/sendResetPasswordMail.spec.ts.snap index da8c041cb..d7f10b33d 100644 --- a/backend/src/emails/__snapshots__/sendResetPasswordMail.spec.ts.snap +++ b/backend/src/emails/__snapshots__/sendResetPasswordMail.spec.ts.snap @@ -99,6 +99,9 @@ footer {

– The ocelot.social Team

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -123,6 +126,9 @@ See you soon on ocelot.social [https://ocelot.social]! – The ocelot.social Team +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -228,6 +234,9 @@ footer {

– Dein ocelot.social Team

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -253,6 +262,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! – Dein ocelot.social Team +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", diff --git a/backend/src/emails/__snapshots__/sendWrongEmail.spec.ts.snap b/backend/src/emails/__snapshots__/sendWrongEmail.spec.ts.snap index b2052d808..6c2300274 100644 --- a/backend/src/emails/__snapshots__/sendWrongEmail.spec.ts.snap +++ b/backend/src/emails/__snapshots__/sendWrongEmail.spec.ts.snap @@ -99,6 +99,9 @@ footer {

– The ocelot.social Team

+
+

If you have questions or problems, feel free to contact our support: devops@ocelot.social

+
@@ -121,6 +124,9 @@ See you soon on ocelot.social [https://ocelot.social]! – The ocelot.social Team +If you have questions or problems, feel free to contact our support: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", @@ -226,6 +232,9 @@ footer {

– Dein ocelot.social Team

+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: devops@ocelot.social

+
@@ -248,6 +257,9 @@ Bis bald bei ocelot.social [https://ocelot.social]! – Dein ocelot.social Team +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +devops@ocelot.social [devops@ocelot.social] + ocelot.social Community [https://ocelot.social]", "to": "user@example.org", diff --git a/backend/src/emails/__snapshots__/supportLine.spec.ts.snap b/backend/src/emails/__snapshots__/supportLine.spec.ts.snap new file mode 100644 index 000000000..78dab2d41 --- /dev/null +++ b/backend/src/emails/__snapshots__/supportLine.spec.ts.snap @@ -0,0 +1,531 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`sendResetPasswordMail with support English renders correctly 1`] = ` +{ + "attachments": [], + "from": "ocelot.social ", + "html": " + + + + + + + + +
+
+
+
+
+

Hello Jenny Rostock,

+
+
+

So, you forgot your password? No problem! Just click the button below to reset it within the next 24 hours:

Confirm your e-mail address +

If you didn't request a new password feel free to ignore this e-mail.

+

If the above button doesn't work you can also copy the following code into your browser window: 123456

+
+

See you soon on ocelot.social!

+

– The ocelot.social Team

+
+
+
+

If you have questions or problems, feel free to contact our support: support@example.org

+
+ +
+ +", + "subject": "Reset Password ocelot.social", + "text": "HELLO JENNY ROSTOCK, + +So, you forgot your password? No problem! Just click the button below to reset +it within the next 24 hours: + +Confirm your e-mail address +[http://webapp:3000/password-reset/change-password?email=user%40example.org&nonce=123456] + +If you didn't request a new password feel free to ignore this e-mail. + +If the above button doesn't work you can also copy the following code into your +browser window: 123456 + +See you soon on ocelot.social [https://ocelot.social]! + +– The ocelot.social Team + +If you have questions or problems, feel free to contact our support: +support@example.org [support@example.org] + + +ocelot.social Community [https://ocelot.social]", + "to": "user@example.org", +} +`; + +exports[`sendResetPasswordMail with support German renders correctly 1`] = ` +{ + "attachments": [], + "from": "ocelot.social ", + "html": " + + + + + + + + +
+
+
+
+
+

Hallo Jenny Rostock,

+
+
+

Du hast also dein Passwort vergessen? Kein Problem! Mit Klick auf diesen Button kannst du innerhalb der nächsten 24 Stunden dein Passwort zurücksetzen:

Bestätige deine E-Mail Adresse +

Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.

+

Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: 123456

+
+

Bis bald bei ocelot.social!

+

– Dein ocelot.social Team

+
+
+
+

Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: support@example.org

+
+ +
+ +", + "subject": "Neues Passwort ocelot.social", + "text": "HALLO JENNY ROSTOCK, + +Du hast also dein Passwort vergessen? Kein Problem! Mit Klick auf diesen Button +kannst du innerhalb der nächsten 24 Stunden dein Passwort zurücksetzen: + +Bestätige deine E-Mail Adresse +[http://webapp:3000/password-reset/change-password?email=user%40example.org&nonce=123456] + +Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach +ignorieren. + +Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in +dein Browserfenster kopieren: 123456 + +Bis bald bei ocelot.social [https://ocelot.social]! + +– Dein ocelot.social Team + +Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: +support@example.org [support@example.org] + + +ocelot.social Community [https://ocelot.social]", + "to": "user@example.org", +} +`; + +exports[`sendResetPasswordMail without support English renders correctly 1`] = ` +{ + "attachments": [], + "from": "ocelot.social ", + "html": " + + + + + + + + +
+
+
+
+
+

Hello Jenny Rostock,

+
+
+

So, you forgot your password? No problem! Just click the button below to reset it within the next 24 hours:

Confirm your e-mail address +

If you didn't request a new password feel free to ignore this e-mail.

+

If the above button doesn't work you can also copy the following code into your browser window: 123456

+
+

See you soon on ocelot.social!

+

– The ocelot.social Team

+
+
+ +
+ +", + "subject": "Reset Password ocelot.social", + "text": "HELLO JENNY ROSTOCK, + +So, you forgot your password? No problem! Just click the button below to reset +it within the next 24 hours: + +Confirm your e-mail address +[http://webapp:3000/password-reset/change-password?email=user%40example.org&nonce=123456] + +If you didn't request a new password feel free to ignore this e-mail. + +If the above button doesn't work you can also copy the following code into your +browser window: 123456 + +See you soon on ocelot.social [https://ocelot.social]! + +– The ocelot.social Team + + +ocelot.social Community [https://ocelot.social]", + "to": "user@example.org", +} +`; + +exports[`sendResetPasswordMail without support German renders correctly 1`] = ` +{ + "attachments": [], + "from": "ocelot.social ", + "html": " + + + + + + + + +
+
+
+
+
+

Hallo Jenny Rostock,

+
+
+

Du hast also dein Passwort vergessen? Kein Problem! Mit Klick auf diesen Button kannst du innerhalb der nächsten 24 Stunden dein Passwort zurücksetzen:

Bestätige deine E-Mail Adresse +

Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.

+

Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: 123456

+
+

Bis bald bei ocelot.social!

+

– Dein ocelot.social Team

+
+
+ +
+ +", + "subject": "Neues Passwort ocelot.social", + "text": "HALLO JENNY ROSTOCK, + +Du hast also dein Passwort vergessen? Kein Problem! Mit Klick auf diesen Button +kannst du innerhalb der nächsten 24 Stunden dein Passwort zurücksetzen: + +Bestätige deine E-Mail Adresse +[http://webapp:3000/password-reset/change-password?email=user%40example.org&nonce=123456] + +Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach +ignorieren. + +Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in +dein Browserfenster kopieren: 123456 + +Bis bald bei ocelot.social [https://ocelot.social]! + +– Dein ocelot.social Team + + +ocelot.social Community [https://ocelot.social]", + "to": "user@example.org", +} +`; diff --git a/backend/src/emails/locales/de.json b/backend/src/emails/locales/de.json index 677c3b7f1..205a529b7 100644 --- a/backend/src/emails/locales/de.json +++ b/backend/src/emails/locales/de.json @@ -28,6 +28,7 @@ "introduction": "Du möchtest also deine E-Mail ändern? Kein Problem! Mit Klick auf diesen Button kannst du deine neue E-Mail Adresse bestätigen:", "doNotChange": "Falls du deine E-Mail Adresse doch nicht ändern möchtest, kannst du diese Nachricht einfach ignorieren. " }, + "support": "Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: ", "buttons": { "confirmEmail": "Bestätige deine E-Mail Adresse", "resetPassword": "Passwort zurücksetzen", diff --git a/backend/src/emails/locales/en.json b/backend/src/emails/locales/en.json index 30ca64655..97a45d3c7 100644 --- a/backend/src/emails/locales/en.json +++ b/backend/src/emails/locales/en.json @@ -28,6 +28,7 @@ "introduction": "So, you want to change your e-mail? No problem! Just click the button below to verify your new address:", "doNotChange": "If you don't want to change your e-mail address feel free to ignore this message. " }, + "support": "If you have questions or problems, feel free to contact our support: ", "buttons": { "confirmEmail": "Confirm your e-mail address", "resetPassword": "Reset password", diff --git a/backend/src/emails/sendEmail.ts b/backend/src/emails/sendEmail.ts index c8e14d74d..61a5ba951 100644 --- a/backend/src/emails/sendEmail.ts +++ b/backend/src/emails/sendEmail.ts @@ -18,11 +18,12 @@ import { UserDbProperties } from '@db/types/User' const welcomeImageUrl = new URL(logosWebapp.LOGO_WELCOME_PATH, CONFIG.CLIENT_URI) const settingsUrl = new URL('/settings/notifications', CONFIG.CLIENT_URI) -const defaultParams = { +export const defaultParams = { welcomeImageUrl, APPLICATION_NAME: CONFIG.APPLICATION_NAME, ORGANIZATION_NAME: metadata.ORGANIZATION_NAME, ORGANIZATION_URL: CONFIG.ORGANIZATION_URL, + SUPPORT_EMAIL: CONFIG.SUPPORT_EMAIL, supportUrl: CONFIG.SUPPORT_URL, settingsUrl, renderSettingsUrl: true, @@ -39,7 +40,7 @@ const email = new Email({ transport, i18n: { locales: ['en', 'de'], - defaultLocale: 'en', + defaultLocale: CONFIG.LANGUAGE_DEFAULT, retryInDefaultLocale: false, directory: path.join(__dirname, 'locales'), updateFiles: false, diff --git a/backend/src/emails/supportLine.spec.ts b/backend/src/emails/supportLine.spec.ts new file mode 100644 index 000000000..c890be794 --- /dev/null +++ b/backend/src/emails/supportLine.spec.ts @@ -0,0 +1,67 @@ +import { sendResetPasswordMail, defaultParams } from './sendEmail' + +describe('sendResetPasswordMail', () => { + const data: { + email: string + nonce: string + locale: string + name: string + } = { + email: 'user@example.org', + nonce: '123456', + locale: 'en', + name: 'Jenny Rostock', + } + + describe('with support', () => { + beforeEach(() => { + defaultParams.SUPPORT_EMAIL = 'support@example.org' + }) + + describe('English', () => { + beforeEach(() => { + data.locale = 'en' + }) + + it('renders correctly', async () => { + await expect(sendResetPasswordMail(data)).resolves.toMatchSnapshot() + }) + }) + + describe('German', () => { + beforeEach(() => { + data.locale = 'de' + }) + + it('renders correctly', async () => { + await expect(sendResetPasswordMail(data)).resolves.toMatchSnapshot() + }) + }) + }) + + describe('without support', () => { + beforeEach(() => { + delete defaultParams.SUPPORT_EMAIL + }) + + describe('English', () => { + beforeEach(() => { + data.locale = 'en' + }) + + it('renders correctly', async () => { + await expect(sendResetPasswordMail(data)).resolves.toMatchSnapshot() + }) + }) + + describe('German', () => { + beforeEach(() => { + data.locale = 'de' + }) + + it('renders correctly', async () => { + await expect(sendResetPasswordMail(data)).resolves.toMatchSnapshot() + }) + }) + }) +}) diff --git a/backend/src/emails/templates/includes/support.pug b/backend/src/emails/templates/includes/support.pug new file mode 100644 index 000000000..49c73e844 --- /dev/null +++ b/backend/src/emails/templates/includes/support.pug @@ -0,0 +1,2 @@ +p= t('support') + a(href='mailto:' + supportEmail)= supportEmail \ No newline at end of file diff --git a/backend/src/emails/templates/layout.pug b/backend/src/emails/templates/layout.pug index faaadb5d3..4614f97be 100644 --- a/backend/src/emails/templates/layout.pug +++ b/backend/src/emails/templates/layout.pug @@ -27,4 +27,9 @@ html(lang=locale) block content include includes/greeting.pug + - var supportEmail = SUPPORT_EMAIL + if supportEmail + .support + include includes/support.pug + include includes/footer.pug diff --git a/backend/src/graphql/queries/statistics.ts b/backend/src/graphql/queries/statistics.ts new file mode 100644 index 000000000..0463b63a4 --- /dev/null +++ b/backend/src/graphql/queries/statistics.ts @@ -0,0 +1,29 @@ +import gql from 'graphql-tag' + +export const statistics = gql` + query statistics { + statistics { + users + usersDeleted + posts + comments + notifications + emails + follows + shouts + invites + chatMessages + chatRooms + tags + locations + groups + inviteCodes + inviteCodesExpired + inviteCodesRedeemed + badgesRewarded + badgesDisplayed + usersVerified + reports + } + } +` diff --git a/backend/src/graphql/resolvers/images/images.spec.ts b/backend/src/graphql/resolvers/images/images.spec.ts index 938571126..75f5f4feb 100644 --- a/backend/src/graphql/resolvers/images/images.spec.ts +++ b/backend/src/graphql/resolvers/images/images.spec.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/require-await */ -/* eslint-disable @typescript-eslint/await-thenable */ + /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable @typescript-eslint/no-unsafe-call */ @@ -13,6 +13,9 @@ import { getNeode, getDriver } from '@db/neo4j' import { deleteImage, mergeImage } from './images' +import type { ImageInput } from './images' +import type { FileUpload } from 'graphql-upload' + const driver = getDriver() const neode = getNeode() const uuid = '[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}' @@ -55,7 +58,7 @@ describe('deleteImage', () => { user = await user.toJson() }) - it('soft deletes `Image` node', async () => { + it('deletes `Image` node', async () => { await expect(neode.all('Image')).resolves.toHaveLength(1) await deleteImage(user, 'AVATAR_IMAGE', { deleteCallback }) await expect(neode.all('Image')).resolves.toHaveLength(0) @@ -71,7 +74,7 @@ describe('deleteImage', () => { describe('given a transaction parameter', () => { it('executes cypher statements within the transaction', async () => { const session = driver.session() - let someString + let someString: string try { someString = await session.writeTransaction(async (transaction) => { await deleteImage(user, 'AVATAR_IMAGE', { @@ -86,7 +89,7 @@ describe('deleteImage', () => { await session.close() } await expect(neode.all('Image')).resolves.toHaveLength(0) - await expect(someString).toEqual('Hello') + expect(someString).toEqual('Hello') }) it('rolls back the transaction in case of errors', async () => { @@ -114,7 +117,7 @@ describe('deleteImage', () => { }) describe('mergeImage', () => { - let imageInput + let imageInput: ImageInput let post beforeEach(() => { imageInput = { @@ -124,18 +127,19 @@ describe('mergeImage', () => { describe('given image.upload', () => { beforeEach(() => { + const createReadStream: FileUpload['createReadStream'] = (() => ({ + pipe: () => ({ + on: (_, callback) => callback(), + }), + })) as unknown as FileUpload['createReadStream'] imageInput = { ...imageInput, - upload: { + upload: Promise.resolve({ filename: 'image.jpg', mimetype: 'image/jpeg', encoding: '7bit', - createReadStream: () => ({ - pipe: () => ({ - on: (_, callback) => callback(), - }), - }), - }, + createReadStream, + }), } }) @@ -173,7 +177,12 @@ describe('mergeImage', () => { }) it('creates a url safe name', async () => { - imageInput.upload.filename = '/path/to/awkward?/ file-location/?foo- bar-avatar.jpg' + if (!imageInput.upload) { + throw new Error('Test imageInput was not setup correctly.') + } + const upload = await imageInput.upload + upload.filename = '/path/to/awkward?/ file-location/?foo- bar-avatar.jpg' + imageInput.upload = Promise.resolve(upload) await expect( mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }), ).resolves.toMatchObject({ @@ -181,21 +190,6 @@ describe('mergeImage', () => { }) }) - // eslint-disable-next-line jest/no-disabled-tests - it.skip('automatically creates different image sizes', async () => { - await expect( - mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }), - ).resolves.toEqual({ - url: expect.any(String), - alt: expect.any(String), - urlW34: expect.stringMatching(new RegExp(`^/uploads/W34/${uuid}-image.jpg`)), - urlW160: expect.stringMatching(new RegExp(`^/uploads/W160/${uuid}-image.jpg`)), - urlW320: expect.stringMatching(new RegExp(`^/uploads/W320/${uuid}-image.jpg`)), - urlW640: expect.stringMatching(new RegExp(`^/uploads/W640/${uuid}-image.jpg`)), - urlW1024: expect.stringMatching(new RegExp(`^/uploads/W1024/${uuid}-image.jpg`)), - }) - }) - it('connects resource with image via given image type', async () => { await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) const result = await neode.cypher( diff --git a/backend/src/graphql/resolvers/images/images.ts b/backend/src/graphql/resolvers/images/images.ts index 217d26553..f437b3c85 100644 --- a/backend/src/graphql/resolvers/images/images.ts +++ b/backend/src/graphql/resolvers/images/images.ts @@ -7,22 +7,57 @@ /* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable promise/avoid-new */ /* eslint-disable security/detect-non-literal-fs-filename */ + import { existsSync, unlinkSync, createWriteStream } from 'node:fs' import path from 'node:path' +import { S3Client, DeleteObjectCommand, ObjectCannedACL } from '@aws-sdk/client-s3' +import { Upload } from '@aws-sdk/lib-storage' import { UserInputError } from 'apollo-server' -import { S3 } from 'aws-sdk' import slug from 'slug' import { v4 as uuid } from 'uuid' import CONFIG from '@config/index' import { getDriver } from '@db/neo4j' -// const widths = [34, 160, 320, 640, 1024] -const { AWS_ENDPOINT: endpoint, AWS_REGION: region, AWS_BUCKET: Bucket, S3_CONFIGURED } = CONFIG +import type { FileUpload } from 'graphql-upload' +import type { Transaction } from 'neo4j-driver' -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function deleteImage(resource, relationshipType, opts: any = {}) { +type FileDeleteCallback = (url: string) => Promise +type FileUploadCallback = ( + upload: Pick & { uniqueFilename: string }, +) => Promise +export interface ImageInput { + upload?: Promise + alt?: string + sensitive?: boolean + aspectRatio?: number + type?: string +} + +// const widths = [34, 160, 320, 640, 1024] +const { AWS_BUCKET: Bucket, S3_CONFIGURED } = CONFIG + +const createS3Client = () => { + const { AWS_ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY } = CONFIG + if (!(AWS_ENDPOINT && AWS_ACCESS_KEY_ID && AWS_SECRET_ACCESS_KEY)) { + throw new Error('Missing AWS credentials.') + } + return new S3Client({ + credentials: { + accessKeyId: AWS_ACCESS_KEY_ID, + secretAccessKey: AWS_SECRET_ACCESS_KEY, + }, + endpoint: AWS_ENDPOINT, + forcePathStyle: true, + }) +} + +interface DeleteImageOpts { + transaction?: Transaction + deleteCallback?: FileDeleteCallback +} +export async function deleteImage(resource, relationshipType, opts: DeleteImageOpts = {}) { sanitizeRelationshipType(relationshipType) const { transaction, deleteCallback } = opts if (!transaction) return wrapTransaction(deleteImage, [resource, relationshipType], opts) @@ -44,8 +79,18 @@ export async function deleteImage(resource, relationshipType, opts: any = {}) { return image } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function mergeImage(resource, relationshipType, imageInput, opts: any = {}) { +interface MergeImageOpts { + transaction?: Transaction + uploadCallback?: FileUploadCallback + deleteCallback?: FileDeleteCallback +} + +export async function mergeImage( + resource, + relationshipType, + imageInput: ImageInput | null | undefined, + opts: MergeImageOpts = {}, +) { if (typeof imageInput === 'undefined') return if (imageInput === null) return deleteImage(resource, relationshipType, opts) sanitizeRelationshipType(relationshipType) @@ -95,20 +140,25 @@ const wrapTransaction = async (wrappedCallback, args, opts) => { } } -const deleteImageFile = (image, deleteCallback) => { +const deleteImageFile = (image, deleteCallback: FileDeleteCallback | undefined) => { if (!deleteCallback) { deleteCallback = S3_CONFIGURED ? s3Delete : localFileDelete } const { url } = image + // eslint-disable-next-line @typescript-eslint/no-floating-promises deleteCallback(url) return url } -const uploadImageFile = async (upload, uploadCallback) => { +const uploadImageFile = async ( + upload: Promise | undefined, + uploadCallback: FileUploadCallback | undefined, +) => { if (!upload) return undefined if (!uploadCallback) { uploadCallback = S3_CONFIGURED ? s3Upload : localFileUpload } + // eslint-disable-next-line @typescript-eslint/unbound-method const { createReadStream, filename, mimetype } = await upload const { name, ext } = path.parse(filename) const uniqueFilename = `${uuid()}-${slug(name)}${ext}` @@ -123,7 +173,7 @@ const sanitizeRelationshipType = (relationshipType) => { } } -const localFileUpload = ({ createReadStream, uniqueFilename }) => { +const localFileUpload: FileUploadCallback = ({ createReadStream, uniqueFilename }) => { const destination = `/uploads/${uniqueFilename}` return new Promise((resolve, reject) => createReadStream().pipe( @@ -134,41 +184,42 @@ const localFileUpload = ({ createReadStream, uniqueFilename }) => { ) } -const s3Upload = async ({ createReadStream, uniqueFilename, mimetype }) => { - const s3 = new S3({ region, endpoint }) +const s3Upload: FileUploadCallback = async ({ createReadStream, uniqueFilename, mimetype }) => { const s3Location = `original/${uniqueFilename}` - - if (!Bucket) { - throw new Error('AWS_BUCKET is undefined') - } const params = { Bucket, Key: s3Location, - ACL: 'public-read', + ACL: ObjectCannedACL.public_read, ContentType: mimetype, Body: createReadStream(), } - const data = await s3.upload(params).promise() + const s3 = createS3Client() + const command = new Upload({ client: s3, params }) + const data = await command.done() const { Location } = data + if (!Location) { + throw new Error('File upload did not return `Location`') + } return Location } -const localFileDelete = async (url) => { +const localFileDelete: FileDeleteCallback = async (url) => { const location = `public${url}` // eslint-disable-next-line n/no-sync if (existsSync(location)) unlinkSync(location) } -const s3Delete = async (url) => { - const s3 = new S3({ region, endpoint }) +const s3Delete: FileDeleteCallback = async (url) => { let { pathname } = new URL(url, 'http://example.org') // dummy domain to avoid invalid URL error pathname = pathname.substring(1) // remove first character '/' - if (!Bucket) { - throw new Error('AWS_BUCKET is undefined') + const prefix = `${Bucket}/` + if (pathname.startsWith(prefix)) { + pathname = pathname.slice(prefix.length) } const params = { Bucket, Key: pathname, } - await s3.deleteObject(params).promise() + const s3 = createS3Client() + await s3.send(new DeleteObjectCommand(params)) } diff --git a/backend/src/graphql/resolvers/notifications.ts b/backend/src/graphql/resolvers/notifications.ts index 08a7c48f5..0c35c249e 100644 --- a/backend/src/graphql/resolvers/notifications.ts +++ b/backend/src/graphql/resolvers/notifications.ts @@ -54,7 +54,7 @@ export default { MATCH (resource {deleted: false, disabled: false})-[notification:NOTIFIED]->(user:User {id:$id}) ${whereClause} OPTIONAL MATCH (relatedUser:User { id: notification.relatedUserId }) - OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(relatedUser) + OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user) WITH user, notification, resource, membership, relatedUser, [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author), postType: [l IN labels(post) WHERE NOT l = 'Post']} ] AS posts diff --git a/backend/src/graphql/resolvers/statistics.spec.ts b/backend/src/graphql/resolvers/statistics.spec.ts index 50f124ac9..f67552f39 100644 --- a/backend/src/graphql/resolvers/statistics.spec.ts +++ b/backend/src/graphql/resolvers/statistics.spec.ts @@ -2,52 +2,39 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import { ApolloServer } from 'apollo-server-express' import { createTestClient } from 'apollo-server-testing' -import gql from 'graphql-tag' +import databaseContext from '@context/database' import Factory, { cleanDatabase } from '@db/factories' -import { getNeode, getDriver } from '@db/neo4j' -import createServer from '@src/server' +import { statistics } from '@graphql/queries/statistics' +import createServer, { getContext } from '@src/server' +const database = databaseContext() + +let server: ApolloServer let query, authenticatedUser -const instance = getNeode() -const driver = getDriver() -const statisticsQuery = gql` - query { - statistics { - countUsers - countPosts - countComments - countNotifications - countInvites - countFollows - countShouts - } - } -` beforeAll(async () => { await cleanDatabase() - authenticatedUser = undefined - const { server } = createServer({ - context: () => { - return { - driver, - neode: instance, - user: authenticatedUser, - } - }, - }) - query = createTestClient(server).query + // eslint-disable-next-line @typescript-eslint/require-await + const contextUser = async (_req) => authenticatedUser + const context = getContext({ user: contextUser, database }) + + server = createServer({ context }).server + + const createTestClientResult = createTestClient(server) + query = createTestClientResult.query }) afterAll(async () => { await cleanDatabase() - await driver.close() + void server.stop() + void database.driver.close() + database.neode.close() }) -// TODO: avoid database clean after each test in the future if possible for performance and flakyness reasons by filling the database step by step, see issue https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4543 afterEach(async () => { await cleanDatabase() }) @@ -63,8 +50,8 @@ describe('statistics', () => { }) it('returns the count of all users', async () => { - await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ - data: { statistics: { countUsers: 6 } }, + await expect(query({ query: statistics })).resolves.toMatchObject({ + data: { statistics: { users: 6 } }, errors: undefined, }) }) @@ -80,8 +67,8 @@ describe('statistics', () => { }) it('returns the count of all posts', async () => { - await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ - data: { statistics: { countPosts: 3 } }, + await expect(query({ query: statistics })).resolves.toMatchObject({ + data: { statistics: { posts: 3 } }, errors: undefined, }) }) @@ -97,8 +84,8 @@ describe('statistics', () => { }) it('returns the count of all comments', async () => { - await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ - data: { statistics: { countComments: 2 } }, + await expect(query({ query: statistics })).resolves.toMatchObject({ + data: { statistics: { comments: 2 } }, errors: undefined, }) }) @@ -116,8 +103,8 @@ describe('statistics', () => { }) it('returns the count of all follows', async () => { - await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ - data: { statistics: { countFollows: 1 } }, + await expect(query({ query: statistics })).resolves.toMatchObject({ + data: { statistics: { follows: 1 } }, errors: undefined, }) }) @@ -143,8 +130,8 @@ describe('statistics', () => { }) it('returns the count of all shouts', async () => { - await expect(query({ query: statisticsQuery })).resolves.toMatchObject({ - data: { statistics: { countShouts: 2 } }, + await expect(query({ query: statistics })).resolves.toMatchObject({ + data: { statistics: { shouts: 2 } }, errors: undefined, }) }) diff --git a/backend/src/graphql/resolvers/statistics.ts b/backend/src/graphql/resolvers/statistics.ts index f7af390bf..00ead1eb2 100644 --- a/backend/src/graphql/resolvers/statistics.ts +++ b/backend/src/graphql/resolvers/statistics.ts @@ -1,48 +1,83 @@ -/* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable security/detect-object-injection */ +/* eslint-disable @typescript-eslint/dot-notation */ +import { Context } from '@src/server' + export default { Query: { - statistics: async (_parent, _args, { driver }) => { - const session = driver.session() - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const counts: any = {} - try { - const mapping = { - countUsers: 'User', - countPosts: 'Post', - countComments: 'Comment', - countNotifications: 'NOTIFIED', - countEmails: 'EmailAddress', - countFollows: 'FOLLOWS', - countShouts: 'SHOUTED', - } - const statisticsReadTxResultPromise = session.readTransaction(async (transaction) => { - const statisticsTransactionResponse = await transaction.run( - ` - CALL apoc.meta.stats() YIELD labels, relTypesCount - RETURN labels, relTypesCount - `, - ) - return statisticsTransactionResponse.records.map((record) => { - return { - ...record.get('labels'), - ...record.get('relTypesCount'), - } - }) - }) - const [statistics] = await statisticsReadTxResultPromise - Object.keys(mapping).forEach((key) => { - const stat = statistics[mapping[key]] - counts[key] = stat ? stat.toNumber() : 0 - }) - counts.countInvites = counts.countEmails - counts.countUsers - return counts - } finally { - session.close() + statistics: async (_parent, _args, context: Context) => { + const statistics = { + users: 0, + usersDeleted: 0, + posts: 0, + comments: 0, + notifications: 0, + emails: 0, + follows: 0, + shouts: 0, + invites: 0, + chatMessages: 0, + chatRooms: 0, + tags: 0, + locations: 0, + groups: 0, + inviteCodes: 0, + inviteCodesExpired: 0, + inviteCodesRedeemed: 0, + badgesRewarded: 0, + badgesDisplayed: 0, + usersVerified: 0, + reports: 0, } + const [metaStats] = ( + await context.database.query({ + query: `CALL apoc.meta.stats() YIELD labels, relTypesCount + RETURN labels, relTypesCount`, + }) + ).records.map((record) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return { ...record.get('labels'), ...record.get('relTypesCount') } + }) + + const deletedUsers = parseInt( + ( + await context.database.query({ + query: `MATCH (u:User) WHERE NOT (u)-[:PRIMARY_EMAIL]->(:EmailAddress) RETURN toString(count(u)) AS count`, + }) + ).records[0].get('count') as string, + ) + + const invalidInviteCodes = parseInt( + ( + await context.database.query({ + query: `MATCH (i:InviteCode) WHERE NOT i.expiresAt IS NULL OR i.expiresAt >= datetime() RETURN toString(count(i)) AS count`, + }) + ).records[0].get('count') as string, + ) + + statistics.users = (metaStats['User']?.toNumber() ?? 0) - deletedUsers + statistics.usersDeleted = deletedUsers + statistics.posts = metaStats['Post']?.toNumber() ?? 0 + statistics.comments = metaStats['Comment']?.toNumber() ?? 0 + statistics.notifications = metaStats['NOTIFIED']?.toNumber() ?? 0 + statistics.emails = metaStats['EmailAddress']?.toNumber() ?? 0 + statistics.follows = metaStats['FOLLOWS']?.toNumber() ?? 0 + statistics.shouts = metaStats['SHOUTED']?.toNumber() ?? 0 + statistics.invites = statistics.emails - statistics.users + statistics.chatMessages = metaStats['Message']?.toNumber() ?? 0 + statistics.chatRooms = metaStats['Room']?.toNumber() ?? 0 + statistics.tags = metaStats['Tag']?.toNumber() ?? 0 + statistics.locations = metaStats['Location']?.toNumber() ?? 0 + statistics.groups = metaStats['Group']?.toNumber() ?? 0 + statistics.inviteCodes = (metaStats['InviteCode']?.toNumber() ?? 0) - invalidInviteCodes + statistics.inviteCodesExpired = invalidInviteCodes + statistics.inviteCodesRedeemed = metaStats['REDEEMED']?.toNumber() ?? 0 + statistics.badgesRewarded = metaStats['REWARDED']?.toNumber() ?? 0 + statistics.badgesDisplayed = metaStats['SELECTED']?.toNumber() ?? 0 + statistics.usersVerified = metaStats['VERIFIES']?.toNumber() ?? 0 + statistics.reports = metaStats['Report']?.toNumber() ?? 0 + return statistics }, }, } diff --git a/backend/src/graphql/types/type/Statistics.gql b/backend/src/graphql/types/type/Statistics.gql index 3963a3e50..d01ff194b 100644 --- a/backend/src/graphql/types/type/Statistics.gql +++ b/backend/src/graphql/types/type/Statistics.gql @@ -3,12 +3,26 @@ type Query { } type Statistics { - countUsers: Int! - countPosts: Int! - countComments: Int! - countNotifications: Int! - countInvites: Int! - countFollows: Int! - countShouts: Int! + users: Int! + usersDeleted: Int! + posts: Int! + comments: Int! + notifications: Int! + emails: Int! + follows: Int! + shouts: Int! + invites: Int! + chatMessages: Int! + chatRooms: Int! + tags: Int! + locations: Int! + groups: Int! + inviteCodes: Int! + inviteCodesExpired: Int! + inviteCodesRedeemed: Int! + badgesRewarded: Int! + badgesDisplayed: Int! + usersVerified: Int! + reports: Int! } diff --git a/backend/yarn.lock b/backend/yarn.lock index 4d6b2e2d3..64a4e780b 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -64,6 +64,575 @@ "@csstools/css-tokenizer" "^3.0.3" lru-cache "^10.4.3" +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== + dependencies: + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + +"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-s3@^3.796.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.804.0.tgz#07f9591078815457e8f21c1a2ebd780b357987d2" + integrity sha512-oLBCq/wOzMEv4HhEDxttl5km0KGuptqnl4MlzzDcxPpsDmXjQU7egZdfQtwKRlB7748F+/uTcYc7khFvX2I1DA== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.804.0" + "@aws-sdk/credential-provider-node" "3.804.0" + "@aws-sdk/middleware-bucket-endpoint" "3.804.0" + "@aws-sdk/middleware-expect-continue" "3.804.0" + "@aws-sdk/middleware-flexible-checksums" "3.804.0" + "@aws-sdk/middleware-host-header" "3.804.0" + "@aws-sdk/middleware-location-constraint" "3.804.0" + "@aws-sdk/middleware-logger" "3.804.0" + "@aws-sdk/middleware-recursion-detection" "3.804.0" + "@aws-sdk/middleware-sdk-s3" "3.804.0" + "@aws-sdk/middleware-ssec" "3.804.0" + "@aws-sdk/middleware-user-agent" "3.804.0" + "@aws-sdk/region-config-resolver" "3.804.0" + "@aws-sdk/signature-v4-multi-region" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@aws-sdk/util-endpoints" "3.804.0" + "@aws-sdk/util-user-agent-browser" "3.804.0" + "@aws-sdk/util-user-agent-node" "3.804.0" + "@aws-sdk/xml-builder" "3.804.0" + "@smithy/config-resolver" "^4.1.0" + "@smithy/core" "^3.3.1" + "@smithy/eventstream-serde-browser" "^4.0.2" + "@smithy/eventstream-serde-config-resolver" "^4.1.0" + "@smithy/eventstream-serde-node" "^4.0.2" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/hash-blob-browser" "^4.0.2" + "@smithy/hash-node" "^4.0.2" + "@smithy/hash-stream-node" "^4.0.2" + "@smithy/invalid-dependency" "^4.0.2" + "@smithy/md5-js" "^4.0.2" + "@smithy/middleware-content-length" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.2" + "@smithy/middleware-retry" "^4.1.3" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.10" + "@smithy/util-defaults-mode-node" "^4.0.10" + "@smithy/util-endpoints" "^3.0.2" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + "@smithy/util-stream" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.3" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.804.0.tgz#99f130025c7225087d730ef83fbefb2cc167a4f4" + integrity sha512-6D5iQbL0MqlJ7B5aaHdP21k9+3H/od0jHjHSXegvFd4h2KQbD+QVTdEOSLeakgBGgHYRfiQXsrdMMzUz8vcpsw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.804.0" + "@aws-sdk/middleware-host-header" "3.804.0" + "@aws-sdk/middleware-logger" "3.804.0" + "@aws-sdk/middleware-recursion-detection" "3.804.0" + "@aws-sdk/middleware-user-agent" "3.804.0" + "@aws-sdk/region-config-resolver" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@aws-sdk/util-endpoints" "3.804.0" + "@aws-sdk/util-user-agent-browser" "3.804.0" + "@aws-sdk/util-user-agent-node" "3.804.0" + "@smithy/config-resolver" "^4.1.0" + "@smithy/core" "^3.3.1" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/hash-node" "^4.0.2" + "@smithy/invalid-dependency" "^4.0.2" + "@smithy/middleware-content-length" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.2" + "@smithy/middleware-retry" "^4.1.3" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.10" + "@smithy/util-defaults-mode-node" "^4.0.10" + "@smithy/util-endpoints" "^3.0.2" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.804.0.tgz#ac0b3108b3803813c077c88e1a784541c39cb6a3" + integrity sha512-KrYDEc6HaJE+Mx5lrwq6uhJxj1RYYfggQ+X+zQeKRyrZHl2GOxFl7PdnpdwtnaQIjX0gNkDzquhZSdyT0ar5rA== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/core" "^3.3.1" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/signature-v4" "^5.1.0" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/util-middleware" "^4.0.2" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.804.0.tgz#b07af9f0841d88ba983f7d2a6acd9a3b1afad18c" + integrity sha512-5mjrWPa4iaBK9/HDEIVN8lGxsnjk60eBjwGaJV0I2uqxnTo1EuQmpLV3XdY/OzQeqJdpuH/DbC6XUIdy9bXNQA== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.804.0.tgz#9d5fd383e703bd87c569ca18461ccc5b8aa03858" + integrity sha512-TD84TXS/iDWcf+ggCq3n6yx36p1WXB2qgyHkbP/yVbdmix/vKU1twuB5qJvaY0PJWI0TOwBa9680XfsYrzaJAA== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/property-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/util-stream" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.804.0.tgz#0f227a306d7cd51d85ffcd5cd8c8aeb65110309f" + integrity sha512-LfReL9TnOOunJWeZbDXPePFEnvJE+jcA7iY/ItsThUALgTy+ydLUdOiwzMZFo1f0JZN/Rfrsb9FOd/xTOoZiFw== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/credential-provider-env" "3.804.0" + "@aws-sdk/credential-provider-http" "3.804.0" + "@aws-sdk/credential-provider-process" "3.804.0" + "@aws-sdk/credential-provider-sso" "3.804.0" + "@aws-sdk/credential-provider-web-identity" "3.804.0" + "@aws-sdk/nested-clients" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/credential-provider-imds" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.804.0.tgz#6a83d53542e7d5aae846ab5bfc4853ff6d411599" + integrity sha512-L2EK5fy2+7El7j7TcRcuwr2lzU5tQfXsfscg+dtFkLPjOqShknnqV/lXylb3QlWx8B3K/c/KK5rcWQl6cYUiDQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.804.0" + "@aws-sdk/credential-provider-http" "3.804.0" + "@aws-sdk/credential-provider-ini" "3.804.0" + "@aws-sdk/credential-provider-process" "3.804.0" + "@aws-sdk/credential-provider-sso" "3.804.0" + "@aws-sdk/credential-provider-web-identity" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/credential-provider-imds" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.804.0.tgz#e4bd67550f5b05941adb4f9710ccdf78922b0fa7" + integrity sha512-s6ng/rZj7WP8GGgxBXsoPZYlSu7MZAm9O8OLgSSWcw8/vaYW7hBVSEVVNMEUkJiJeEo7Lh+Y/3d6SY27S1of/g== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.804.0.tgz#5365938fbdc76399ff0d26acb011b0d0e2366431" + integrity sha512-9Tt5zmhiK2nBfJv52Is5gNtW6bhK0W20GRhckg4T+BlnxOkPy//2ui23DzYacrwETH6TE3kdoyL3xgEL++HSLg== + dependencies: + "@aws-sdk/client-sso" "3.804.0" + "@aws-sdk/core" "3.804.0" + "@aws-sdk/token-providers" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.804.0.tgz#87377f3bbacfe01ad736df3360222a46b03de8c1" + integrity sha512-eBICjQUnqaoiHl9/AHKVPt/YkrifDddAUNGWUj+9cb3bRml6PEBSHE0k/tbbCTMq1xz7CCP+gmnnAA92ChnseA== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/nested-clients" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/lib-storage@^3.797.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.804.0.tgz#00aac043f3309337e49d26e1a3c1006ff8ef0088" + integrity sha512-o7/YYquJeIbsplqHwo78L39UigmQpsXHY3WrJ3j2kAzBBN9T6rPsBU6dPIBMHdtx06uHehcZwm/+B8GVMfMc8A== + dependencies: + "@smithy/abort-controller" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.2" + "@smithy/smithy-client" "^4.2.2" + buffer "5.6.0" + events "3.3.0" + stream-browserify "3.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-bucket-endpoint@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.804.0.tgz#c4286b8124e2dd18676eb2f47068356ea35000d1" + integrity sha512-vVphifJ5Ab2JUjB27UvdNV51ezxTn3f/jNbC/Y+KF1vNcYkwWXqo+U1gD8SUsDK+NhnD3wasfVBVLOdJa7qqKw== + dependencies: + "@aws-sdk/types" "3.804.0" + "@aws-sdk/util-arn-parser" "3.804.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-config-provider" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-expect-continue@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.804.0.tgz#3f9982a7100d186a2830b0c3723275e0734de6ae" + integrity sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-flexible-checksums@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.804.0.tgz#dabce925af91ae92d30caf87e599bd37026a319d" + integrity sha512-bQbh3hTrp+3XEuu8G5DkPDK9u3nnIabw2N1GpqlIwv8oGM+GTtGH35gBZtbbd2WAxfSUIBOAwkc86kTS0g0mFg== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-crypto/util" "5.2.0" + "@aws-sdk/core" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-stream" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz#e4c2180cfc75f19c697974383324509fa104d7a3" + integrity sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-location-constraint@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.804.0.tgz#512104f4648186fc88a62356c069e4a8f77b3e02" + integrity sha512-AMtKnllIWKgoo7hiJfphLYotEwTERfjVMO2+cKAncz9w1g+bnYhHxiVhJJoR94y047c06X4PU5MsTxvdQ73Znw== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz#9b7860d0193ec8647a1102aa6ffad070e3260513" + integrity sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz#797bbe72c765e83a1d4c259db9799b77831e1fbb" + integrity sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-sdk-s3@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.804.0.tgz#32f64ce59d475bade50cffe71885e8f90e4b8881" + integrity sha512-kiuqjV2ozoyI6w34+KMhZU+YVOLTPgh1Kp1DSpuS+tbkwkxnQCrPGziQhuSA5/Y0bUFaa2zLwUh2jpCmJQbLyA== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@aws-sdk/util-arn-parser" "3.804.0" + "@smithy/core" "^3.3.1" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/signature-v4" "^5.1.0" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-stream" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-ssec@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.804.0.tgz#4b586d7f9ce03907e6b3968d31ec1cad877d7f53" + integrity sha512-Tk8jK0gOIUBvEPTz/wwSlP1V70zVQ3QYqsLPAjQRMO6zfOK9ax31dln3MgKvFDJxBydS2tS3wsn53v+brxDxTA== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.804.0.tgz#6399bd2bd79fcca80e34e9866651e4fb7ae70bea" + integrity sha512-HoBaun4t3vAFhMj/I7L/HNBKBrAYu7Sb5bTFINx8kFCxPbqsvF+jOrEE8WiljHNy7FbPjz0mPVRUwO7RZSYNiQ== + dependencies: + "@aws-sdk/core" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@aws-sdk/util-endpoints" "3.804.0" + "@smithy/core" "^3.3.1" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.804.0.tgz#b73be267a161378c99313865307d894aca6eb49b" + integrity sha512-IOUcw6stjqYBMhLoAXlLVipYpAqLlA17jcyI0OzpS0pTD1RvBqEBckYibF4HJeReI+IiEHu/m0If0SKVR5WyXQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.804.0" + "@aws-sdk/middleware-host-header" "3.804.0" + "@aws-sdk/middleware-logger" "3.804.0" + "@aws-sdk/middleware-recursion-detection" "3.804.0" + "@aws-sdk/middleware-user-agent" "3.804.0" + "@aws-sdk/region-config-resolver" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@aws-sdk/util-endpoints" "3.804.0" + "@aws-sdk/util-user-agent-browser" "3.804.0" + "@aws-sdk/util-user-agent-node" "3.804.0" + "@smithy/config-resolver" "^4.1.0" + "@smithy/core" "^3.3.1" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/hash-node" "^4.0.2" + "@smithy/invalid-dependency" "^4.0.2" + "@smithy/middleware-content-length" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.2" + "@smithy/middleware-retry" "^4.1.3" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.10" + "@smithy/util-defaults-mode-node" "^4.0.10" + "@smithy/util-endpoints" "^3.0.2" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.804.0.tgz#c27044e7a3c660056e57d6fa59e55a8a6449f7e9" + integrity sha512-Qlr8jVUL5U8Ej+84ElUTGeOok6hQXcJdx5IOSRoqKs6bCKVa8TtwgX1zZIajzjMhMgMlR3/V+M8oDVDKPB43Ug== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + tslib "^2.6.2" + +"@aws-sdk/signature-v4-multi-region@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.804.0.tgz#851f1dd954bf367dbc4a62a8890aea35fa82d81f" + integrity sha512-6wxi+f/uvddm2PVRG1gDkjnukfwhEtu3JUAvGqQ56VWbDyM69pxPnGjcwoxCKf0dX16mU8+kHT5CpXsRIpEkkw== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/signature-v4" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.804.0.tgz#6b84452bbcdb3070f60b6e0b540c697c5e4db1ba" + integrity sha512-ndcLGD1nHEVJdWRl0lK8SfC0dN4j3X4gcGXEJxK16KZD23veMB2adHP69ySYXNFNo5gI6W9Ct9QXnB+tJCCS1Q== + dependencies: + "@aws-sdk/nested-clients" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/types@3.804.0", "@aws-sdk/types@^3.222.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.804.0.tgz#b70a734fa721450cf8a513cec0c276001a5d154f" + integrity sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/util-arn-parser@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz#d0b52bf5f9ae5b2c357a635551e5844dcad074c8" + integrity sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.804.0.tgz#77733192f26672a32b999816870fcb2581dd3036" + integrity sha512-mT2R1De1fBT3vgm00ELVFoaArblW3PqGUCVteGGSUdJA525To7h6xPThrNrw3Dn8blAcR8VYGYte/JX7vKgFxw== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/types" "^4.2.0" + "@smithy/util-endpoints" "^3.0.2" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz#a2ee8dc5d9c98276986e8e1ba03c0c84d9afb0f5" + integrity sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz#0312fda0fd34958a1d89e7691c5b1cf41ad5549b" + integrity sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A== + dependencies: + "@aws-sdk/types" "3.804.0" + "@smithy/types" "^4.2.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.804.0.tgz#942327170e0acd4581ba1ed1c812db631580908a" + integrity sha512-TacXL50ZHOeTUvN9LbHjS3muvvJNpzZp9cAtGRKpKXzlu8zCxPHrVU7dGOF6ONuNG30GpN2xzz81/XcCtg+8/A== + dependencies: + "@aws-sdk/middleware-user-agent" "3.804.0" + "@aws-sdk/types" "3.804.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/xml-builder@3.804.0": + version "3.804.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.804.0.tgz#8a1708b5cda5006e5a7f902542a3d9cd75052add" + integrity sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" @@ -445,10 +1014,10 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@faker-js/faker@9.7.0": - version "9.7.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.7.0.tgz#1cf1fecfcad5e2da2332140bf3b5f23cc1c2a7f4" - integrity sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg== +"@faker-js/faker@9.8.0": + version "9.8.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.8.0.tgz#3344284028d1c9dc98dee2479f82939310370d88" + integrity sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg== "@graphql-toolkit/common@0.10.4": version "0.10.4" @@ -1196,6 +1765,496 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@smithy/abort-controller@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.2.tgz#36a23e8cc65fc03cacb6afa35dfbfd319c560c6b" + integrity sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/chunked-blob-reader-native@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz#33cbba6deb8a3c516f98444f65061784f7cd7f8c" + integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== + dependencies: + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + +"@smithy/chunked-blob-reader@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz#3f6ea5ff4e2b2eacf74cefd737aa0ba869b2e0f6" + integrity sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw== + dependencies: + tslib "^2.6.2" + +"@smithy/config-resolver@^4.1.0", "@smithy/config-resolver@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.1.1.tgz#12f6da81551a99d447da47050501562b2646b779" + integrity sha512-FZUtpiDnPZQmuIl4lfbdO+u3foNLmRCKct/2w2nRwgB99Yvaq4SHcfxyzMfxkyBrBmgnF1kdXzhHNXN7ycDvWg== + dependencies: + "@smithy/node-config-provider" "^4.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + tslib "^2.6.2" + +"@smithy/core@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.3.1.tgz#6119a683f62099158eb193e3745f4ade6de741dd" + integrity sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ== + dependencies: + "@smithy/middleware-serde" "^4.0.3" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-stream" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^4.0.2", "@smithy/credential-provider-imds@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.3.tgz#574640e889705a2fc5b62356277da1df336e4bbc" + integrity sha512-UdNvGjZnunS9+45gHYtVXDynoWH1X0tYY0pS368k1zUZum6Mm4ivU4Se0WhFJf8jNocD+p94khzTtrx4ha3OOQ== + dependencies: + "@smithy/node-config-provider" "^4.1.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.2.tgz#d4d77699308a3dfeea1b2e87683845f5d8440bdb" + integrity sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^4.2.0" + "@smithy/util-hex-encoding" "^4.0.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-browser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.2.tgz#876f05491373ab217801c47b802601b8c09388d4" + integrity sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug== + dependencies: + "@smithy/eventstream-serde-universal" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-config-resolver@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.0.tgz#4ab7a2575e9041a2df2179bce64619a4e632e4d3" + integrity sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-node@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.2.tgz#390306ff79edb0c607705f639d8c5a76caad4bf7" + integrity sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw== + dependencies: + "@smithy/eventstream-serde-universal" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-universal@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.2.tgz#9f45472fc4fe5fe5f7c22c33d90ec6fc0230d0ae" + integrity sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng== + dependencies: + "@smithy/eventstream-codec" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.2.tgz#9d3cacf044aa9573ab933f445ab95cddb284813d" + integrity sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ== + dependencies: + "@smithy/protocol-http" "^5.1.0" + "@smithy/querystring-builder" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + +"@smithy/hash-blob-browser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.2.tgz#c51abe21684803f6eb5e43c4870e2af9e232a5cd" + integrity sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g== + dependencies: + "@smithy/chunked-blob-reader" "^5.0.0" + "@smithy/chunked-blob-reader-native" "^4.0.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/hash-node@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.2.tgz#a34fe5a33b067d754ca63302b9791778f003e437" + integrity sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg== + dependencies: + "@smithy/types" "^4.2.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/hash-stream-node@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.0.2.tgz#c9ee7d85710121268b7b487a7259375c949a3289" + integrity sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg== + dependencies: + "@smithy/types" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.2.tgz#e9b1c5e407d795f10a03afba90e37bccdc3e38f7" + integrity sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206" + integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== + dependencies: + tslib "^2.6.2" + +"@smithy/md5-js@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.2.tgz#ac8f05d2c845fde48d3fde805a04ec21030fd19b" + integrity sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA== + dependencies: + "@smithy/types" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/middleware-content-length@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.2.tgz#ff78658e8047ad7038f58478cf8713ee2f6ef647" + integrity sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A== + dependencies: + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^4.1.2", "@smithy/middleware-endpoint@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.3.tgz#a972033a772904a1138e03e0cda35eccde3a5045" + integrity sha512-w7fJjCSqdTVTs1o1O7SRZm+Umf6r/FzkdlO5OH6tboASeUeugnMgQAs7gnc2dXvJVJtEGrmrBgPZFPxq3wWyzw== + dependencies: + "@smithy/core" "^3.3.1" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/node-config-provider" "^4.1.0" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-middleware" "^4.0.2" + tslib "^2.6.2" + +"@smithy/middleware-retry@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.4.tgz#060b24caebcefd771f3c2fa8eb6078aa06aa41e0" + integrity sha512-QtWuD7bd7AAEFKvBmLQdOax25bXv4BACLQNWi3ddvpWwUUSAkAku9mzI+28jbjg48qw28lbzJ+YoYbbaXhLUjw== + dependencies: + "@smithy/node-config-provider" "^4.1.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/service-error-classification" "^4.0.3" + "@smithy/smithy-client" "^4.2.3" + "@smithy/types" "^4.2.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.3.tgz#b90ef1065ad9dc0b54c561fae73c8a5792d145e3" + integrity sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/middleware-stack@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.2.tgz#ca7bc3eedc7c1349e2cf94e0dc92a68d681bef18" + integrity sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/node-config-provider@^4.0.2", "@smithy/node-config-provider@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.1.0.tgz#5ae4e02e4bc0bf95220fb17029c42e41cb8bdfb1" + integrity sha512-gmPsv6L3ZRlBinv+vtSGUwfhTMh4+SgjbgGdX7bqYEs3Ys5RYVQtLuZ/WgZZdxn8QrDSUqLmTWunLM96WyM7UQ== + dependencies: + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/node-http-handler@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz#aa583d201c1ee968170b65a07f06d633c214b7a1" + integrity sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g== + dependencies: + "@smithy/abort-controller" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/querystring-builder" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/property-provider@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.2.tgz#4572c10415c9d4215f3df1530ba61b0319b17b55" + integrity sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/protocol-http@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.1.0.tgz#ad34e336a95944785185234bebe2ec8dbe266936" + integrity sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/querystring-builder@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz#834cea95bf413ab417bf9c166d60fd80d2cb3016" + integrity sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q== + dependencies: + "@smithy/types" "^4.2.0" + "@smithy/util-uri-escape" "^4.0.0" + tslib "^2.6.2" + +"@smithy/querystring-parser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.2.tgz#d80c5afb740e12ad8b4d4f58415e402c69712479" + integrity sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/service-error-classification@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.3.tgz#df43e3ec00a9f2d15415185561d98cd602c8bc67" + integrity sha512-FTbcajmltovWMjj3tksDQdD23b2w6gH+A0DYA1Yz3iSpjDj8fmkwy62UnXcWMy4d5YoMoSyLFHMfkEVEzbiN8Q== + dependencies: + "@smithy/types" "^4.2.0" + +"@smithy/shared-ini-file-loader@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.2.tgz#15043f0516fe09ff4b22982bc5f644dc701ebae5" + integrity sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/signature-v4@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.1.0.tgz#2c56e5b278482b04383d84ea2c07b7f0a8eb8f63" + integrity sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^4.2.2", "@smithy/smithy-client@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.2.3.tgz#f7cd92c4ccfd7834c50027e0a86513d9012d5f2b" + integrity sha512-j/RRx6N007rJQ3qyjN4yuX9B0bxTn9ynDVxYQ43mcs7fluVJXmQGquy0TrWJfOPZcIikpY377GunZ2UK90GHYQ== + dependencies: + "@smithy/core" "^3.3.1" + "@smithy/middleware-endpoint" "^4.1.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-stream" "^4.2.0" + tslib "^2.6.2" + +"@smithy/types@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.2.0.tgz#e7998984cc54b1acbc32e6d4cf982c712e3d26b6" + integrity sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.2.tgz#a316f7d8593ffab796348bc5df96237833880713" + integrity sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ== + dependencies: + "@smithy/querystring-parser" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/util-base64@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" + integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== + dependencies: + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded" + integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3" + integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9" + integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-config-provider@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^4.0.10": + version "4.0.11" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.11.tgz#1f3901078a5ab7ac883f16d0114d7991a4fdc6ee" + integrity sha512-Z49QNUSKbEj7JVZqaSUZkTkexRciQBbmonJ8AMar4fA0S2kvVpgjeVyGXnZYWTFzkgEwStacjFq4cQKbaQ8AnQ== + dependencies: + "@smithy/property-provider" "^4.0.2" + "@smithy/smithy-client" "^4.2.3" + "@smithy/types" "^4.2.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^4.0.10": + version "4.0.11" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.11.tgz#8dccc28ac46f008cc54726bb7413dbfa8dcf8490" + integrity sha512-y9UYcXjz4ry5sDPX40Vy6224Cw2/dch+wET6giaRoeXpyh56DCUVxW+Mgc/gO2uczAKktWd4ZWs2LWcW+PHz3Q== + dependencies: + "@smithy/config-resolver" "^4.1.1" + "@smithy/credential-provider-imds" "^4.0.3" + "@smithy/node-config-provider" "^4.1.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/smithy-client" "^4.2.3" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/util-endpoints@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.3.tgz#efcb535e92a9825e4cd8220adccff75433100ebb" + integrity sha512-284PZFhCMdudqq61/E67zJ3i10gCYrMBjXcMg3h048qI39gTXQCCeNZvtJhL4vrj9yMpJ/y9M+Ek7V0o5tak3w== + dependencies: + "@smithy/node-config-provider" "^4.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" + integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== + dependencies: + tslib "^2.6.2" + +"@smithy/util-middleware@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.2.tgz#272f1249664e27068ef0d5f967a233bf7b77962c" + integrity sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ== + dependencies: + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/util-retry@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.3.tgz#42d54b3a100915b61c6f9bee43c966e96139584d" + integrity sha512-DPuYjZQDXmKr/sNvy9Spu8R/ESa2e22wXZzSAY6NkjOLj6spbIje/Aq8rT97iUMdDj0qHMRIe+bTxvlU74d9Ng== + dependencies: + "@smithy/service-error-classification" "^4.0.3" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@smithy/util-stream@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.2.0.tgz#85f85516b0042726162bf619caa3358332195652" + integrity sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ== + dependencies: + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/types" "^4.2.0" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" + integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-utf8@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== + dependencies: + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c" + integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== + dependencies: + "@smithy/util-buffer-from" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-waiter@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.3.tgz#ec5605ec123493259ccbf1c0b5c1951b3360f43b" + integrity sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA== + dependencies: + "@smithy/abort-controller" "^4.0.2" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -1473,6 +2532,11 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== +"@types/mime-types@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.4.tgz#93a1933e24fed4fb9e4adc5963a63efcbb3317a2" + integrity sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w== + "@types/mime@*": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5" @@ -1491,10 +2555,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^22.15.3": - version "22.15.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.3.tgz#b7fb9396a8ec5b5dfb1345d8ac2502060e9af68b" - integrity sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw== +"@types/node@*", "@types/node@^22.15.18": + version "22.15.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.18.tgz#2f8240f7e932f571c2d45f555ba0b6c3f7a75963" + integrity sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg== dependencies: undici-types "~6.21.0" @@ -2399,22 +3463,6 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -aws-sdk@^2.1692.0: - version "2.1692.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1692.0.tgz#9dac5f7bfcc5ab45825cc8591b12753aa7d2902c" - integrity sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw== - dependencies: - buffer "4.9.2" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.16.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - util "^0.12.4" - uuid "8.0.0" - xml2js "0.6.2" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -2572,6 +3620,11 @@ boolean@3.2.0: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2628,14 +3681,13 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" - isarray "^1.0.0" buffer@^6.0.3: version "6.0.3" @@ -3363,12 +4415,7 @@ deepmerge@4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== - -deepmerge@^4.3.1: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -4053,10 +5100,10 @@ eslint-compat-utils@^0.6.4: dependencies: semver "^7.5.4" -eslint-config-prettier@^10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz#31a4b393c40c4180202c27e829af43323bf85276" - integrity sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA== +eslint-config-prettier@^10.1.5: + version "10.1.5" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782" + integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw== eslint-config-standard@^17.1.0: version "17.1.0" @@ -4172,10 +5219,10 @@ eslint-plugin-no-catch-all@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-no-catch-all/-/eslint-plugin-no-catch-all-1.1.0.tgz#f2e8950cc2b0bdde5faa4ab339d0986c6ae32fb0" integrity sha512-VkP62jLTmccPrFGN/W6V7a3SEwdtTZm+Su2k4T3uyJirtkm0OMMm97h7qd8pRFAHus/jQg9FpUpLRc7sAylBEQ== -eslint-plugin-prettier@^5.2.6: - version "5.2.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz#be39e3bb23bb3eeb7e7df0927cdb46e4d7945096" - integrity sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ== +eslint-plugin-prettier@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz#54d4748904e58eaf1ffe26c4bffa4986ca7f952b" + integrity sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA== dependencies: prettier-linter-helpers "^1.0.0" synckit "^0.11.0" @@ -4361,10 +5408,10 @@ eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -events@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@^0.10.0: version "0.10.0" @@ -4571,6 +5618,13 @@ fast-printf@^1.6.9: resolved "https://registry.yarnpkg.com/fast-printf/-/fast-printf-1.6.10.tgz#c44ad871726152159d7a903a5af0d65cf3d75875" integrity sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w== +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" @@ -5505,11 +6559,6 @@ iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -5569,7 +6618,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5663,14 +6712,6 @@ is-absolute-url@^3.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.1.tgz#e315cbdcbbc3d6789532d591954ac78a0e5049f6" integrity sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -5786,13 +6827,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -5947,7 +6981,7 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" -is-typed-array@^1.1.12, is-typed-array@^1.1.3: +is-typed-array@^1.1.12: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -5996,11 +7030,6 @@ is-wsl@^2.1.1: dependencies: is-docker "^2.0.0" -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -6476,11 +7505,6 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -jmespath@0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" - integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== - js-stringify@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" @@ -6738,10 +7762,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -linkify-html@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/linkify-html/-/linkify-html-4.2.0.tgz#06f78780827d90433424e412976d656912b13fb8" - integrity sha512-bVXuLiWmGwvlH95hq6q9DFGqTsQeFSGw/nHmvvjGMZv9T3GqkxuW2d2SOgk/a4DV2ajeS4c37EqlF16cjOj7GA== +linkify-html@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/linkify-html/-/linkify-html-4.3.1.tgz#6226a2205d96eb6a3b0c59571a2b02936c6386f3" + integrity sha512-6ZNyucw7fH9Ncu17s+hvHFB2sU6fLWowqH6MqkXxtVL2kKkhnrho/DMCE3fWovmzVPgWSFGvg6zLkW+VWrVr4w== linkify-it@5.0.0: version "5.0.0" @@ -8319,11 +9343,6 @@ punycode2@~1.0.0: resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8" integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g= -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -8358,11 +9377,6 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - queue-lit@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.2.tgz#83c24d4f4764802377b05a6e5c73017caf3f8747" @@ -8430,6 +9444,15 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +readable-stream@^3.5.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8700,10 +9723,10 @@ safe-regex@^2.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-html@~2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.16.0.tgz#2b9973b63fa42e3580020499cbda1d894b3642bc" - integrity sha512-0s4caLuHHaZFVxFTG74oW91+j6vW7gKbGD6CD2+miP73CE6z6YtOBN0ArtLd2UGyi4IC7K47v3ENUbQX4jV3Mg== +sanitize-html@~2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.17.0.tgz#a8f66420a6be981d8fe412e3397cc753782598e4" + integrity sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA== dependencies: deepmerge "^4.2.2" escape-string-regexp "^4.0.0" @@ -8712,16 +9735,6 @@ sanitize-html@~2.16.0: parse-srcset "^1.0.2" postcss "^8.3.11" -sax@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -8736,25 +9749,20 @@ selderee@^0.11.0: dependencies: parseley "^0.12.0" -semver@^5.5.0: +semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.1: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== +semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.1, semver@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== send@0.19.0: version "0.19.0" @@ -9100,6 +10108,14 @@ statuses@2.0.1, statuses@^2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + streamsearch@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" @@ -9185,7 +10201,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.3.0: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -9236,6 +10252,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" + integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== + subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16: version "0.9.19" resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf" @@ -9542,10 +10563,10 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" -ts-jest@^29.3.2: - version "29.3.2" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.3.2.tgz#0576cdf0a507f811fe73dcd16d135ce89f8156cb" - integrity sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug== +ts-jest@^29.3.4: + version "29.3.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.3.4.tgz#9354472aceae1d3867a80e8e02014ea5901aee41" + integrity sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA== dependencies: bs-logger "^0.2.6" ejs "^3.1.10" @@ -9554,8 +10575,8 @@ ts-jest@^29.3.2: json5 "^2.2.3" lodash.memoize "^4.1.2" make-error "^1.3.6" - semver "^7.7.1" - type-fest "^4.39.1" + semver "^7.7.2" + type-fest "^4.41.0" yargs-parser "^21.1.1" ts-node@^10.9.2: @@ -9577,10 +10598,10 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsc-alias@^1.8.15: - version "1.8.15" - resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.15.tgz#7a07a77a4157872f834841a2a1647fad9464884d" - integrity sha512-yKLVx8ddUurRwhVcS6JFF2ZjksOX2ZWDRIdgt+PQhJBDegIdAdilptiHsuAbx9UFxa16GFrxeKQ2kTcGvR6fkQ== +tsc-alias@^1.8.16: + version "1.8.16" + resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.16.tgz#dbc74e797071801c7284f1a478259de920f852d4" + integrity sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g== dependencies: chokidar "^3.5.3" commander "^9.0.0" @@ -9619,7 +10640,7 @@ tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0, tslib@^2.4.0, tslib@^2.8.1: +tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -9665,10 +10686,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^4.39.1: - version "4.39.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.39.1.tgz#7521f6944e279abaf79cf60cfbc4823f4858083e" - integrity sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w== +type-fest@^4.41.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== type-is@^1.6.16, type-is@~1.6.18: version "1.6.18" @@ -9902,13 +10923,10 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" -url@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= - dependencies: - punycode "1.3.2" - querystring "0.2.0" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util.promisify@^1.0.0: version "1.0.1" @@ -9927,27 +10945,11 @@ util@0.10.3: dependencies: inherits "2.0.1" -util@^0.12.4: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" - integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== - uuid@^3.1.0, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -10104,7 +11106,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.11, which-typed-array@^1.1.2: +which-typed-array@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -10226,19 +11228,6 @@ xml-name-validator@^5.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== -xml2js@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" - integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" diff --git a/deployment/helm/charts/ocelot-neo4j/Chart.yaml b/deployment/helm/charts/ocelot-neo4j/Chart.yaml index 125a84c31..8cb9e2418 100644 --- a/deployment/helm/charts/ocelot-neo4j/Chart.yaml +++ b/deployment/helm/charts/ocelot-neo4j/Chart.yaml @@ -21,4 +21,4 @@ version: 0.1.0 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "3.6.0" +appVersion: "3.6.1" diff --git a/deployment/helm/charts/ocelot-social/Chart.yaml b/deployment/helm/charts/ocelot-social/Chart.yaml index eda686495..c24ea6cfc 100644 --- a/deployment/helm/charts/ocelot-social/Chart.yaml +++ b/deployment/helm/charts/ocelot-social/Chart.yaml @@ -21,4 +21,4 @@ version: 0.1.0 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "3.6.0" +appVersion: "3.6.1" diff --git a/docker-compose.maintenance.yml b/docker-compose.maintenance.yml deleted file mode 100644 index e2cd1e515..000000000 --- a/docker-compose.maintenance.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Todo: !!! This file seems related to our old maintenance worker for MongoDB and has to be refactored in case of using it !!! - -services: - maintenance-worker: - image: ghcr.io/ocelot-social-community/ocelot-social/develop-maintenance-worker:latest - build: - context: deployment/legacy-migration/maintenance-worker - volumes: - - uploads:/uploads - - neo4j-data:/data - - ./deployment/legacy-migration/maintenance-worker/migration/:/migration - - ./deployment/legacy-migration/maintenance-worker/ssh/:/root/.ssh - environment: - - NEO4J_dbms_security_auth__enabled=false - - NEO4J_dbms_memory_heap_max__size=2G - - GRAPHQL_URI=http://localhost:4000 - - CLIENT_URI=http://localhost:3000 - - JWT_SECRET=b/&&7b78BF&fv/Vd - - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 - - NEO4J_apoc_import_file_enabled=true - - "SSH_USERNAME=${SSH_USERNAME}" - - "SSH_HOST=${SSH_HOST}" - - "MONGODB_USERNAME=${MONGODB_USERNAME}" - - "MONGODB_PASSWORD=${MONGODB_PASSWORD}" - - "MONGODB_AUTH_DB=${MONGODB_AUTH_DB}" - - "MONGODB_DATABASE=${MONGODB_DATABASE}" - - "UPLOADS_DIRECTORY=${UPLOADS_DIRECTORY}" - - "MONGO_EXPORT_SPLIT_SIZE=${MONGO_EXPORT_SPLIT_SIZE}" - ports: - - 7687:7687 - - 7474:7474 - -volumes: - neo4j-data: - uploads: diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 492bb4ae2..56ed60cad 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "ocelot-social-frontend", - "version": "3.6.0", + "version": "3.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ocelot-social-frontend", - "version": "3.6.0", + "version": "3.6.1", "license": "Apache-2.0", "dependencies": { "@intlify/unplugin-vue-i18n": "^2.0.0", diff --git a/frontend/package.json b/frontend/package.json index e151e436e..427484f5a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-frontend", - "version": "3.6.0", + "version": "3.6.1", "description": "ocelot.social new Frontend (in development and not fully implemented) by IT4C Boilerplate for frontends", "main": "build/index.js", "type": "module", diff --git a/package-lock.json b/package-lock.json index f9ad43b0b..57bc3fe2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ocelot-social", - "version": "3.4.0", + "version": "3.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ocelot-social", - "version": "3.4.0", + "version": "3.6.1", "license": "MIT", "devDependencies": { "@babel/core": "^7.27.1", @@ -15,7 +15,7 @@ "@badeball/cypress-cucumber-preprocessor": "^22.0.1", "@cucumber/cucumber": "11.2.0", "@cypress/browserify-preprocessor": "^3.0.2", - "@faker-js/faker": "9.7.0", + "@faker-js/faker": "9.8.0", "auto-changelog": "^2.5.0", "bcryptjs": "^3.0.2", "cross-env": "^7.0.3", @@ -2849,9 +2849,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.7.0.tgz", - "integrity": "sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.8.0.tgz", + "integrity": "sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 4d577a221..1e4c41671 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social", - "version": "3.6.0", + "version": "3.6.1", "description": "Free and open source software program code available to run social networks.", "author": "ocelot.social Community", "license": "MIT", @@ -39,7 +39,7 @@ "@badeball/cypress-cucumber-preprocessor": "^22.0.1", "@cucumber/cucumber": "11.2.0", "@cypress/browserify-preprocessor": "^3.0.2", - "@faker-js/faker": "9.7.0", + "@faker-js/faker": "9.8.0", "auto-changelog": "^2.5.0", "bcryptjs": "^3.0.2", "cross-env": "^7.0.3", diff --git a/webapp/assets/styles/main.scss b/webapp/assets/styles/main.scss index 036b7b90d..f912a0dc3 100644 --- a/webapp/assets/styles/main.scss +++ b/webapp/assets/styles/main.scss @@ -1,6 +1,10 @@ @import './imports/_tooltip.scss'; @import './imports/_toast.scss'; +html { + scrollbar-gutter: stable; +} + // Transition Easing $easeOut: cubic-bezier(0.19, 1, 0.22, 1); @@ -145,7 +149,6 @@ hr { body.dropdown-open { max-height: 100vh; overflow: hidden; - scrollbar-gutter: stable; } .base-card > .ds-section { diff --git a/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap b/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap index 5875d2341..e33d0f164 100644 --- a/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap +++ b/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap @@ -4,6 +4,7 @@ exports[`GroupContentMenu renders as groupProfile when I am the owner 1`] = `
@@ -72,7 +73,7 @@ export default { } }, closeMenu(useTimeout) { - if (this.disabled) { + if (this.noMouseLeaveClosing || this.disabled) { return } this.clearTimeouts() diff --git a/webapp/components/LoginForm/LoginForm.spec.js b/webapp/components/LoginForm/LoginForm.spec.js index 2004656a5..d3d4a7648 100644 --- a/webapp/components/LoginForm/LoginForm.spec.js +++ b/webapp/components/LoginForm/LoginForm.spec.js @@ -15,6 +15,11 @@ const stubs = { } const authUserMock = jest.fn().mockReturnValue({ activeCategories: [] }) +const apolloQueryMock = jest.fn().mockResolvedValue({ + data: { + Category: [{ id: 'cat0' }, { id: 'cat1' }, { id: 'cat2' }, { id: 'cat3' }, { id: 'cat4' }], + }, +}) describe('LoginForm', () => { let mocks @@ -47,6 +52,9 @@ describe('LoginForm', () => { success: jest.fn(), error: jest.fn(), }, + $apollo: { + query: apolloQueryMock, + }, } return mount(LoginForm, { mocks, localVue, propsData, store, stubs }) } @@ -74,7 +82,9 @@ describe('LoginForm', () => { describe('no categories saved', () => { it('resets the categories', async () => { - await fillIn(Wrapper()) + const wrapper = Wrapper() + await fillIn(wrapper) + await wrapper.vm.$nextTick() expect(storeMocks.mutations['posts/RESET_CATEGORIES']).toHaveBeenCalled() expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).not.toHaveBeenCalled() }) @@ -82,13 +92,28 @@ describe('LoginForm', () => { describe('categories saved', () => { it('sets the categories', async () => { - authUserMock.mockReturnValue({ activeCategories: ['cat1', 'cat9', 'cat12'] }) - await fillIn(Wrapper()) + authUserMock.mockReturnValue({ activeCategories: ['cat0', 'cat2', 'cat4'] }) + const wrapper = Wrapper() + await fillIn(wrapper) + await wrapper.vm.$nextTick() expect(storeMocks.mutations['posts/RESET_CATEGORIES']).toHaveBeenCalled() expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledTimes(3) - expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat1') - expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat9') - expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat12') + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat0') + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat2') + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat4') + }) + }) + + describe('all categories saved', () => { + it('resets the categories', async () => { + authUserMock.mockReturnValue({ + activeCategories: ['cat0', 'cat1', 'cat2', 'cat3', 'cat4', 'cat5'], + }) + const wrapper = Wrapper() + await fillIn(wrapper) + await wrapper.vm.$nextTick() + expect(storeMocks.mutations['posts/RESET_CATEGORIES']).toHaveBeenCalled() + expect(storeMocks.mutations['posts/TOGGLE_CATEGORY']).not.toHaveBeenCalled() }) }) }) diff --git a/webapp/components/LoginForm/LoginForm.vue b/webapp/components/LoginForm/LoginForm.vue index 5bdf356fe..ab64c5a3b 100644 --- a/webapp/components/LoginForm/LoginForm.vue +++ b/webapp/components/LoginForm/LoginForm.vue @@ -59,6 +59,7 @@ import LocaleSwitch from '~/components/LocaleSwitch/LocaleSwitch' import Logo from '~/components/Logo/Logo' import ShowPassword from '../ShowPassword/ShowPassword.vue' import { mapGetters, mapMutations } from 'vuex' +import CategoryQuery from '~/graphql/CategoryQuery' export default { components: { @@ -98,9 +99,13 @@ export default { const { email, password } = this.form try { await this.$store.dispatch('auth/login', { email, password }) + const result = await this.$apollo.query({ + query: CategoryQuery(), + }) + const categories = result.data.Category if (this.currentUser && this.currentUser.activeCategories) { this.resetCategories() - if (this.currentUser.activeCategories.length < 19) { + if (this.currentUser.activeCategories.length < categories.length) { this.currentUser.activeCategories.forEach((categoryId) => { this.toggleCategory(categoryId) }) diff --git a/webapp/components/Registration/RegistrationSlideCreate.vue b/webapp/components/Registration/RegistrationSlideCreate.vue index 9aab5d77a..86741a90c 100644 --- a/webapp/components/Registration/RegistrationSlideCreate.vue +++ b/webapp/components/Registration/RegistrationSlideCreate.vue @@ -171,31 +171,27 @@ export default { } }, mounted: function () { - this.$nextTick(function () { - // Code that will run only after the entire view has been rendered + this.formData.name = this.sliderData.collectedInputData.name + ? this.sliderData.collectedInputData.name + : '' + this.formData.password = this.sliderData.collectedInputData.password + ? this.sliderData.collectedInputData.password + : '' + this.formData.passwordConfirmation = this.sliderData.collectedInputData.passwordConfirmation + ? this.sliderData.collectedInputData.passwordConfirmation + : '' + this.termsAndConditionsConfirmed = this.sliderData.collectedInputData + .termsAndConditionsConfirmed + ? this.sliderData.collectedInputData.termsAndConditionsConfirmed + : false + this.recieveCommunicationAsEmailsEtcConfirmed = this.sliderData.collectedInputData + .recieveCommunicationAsEmailsEtcConfirmed + ? this.sliderData.collectedInputData.recieveCommunicationAsEmailsEtcConfirmed + : false + this.sendValidation() - this.formData.name = this.sliderData.collectedInputData.name - ? this.sliderData.collectedInputData.name - : '' - this.formData.password = this.sliderData.collectedInputData.password - ? this.sliderData.collectedInputData.password - : '' - this.formData.passwordConfirmation = this.sliderData.collectedInputData.passwordConfirmation - ? this.sliderData.collectedInputData.passwordConfirmation - : '' - this.termsAndConditionsConfirmed = this.sliderData.collectedInputData - .termsAndConditionsConfirmed - ? this.sliderData.collectedInputData.termsAndConditionsConfirmed - : false - this.recieveCommunicationAsEmailsEtcConfirmed = this.sliderData.collectedInputData - .recieveCommunicationAsEmailsEtcConfirmed - ? this.sliderData.collectedInputData.recieveCommunicationAsEmailsEtcConfirmed - : false - this.sendValidation() - - this.sliderData.setSliderValuesCallback(this.validInput, { - sliderSettings: { buttonSliderCallback: this.onNextClick }, - }) + this.sliderData.setSliderValuesCallback(this.validInput, { + sliderSettings: { buttonSliderCallback: this.onNextClick }, }) }, computed: { diff --git a/webapp/components/Registration/RegistrationSlideEmail.vue b/webapp/components/Registration/RegistrationSlideEmail.vue index 96441dee8..0a74858be 100644 --- a/webapp/components/Registration/RegistrationSlideEmail.vue +++ b/webapp/components/Registration/RegistrationSlideEmail.vue @@ -67,20 +67,16 @@ export default { } }, mounted: function () { - this.$nextTick(function () { - // Code that will run only after the entire view has been rendered + this.formData.email = this.sliderData.collectedInputData.email + ? this.sliderData.collectedInputData.email + : '' + this.sendValidation() - this.formData.email = this.sliderData.collectedInputData.email - ? this.sliderData.collectedInputData.email - : '' - this.sendValidation() - - this.sliderData.setSliderValuesCallback(this.validInput, { - sliderSettings: { - ...this.buttonValues().sliderSettings, - buttonSliderCallback: this.onNextClick, - }, - }) + this.sliderData.setSliderValuesCallback(this.validInput, { + sliderSettings: { + ...this.buttonValues().sliderSettings, + buttonSliderCallback: this.onNextClick, + }, }) }, watch: { diff --git a/webapp/components/Registration/RegistrationSlideInvite.vue b/webapp/components/Registration/RegistrationSlideInvite.vue index 276dec737..b11c42db4 100644 --- a/webapp/components/Registration/RegistrationSlideInvite.vue +++ b/webapp/components/Registration/RegistrationSlideInvite.vue @@ -75,17 +75,13 @@ export default { } }, mounted: function () { - this.$nextTick(function () { - // Code that will run only after the entire view has been rendered + this.formData.inviteCode = this.sliderData.collectedInputData.inviteCode + ? this.sliderData.collectedInputData.inviteCode + : '' + this.sendValidation() - this.formData.inviteCode = this.sliderData.collectedInputData.inviteCode - ? this.sliderData.collectedInputData.inviteCode - : '' - this.sendValidation() - - this.sliderData.setSliderValuesCallback(this.validInput, { - sliderSettings: { buttonSliderCallback: this.onNextClick }, - }) + this.sliderData.setSliderValuesCallback(this.validInput, { + sliderSettings: { buttonSliderCallback: this.onNextClick }, }) }, computed: { @@ -96,12 +92,14 @@ export default { return this.formData.inviteCode.length === 6 }, invitedBy() { - return this.sliderData.sliders[this.sliderIndex].data.response.validateInviteCode + return this.validInput && + this.sliderData.sliders[this.sliderIndex].data.response.validateInviteCode ? this.sliderData.sliders[this.sliderIndex].data.response.validateInviteCode.generatedBy : null }, invitedTo() { - return this.sliderData.sliders[this.sliderIndex].data.response.validateInviteCode + return this.validInput && + this.sliderData.sliders[this.sliderIndex].data.response.validateInviteCode ? this.sliderData.sliders[this.sliderIndex].data.response.validateInviteCode.invitedTo : null }, @@ -124,18 +122,11 @@ export default { async handleInputValid() { this.sendValidation() }, - isVariablesRequested(variables) { - return ( - this.sliderData.sliders[this.sliderIndex].data.request && - this.sliderData.sliders[this.sliderIndex].data.request.variables && - this.sliderData.sliders[this.sliderIndex].data.request.variables.code === variables.code - ) - }, async handleSubmitVerify() { const { inviteCode } = this.sliderData.collectedInputData const variables = { code: inviteCode } - if (!this.isVariablesRequested(variables) && !this.dbRequestInProgress) { + if (!this.dbRequestInProgress) { try { this.dbRequestInProgress = true diff --git a/webapp/components/Registration/RegistrationSlideNoPublic.vue b/webapp/components/Registration/RegistrationSlideNoPublic.vue index c5f815ef4..8c5edcf5b 100644 --- a/webapp/components/Registration/RegistrationSlideNoPublic.vue +++ b/webapp/components/Registration/RegistrationSlideNoPublic.vue @@ -18,12 +18,8 @@ export default { sliderData: { type: Object, required: true }, }, mounted: function () { - this.$nextTick(function () { - // Code that will run only after the entire view has been rendered - - this.sliderData.setSliderValuesCallback(true, { - sliderSettings: { buttonSliderCallback: this.onNextClick }, - }) + this.sliderData.setSliderValuesCallback(true, { + sliderSettings: { buttonSliderCallback: this.onNextClick }, }) }, methods: { diff --git a/webapp/components/Registration/RegistrationSlideNonce.vue b/webapp/components/Registration/RegistrationSlideNonce.vue index 844298611..0bc466e58 100644 --- a/webapp/components/Registration/RegistrationSlideNonce.vue +++ b/webapp/components/Registration/RegistrationSlideNonce.vue @@ -66,17 +66,13 @@ export default { } }, mounted: function () { - this.$nextTick(function () { - // Code that will run only after the entire view has been rendered + this.formData.nonce = this.sliderData.collectedInputData.nonce + ? this.sliderData.collectedInputData.nonce + : '' + this.sendValidation() - this.formData.nonce = this.sliderData.collectedInputData.nonce - ? this.sliderData.collectedInputData.nonce - : '' - this.sendValidation() - - this.sliderData.setSliderValuesCallback(this.validInput, { - sliderSettings: { buttonSliderCallback: this.onNextClick }, - }) + this.sliderData.setSliderValuesCallback(this.validInput, { + sliderSettings: { buttonSliderCallback: this.onNextClick }, }) }, computed: { @@ -109,20 +105,11 @@ export default { async handleInputValid() { this.sendValidation() }, - isVariablesRequested(variables) { - return ( - this.sliderData.sliders[this.sliderIndex].data.request && - this.sliderData.sliders[this.sliderIndex].data.request.variables && - this.sliderData.sliders[this.sliderIndex].data.request.variables.email === - variables.email && - this.sliderData.sliders[this.sliderIndex].data.request.variables.nonce === variables.nonce - ) - }, async handleSubmitVerify() { const { email, nonce } = this.sliderData.collectedInputData const variables = { email, nonce } - if (!this.isVariablesRequested(variables) && !this.dbRequestInProgress) { + if (!this.dbRequestInProgress) { try { this.dbRequestInProgress = true diff --git a/webapp/components/UserTeaser/UserTeaser.spec.js b/webapp/components/UserTeaser/UserTeaser.spec.js index 8a67285ac..0c2adab8a 100644 --- a/webapp/components/UserTeaser/UserTeaser.spec.js +++ b/webapp/components/UserTeaser/UserTeaser.spec.js @@ -86,6 +86,12 @@ describe('UserTeaser', () => { }, mocks: { $t: jest.fn((t) => t), + $i18n: { + locale: jest.fn(() => 'en'), + }, + $apollo: { + query: jest.fn(() => Promise.resolve({ data: { user } })), + }, }, }) } diff --git a/webapp/components/UserTeaser/UserTeaserNonAnonymous.vue b/webapp/components/UserTeaser/UserTeaserNonAnonymous.vue index 34c3769bb..286a9daa2 100644 --- a/webapp/components/UserTeaser/UserTeaserNonAnonymous.vue +++ b/webapp/components/UserTeaser/UserTeaserNonAnonymous.vue @@ -6,7 +6,7 @@ :link-to-profile="linkToProfile" :show-popover="showPopover" :user-link="userLink" - @open-menu="openMenu(false)" + @open-menu="loadPopover(openMenu)" @close-menu="closeMenu(false)" data-test="avatarUserLink" > @@ -18,7 +18,7 @@ :link-to-profile="linkToProfile" :show-popover="showPopover" :user-link="userLink" - @open-menu="openMenu(false)" + @open-menu="loadPopover(openMenu)" @close-menu="closeMenu(false)" > {{ userSlug }} @@ -57,6 +57,7 @@ diff --git a/webapp/components/UserTeaser/UserTeaserPopover.vue b/webapp/components/UserTeaser/UserTeaserPopover.vue index 05d34631a..68fffaf90 100644 --- a/webapp/components/UserTeaser/UserTeaserPopover.vue +++ b/webapp/components/UserTeaser/UserTeaserPopover.vue @@ -1,6 +1,5 @@