diff --git a/.dockerignore b/.dockerignore index ced02564a89..70377fccdd6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,3 +7,6 @@ karma-reports/ .idea/ .tmp/ config.json* +# Exclude the playwright directory as much as we can as the snapshots are huge and we bind mount it in +playwright/ +!playwright/docker-entrypoint.sh diff --git a/.eslintrc.js b/.eslintrc.js index cf034d14682..f4d92f1cf2e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -198,6 +198,8 @@ module.exports = { "@typescript-eslint/ban-ts-comment": "off", // We're okay with assertion errors when we ask for them "@typescript-eslint/no-non-null-assertion": "off", + // We do this sometimes to brand interfaces + "@typescript-eslint/no-empty-object-type": "off", }, }, // temporary override for offending icon require files diff --git a/.github/workflows/dockerhub.yaml b/.github/workflows/dockerhub.yaml index 2fdc66fb338..cdd50e0bcc4 100644 --- a/.github/workflows/dockerhub.yaml +++ b/.github/workflows/dockerhub.yaml @@ -15,15 +15,6 @@ jobs: name: Docker Buildx runs-on: ubuntu-24.04 environment: dockerhub - strategy: - fail-fast: false - matrix: - include: - - variant: vanilla - # Variant we ship to aid ESS in providing a build on the OpenCoDE platform including specific modules - - variant: opendesk - flavor: suffix=-opendesk,onlatest=true - prepare: mv variants/openDesk/* . steps: - uses: actions/checkout@v4 with: @@ -32,10 +23,6 @@ jobs: - name: Install Cosign uses: sigstore/cosign-installer@4959ce089c160fddf62f7b42464195ba1a56d382 # v3 - - name: Prepare - if: matrix.prepare - run: ${{ matrix.prepare }} - - name: Set up QEMU uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3 @@ -61,7 +48,6 @@ jobs: type=ref,event=tag flavor: | latest=${{ contains(github.ref_name, '-rc.') && 'false' || 'auto' }} - ${{ matrix.flavor }} - name: Build and push id: build-and-push @@ -85,7 +71,6 @@ jobs: cosign sign --yes ${images} - name: Update repo description - if: matrix.variant == 'vanilla' uses: peter-evans/dockerhub-description@e98e4d1628a5f3be2be7c231e50981aee98723ae # v4 continue-on-error: true with: diff --git a/package.json b/package.json index b57457d59fb..44e1a73f001 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "test:playwright:open": "yarn test:playwright --ui", "test:playwright:screenshots": "yarn test:playwright:screenshots:build && yarn test:playwright:screenshots:run", "test:playwright:screenshots:build": "docker build playwright -t element-web-playwright", - "test:playwright:screenshots:run": "docker run --rm --network host -e BASE_URL -e CI -v $(pwd):/work/ -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/:/tmp/ -it element-web-playwright", + "test:playwright:screenshots:run": "docker run --rm --network host -e BASE_URL -e CI -v $(pwd):/work/ -v $(node -e 'console.log(require(`path`).dirname(require.resolve(`matrix-js-sdk/package.json`)))'):/work/node_modules/matrix-js-sdk -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/:/tmp/ -it element-web-playwright", "coverage": "yarn test --coverage", "analyse:unused-exports": "ts-node ./scripts/analyse_unused_exports.ts", "analyse:webpack-bundles": "webpack-bundle-analyzer webpack-stats.json webapp", @@ -77,10 +77,8 @@ "@types/react-dom": "17.0.25", "@types/react": "17.0.83", "@types/seedrandom": "3.0.8", - "oidc-client-ts": "3.0.1", + "oidc-client-ts": "3.1.0", "jwt-decode": "4.0.0", - "@vector-im/compound-design-tokens": "1.8.0", - "@vector-im/compound-web": "7.0.0", "@floating-ui/react": "0.26.11", "@radix-ui/react-id": "1.1.0", "caniuse-lite": "1.0.30001668", @@ -98,7 +96,7 @@ "@sentry/browser": "^8.0.0", "@testing-library/react-hooks": "^8.0.1", "@vector-im/compound-design-tokens": "^1.8.0", - "@vector-im/compound-web": "^7.0.0", + "@vector-im/compound-web": "^7.1.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "@zxcvbn-ts/language-en": "^3.0.2", @@ -115,7 +113,7 @@ "emojibase-regex": "15.3.2", "escape-html": "^1.0.3", "file-saver": "^2.0.5", - "filesize": "10.1.4", + "filesize": "10.1.6", "github-markdown-css": "^5.5.1", "glob-to-regexp": "^0.4.1", "highlight.js": "^11.3.1", @@ -142,7 +140,7 @@ "png-chunks-extract": "^1.0.0", "posthog-js": "1.157.2", "qrcode": "1.5.4", - "re-resizable": "^6.9.0", + "re-resizable": "6.9.17", "react": "17.0.2", "react-beautiful-dnd": "^13.1.0", "react-blurhash": "^0.3.0", @@ -151,7 +149,7 @@ "react-transition-group": "^4.4.1", "rfc4648": "^1.4.0", "sanitize-filename": "^1.6.3", - "sanitize-html": "2.13.0", + "sanitize-html": "2.13.1", "tar-js": "^0.3.0", "temporal-polyfill": "^0.2.5", "ua-parser-js": "^1.0.2", @@ -186,6 +184,7 @@ "@playwright/test": "^1.40.1", "@principalstudio/html-webpack-inject-preload": "^1.2.7", "@sentry/webpack-plugin": "^2.7.1", + "@stylistic/eslint-plugin": "^2.9.0", "@svgr/webpack": "^8.0.0", "@testing-library/dom": "^9.0.0", "@testing-library/jest-dom": "^6.0.0", @@ -223,8 +222,8 @@ "@types/tar-js": "^0.3.5", "@types/ua-parser-js": "^0.7.36", "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", "axe-core": "4.10.0", "babel-jest": "^29.0.0", "babel-loader": "^9.0.0", @@ -246,7 +245,7 @@ "eslint-plugin-import": "^2.25.4", "eslint-plugin-jest": "^28.0.0", "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-matrix-org": "1.2.1", + "eslint-plugin-matrix-org": "^2.0.2", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-unicorn": "^56.0.0", diff --git a/playwright.config.ts b/playwright.config.ts index b0fd1ef99e4..1c1d380042d 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -26,6 +26,7 @@ export default defineConfig({ command: process.env.CI ? "npx serve -p 8080 -L ./webapp" : "yarn start", url: `${baseURL}/config.json`, reuseExistingServer: true, + timeout: (process.env.CI ? 30 : 120) * 1000, }, testDir: "playwright/e2e", outputDir: "playwright/test-results", diff --git a/playwright/e2e/audio-player/audio-player.spec.ts b/playwright/e2e/audio-player/audio-player.spec.ts index a8f483a3758..c2081dfcd80 100644 --- a/playwright/e2e/audio-player/audio-player.spec.ts +++ b/playwright/e2e/audio-player/audio-player.spec.ts @@ -242,6 +242,7 @@ test.describe("Audio player", () => { // Find and click "Reply" button const clickButtonReply = async () => { + await tile.scrollIntoViewIfNeeded(); await tile.hover(); await tile.getByRole("button", { name: "Reply", exact: true }).click(); }; diff --git a/playwright/e2e/composer/RTE.spec.ts b/playwright/e2e/composer/RTE.spec.ts index d76a3373164..91a56afb8ad 100644 --- a/playwright/e2e/composer/RTE.spec.ts +++ b/playwright/e2e/composer/RTE.spec.ts @@ -96,8 +96,7 @@ test.describe("Composer", () => { }, }); - // https://github.com/vector-im/element-web/issues/26037 - test.skip("autocomplete behaviour tests", async ({ page, app, bot: bob }) => { + test("autocomplete behaviour tests", async ({ page, app, bot: bob }) => { // Set up a private room so we have another user to mention await app.client.createRoom({ is_direct: true, @@ -138,10 +137,10 @@ test.describe("Composer", () => { .pressSequentially(`initial text @${bob.credentials.displayName.slice(0, 1)} abc`); await expect(page.getByTestId("autocomplete-wrapper")).toBeEmpty(); // Move the cursor left by 4 to put it to: `@B| abc`, check autocomplete displays - await page.getByRole("textbox").press("LeftArrow"); - await page.getByRole("textbox").press("LeftArrow"); - await page.getByRole("textbox").press("LeftArrow"); - await page.getByRole("textbox").press("LeftArrow"); + await page.getByRole("textbox").press("ArrowLeft"); + await page.getByRole("textbox").press("ArrowLeft"); + await page.getByRole("textbox").press("ArrowLeft"); + await page.getByRole("textbox").press("ArrowLeft"); await expect(page.getByTestId("autocomplete-wrapper")).not.toBeEmpty(); // Selecting the autocomplete option using Enter inserts it into the composer diff --git a/playwright/e2e/editing/editing.spec.ts b/playwright/e2e/editing/editing.spec.ts index 2cc47f8edf0..206d91982e0 100644 --- a/playwright/e2e/editing/editing.spec.ts +++ b/playwright/e2e/editing/editing.spec.ts @@ -263,7 +263,6 @@ test.describe("Editing", () => { checkA11y, }) => { axe.disableRules("color-contrast"); // XXX: We have some known contrast issues here - axe.exclude(".mx_Tooltip_visible"); // XXX: this is fine but would be good to fix await page.goto(`#/room/${room.roomId}`); diff --git a/playwright/e2e/read-receipts/index.ts b/playwright/e2e/read-receipts/index.ts index 747717908b4..49a0195fd72 100644 --- a/playwright/e2e/read-receipts/index.ts +++ b/playwright/e2e/read-receipts/index.ts @@ -69,7 +69,7 @@ export class MessageBuilder { /** * Map of message content -> event. */ - messages = new Map>>(); + messages = new Map>>(); /** * Utility to find a MatrixEvent by its body content diff --git a/playwright/e2e/register/register.spec.ts b/playwright/e2e/register/register.spec.ts index 8ea64f8a657..2dd3779573d 100644 --- a/playwright/e2e/register/register.spec.ts +++ b/playwright/e2e/register/register.spec.ts @@ -96,7 +96,7 @@ test.describe("Registration", () => { }); }); await page.getByRole("textbox", { name: "Username", exact: true }).fill("_alice"); - await expect(page.getByRole("alert").filter({ hasText: "Some characters not allowed" })).toBeVisible(); + await expect(page.getByRole("tooltip").filter({ hasText: "Some characters not allowed" })).toBeVisible(); await page.route("**/_matrix/client/*/register/available?username=bob", async (route) => { await route.fulfill({ @@ -108,9 +108,9 @@ test.describe("Registration", () => { }); }); await page.getByRole("textbox", { name: "Username", exact: true }).fill("bob"); - await expect(page.getByRole("alert").filter({ hasText: "Someone already has that username" })).toBeVisible(); + await expect(page.getByRole("tooltip").filter({ hasText: "Someone already has that username" })).toBeVisible(); await page.getByRole("textbox", { name: "Username", exact: true }).fill("foobar"); - await expect(page.getByRole("alert")).not.toBeVisible(); + await expect(page.getByRole("tooltip")).not.toBeVisible(); }); }); diff --git a/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts b/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts index 4c8f3b3c09b..4f3b75b5baa 100644 --- a/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts +++ b/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts @@ -74,7 +74,7 @@ test.describe("Appearance user settings tab", () => { await expect(util.getThemePanel()).toMatchScreenshot("theme-panel-custom-theme-added.png"); await util.removeCustomTheme(); - await expect(util.getThemePanel()).toMatchScreenshot("theme-panel-custom-theme.png"); + await expect(util.getThemePanel()).toMatchScreenshot("theme-panel-custom-theme-removed.png"); }); }); }); diff --git a/playwright/e2e/spaces/threads-activity-centre/index.ts b/playwright/e2e/spaces/threads-activity-centre/index.ts index bf05fc34c18..f6ac7f95d69 100644 --- a/playwright/e2e/spaces/threads-activity-centre/index.ts +++ b/playwright/e2e/spaces/threads-activity-centre/index.ts @@ -70,7 +70,7 @@ export class MessageBuilder { /** * Map of message content -> event. */ - messages = new Map>>(); + messages = new Map>>(); /** * Utility to find a MatrixEvent by its body content diff --git a/playwright/e2e/spotlight/spotlight.spec.ts b/playwright/e2e/spotlight/spotlight.spec.ts index 4a6b5611d0c..22513ca47a7 100644 --- a/playwright/e2e/spotlight/spotlight.spec.ts +++ b/playwright/e2e/spotlight/spotlight.spec.ts @@ -216,7 +216,7 @@ test.describe("Spotlight", () => { * * https://github.com/matrix-org/synapse/issues/16472 */ - test.skip("should find unknown people", async ({ page, app }) => { + test("should find unknown people", async ({ page, app }) => { const spotlight = await app.openSpotlight(); await page.waitForTimeout(500); // wait for the dialog to settle await spotlight.filter(Filter.People); diff --git a/playwright/e2e/timeline/timeline.spec.ts b/playwright/e2e/timeline/timeline.spec.ts index 1abf229e2e2..e8ef0e577c2 100644 --- a/playwright/e2e/timeline/timeline.spec.ts +++ b/playwright/e2e/timeline/timeline.spec.ts @@ -653,7 +653,7 @@ test.describe("Timeline", () => { const toggleEventButton = viewSourceEventExpanded.getByRole("button", { name: "toggle event" }); // Check size and position of toggle on expanded view source event // See: _ViewSourceEvent.pcss - await expect(toggleEventButton).toHaveCSS("height", "12px"); // --ViewSourceEvent_toggle-size + await expect(toggleEventButton).toHaveCSS("height", "16px"); // --ViewSourceEvent_toggle-size await expect(toggleEventButton).toHaveCSS("align-self", "flex-end"); // Click again to collapse the source await toggleEventButton.click({ position: { x: 0, y: 0 } }); @@ -679,7 +679,7 @@ test.describe("Timeline", () => { ); // Click view source event toggle - await viewSourceEventIrc.getByRole("button", { name: "toggle event" }).click({ position: { x: 0, y: 0 } }); + await viewSourceEventIrc.getByRole("button", { name: "toggle event" }).click({ position: { x: 8, y: 8 } }); // Make sure the expand toggle worked await expect(page.locator(".mx_EventTile[data-layout=irc] .mx_ViewSourceEvent_expanded")).toBeVisible(); diff --git a/playwright/element-web-test.ts b/playwright/element-web-test.ts index 2973f88cdab..66dd6663892 100644 --- a/playwright/element-web-test.ts +++ b/playwright/element-web-test.ts @@ -345,8 +345,7 @@ export const expect = baseExpect.extend({ if (!options?.showTooltips) { css += ` - [role="tooltip"], - .mx_Tooltip_visible { + [role="tooltip"] { visibility: hidden !important; } `; diff --git a/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png b/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png index 1c88bb4c1fe..0ec66fa4ef1 100644 Binary files a/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png and b/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png differ diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png b/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png index c195186db84..2f9c3841ac3 100644 Binary files a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png and b/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png differ diff --git a/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png b/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png index afe3331d2e3..7e1195c82d6 100644 Binary files a/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png and b/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png differ diff --git a/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png b/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png index 9a38579e217..bbc29d4be3c 100644 Binary files a/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png and b/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png differ diff --git a/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png b/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png index f5bc02ef1ef..120b80320b2 100644 Binary files a/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png and b/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png index 76a9308b35d..bceaa4a283d 100644 Binary files a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png and b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png new file mode 100644 index 00000000000..cdafb6e9ee8 Binary files /dev/null and b/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png differ diff --git a/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png b/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png index 46528336287..e7f09c67fb4 100644 Binary files a/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png and b/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png index 4745d81d22c..6e8ffeee8ef 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png index 273be0a2697..d69fca47384 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png index 594ac521e0e..5701a63fcfa 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png index 1c83d343d0a..c2e8afbd7b6 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png index 4745d81d22c..6e8ffeee8ef 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png index c69649ed0e8..1defab72080 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png index 78ecc64c712..2015220013f 100644 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png and b/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png differ diff --git a/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png b/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png index 20618f5d66e..203991bc325 100644 Binary files a/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png and b/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png differ diff --git a/res/css/_components.pcss b/res/css/_components.pcss index 42cd010e08f..c0dd2ee0b02 100644 --- a/res/css/_components.pcss +++ b/res/css/_components.pcss @@ -217,7 +217,6 @@ @import "./views/elements/_TagComposer.pcss"; @import "./views/elements/_TextWithTooltip.pcss"; @import "./views/elements/_ToggleSwitch.pcss"; -@import "./views/elements/_Tooltip.pcss"; @import "./views/elements/_UseCaseSelection.pcss"; @import "./views/elements/_UseCaseSelectionButton.pcss"; @import "./views/elements/_Validation.pcss"; diff --git a/res/css/components/views/location/_ZoomButtons.pcss b/res/css/components/views/location/_ZoomButtons.pcss index e44c9294324..4e9d3b124b1 100644 --- a/res/css/components/views/location/_ZoomButtons.pcss +++ b/res/css/components/views/location/_ZoomButtons.pcss @@ -27,7 +27,7 @@ Please see LICENSE files in the repository root for full details. box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.25); .mx_ZoomButtons_icon { - $ZoomButtons_icon-size: 10px; + $ZoomButtons_icon-size: 12px; height: $ZoomButtons_icon-size; width: $ZoomButtons_icon-size; diff --git a/res/css/structures/_GenericDropdownMenu.pcss b/res/css/structures/_GenericDropdownMenu.pcss index 7f7342416fe..d58c29f81a8 100644 --- a/res/css/structures/_GenericDropdownMenu.pcss +++ b/res/css/structures/_GenericDropdownMenu.pcss @@ -99,11 +99,11 @@ Please see LICENSE files in the repository root for full details. &[aria-checked="true"]::before { content: ""; - width: 12px; - height: 12px; - margin-left: -20px; - margin-right: 8px; - mask-image: url("$(res)/img/feather-customised/check.svg"); + width: 16px; + height: 16px; + margin-left: -22px; + margin-right: 6px; + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); mask-size: 100%; mask-repeat: no-repeat; background-color: $primary-content; diff --git a/res/css/structures/_RoomStatusBar.pcss b/res/css/structures/_RoomStatusBar.pcss index 2e5af46389c..b131009868b 100644 --- a/res/css/structures/_RoomStatusBar.pcss +++ b/res/css/structures/_RoomStatusBar.pcss @@ -118,7 +118,7 @@ Please see LICENSE files in the repository root for full details. } &.mx_RoomStatusBar_unsentCancelAllBtn::before { - mask-image: url("$(res)/img/element-icons/trashcan.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/delete.svg"); } &.mx_RoomStatusBar_unsentRetry { diff --git a/res/css/structures/_SpacePanel.pcss b/res/css/structures/_SpacePanel.pcss index f3bd82cc96d..7875e629733 100644 --- a/res/css/structures/_SpacePanel.pcss +++ b/res/css/structures/_SpacePanel.pcss @@ -229,7 +229,7 @@ Please see LICENSE files in the repository root for full details. &.mx_SpaceButton_new .mx_SpaceButton_icon { &::before { background-color: $primary-content; - mask-image: url("$(res)/img/element-icons/plus.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/plus.svg"); transition: all 0.2s ease-in-out; /* TODO transition */ } } @@ -434,7 +434,7 @@ Please see LICENSE files in the repository root for full details. } .mx_SpacePanel_iconPlus::before { - mask-image: url("$(res)/img/element-icons/plus.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/plus.svg"); } .mx_SpacePanel_iconExplore::before { diff --git a/res/css/views/auth/_PassphraseField.pcss b/res/css/views/auth/_PassphraseField.pcss index 6020fb2b33d..293a81cbe2a 100644 --- a/res/css/views/auth/_PassphraseField.pcss +++ b/res/css/views/auth/_PassphraseField.pcss @@ -16,7 +16,8 @@ progress.mx_PassphraseField_progress { border: 0; height: 4px; position: absolute; - top: -12px; + top: -10px; + left: 0; @mixin ProgressBarBorderRadius "2px"; @mixin ProgressBarColour $PassphraseStrengthLow; diff --git a/res/css/views/context_menus/_MessageContextMenu.pcss b/res/css/views/context_menus/_MessageContextMenu.pcss index 268280f08da..20d7ed1d13b 100644 --- a/res/css/views/context_menus/_MessageContextMenu.pcss +++ b/res/css/views/context_menus/_MessageContextMenu.pcss @@ -25,7 +25,7 @@ Please see LICENSE files in the repository root for full details. } .mx_MessageContextMenu_iconCollapse::before { - mask-image: url("$(res)/img/element-icons/message/chevron-up.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/chevron-up.svg"); } .mx_MessageContextMenu_iconReport::before { @@ -57,7 +57,7 @@ Please see LICENSE files in the repository root for full details. } .mx_MessageContextMenu_iconRedact::before { - mask-image: url("$(res)/img/element-icons/trashcan.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/delete.svg"); } .mx_MessageContextMenu_iconResend::before { @@ -92,7 +92,7 @@ Please see LICENSE files in the repository root for full details. } .mx_MessageContextMenu_iconReply::before { - mask-image: url("$(res)/img/element-icons/room/message-bar/reply.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/reply.svg"); } .mx_MessageContextMenu_iconReplyInThread::before { diff --git a/res/css/views/dialogs/_InviteDialog.pcss b/res/css/views/dialogs/_InviteDialog.pcss index 7a3ca6bd3c4..753e4155cf6 100644 --- a/res/css/views/dialogs/_InviteDialog.pcss +++ b/res/css/views/dialogs/_InviteDialog.pcss @@ -351,7 +351,7 @@ Please see LICENSE files in the repository root for full details. height: 24px; grid-column: 1; grid-row: 1; - mask-image: url("$(res)/img/feather-customised/check.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); mask-size: 100%; mask-repeat: no-repeat; position: absolute; diff --git a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss index 372b41042ba..0b42281e3ef 100644 --- a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss +++ b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss @@ -80,7 +80,7 @@ Please see LICENSE files in the repository root for full details. color: $accent; &::before { - mask-image: url("$(res)/img/feather-customised/check.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); background-color: $accent; } } diff --git a/res/css/views/elements/_AccessibleButton.pcss b/res/css/views/elements/_AccessibleButton.pcss index 3101520bd4c..27219d06b56 100644 --- a/res/css/views/elements/_AccessibleButton.pcss +++ b/res/css/views/elements/_AccessibleButton.pcss @@ -64,7 +64,7 @@ Please see LICENSE files in the repository root for full details. background-color: var(--cpd-color-bg-action-primary-rest); &::before { - mask-image: url("$(res)/img/feather-customised/check.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); } } diff --git a/res/css/views/elements/_Field.pcss b/res/css/views/elements/_Field.pcss index 92f8e41f0aa..2659c4d3899 100644 --- a/res/css/views/elements/_Field.pcss +++ b/res/css/views/elements/_Field.pcss @@ -164,14 +164,6 @@ Please see LICENSE files in the repository root for full details. } } -.mx_Field_tooltip { - width: 200px; -} - -.mx_Field_tooltip.mx_Field_valid { - animation: mx_fadeout 1s 2s forwards; -} - /* Customise other components when placed inside a Field */ .mx_Field .mx_Dropdown_input { diff --git a/res/css/views/elements/_ImageView.pcss b/res/css/views/elements/_ImageView.pcss index 2d48dea9941..03041fe255e 100644 --- a/res/css/views/elements/_ImageView.pcss +++ b/res/css/views/elements/_ImageView.pcss @@ -129,7 +129,8 @@ $button-gap: 24px; } .mx_ImageView_button_more::before { - mask-image: url("$(res)/img/image-view/more.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/overflow-horizontal.svg"); + mask-size: 28px; } .mx_ImageView_button_close { diff --git a/res/css/views/elements/_InviteReason.pcss b/res/css/views/elements/_InviteReason.pcss index 3060e8a16ea..c57c59ae1f8 100644 --- a/res/css/views/elements/_InviteReason.pcss +++ b/res/css/views/elements/_InviteReason.pcss @@ -27,7 +27,7 @@ Please see LICENSE files in the repository root for full details. content: ""; margin-right: 8px; background-color: $secondary-content; - mask-image: url("$(res)/img/feather-customised/eye.svg"); + mask-image: url("$(res)/img/element-icons/eye.svg"); display: inline-block; width: 18px; height: 14px; diff --git a/res/css/views/elements/_MiniAvatarUploader.pcss b/res/css/views/elements/_MiniAvatarUploader.pcss index 9b1845b122c..bcb47e28ec1 100644 --- a/res/css/views/elements/_MiniAvatarUploader.pcss +++ b/res/css/views/elements/_MiniAvatarUploader.pcss @@ -10,18 +10,6 @@ Please see LICENSE files in the repository root for full details. position: relative; width: min-content; - /* this isn't a floating tooltip so override some things to not need to bother with z-index and floating */ - .mx_Tooltip { - display: inline-block; - position: absolute; - z-index: unset; - width: max-content; - left: 72px; - /* top edge starting at 50 % of parent - 50 % of itself -> centered vertically */ - top: 50%; - transform: translateY(-50%); - } - .mx_MiniAvatarUploader_indicator { position: absolute; diff --git a/res/css/views/elements/_StyledCheckbox.pcss b/res/css/views/elements/_StyledCheckbox.pcss index 1ea3c4d3f3d..986889c6dc1 100644 --- a/res/css/views/elements/_StyledCheckbox.pcss +++ b/res/css/views/elements/_StyledCheckbox.pcss @@ -43,7 +43,7 @@ Please see LICENSE files in the repository root for full details. height: 100%; width: 100%; - mask-image: url("$(res)/img/feather-customised/check.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); mask-position: center; mask-size: 100%; mask-repeat: no-repeat; diff --git a/res/css/views/elements/_Tooltip.pcss b/res/css/views/elements/_Tooltip.pcss deleted file mode 100644 index 30308ed2342..00000000000 --- a/res/css/views/elements/_Tooltip.pcss +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2019-2024 New Vector Ltd. -Copyright 2015, 2016 OpenMarket Ltd - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only -Please see LICENSE files in the repository root for full details. -*/ - -@keyframes mx_fadein { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@keyframes mx_fadeout { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -.mx_Tooltip_chevron { - position: absolute; - left: -7px; - top: calc(50% - 6px); - width: 0; - height: 0; - border-top: 7px solid transparent; - border-right: 7px solid $menu-border-color; - border-bottom: 7px solid transparent; -} - -.mx_Tooltip_chevron::after { - content: ""; - width: 0; - height: 0; - border-top: 6px solid transparent; - border-right: 6px solid $menu-bg-color; - border-bottom: 6px solid transparent; - position: absolute; - top: -6px; - left: 1px; -} - -.mx_Tooltip { - display: none; - position: fixed; - border-radius: 8px; - z-index: 6000; /* Higher than context menu so tooltips can be used everywhere */ - padding: 10px; - pointer-events: none; - line-height: $font-14px; - font-size: $font-12px; - font-weight: 500; - max-width: 300px; - word-break: break-word; - - background-color: var(--cpd-color-alpha-gray-1400); - color: var(--cpd-color-text-on-solid-primary); - border: 0; - text-align: center; - - .mx_Tooltip_chevron { - display: none; - } - - &.mx_Tooltip_visible { - animation: mx_fadein 0.2s forwards; - } - - &.mx_Tooltip_invisible { - animation: mx_fadeout 0.1s forwards; - } - - ul, - ol { - text-align: start; /* for list items */ - } -} - -/* These tooltips use an older style with a chevron */ -.mx_Field_tooltip { - background-color: $menu-bg-color; - color: $primary-content; - border: 1px solid $menu-border-color; - text-align: unset; - - .mx_Tooltip_chevron { - display: unset; - } -} - -.mx_Tooltip_title { - font-weight: var(--cpd-font-weight-semibold); -} - -.mx_Tooltip_sub { - opacity: 0.7; - margin-top: 4px; -} diff --git a/res/css/views/elements/_Validation.pcss b/res/css/views/elements/_Validation.pcss index 24953216df3..5bf8dfb7944 100644 --- a/res/css/views/elements/_Validation.pcss +++ b/res/css/views/elements/_Validation.pcss @@ -7,6 +7,7 @@ Please see LICENSE files in the repository root for full details. .mx_Validation { position: relative; + max-width: 200px; } .mx_Validation_details { @@ -44,7 +45,7 @@ Please see LICENSE files in the repository root for full details. color: $accent; &::before { - mask-image: url("$(res)/img/feather-customised/check.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); background-color: $accent; } } diff --git a/res/css/views/messages/_MImageBody.pcss b/res/css/views/messages/_MImageBody.pcss index bb6ca1b7823..6a6f31948a7 100644 --- a/res/css/views/messages/_MImageBody.pcss +++ b/res/css/views/messages/_MImageBody.pcss @@ -100,7 +100,7 @@ Please see LICENSE files in the repository root for full details. margin-right: 8px; background-color: $accent; - mask-image: url("$(res)/img/feather-customised/eye.svg"); + mask-image: url("$(res)/img/element-icons/eye.svg"); display: inline-block; width: 18px; height: 14px; diff --git a/res/css/views/messages/_MessageActionBar.pcss b/res/css/views/messages/_MessageActionBar.pcss index b8333defdf4..4fe68f08d07 100644 --- a/res/css/views/messages/_MessageActionBar.pcss +++ b/res/css/views/messages/_MessageActionBar.pcss @@ -122,4 +122,8 @@ Please see LICENSE files in the repository root for full details. --MessageActionBar-icon-size: 12px; } } + + .mx_MessageActionBar_optionsButton { + --MessageActionBar-icon-size: 22px; + } } diff --git a/res/css/views/messages/_RedactedBody.pcss b/res/css/views/messages/_RedactedBody.pcss index 65027ffb975..7939cc6d098 100644 --- a/res/css/views/messages/_RedactedBody.pcss +++ b/res/css/views/messages/_RedactedBody.pcss @@ -18,7 +18,7 @@ Please see LICENSE files in the repository root for full details. height: 14px; width: 14px; background-color: $icon-button-color; - mask-image: url("$(res)/img/feather-customised/trash.custom.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/delete.svg"); mask-repeat: no-repeat; mask-position: center; mask-size: contain; diff --git a/res/css/views/messages/_ViewSourceEvent.pcss b/res/css/views/messages/_ViewSourceEvent.pcss index b8b240816fa..6b497719d93 100644 --- a/res/css/views/messages/_ViewSourceEvent.pcss +++ b/res/css/views/messages/_ViewSourceEvent.pcss @@ -25,19 +25,18 @@ Please see LICENSE files in the repository root for full details. } .mx_ViewSourceEvent_toggle { - --ViewSourceEvent_toggle-size: 12px; + --ViewSourceEvent_toggle-size: 16px; visibility: hidden; - /* override styles from AccessibleButton */ - border-radius: 0; /* icon */ - mask-repeat: no-repeat; - mask-position: 0 center; - mask-size: auto var(--ViewSourceEvent_toggle-size); width: var(--ViewSourceEvent_toggle-size); min-width: var(--ViewSourceEvent_toggle-size); - background-color: $accent; - mask-image: url("$(res)/img/element-icons/maximise-expand.svg"); + + svg { + color: $accent; + width: var(--ViewSourceEvent_toggle-size); + height: var(--ViewSourceEvent_toggle-size); + } .mx_EventTile:hover & { visibility: visible; @@ -47,8 +46,5 @@ Please see LICENSE files in the repository root for full details. &.mx_ViewSourceEvent_expanded .mx_ViewSourceEvent_toggle { align-self: flex-end; height: var(--ViewSourceEvent_toggle-size); - mask-position: 0 bottom; - margin-bottom: 5px; - mask-image: url("$(res)/img/element-icons/minimise-collapse.svg"); } } diff --git a/res/css/views/right_panel/_BaseCard.pcss b/res/css/views/right_panel/_BaseCard.pcss index 2adf71e25b2..d09a280dfab 100644 --- a/res/css/views/right_panel/_BaseCard.pcss +++ b/res/css/views/right_panel/_BaseCard.pcss @@ -73,7 +73,7 @@ Please see LICENSE files in the repository root for full details. width: 100%; mask-repeat: no-repeat; mask-position: center; - mask-image: url("$(res)/img/element-icons/message/overflow-large.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/overflow-horizontal.svg"); background-color: $secondary-content; } diff --git a/res/css/views/right_panel/_ThreadPanel.pcss b/res/css/views/right_panel/_ThreadPanel.pcss index c350a450ade..a9743d945b6 100644 --- a/res/css/views/right_panel/_ThreadPanel.pcss +++ b/res/css/views/right_panel/_ThreadPanel.pcss @@ -191,7 +191,7 @@ Please see LICENSE files in the repository root for full details. width: 12px; height: 12px; margin-right: 8px; - mask-image: url("$(res)/img/feather-customised/check.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/check.svg"); mask-size: 100%; mask-repeat: no-repeat; background-color: $primary-content; diff --git a/res/css/views/rooms/_EventTile.pcss b/res/css/views/rooms/_EventTile.pcss index 92e4cf78eaf..311e0591667 100644 --- a/res/css/views/rooms/_EventTile.pcss +++ b/res/css/views/rooms/_EventTile.pcss @@ -982,11 +982,11 @@ $left-gutter: 64px; } .mx_EventTile_collapseButton { - mask-image: url("$(res)/img/element-icons/minimise-collapse.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/collapse.svg"); } .mx_EventTile_expandButton { - mask-image: url("$(res)/img/element-icons/maximise-expand.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/expand.svg"); } .mx_EventTile_tileError { diff --git a/res/css/views/rooms/_JumpToBottomButton.pcss b/res/css/views/rooms/_JumpToBottomButton.pcss index 7ca4efe5d0c..89aac3c58b5 100644 --- a/res/css/views/rooms/_JumpToBottomButton.pcss +++ b/res/css/views/rooms/_JumpToBottomButton.pcss @@ -53,9 +53,9 @@ Please see LICENSE files in the repository root for full details. content: ""; position: absolute; inset: 0; - mask-image: url("$(res)/img/element-icons/message/chevron-up.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/chevron-up.svg"); mask-repeat: no-repeat; - mask-size: 20px; + mask-size: 24px; mask-position: center 6px; transform: rotate(180deg); background: var(--cpd-color-icon-tertiary); diff --git a/res/css/views/rooms/_MessageComposer.pcss b/res/css/views/rooms/_MessageComposer.pcss index 5e3e8b03035..d176a0d6272 100644 --- a/res/css/views/rooms/_MessageComposer.pcss +++ b/res/css/views/rooms/_MessageComposer.pcss @@ -277,7 +277,8 @@ Please see LICENSE files in the repository root for full details. } .mx_MessageComposer_buttonMenu::before { - mask-image: url("$(res)/img/image-view/more.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/overflow-horizontal.svg"); + mask-size: 24px; } .mx_MessageComposer_sendMessage { diff --git a/res/css/views/rooms/_RoomListHeader.pcss b/res/css/views/rooms/_RoomListHeader.pcss index e474cacfcd6..07aa1cbf5be 100644 --- a/res/css/views/rooms/_RoomListHeader.pcss +++ b/res/css/views/rooms/_RoomListHeader.pcss @@ -75,7 +75,7 @@ Please see LICENSE files in the repository root for full details. mask-size: contain; mask-repeat: no-repeat; background-color: $secondary-content; - mask-image: url("$(res)/img/element-icons/roomlist/plus.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/plus.svg"); } &:hover { @@ -104,5 +104,5 @@ Please see LICENSE files in the repository root for full details. mask-image: url("$(res)/img/element-icons/roomlist/hash-search.svg"); } .mx_RoomListHeader_iconPlus::before { - mask-image: url("$(res)/img/element-icons/plus.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/plus.svg"); } diff --git a/res/css/views/rooms/_RoomSublist.pcss b/res/css/views/rooms/_RoomSublist.pcss index 2e90c68f876..d4d6f05719a 100644 --- a/res/css/views/rooms/_RoomSublist.pcss +++ b/res/css/views/rooms/_RoomSublist.pcss @@ -127,7 +127,7 @@ Please see LICENSE files in the repository root for full details. } .mx_RoomSublist_auxButton::before { - mask-image: url("$(res)/img/element-icons/roomlist/plus.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/plus.svg"); } .mx_RoomSublist_menuButton::before { diff --git a/res/css/views/rooms/_TopUnreadMessagesBar.pcss b/res/css/views/rooms/_TopUnreadMessagesBar.pcss index 95164105d33..dafe192e763 100644 --- a/res/css/views/rooms/_TopUnreadMessagesBar.pcss +++ b/res/css/views/rooms/_TopUnreadMessagesBar.pcss @@ -41,9 +41,9 @@ Please see LICENSE files in the repository root for full details. position: absolute; width: 36px; height: 36px; - mask-image: url("$(res)/img/element-icons/message/chevron-up.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/chevron-up.svg"); mask-repeat: no-repeat; - mask-size: 20px; + mask-size: 24px; mask-position: center; background: var(--cpd-color-icon-tertiary); } diff --git a/res/css/views/rooms/_VoiceRecordComposerTile.pcss b/res/css/views/rooms/_VoiceRecordComposerTile.pcss index 92a06f93f01..9e51dbea6c2 100644 --- a/res/css/views/rooms/_VoiceRecordComposerTile.pcss +++ b/res/css/views/rooms/_VoiceRecordComposerTile.pcss @@ -35,7 +35,7 @@ Please see LICENSE files in the repository root for full details. background-color: $voice-record-icon-color; mask-repeat: no-repeat; mask-size: contain; - mask-image: url("$(res)/img/element-icons/trashcan.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/delete.svg"); } .mx_VoiceRecordComposerTile_uploadingState { diff --git a/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss b/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss index 94cc7d949b3..55052144cf0 100644 --- a/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss +++ b/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss @@ -35,6 +35,6 @@ Please see LICENSE files in the repository root for full details. top: 0; left: 0; background-color: $alert; - mask-image: url("$(res)/img/feather-customised/alert-triangle.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/warning.svg"); } } diff --git a/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss b/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss index d17e05bb05a..a96fe20ec26 100644 --- a/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss +++ b/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss @@ -67,9 +67,9 @@ Please see LICENSE files in the repository root for full details. bottom: 0; &::before { - width: 14px; - height: 14px; - mask-image: url("$(res)/img/element-icons/message/chevron-up.svg"); + width: 16px; + height: 16px; + mask-image: url("@vector-im/compound-design-tokens/icons/chevron-up.svg"); } &.mx_LegacyCallViewButtons_dropdownButton_collapsed::before { @@ -161,7 +161,7 @@ Please see LICENSE files in the repository root for full details. } &.mx_LegacyCallViewButtons_button_more::before { - mask-image: url("$(res)/img/voip/call-view/more.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/overflow-horizontal.svg"); } /* Stateless buttons */ diff --git a/res/img/compound/thread-16px.svg b/res/img/compound/thread-16px.svg deleted file mode 100644 index f1a678ebc9a..00000000000 --- a/res/img/compound/thread-16px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/compound/user.svg b/res/img/compound/user.svg deleted file mode 100644 index fa8bb87cd1f..00000000000 --- a/res/img/compound/user.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/res/img/element-icons/add-photo.svg b/res/img/element-icons/add-photo.svg deleted file mode 100644 index bde5253bea1..00000000000 --- a/res/img/element-icons/add-photo.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/img/element-icons/community-rooms.svg b/res/img/element-icons/community-rooms.svg deleted file mode 100644 index 570b45a488b..00000000000 --- a/res/img/element-icons/community-rooms.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/maximise-expand.svg b/res/img/element-icons/maximise-expand.svg deleted file mode 100644 index a63f7e0022a..00000000000 --- a/res/img/element-icons/maximise-expand.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/message/chevron-up.svg b/res/img/element-icons/message/chevron-up.svg deleted file mode 100644 index 4eb5ecc33e3..00000000000 --- a/res/img/element-icons/message/chevron-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/res/img/element-icons/message/overflow-large.svg b/res/img/element-icons/message/overflow-large.svg deleted file mode 100644 index 65a52e4aa23..00000000000 --- a/res/img/element-icons/message/overflow-large.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/img/element-icons/minimise-collapse.svg b/res/img/element-icons/minimise-collapse.svg deleted file mode 100644 index 535c56a36bb..00000000000 --- a/res/img/element-icons/minimise-collapse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/minus-button.svg b/res/img/element-icons/minus-button.svg deleted file mode 100644 index 6e7ea87c0b1..00000000000 --- a/res/img/element-icons/minus-button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/plus-button.svg b/res/img/element-icons/plus-button.svg deleted file mode 100644 index 9a14c85ee5e..00000000000 --- a/res/img/element-icons/plus-button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/plus.svg b/res/img/element-icons/plus.svg deleted file mode 100644 index ea1972237d1..00000000000 --- a/res/img/element-icons/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/roomlist/archived.svg b/res/img/element-icons/roomlist/archived.svg deleted file mode 100644 index 4d30195082c..00000000000 --- a/res/img/element-icons/roomlist/archived.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/roomlist/plus.svg b/res/img/element-icons/roomlist/plus.svg deleted file mode 100644 index f6d80ac7efd..00000000000 --- a/res/img/element-icons/roomlist/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/trashcan.svg b/res/img/element-icons/trashcan.svg deleted file mode 100644 index 4d0c4a6065c..00000000000 --- a/res/img/element-icons/trashcan.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/feather-customised/alert-triangle.svg b/res/img/feather-customised/alert-triangle.svg deleted file mode 100644 index ceb664790f4..00000000000 --- a/res/img/feather-customised/alert-triangle.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/img/feather-customised/check.svg b/res/img/feather-customised/check.svg deleted file mode 100644 index 85cd1965117..00000000000 --- a/res/img/feather-customised/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/feather-customised/eye.svg b/res/img/feather-customised/eye.svg deleted file mode 100644 index fd06bf7b212..00000000000 --- a/res/img/feather-customised/eye.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/res/img/feather-customised/plus.svg b/res/img/feather-customised/plus.svg deleted file mode 100644 index c747253139f..00000000000 --- a/res/img/feather-customised/plus.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/res/img/feather-customised/trash.custom.svg b/res/img/feather-customised/trash.custom.svg deleted file mode 100644 index dc1985ddb2b..00000000000 --- a/res/img/feather-customised/trash.custom.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/res/img/feather-customised/warning-triangle.svg b/res/img/feather-customised/warning-triangle.svg deleted file mode 100644 index 4d7bfe0798e..00000000000 --- a/res/img/feather-customised/warning-triangle.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - diff --git a/res/img/feather-customised/widget/external-link.svg b/res/img/feather-customised/widget/external-link.svg deleted file mode 100644 index e2df9883fa8..00000000000 --- a/res/img/feather-customised/widget/external-link.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/img/format/bold.svg b/res/img/format/bold.svg deleted file mode 100644 index 634d735031e..00000000000 --- a/res/img/format/bold.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/format/code.svg b/res/img/format/code.svg deleted file mode 100644 index 0a29bcd7bdc..00000000000 --- a/res/img/format/code.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/res/img/format/italics.svg b/res/img/format/italics.svg deleted file mode 100644 index 841afadffd8..00000000000 --- a/res/img/format/italics.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/format/quote.svg b/res/img/format/quote.svg deleted file mode 100644 index 82d34033148..00000000000 --- a/res/img/format/quote.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/img/format/strikethrough.svg b/res/img/format/strikethrough.svg deleted file mode 100644 index fc02b0aae21..00000000000 --- a/res/img/format/strikethrough.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/res/img/icon-address-delete.svg b/res/img/icon-address-delete.svg deleted file mode 100644 index 1289d5aafce..00000000000 --- a/res/img/icon-address-delete.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - 943783E9-DBD7-4D4E-BAC9-35437C17C2C4 - Created with sketchtool. - - - - - - - - - - diff --git a/res/img/icon-email-user.svg b/res/img/icon-email-user.svg deleted file mode 100644 index 2d41e06f980..00000000000 --- a/res/img/icon-email-user.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - 6F488856-F8EF-479C-9747-AB6E0945C7DE - Created with sketchtool. - - - - - - - - - - - - diff --git a/res/img/icon-invite-people.svg b/res/img/icon-invite-people.svg deleted file mode 100644 index 73500ebe063..00000000000 --- a/res/img/icon-invite-people.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/img/icon-return.svg b/res/img/icon-return.svg deleted file mode 100644 index 80da0f82aa8..00000000000 --- a/res/img/icon-return.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - B542A09B-DBBF-41D4-A5FD-D05EE1E6BBC4 - Created with sketchtool. - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/img/icon_context_delete.svg b/res/img/icon_context_delete.svg deleted file mode 100644 index 896b94ad136..00000000000 --- a/res/img/icon_context_delete.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/res/img/icons-create-room.svg b/res/img/icons-create-room.svg deleted file mode 100644 index 78c45563d1f..00000000000 --- a/res/img/icons-create-room.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/res/img/icons-room-add.svg b/res/img/icons-room-add.svg deleted file mode 100644 index f0b7584df9f..00000000000 --- a/res/img/icons-room-add.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/img/image-view/more.svg b/res/img/image-view/more.svg deleted file mode 100644 index 4f5fa6f9b93..00000000000 --- a/res/img/image-view/more.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/subtract.svg b/res/img/subtract.svg deleted file mode 100644 index 55e25831ef5..00000000000 --- a/res/img/subtract.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/voip/call-view/more.svg b/res/img/voip/call-view/more.svg deleted file mode 100644 index af15cf16304..00000000000 --- a/res/img/voip/call-view/more.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/@types/common.ts b/src/@types/common.ts index d0ab03221d3..1331ba92b5e 100644 --- a/src/@types/common.ts +++ b/src/@types/common.ts @@ -35,6 +35,7 @@ export type Defaultize = P extends any Partial>> : never; +/* eslint-disable @typescript-eslint/no-unsafe-function-type */ export type DeepReadonly = T extends (infer R)[] ? DeepReadonlyArray : T extends Function @@ -42,6 +43,7 @@ export type DeepReadonly = T extends (infer R)[] : T extends object ? DeepReadonlyObject : T; +/* eslint-enable @typescript-eslint/no-unsafe-function-type */ interface DeepReadonlyArray extends ReadonlyArray> {} diff --git a/src/AddThreepid.ts b/src/AddThreepid.ts index 7e53bd79a2d..34ba9d51ed7 100644 --- a/src/AddThreepid.ts +++ b/src/AddThreepid.ts @@ -201,7 +201,7 @@ export default class AddThreepid { // implemented it without, so this may just succeed and that's OK. return [true]; } catch (err) { - if (!(err instanceof MatrixError) || err.httpStatus !== 401 || !err.data || !err.data.flows) { + if (!(err instanceof MatrixError) || err.httpStatus !== 401 || !err.data?.flows) { // doesn't look like an interactive-auth failure throw err; } @@ -300,7 +300,7 @@ export default class AddThreepid { // implemented it without, so this may just succeed and that's OK. return [true]; } catch (err) { - if (!(err instanceof MatrixError) || err.httpStatus !== 401 || !err.data || !err.data.flows) { + if (!(err instanceof MatrixError) || err.httpStatus !== 401 || !err.data?.flows) { // doesn't look like an interactive-auth failure throw err; } diff --git a/src/Avatar.ts b/src/Avatar.ts index 5821647ea88..a78aa4d03b3 100644 --- a/src/Avatar.ts +++ b/src/Avatar.ts @@ -68,7 +68,7 @@ function isValidHexColor(color: string): boolean { return ( typeof color === "string" && (color.length === 7 || color.length === 9) && - color.charAt(0) === "#" && + color.startsWith("#") && !color .slice(1) .split("") diff --git a/src/BasePlatform.ts b/src/BasePlatform.ts index 20e9e7add30..8bbad339c79 100644 --- a/src/BasePlatform.ts +++ b/src/BasePlatform.ts @@ -129,7 +129,7 @@ export default abstract class BasePlatform { try { const [version, deferUntil] = JSON.parse(localStorage.getItem(UPDATE_DEFER_KEY)!); return newVersion !== version || Date.now() > deferUntil; - } catch (e) { + } catch { return true; } } @@ -380,7 +380,7 @@ export default abstract class BasePlatform { try { await idbSave("pickleKey", [userId, deviceId], data); - } catch (e) { + } catch { return null; } return encodeUnpaddedBase64(randomArray); diff --git a/src/ContentMessages.ts b/src/ContentMessages.ts index 07c5491f51d..c669fa4567f 100644 --- a/src/ContentMessages.ts +++ b/src/ContentMessages.ts @@ -337,7 +337,7 @@ export async function uploadFile( const abortController = controller ?? new AbortController(); // If the room is encrypted then encrypt the file before uploading it. - if (matrixClient.isRoomEncrypted(roomId)) { + if (await matrixClient.getCrypto()?.isEncryptionEnabledInRoom(roomId)) { // First read the file into memory. const data = await readFileAsArrayBuffer(file); if (abortController.signal.aborted) throw new UploadCanceledError(); @@ -396,11 +396,7 @@ export default class ContentMessages { } public getUploadLimit(): number | null { - if (this.mediaConfig !== null && this.mediaConfig["m.upload.size"] !== undefined) { - return this.mediaConfig["m.upload.size"]; - } else { - return null; - } + return this.mediaConfig?.["m.upload.size"] ?? null; } public async sendContentListToRoom( @@ -578,7 +574,7 @@ export default class ContentMessages { logger.error(e); content.msgtype = MsgType.File; } - } else if (file.type.indexOf("audio/") === 0) { + } else if (file.type.startsWith("audio/")) { content.msgtype = MsgType.Audio; try { const audioInfo = await infoForAudioFile(file); @@ -588,7 +584,7 @@ export default class ContentMessages { logger.error(e); content.msgtype = MsgType.File; } - } else if (file.type.indexOf("video/") === 0) { + } else if (file.type.startsWith("video/")) { content.msgtype = MsgType.Video; try { const videoInfo = await infoForVideoFile(matrixClient, roomId, file); @@ -648,11 +644,7 @@ export default class ContentMessages { } private isFileSizeAcceptable(file: File): boolean { - if ( - this.mediaConfig !== null && - this.mediaConfig["m.upload.size"] !== undefined && - file.size > this.mediaConfig["m.upload.size"] - ) { + if (this.mediaConfig?.["m.upload.size"] !== undefined && file.size > this.mediaConfig["m.upload.size"]) { return false; } return true; diff --git a/src/DraftCleaner.ts b/src/DraftCleaner.ts index eebc7b87d0a..48a3523f616 100644 --- a/src/DraftCleaner.ts +++ b/src/DraftCleaner.ts @@ -48,7 +48,7 @@ function shouldCleanupDrafts(): boolean { return true; } return Date.now() > parsedTimestamp + DRAFT_CLEANUP_PERIOD; - } catch (error) { + } catch { return true; } } diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index 8b0b73c6921..3146a9eb078 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -52,7 +52,7 @@ export const EMOJI_REGEX = (() => { // want the app to completely crash on older platforms. We use the // constructor here to avoid a syntax error on such platforms. return new RegExp("\\p{RGI_Emoji}(?!\\uFE0E)(?:(? { const BIGEMOJI_REGEX = (() => { try { return new RegExp(`^(${EMOJI_REGEX.source})+$`, "iv"); - } catch (_e) { + } catch { // Fall back, just like for EMOJI_REGEX return /(?!)/; } @@ -120,7 +120,7 @@ export function isUrlPermitted(inputUrl: string): boolean { try { // URL parser protocol includes the trailing colon return PERMITTED_URL_SCHEMES.includes(new URL(inputUrl).protocol.slice(0, -1)); - } catch (e) { + } catch { return false; } } diff --git a/src/IdentityAuthClient.tsx b/src/IdentityAuthClient.tsx index 3b78d9e5706..8963b6bcf25 100644 --- a/src/IdentityAuthClient.tsx +++ b/src/IdentityAuthClient.tsx @@ -170,7 +170,7 @@ export default class IdentityAuthClient { // XXX: The spec is `token`, but we used `access_token` for a Sydent release. const { access_token: accessToken, token } = await this.identityClient.registerWithIdentityServer(hsOpenIdToken); - const identityAccessToken = token ? token : accessToken; + const identityAccessToken = token || accessToken; if (check) await this.checkToken(identityAccessToken); return identityAccessToken; } diff --git a/src/LegacyCallHandler.tsx b/src/LegacyCallHandler.tsx index ae14b31aed1..a06480e9cd7 100644 --- a/src/LegacyCallHandler.tsx +++ b/src/LegacyCallHandler.tsx @@ -827,7 +827,7 @@ export default class LegacyCallHandler extends EventEmitter { try { this.addCallForRoom(roomId, call); - } catch (e) { + } catch { Modal.createDialog(ErrorDialog, { title: _t("voip|already_in_call"), description: _t("voip|already_in_call_person"), diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index 39d93dec119..89faa9e0e9a 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -661,7 +661,7 @@ export async function setLoggedIn(credentials: IMatrixClientCreds): Promise string | null> = { [MsgType.KeyVerificationRequest]: (event: MatrixEvent) => { - const name = (event.sender || {}).name; + const name = event.sender?.name; return _t("notifier|m.key.verification.request", { name }); }, [M_LOCATION.name]: (event: MatrixEvent) => { @@ -233,7 +233,7 @@ class NotifierClass extends TypedEventEmitter void, ): Promise { const inviter = new MultiInviter(client, roomId, progressCallback); - return inviter.invite(addresses, undefined).then((states) => Promise.resolve({ states, inviter })); + return { states: await inviter.invite(addresses), inviter }; } export function showStartChatInviteDialog(initialText = ""): void { @@ -104,7 +104,7 @@ export function inviteUsersToRoom( logger.error(err.stack); Modal.createDialog(ErrorDialog, { title: _t("invite|failed_title"), - description: err && err.message ? err.message : _t("invite|failed_generic"), + description: err?.message ?? _t("invite|failed_generic"), }); }); } diff --git a/src/RoomNotifs.ts b/src/RoomNotifs.ts index cc027c9682d..7c281d0d2d8 100644 --- a/src/RoomNotifs.ts +++ b/src/RoomNotifs.ts @@ -44,7 +44,7 @@ export function getRoomNotifsState(client: MatrixClient, roomId: string): RoomNo let roomRule: IPushRule | undefined; try { roomRule = client.getRoomPushRule("global", roomId); - } catch (err) { + } catch { // Possible that the client doesn't have pushRules yet. If so, it // hasn't started either, so indicate that this room is not notifying. return null; diff --git a/src/ScalarMessaging.ts b/src/ScalarMessaging.ts index d8092953f37..cac5b561a03 100644 --- a/src/ScalarMessaging.ts +++ b/src/ScalarMessaging.ts @@ -855,14 +855,14 @@ const onMessage = function (event: MessageEvent): void { try { if (!openManagerUrl) openManagerUrl = IntegrationManagers.sharedInstance().getPrimaryManager()?.uiUrl; configUrl = new URL(openManagerUrl!); - } catch (e) { + } catch { // No integrations UI URL, ignore silently. return; } let eventOriginUrl: URL; try { eventOriginUrl = new URL(event.origin); - } catch (e) { + } catch { return; } // TODO -- Scalar postMessage API should be namespaced with event.data.api field diff --git a/src/SdkConfig.ts b/src/SdkConfig.ts index abf9933e2bc..cbec03381ac 100644 --- a/src/SdkConfig.ts +++ b/src/SdkConfig.ts @@ -42,6 +42,7 @@ export const DEFAULTS: DeepReadonly = { // be preferred over their config. desktopBuilds: { available: true, + // eslint-disable-next-line @typescript-eslint/no-require-imports logo: require("../res/img/element-desktop-logo.svg").default, url: "https://element.io/get-started", }, diff --git a/src/SecurityManager.ts b/src/SecurityManager.ts index 2d103cf25e3..4717404222f 100644 --- a/src/SecurityManager.ts +++ b/src/SecurityManager.ts @@ -76,7 +76,7 @@ async function getSecretStorageKey({ keys: Record; }): Promise<[string, Uint8Array]> { const cli = MatrixClientPeg.safeGet(); - let keyId = await cli.getDefaultSecretStorageKeyId(); + let keyId = await cli.secretStorage.getDefaultKeyId(); let keyInfo!: SecretStorage.SecretStorageKeyDescription; if (keyId) { // use the default SSSS key if set diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index 02c2b338493..5fc4d8c3576 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -450,7 +450,7 @@ export const Commands = [ const matches = args.match(/^(\S+)$/); if (matches) { let roomAlias = matches[1]; - if (roomAlias[0] !== "#") return reject(this.getUsage()); + if (!roomAlias.startsWith("#")) return reject(this.getUsage()); if (!roomAlias.includes(":")) { roomAlias += ":" + cli.getDomain(); @@ -994,7 +994,7 @@ Commands.forEach((cmd) => { export function parseCommandString(input: string): { cmd?: string; args?: string } { // trim any trailing whitespace, as it can confuse the parser for IRC-style commands input = input.trimEnd(); - if (input[0] !== "/") return {}; // not a command + if (!input.startsWith("/")) return {}; // not a command const bits = input.match(/^(\S+?)(?:[ \n]+((.|\n)*))?$/); let cmd: string; diff --git a/src/SlidingSyncManager.ts b/src/SlidingSyncManager.ts index 578a1757490..e3ca77f9884 100644 --- a/src/SlidingSyncManager.ts +++ b/src/SlidingSyncManager.ts @@ -72,27 +72,23 @@ const DEFAULT_ROOM_SUBSCRIPTION_INFO = { }; // lazy load room members so rooms like Matrix HQ don't take forever to load const UNENCRYPTED_SUBSCRIPTION_NAME = "unencrypted"; -const UNENCRYPTED_SUBSCRIPTION = Object.assign( - { - required_state: [ - [MSC3575_WILDCARD, MSC3575_WILDCARD], // all events - [EventType.RoomMember, MSC3575_STATE_KEY_ME], // except for m.room.members, get our own membership - [EventType.RoomMember, MSC3575_STATE_KEY_LAZY], // ...and lazy load the rest. - ], - }, - DEFAULT_ROOM_SUBSCRIPTION_INFO, -); +const UNENCRYPTED_SUBSCRIPTION = { + required_state: [ + [MSC3575_WILDCARD, MSC3575_WILDCARD], // all events + [EventType.RoomMember, MSC3575_STATE_KEY_ME], // except for m.room.members, get our own membership + [EventType.RoomMember, MSC3575_STATE_KEY_LAZY], // ...and lazy load the rest. + ], + ...DEFAULT_ROOM_SUBSCRIPTION_INFO, +}; // we need all the room members in encrypted rooms because we need to know which users to encrypt // messages for. -const ENCRYPTED_SUBSCRIPTION = Object.assign( - { - required_state: [ - [MSC3575_WILDCARD, MSC3575_WILDCARD], // all events - ], - }, - DEFAULT_ROOM_SUBSCRIPTION_INFO, -); +const ENCRYPTED_SUBSCRIPTION = { + required_state: [ + [MSC3575_WILDCARD, MSC3575_WILDCARD], // all events + ], + ...DEFAULT_ROOM_SUBSCRIPTION_INFO, +}; export type PartialSlidingSyncRequest = { filters?: MSC3575Filter; @@ -199,10 +195,10 @@ export class SlidingSyncManager { [EventType.RoomMember, MSC3575_STATE_KEY_ME], // lets the client calculate that we are in fact in the room ], }, + ...updateArgs, }; - list = Object.assign(list, updateArgs); } else { - const updatedList = Object.assign({}, list, updateArgs); + const updatedList = { ...list, ...updateArgs }; // cannot use objectHasDiff as we need to do deep diff checking if (JSON.stringify(list) === JSON.stringify(updatedList)) { logger.debug("list matches, not sending, update => ", updateArgs); @@ -252,7 +248,7 @@ export class SlidingSyncManager { try { // wait until the next sync before returning as RoomView may need to know the current state await p; - } catch (err) { + } catch { logger.warn("SlidingSync setRoomVisible:", roomId, visible, "failed to confirm transaction"); } return roomId; @@ -305,7 +301,7 @@ export class SlidingSyncManager { } else { await this.slidingSync!.setListRanges(SlidingSyncManager.ListSearch, ranges); } - } catch (err) { + } catch { // do nothing, as we reject only when we get interrupted but that's fine as the next // request will include our data } finally { @@ -357,7 +353,7 @@ export class SlidingSyncManager { } const clientWellKnown = await AutoDiscovery.findClientConfig(clientDomain); proxyUrl = clientWellKnown?.["org.matrix.msc3575.proxy"]?.url; - } catch (e) { + } catch { // Either client.getDomain() is null so we've shorted out, or is invalid so `AutoDiscovery.findClientConfig` has thrown } diff --git a/src/Terms.ts b/src/Terms.ts index ee5ddfd8540..868e2428c67 100644 --- a/src/Terms.ts +++ b/src/Terms.ts @@ -102,13 +102,8 @@ export async function startTermsFlow( }); // fetch the set of agreed policy URLs from account data - const currentAcceptedTerms = await client.getAccountData("m.accepted_terms"); - let agreedUrlSet: Set; - if (!currentAcceptedTerms || !currentAcceptedTerms.getContent() || !currentAcceptedTerms.getContent().accepted) { - agreedUrlSet = new Set(); - } else { - agreedUrlSet = new Set(currentAcceptedTerms.getContent().accepted); - } + const currentAcceptedTerms = client.getAccountData("m.accepted_terms")?.getContent(); + const agreedUrlSet = new Set(currentAcceptedTerms?.accepted || []); // remove any policies the user has already agreed to and any services where // they've already agreed to all the policies diff --git a/src/UserActivity.ts b/src/UserActivity.ts index 61f3c93ca99..a1a090ca0e1 100644 --- a/src/UserActivity.ts +++ b/src/UserActivity.ts @@ -213,7 +213,7 @@ export default class UserActivity { attachedTimers.forEach((t) => t.start()); try { await timeout.finished(); - } catch (_e) { + } catch { /* aborted */ } attachedTimers.forEach((t) => t.abort()); diff --git a/src/actions/RoomListActions.ts b/src/actions/RoomListActions.ts index 1b693ba4dd6..578226986d7 100644 --- a/src/actions/RoomListActions.ts +++ b/src/actions/RoomListActions.ts @@ -79,7 +79,7 @@ export default class RoomListActions { logger.error("Failed to set DM tag " + err); Modal.createDialog(ErrorDialog, { title: _t("room_list|failed_set_dm_tag"), - description: err && err.message ? err.message : _t("invite|failed_generic"), + description: err?.message ?? _t("invite|failed_generic"), }); }); } @@ -95,7 +95,7 @@ export default class RoomListActions { logger.error("Failed to remove tag " + oldTag + " from room: " + err); Modal.createDialog(ErrorDialog, { title: _t("room_list|failed_remove_tag", { tagName: oldTag }), - description: err && err.message ? err.message : _t("invite|failed_generic"), + description: err?.message ?? _t("invite|failed_generic"), }); }); @@ -108,7 +108,7 @@ export default class RoomListActions { logger.error("Failed to add tag " + newTag + " to room: " + err); Modal.createDialog(ErrorDialog, { title: _t("room_list|failed_add_tag", { tagName: newTag }), - description: err && err.message ? err.message : _t("invite|failed_generic"), + description: err?.message ?? _t("invite|failed_generic"), }); throw err; diff --git a/src/async-components/views/dialogs/security/CreateKeyBackupDialog.tsx b/src/async-components/views/dialogs/security/CreateKeyBackupDialog.tsx index 3ec62c3df5a..9608abc4bcd 100644 --- a/src/async-components/views/dialogs/security/CreateKeyBackupDialog.tsx +++ b/src/async-components/views/dialogs/security/CreateKeyBackupDialog.tsx @@ -69,7 +69,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent => { - const keyCallback = (k: Uint8Array): void => {}; - const { finished } = Modal.createDialog( RestoreKeyBackupDialog, { showSummary: false, - keyCallback, }, undefined, /* priority = */ false, diff --git a/src/components/structures/ContextMenu.tsx b/src/components/structures/ContextMenu.tsx index d5893766105..2c7a864db5d 100644 --- a/src/components/structures/ContextMenu.tsx +++ b/src/components/structures/ContextMenu.tsx @@ -12,7 +12,6 @@ import React, { CSSProperties, RefObject, SyntheticEvent, useRef, useState } fro import ReactDOM from "react-dom"; import classNames from "classnames"; import FocusLock from "react-focus-lock"; -import { TooltipProvider } from "@vector-im/compound-web"; import { Writeable } from "../../@types/common"; import UIStore from "../../stores/UIStore"; @@ -611,35 +610,6 @@ export const useContextMenu = (inputRef?: RefObject return [button.current ? isOpen : false, button, open, close, setIsOpen]; }; -// XXX: Deprecated, used only for dynamic Tooltips. Avoid using at all costs. -export function createMenu( - ElementClass: typeof React.Component, - props: Record, -): { close: (...args: any[]) => void } { - const onFinished = function (...args: any[]): void { - ReactDOM.unmountComponentAtNode(getOrCreateContainer()); - props?.onFinished?.apply(null, args); - }; - - const menu = ( - - - - - - ); - - ReactDOM.render(menu, getOrCreateContainer()); - - return { close: onFinished }; -} - // re-export the semantic helper components for simplicity export { ContextMenuButton } from "../../accessibility/context_menu/ContextMenuButton"; export { ContextMenuTooltipButton } from "../../accessibility/context_menu/ContextMenuTooltipButton"; diff --git a/src/components/structures/FileDropTarget.tsx b/src/components/structures/FileDropTarget.tsx index b815d9aa622..5bc16e2ee42 100644 --- a/src/components/structures/FileDropTarget.tsx +++ b/src/components/structures/FileDropTarget.tsx @@ -9,6 +9,7 @@ Please see LICENSE files in the repository root for full details. import React, { useEffect, useState } from "react"; import { _t } from "../../languageHandler"; +import UploadBigSvg from "../../../res/img/upload-big.svg"; interface IProps { parent: HTMLElement | null; @@ -106,11 +107,7 @@ const FileDropTarget: React.FC = ({ parent, onFileDrop }) => { if (state.dragging) { return (
- + {_t("room|drop_file_prompt")}
); diff --git a/src/components/structures/HomePage.tsx b/src/components/structures/HomePage.tsx index 893a7d4d5bb..31deb381ddd 100644 --- a/src/components/structures/HomePage.tsx +++ b/src/components/structures/HomePage.tsx @@ -11,7 +11,7 @@ import { useContext, useState } from "react"; import AutoHideScrollbar from "./AutoHideScrollbar"; import { getHomePageUrl } from "../../utils/pages"; -import { _tDom } from "../../languageHandler"; +import { _t, _tDom } from "../../languageHandler"; import SdkConfig from "../../SdkConfig"; import dis from "../../dispatcher/dispatcher"; import { Action } from "../../dispatcher/actions"; @@ -66,8 +66,8 @@ const UserWelcomeTop: React.FC = () => {
cli.setAvatarUrl(url)} isUserAvatar onClick={(ev) => PosthogTrackers.trackInteraction("WebHomeMiniAvatarUploadButton", ev)} diff --git a/src/components/structures/LegacyCallEventGrouper.ts b/src/components/structures/LegacyCallEventGrouper.ts index d5c5a5a0feb..3eefbdbb871 100644 --- a/src/components/structures/LegacyCallEventGrouper.ts +++ b/src/components/structures/LegacyCallEventGrouper.ts @@ -161,9 +161,11 @@ export default class LegacyCallEventGrouper extends EventEmitter { public toggleSilenced = (): void => { const silenced = LegacyCallHandler.instance.isCallSilenced(this.callId); - silenced - ? LegacyCallHandler.instance.unSilenceCall(this.callId) - : LegacyCallHandler.instance.silenceCall(this.callId); + if (silenced) { + LegacyCallHandler.instance.unSilenceCall(this.callId); + } else { + LegacyCallHandler.instance.silenceCall(this.callId); + } }; private setCallListeners(): void { diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index f2dfc3d3163..d0edcccd4f8 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -982,7 +982,7 @@ export default class MatrixChat extends React.PureComponent { try { const config = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(params.hs_url); newState.serverConfig = config; - } catch (err) { + } catch { logger.warn("Failed to load hs_url param:", params.hs_url); } } else if (params.client_secret && params.session_id && params.hs_url && params.is_url && params.sid) { @@ -1317,7 +1317,7 @@ export default class MatrixChat extends React.PureComponent { const errCode = err.errcode || _td("error|unknown_error_code"); Modal.createDialog(ErrorDialog, { title: _t("error_dialog|forget_room_failed", { errCode }), - description: err && err.message ? err.message : _t("invite|failed_generic"), + description: err?.message ?? _t("invite|failed_generic"), }); }); } @@ -1709,9 +1709,10 @@ export default class MatrixChat extends React.PureComponent { } } - if (cli.getCrypto()) { + const crypto = cli.getCrypto(); + if (crypto) { const blacklistEnabled = SettingsStore.getValueAt(SettingLevel.DEVICE, "blacklistUnverifiedDevices"); - cli.setGlobalBlacklistUnverifiedDevices(blacklistEnabled); + crypto.globalBlacklistUnverifiedDevices = blacklistEnabled; // With cross-signing enabled, we send to unknown devices // without prompting. Any bad-device status the user should diff --git a/src/components/structures/RoomStatusBar.tsx b/src/components/structures/RoomStatusBar.tsx index a3f8ac51653..bd236f2286a 100644 --- a/src/components/structures/RoomStatusBar.tsx +++ b/src/components/structures/RoomStatusBar.tsx @@ -17,8 +17,8 @@ import { SyncState, SyncStateData, } from "matrix-js-sdk/src/matrix"; +import { WarningIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; -import { Icon as WarningIcon } from "../../../res/img/feather-customised/warning-triangle.svg"; import { _t, _td } from "../../languageHandler"; import Resend from "../../Resend"; import dis from "../../dispatcher/dispatcher"; diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index dc16d248af5..d12f66e9c7d 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -691,7 +691,7 @@ const ManageButtons: React.FC = ({ hierarchy, selected, set hierarchy.removeRelation(parentId, childId); } - } catch (e) { + } catch { setError(_t("space|failed_remove_rooms")); } setRemoving(false); @@ -724,7 +724,7 @@ const ManageButtons: React.FC = ({ hierarchy, selected, set // mutate the local state to save us having to refetch the world existingContent.suggested = content.suggested; } - } catch (e) { + } catch { setError("Failed to update some suggestions. Try again later"); } setSaving(false); diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index f4c9b639acb..b55709e8c28 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -973,7 +973,7 @@ class TimelinePanel extends React.Component { UserActivity.sharedInstance().timeWhileActiveRecently(this.readMarkerActivityTimer); try { await this.readMarkerActivityTimer.finished(); - } catch (e) { + } catch { continue; /* aborted */ } // outside of try/catch to not swallow errors @@ -988,7 +988,7 @@ class TimelinePanel extends React.Component { UserActivity.sharedInstance().timeWhileActiveNow(this.readReceiptActivityTimer); try { await this.readReceiptActivityTimer.finished(); - } catch (e) { + } catch { continue; /* aborted */ } // outside of try/catch to not swallow errors diff --git a/src/components/structures/UserMenu.tsx b/src/components/structures/UserMenu.tsx index 4bdb6e227be..971e07193bd 100644 --- a/src/components/structures/UserMenu.tsx +++ b/src/components/structures/UserMenu.tsx @@ -44,6 +44,7 @@ import { Icon as LiveIcon } from "../../../res/img/compound/live-8px.svg"; import { VoiceBroadcastRecording, VoiceBroadcastRecordingsStoreEvent } from "../../voice-broadcast"; import { SDKContext } from "../../contexts/SDKContext"; import { shouldShowFeedback } from "../../utils/Feedback"; +import DarkLightModeSvg from "../../../res/img/element-icons/roomlist/dark-light-mode.svg"; interface IProps { isPanelCollapsed: boolean; @@ -414,12 +415,7 @@ export default class UserMenu extends React.Component { : _t("user_menu|switch_theme_dark") } > - +
{topSection} diff --git a/src/components/structures/auth/ForgotPassword.tsx b/src/components/structures/auth/ForgotPassword.tsx index 0e5cfb0f389..e0a9318e9a2 100644 --- a/src/components/structures/auth/ForgotPassword.tsx +++ b/src/components/structures/auth/ForgotPassword.tsx @@ -274,7 +274,7 @@ export default class ForgotPassword extends React.Component { await this.reset.setNewPassword(this.state.password); this.setState({ phase: Phase.Done }); modal.close(); - } catch (e) { + } catch { // Email not confirmed, yet. Retry after a while. await sleep(emailCheckInterval); } diff --git a/src/components/structures/static-page-vars.ts b/src/components/structures/static-page-vars.ts index 8cd2fd4a215..aaabfafa6dd 100644 --- a/src/components/structures/static-page-vars.ts +++ b/src/components/structures/static-page-vars.ts @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. */ // We're importing via require specifically so the svg becomes a URI rather than a DOM element. -// eslint-disable-next-line @typescript-eslint/no-var-requires +// eslint-disable-next-line @typescript-eslint/no-require-imports const matrixSvg = require("../../../res/img/matrix.svg").default; /** diff --git a/src/components/views/auth/EmailField.tsx b/src/components/views/auth/EmailField.tsx index acd5597259b..1a72872b953 100644 --- a/src/components/views/auth/EmailField.tsx +++ b/src/components/views/auth/EmailField.tsx @@ -6,13 +6,12 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import React, { PureComponent, RefCallback, RefObject } from "react"; +import React, { ComponentProps, PureComponent, RefCallback, RefObject } from "react"; import Field, { IInputProps } from "../elements/Field"; import { _t, _td, TranslationKey } from "../../../languageHandler"; import withValidation, { IFieldState, IValidationResult } from "../elements/Validation"; import * as Email from "../../../email"; -import { Alignment } from "../elements/Tooltip"; interface IProps extends Omit { id?: string; @@ -23,7 +22,7 @@ interface IProps extends Omit { label: TranslationKey; labelRequired: TranslationKey; labelInvalid: TranslationKey; - tooltipAlignment?: Alignment; + tooltipAlignment?: ComponentProps["tooltipAlignment"]; // When present, completely overrides the default validation rules. validationRules?: (fieldState: IFieldState) => Promise; diff --git a/src/components/views/auth/PassphraseConfirmField.tsx b/src/components/views/auth/PassphraseConfirmField.tsx index ec26099dedf..2b27d3ecaf9 100644 --- a/src/components/views/auth/PassphraseConfirmField.tsx +++ b/src/components/views/auth/PassphraseConfirmField.tsx @@ -6,12 +6,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import React, { PureComponent, RefCallback, RefObject } from "react"; +import React, { ComponentProps, PureComponent, RefCallback, RefObject } from "react"; import Field, { IInputProps } from "../elements/Field"; import withValidation, { IFieldState, IValidationResult } from "../elements/Validation"; import { _t, _td, TranslationKey } from "../../../languageHandler"; -import { Alignment } from "../elements/Tooltip"; interface IProps extends Omit { id?: string; @@ -23,7 +22,7 @@ interface IProps extends Omit { label: TranslationKey; labelRequired: TranslationKey; labelInvalid: TranslationKey; - tooltipAlignment?: Alignment; + tooltipAlignment?: ComponentProps["tooltipAlignment"]; onChange(ev: React.FormEvent): void; onValidate?(result: IValidationResult): void; } diff --git a/src/components/views/auth/PassphraseField.tsx b/src/components/views/auth/PassphraseField.tsx index 6770b141a50..90201d1ec13 100644 --- a/src/components/views/auth/PassphraseField.tsx +++ b/src/components/views/auth/PassphraseField.tsx @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import React, { PureComponent, RefCallback, RefObject } from "react"; +import React, { ComponentProps, PureComponent, RefCallback, RefObject } from "react"; import classNames from "classnames"; import type { ZxcvbnResult } from "@zxcvbn-ts/core"; @@ -15,7 +15,6 @@ import withValidation, { IFieldState, IValidationResult } from "../elements/Vali import { _t, _td, TranslationKey } from "../../../languageHandler"; import Field, { IInputProps } from "../elements/Field"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; -import { Alignment } from "../elements/Tooltip"; interface IProps extends Omit { autoFocus?: boolean; @@ -31,7 +30,7 @@ interface IProps extends Omit { labelEnterPassword: TranslationKey; labelStrongPassword: TranslationKey; labelAllowedButUnsafe: TranslationKey; - tooltipAlignment?: Alignment; + tooltipAlignment?: ComponentProps["tooltipAlignment"]; onChange(ev: React.FormEvent): void; onValidate?(result: IValidationResult): void; diff --git a/src/components/views/auth/RegistrationForm.tsx b/src/components/views/auth/RegistrationForm.tsx index 4df3313758e..540e5905a35 100644 --- a/src/components/views/auth/RegistrationForm.tsx +++ b/src/components/views/auth/RegistrationForm.tsx @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import React, { BaseSyntheticEvent, ReactNode } from "react"; +import React, { BaseSyntheticEvent, ComponentProps, ReactNode } from "react"; import { MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; @@ -26,7 +26,6 @@ import RegistrationEmailPromptDialog from "../dialogs/RegistrationEmailPromptDia import CountryDropdown from "./CountryDropdown"; import PassphraseConfirmField from "./PassphraseConfirmField"; import { PosthogAnalytics } from "../../../PosthogAnalytics"; -import { Alignment } from "../elements/Tooltip"; enum RegistrationField { Email = "field_email", @@ -441,9 +440,9 @@ export default class RegistrationForm extends React.PureComponent["tooltipAlignment"] | undefined { if (this.props.mobileRegister) { - return Alignment.Bottom; + return "bottom"; } return undefined; } diff --git a/src/components/views/avatars/WidgetAvatar.tsx b/src/components/views/avatars/WidgetAvatar.tsx index 171b1b78b4a..bbb673a2955 100644 --- a/src/components/views/avatars/WidgetAvatar.tsx +++ b/src/components/views/avatars/WidgetAvatar.tsx @@ -20,6 +20,7 @@ interface IProps extends Omit, "name" | "url" | " } const WidgetAvatar: React.FC = ({ app, className, size = "20px", ...props }) => { + /* eslint-disable @typescript-eslint/no-require-imports */ let iconUrls = [require("../../../../res/img/element-icons/room/default_app.svg").default]; // heuristics for some better icons until Widgets support their own icons if (app.type.includes("jitsi")) { @@ -31,6 +32,7 @@ const WidgetAvatar: React.FC = ({ app, className, size = "20px", ...prop } else if (app.type.includes("clock")) { iconUrls = [require("../../../../res/img/element-icons/room/default_clock.svg").default]; } + /* eslint-enable @typescript-eslint/no-require-imports */ return ( - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only -Please see LICENSE files in the repository root for full details. -*/ - -import React from "react"; - -interface IProps { - message: string; -} - -export default class GenericTextContextMenu extends React.Component { - public render(): React.ReactNode { - return ( -
- {this.props.message} -
- ); - } -} diff --git a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx b/src/components/views/dialogs/AddExistingToSpaceDialog.tsx index 8bd7bfcccab..ce60b76d2e1 100644 --- a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx +++ b/src/components/views/dialogs/AddExistingToSpaceDialog.tsx @@ -34,6 +34,7 @@ import LazyRenderList from "../elements/LazyRenderList"; import { useSettingValue } from "../../../hooks/useSettings"; import { filterBoolean } from "../../../utils/arrays"; import { NonEmptyArray } from "../../../@types/common"; +import WarningBadgeSvg from "../../../../res/img/element-icons/warning-badge.svg"; // These values match CSS const ROW_HEIGHT = 32 + 12; @@ -228,12 +229,7 @@ export const AddExistingToSpace: React.FC = ({ if (error) { footer = ( <> - +
diff --git a/src/components/views/dialogs/ForwardDialog.tsx b/src/components/views/dialogs/ForwardDialog.tsx index b8a7f9d500e..6e9df055cdd 100644 --- a/src/components/views/dialogs/ForwardDialog.tsx +++ b/src/components/views/dialogs/ForwardDialog.tsx @@ -23,6 +23,8 @@ import { TimelineEvents, } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; +// eslint-disable-next-line no-restricted-imports +import OverflowHorizontalSvg from "@vector-im/compound-design-tokens/icons/overflow-horizontal.svg"; import { _t } from "../../../languageHandler"; import dis from "../../../dispatcher/dispatcher"; @@ -104,7 +106,7 @@ const Entry: React.FC> = ({ room, type, content, matrixClient: try { await cli.sendEvent(room.roomId, type, content); setSendState(SendState.Sent); - } catch (e) { + } catch { setSendState(SendState.Failed); } }; @@ -278,13 +280,7 @@ const ForwardDialog: React.FC = ({ matrixClient: cli, event, permalinkCr return ( - } + avatarJsx={} name={text} showPresence={false} onClick={() => setTruncateAt(totalCount)} diff --git a/src/components/views/dialogs/ModalWidgetDialog.tsx b/src/components/views/dialogs/ModalWidgetDialog.tsx index 28f06927b5d..90f330c6256 100644 --- a/src/components/views/dialogs/ModalWidgetDialog.tsx +++ b/src/components/views/dialogs/ModalWidgetDialog.tsx @@ -33,6 +33,7 @@ import { arrayFastClone } from "../../../utils/arrays"; import { ElementWidget } from "../../../stores/widgets/StopGapWidget"; import { ELEMENT_CLIENT_ID } from "../../../identifiers"; import SettingsStore from "../../../settings/SettingsStore"; +import WarningBadgeSvg from "../../../../res/img/element-icons/warning-badge.svg"; interface IProps { widgetDefinition: IModalWidgetOpenRequestData; @@ -185,12 +186,7 @@ export default class ModalWidgetDialog extends React.PureComponent
- + {_t("widget|modal_data_warning", { widgetDomain: parsed.hostname, })} diff --git a/src/components/views/dialogs/RoomUpgradeDialog.tsx b/src/components/views/dialogs/RoomUpgradeDialog.tsx index 0935fca19f7..337c1a334ca 100644 --- a/src/components/views/dialogs/RoomUpgradeDialog.tsx +++ b/src/components/views/dialogs/RoomUpgradeDialog.tsx @@ -52,8 +52,7 @@ export default class RoomUpgradeDialog extends React.Component { .catch((err) => { Modal.createDialog(ErrorDialog, { title: _t("room_settings|advanced|error_upgrade_title"), - description: - err && err.message ? err.message : _t("room_settings|advanced|error_upgrade_description"), + description: err?.message ?? _t("room_settings|advanced|error_upgrade_description"), }); }) .finally(() => { diff --git a/src/components/views/dialogs/ShareDialog.tsx b/src/components/views/dialogs/ShareDialog.tsx index 3369850b846..f9382227e4e 100644 --- a/src/components/views/dialogs/ShareDialog.tsx +++ b/src/components/views/dialogs/ShareDialog.tsx @@ -21,11 +21,12 @@ import BaseDialog from "./BaseDialog"; import CopyableText from "../elements/CopyableText"; import { XOR } from "../../../@types/common"; +/* eslint-disable @typescript-eslint/no-require-imports */ const socials = [ { name: "Facebook", img: require("../../../../res/img/social/facebook.png"), - url: (url: String) => `https://www.facebook.com/sharer/sharer.php?u=${url}`, + url: (url: string) => `https://www.facebook.com/sharer/sharer.php?u=${url}`, }, { name: "Twitter", @@ -52,6 +53,7 @@ const socials = [ url: (url: string) => `mailto:?body=${url}`, }, ]; +/* eslint-enable @typescript-eslint/no-require-imports */ interface BaseProps { /** diff --git a/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx b/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx index 412d88c704f..7361e3982dd 100644 --- a/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx +++ b/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx @@ -107,7 +107,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent => { // Now reset cross-signing so everything Just Works™ again. const cli = MatrixClientPeg.safeGet(); - await cli.bootstrapCrossSigning({ + await cli.getCrypto()?.bootstrapCrossSigning({ authUploadDeviceSigningKeys: async (makeRequest): Promise => { const { finished } = Modal.createDialog(InteractiveAuthDialog, { title: _t("encryption|bootstrap_title"), diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx index 442251d2997..4d29c1cfa34 100644 --- a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx +++ b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx @@ -37,9 +37,6 @@ interface IProps { // if false, will close the dialog as soon as the restore completes successfully // default: true showSummary?: boolean; - // If specified, gather the key from the user but then call the function with the backup - // key rather than actually (necessarily) restoring the backup. - keyCallback?: (key: Uint8Array) => void; onFinished(done?: boolean): void; } @@ -127,7 +124,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { : Container.Center; WidgetLayoutStore.instance.moveToContainer(this.props.room, this.props.app, targetContainer); - // If the right panel has a timeline, but we're about to show the timeline in the main view, pop the right panel - if ( - targetContainer === Container.Top && - RightPanelStore.instance.currentCardForRoom(this.props.room.roomId).phase === RightPanelPhases.Timeline - ) { - RightPanelStore.instance.popCard(this.props.room.roomId); - } + if (targetContainer === Container.Top) this.closeChatCardIfNeeded(); }; private onMinimiseClicked = (): void => { if (!this.props.room) return; // ignore action - it shouldn't even be visible WidgetLayoutStore.instance.moveToContainer(this.props.room, this.props.app, Container.Right); + this.closeChatCardIfNeeded(); + }; + + private closeChatCardIfNeeded = (): void => { + if (!this.props.room) return; // ignore action - it shouldn't even be visible + // If the right panel has a timeline, but we're about to show the timeline in the main view, pop the right panel + if (RightPanelStore.instance.currentCardForRoom(this.props.room.roomId).phase === RightPanelPhases.Timeline) { + RightPanelStore.instance.popCard(this.props.room.roomId); + } }; private onContextMenuClick = (): void => { @@ -759,7 +764,7 @@ export default class AppTile extends React.Component { {isMaximised ? ( ) : ( - + )} , ); @@ -771,7 +776,7 @@ export default class AppTile extends React.Component { title={_t("action|minimise")} onClick={this.onMinimiseClicked} > - + , ); } @@ -806,7 +811,7 @@ export default class AppTile extends React.Component { ref={this.contextMenuButton} onClick={this.onContextMenuClick} > - + )} diff --git a/src/components/views/elements/AppWarning.tsx b/src/components/views/elements/AppWarning.tsx index 5bca362fb85..4e43ca9c1ac 100644 --- a/src/components/views/elements/AppWarning.tsx +++ b/src/components/views/elements/AppWarning.tsx @@ -8,6 +8,8 @@ Please see LICENSE files in the repository root for full details. import React from "react"; +import WarningSvg from "../../../../res/img/warning.svg"; + interface IProps { errorMsg?: string; } @@ -16,7 +18,7 @@ const AppWarning: React.FC = (props) => { return (
- +
{props.errorMsg || "Error"} diff --git a/src/components/views/elements/CopyableText.tsx b/src/components/views/elements/CopyableText.tsx index 18c82d59920..c7b0df06793 100644 --- a/src/components/views/elements/CopyableText.tsx +++ b/src/components/views/elements/CopyableText.tsx @@ -21,7 +21,7 @@ interface IProps extends React.HTMLAttributes { className?: string; } -const CopyableText: React.FC = ({ children, getTextToCopy, border = true, className, ...props }) => { +export const CopyTextButton: React.FC> = ({ getTextToCopy, className }) => { const [tooltip, setTooltip] = useState(undefined); const onCopyClickInternal = async (e: ButtonEvent): Promise => { @@ -37,6 +37,19 @@ const CopyableText: React.FC = ({ children, getTextToCopy, border = true } }; + return ( + { + if (!open) onHideTooltip(); + }} + /> + ); +}; + +const CopyableText: React.FC = ({ children, getTextToCopy, border = true, className, ...props }) => { const combinedClassName = classNames("mx_CopyableText", className, { mx_CopyableText_border: border, }); @@ -44,14 +57,7 @@ const CopyableText: React.FC = ({ children, getTextToCopy, border = true return (
{children} - { - if (!open) onHideTooltip(); - }} - /> +
); }; diff --git a/src/components/views/elements/Field.tsx b/src/components/views/elements/Field.tsx index 6cc5dffc40c..540cf37cbef 100644 --- a/src/components/views/elements/Field.tsx +++ b/src/components/views/elements/Field.tsx @@ -11,14 +11,13 @@ import React, { TextareaHTMLAttributes, RefObject, createRef, - KeyboardEvent, + ComponentProps, } from "react"; import classNames from "classnames"; import { debounce } from "lodash"; +import { Tooltip } from "@vector-im/compound-web"; import { IFieldState, IValidationResult } from "./Validation"; -import Tooltip, { Alignment } from "./Tooltip"; -import { Key } from "../../../Keyboard"; // Invoke validation from user input (when typing, etc.) at most once every N ms. const VALIDATION_THROTTLE_MS = 200; @@ -57,11 +56,11 @@ interface IProps { forceValidity?: boolean; // If specified, contents will appear as a tooltip on the element and // validation feedback tooltips will be suppressed. - tooltipContent?: React.ReactNode; + tooltipContent?: JSX.Element | string; // If specified the tooltip will be shown regardless of feedback forceTooltipVisible?: boolean; // If specified, the tooltip with be aligned accorindly with the field, defaults to Right. - tooltipAlignment?: Alignment; + tooltipAlignment?: ComponentProps["placement"]; // If specified alongside tooltipContent, the class name to apply to the // tooltip itself. tooltipClassName?: string; @@ -112,7 +111,7 @@ type PropShapes = IInputProps | ISelectProps | ITextareaProps | INativeOnChangeI interface IState { valid?: boolean; - feedback?: React.ReactNode; + feedback?: JSX.Element | string; feedbackVisible: boolean; focused: boolean; } @@ -127,6 +126,7 @@ export default class Field extends React.PureComponent { validateOnFocus: true, validateOnBlur: true, validateOnChange: true, + tooltipAlignment: "right", }; /* @@ -233,16 +233,10 @@ export default class Field extends React.PureComponent { return this.props.inputRef ?? this._inputRef; } - private onKeyDown = (evt: KeyboardEvent): void => { - // If the tooltip is displayed to show a feedback and Escape is pressed - // The tooltip is hided - if (this.state.feedbackVisible && evt.key === Key.ESCAPE) { - evt.preventDefault(); - evt.stopPropagation(); - this.setState({ - feedbackVisible: false, - }); - } + private onTooltipOpenChange = (open: boolean): void => { + this.setState({ + feedbackVisible: open, + }); }; public render(): React.ReactNode { @@ -268,31 +262,15 @@ export default class Field extends React.PureComponent { } = this.props; // Handle displaying feedback on validity - let fieldTooltip: JSX.Element | undefined; + const tooltipProps: Pick, "aria-live" | "aria-atomic"> = {}; + let tooltipOpen = false; if (tooltipContent || this.state.feedback) { - const tooltipId = `${this.id}_tooltip`; - const visible = (this.state.focused && forceTooltipVisible) || this.state.feedbackVisible; - if (visible) { - inputProps["aria-describedby"] = tooltipId; - } + tooltipOpen = (this.state.focused && forceTooltipVisible) || this.state.feedbackVisible; - let role: React.AriaRole; - if (tooltipContent) { - role = "tooltip"; - } else { - role = this.state.valid ? "status" : "alert"; + if (!tooltipContent) { + tooltipProps["aria-atomic"] = "true"; + tooltipProps["aria-live"] = this.state.valid ? "polite" : "assertive"; } - - fieldTooltip = ( - - ); } inputProps.placeholder = inputProps.placeholder ?? inputProps.label; @@ -332,12 +310,20 @@ export default class Field extends React.PureComponent { }); return ( -
+
{prefixContainer} - {fieldInput} + + {fieldInput} + {postfixContainer} - {fieldTooltip}
); } diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index 24a3a29ce6a..8bbca5b309b 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -9,11 +9,11 @@ Please see LICENSE files in the repository root for full details. import classNames from "classnames"; import { EventType } from "matrix-js-sdk/src/matrix"; import React, { useContext, useRef, useState, MouseEvent, ReactNode } from "react"; +import { Tooltip } from "@vector-im/compound-web"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import RoomContext from "../../../contexts/RoomContext"; import { useTimeout } from "../../../hooks/useTimeout"; -import { TranslatedString } from "../../../languageHandler"; import { chromeFileInputFix } from "../../../utils/BrowserWorkarounds"; import AccessibleButton from "./AccessibleButton"; import Spinner from "./Spinner"; @@ -22,8 +22,8 @@ export const AVATAR_SIZE = "52px"; interface IProps { hasAvatar: boolean; - noAvatarLabel?: TranslatedString; - hasAvatarLabel?: TranslatedString; + noAvatarLabel?: string; + hasAvatarLabel?: string; setAvatarUrl(url: string): Promise; isUserAvatar?: boolean; onClick?(ev: MouseEvent): void; @@ -82,34 +82,24 @@ const MiniAvatarUploader: React.FC = ({ accept="image/*" /> - { - uploadRef.current?.click(); - }} - onMouseOver={() => setHover(true)} - onMouseLeave={() => setHover(false)} - > - {children} - -
- {busy ? :
} -
- -
+ { + uploadRef.current?.click(); + }} > -
- {label} -
-
+ {children} + +
+ {busy ? :
} +
+ + ); }; diff --git a/src/components/views/elements/Pill.tsx b/src/components/views/elements/Pill.tsx index 12cec19a425..14093587ad3 100644 --- a/src/components/views/elements/Pill.tsx +++ b/src/components/views/elements/Pill.tsx @@ -10,7 +10,7 @@ import React, { ReactElement } from "react"; import classNames from "classnames"; import { Room, RoomMember } from "matrix-js-sdk/src/matrix"; import { Tooltip } from "@vector-im/compound-web"; -import LinkIcon from "@vector-im/compound-design-tokens/assets/web/icons/link"; +import { LinkIcon, UserSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; @@ -18,7 +18,6 @@ import { usePermalink } from "../../../hooks/usePermalink"; import RoomAvatar from "../avatars/RoomAvatar"; import MemberAvatar from "../avatars/MemberAvatar"; import { _t } from "../../../languageHandler"; -import { Icon as UserIcon } from "../../../../res/img/compound/user.svg"; export enum PillType { UserMention = "TYPE_USER_MENTION", @@ -63,7 +62,7 @@ const PillMemberAvatar: React.FC<{ if (member) { return
`; +exports[` renders formatted m.text correctly should syntax highlight code blocks 1`] = ` +
+
+
+      
+        
+          1
+        
+        
+          2
+        
+        
+          3
+        
+        
+          4
+        
+        
+          5
+        
+        
+          6
+        
+        
+          7
+        
+        
+          8
+        
+        
+          9
+        
+        
+          10
+        
+      
+      
+ + + # Python Program to calculate the square root + + + + + + # Note: change this value for a different result + + +num = + + 8 + + + + + + # To take the input from the user + + + + + #num = float(input('Enter a number: ')) + + + +num_sqrt = num ** + + 0.5 + + + + + print + + ( + + 'The square root of %0.3f is %0.3f' + + %(num ,num_sqrt)) + + +
+
+ +
+
+ + +
+`; + exports[` renders formatted m.text correctly spoilers get injected properly into the DOM 1`] = `
", () => { const event = makePollStartEvent("Question?", "@me:domain.org"); - event.getContent().origin; const defaultProps = { event, onClick: jest.fn() }; const getComponent = (props = {}) => render(); diff --git a/test/unit-tests/components/views/right_panel/UserInfo-test.tsx b/test/unit-tests/components/views/right_panel/UserInfo-test.tsx index e0bfe10c863..c9996d7d67b 100644 --- a/test/unit-tests/components/views/right_panel/UserInfo-test.tsx +++ b/test/unit-tests/components/views/right_panel/UserInfo-test.tsx @@ -160,7 +160,6 @@ beforeEach(() => { getRoom: jest.fn(), credentials: {}, setPowerLevel: jest.fn(), - downloadKeys: jest.fn(), getCrypto: jest.fn().mockReturnValue(mockCrypto), } as unknown as MatrixClient); diff --git a/test/unit-tests/components/views/rooms/MessageComposer-test.tsx b/test/unit-tests/components/views/rooms/MessageComposer-test.tsx index 7fea00fe02d..c2e0c4848e6 100644 --- a/test/unit-tests/components/views/rooms/MessageComposer-test.tsx +++ b/test/unit-tests/components/views/rooms/MessageComposer-test.tsx @@ -247,11 +247,11 @@ describe("MessageComposer", () => { }); describe("UIStore interactions", () => { - let resizeCallback: Function; + let resizeCallback: (key: string, data: object) => void; beforeEach(() => { jest.spyOn(UIStore.instance, "on").mockImplementation( - (_event: string | symbol, listener: Function): any => { + (_event: string | symbol, listener: (key: string, data: object) => void): any => { resizeCallback = listener; }, ); diff --git a/test/unit-tests/components/views/rooms/RoomHeader-test.tsx b/test/unit-tests/components/views/rooms/RoomHeader-test.tsx index 6805f064cfb..a7e556e4527 100644 --- a/test/unit-tests/components/views/rooms/RoomHeader-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomHeader-test.tsx @@ -564,7 +564,7 @@ describe("RoomHeader", () => { jest.spyOn(SdkContextClass.instance.roomViewStore, "isViewingCall").mockReturnValue(true); - render(, getWrapper()).container; + render(, getWrapper()); expect(getByLabelText(document.body, _t("voip|get_call_link"))).toBeInTheDocument(); }); diff --git a/test/unit-tests/components/views/rooms/RoomList-test.tsx b/test/unit-tests/components/views/rooms/RoomList-test.tsx index 1d69f03e6b0..cb824bcdf9a 100644 --- a/test/unit-tests/components/views/rooms/RoomList-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomList-test.tsx @@ -210,7 +210,6 @@ describe("RoomList", () => { beforeEach(async () => { cleanup(); const rooms: Room[] = []; - RoomListStore.instance; testUtils.mkRoom(client, videoRoomPrivate, rooms); testUtils.mkRoom(client, videoRoomPublic, rooms); testUtils.mkRoom(client, videoRoomKnock, rooms); diff --git a/test/unit-tests/components/views/rooms/RoomPreviewBar-test.tsx b/test/unit-tests/components/views/rooms/RoomPreviewBar-test.tsx index f332702b2d8..fb531bb3bd9 100644 --- a/test/unit-tests/components/views/rooms/RoomPreviewBar-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomPreviewBar-test.tsx @@ -100,7 +100,7 @@ describe("", () => { afterEach(() => { const container = document.body.firstChild; - container && document.body.removeChild(container); + if (container) document.body.removeChild(container); }); it("renders joining message", () => { diff --git a/test/unit-tests/components/views/settings/CrossSigningPanel-test.tsx b/test/unit-tests/components/views/settings/CrossSigningPanel-test.tsx index 0b7a6800935..daa3570ed27 100644 --- a/test/unit-tests/components/views/settings/CrossSigningPanel-test.tsx +++ b/test/unit-tests/components/views/settings/CrossSigningPanel-test.tsx @@ -34,7 +34,6 @@ describe("", () => { }); mockClient.doesServerSupportUnstableFeature.mockResolvedValue(true); - mockClient.isCrossSigningReady.mockResolvedValue(false); }); afterEach(() => { diff --git a/test/unit-tests/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap b/test/unit-tests/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap index 1dedfa7dd4f..7478ce1b16e 100644 --- a/test/unit-tests/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap +++ b/test/unit-tests/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap @@ -90,10 +90,17 @@ exports[`PeopleRoomSettingsTab with requests to join renders requests fully 1`] role="button" tabindex="0" > -
+ xmlns="http://www.w3.org/2000/svg" + > + +
@@ -164,10 +171,17 @@ exports[`PeopleRoomSettingsTab with requests to join renders requests reduced 1` role="button" tabindex="0" > -
+ xmlns="http://www.w3.org/2000/svg" + > + +
diff --git a/test/unit-tests/components/views/settings/tabs/user/SessionManagerTab-test.tsx b/test/unit-tests/components/views/settings/tabs/user/SessionManagerTab-test.tsx index aec661120f7..3ff0084ef97 100644 --- a/test/unit-tests/components/views/settings/tabs/user/SessionManagerTab-test.tsx +++ b/test/unit-tests/components/views/settings/tabs/user/SessionManagerTab-test.tsx @@ -17,7 +17,6 @@ import { waitForElementToBeRemoved, within, } from "jest-matrix-react"; -import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; import { logger } from "matrix-js-sdk/src/logger"; import { CryptoApi, DeviceVerificationStatus, VerificationRequest } from "matrix-js-sdk/src/crypto-api"; import { defer, sleep } from "matrix-js-sdk/src/utils"; @@ -205,7 +204,6 @@ describe("", () => { ...mockClientMethodsServer(), getCrypto: jest.fn().mockReturnValue(mockCrypto), getDevices: jest.fn(), - getStoredDevice: jest.fn(), getDeviceId: jest.fn().mockReturnValue(deviceId), deleteMultipleDevices: jest.fn(), generateClientSecret: jest.fn(), @@ -220,10 +218,6 @@ describe("", () => { }); jest.clearAllMocks(); jest.spyOn(logger, "error").mockRestore(); - mockClient.getStoredDevice.mockImplementation((_userId, id) => { - const device = [alicesDevice, alicesMobileDevice].find((device) => device.device_id === id); - return device ? new DeviceInfo(device.device_id) : null; - }); mockCrypto.getDeviceVerificationStatus.mockReset().mockResolvedValue(new DeviceVerificationStatus({})); mockClient.getDevices.mockReset().mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice] }); @@ -292,7 +286,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice, alicesOlderMobileDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); mockCrypto.getDeviceVerificationStatus.mockImplementation(async (_userId, deviceId) => { // alices device is trusted if (deviceId === alicesDevice.device_id) { @@ -464,7 +457,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice], }); - mockClient.getStoredDevice.mockImplementation(() => new DeviceInfo(alicesDevice.device_id)); mockCrypto.getDeviceVerificationStatus.mockResolvedValue( new DeviceVerificationStatus({ crossSigningVerified: true, localVerified: true }), ); @@ -568,7 +560,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); mockCrypto.getDeviceVerificationStatus.mockImplementation(async (_userId, deviceId) => { if (deviceId === alicesDevice.device_id) { return new DeviceVerificationStatus({ crossSigningVerified: true, localVerified: true }); @@ -595,7 +586,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); mockCrypto.getDeviceVerificationStatus.mockImplementation(async (_userId, deviceId) => { // current session verified = able to verify other sessions if (deviceId === alicesDevice.device_id) { @@ -629,7 +619,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); mockCrypto.getDeviceVerificationStatus.mockImplementation(async (_userId, deviceId) => { if (deviceId === alicesDevice.device_id) { return new DeviceVerificationStatus({ crossSigningVerified: true, localVerified: true }); @@ -667,7 +656,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice, alicesDehydratedDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); const devicesMap = new Map([ [alicesDeviceObj.deviceId, alicesDeviceObj], @@ -708,7 +696,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice, alicesDehydratedDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); const devicesMap = new Map([ [alicesDeviceObj.deviceId, alicesDeviceObj], @@ -749,7 +736,6 @@ describe("", () => { mockClient.getDevices.mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice, alicesDehydratedDevice, alicesOtherDehydratedDevice], }); - mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId)); const devicesMap = new Map([ [alicesDeviceObj.deviceId, alicesDeviceObj], diff --git a/test/unit-tests/components/views/spaces/SpacePanel-test.tsx b/test/unit-tests/components/views/spaces/SpacePanel-test.tsx index 5f83efd14ed..1d1ebc194f0 100644 --- a/test/unit-tests/components/views/spaces/SpacePanel-test.tsx +++ b/test/unit-tests/components/views/spaces/SpacePanel-test.tsx @@ -85,7 +85,7 @@ const drop = async (element: HTMLElement) => { }; jest.mock("../../../../../src/stores/spaces/SpaceStore", () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports const EventEmitter = require("events"); class MockSpaceStore extends EventEmitter { invitedSpaces: SpaceKey[] = []; diff --git a/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx b/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx index 5ff66e73304..1e44fa6a0a8 100644 --- a/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx +++ b/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx @@ -21,7 +21,7 @@ import { StaticNotificationState } from "../../../../../src/stores/notifications import { NotificationLevel } from "../../../../../src/stores/notifications/NotificationLevel"; jest.mock("../../../../../src/stores/spaces/SpaceStore", () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports const EventEmitter = require("events"); class MockSpaceStore extends EventEmitter { activeSpace: SpaceKey = "!space1"; diff --git a/test/unit-tests/contexts/SdkContext-test.ts b/test/unit-tests/contexts/SdkContext-test.ts index 7ca881f817d..21f356ed94c 100644 --- a/test/unit-tests/contexts/SdkContext-test.ts +++ b/test/unit-tests/contexts/SdkContext-test.ts @@ -40,15 +40,11 @@ describe("SdkContextClass", () => { }); it("userProfilesStore should raise an error without a client", () => { - expect(() => { - sdkContext.userProfilesStore; - }).toThrow("Unable to create UserProfilesStore without a client"); + expect(() => sdkContext.userProfilesStore).toThrow("Unable to create UserProfilesStore without a client"); }); it("oidcClientStore should raise an error without a client", () => { - expect(() => { - sdkContext.oidcClientStore; - }).toThrow("Unable to create OidcClientStore without a client"); + expect(() => sdkContext.oidcClientStore).toThrow("Unable to create OidcClientStore without a client"); }); describe("when SDKContext has a client", () => { diff --git a/test/unit-tests/models/Call-test.ts b/test/unit-tests/models/Call-test.ts index a5e19fb0046..40e929fb4a9 100644 --- a/test/unit-tests/models/Call-test.ts +++ b/test/unit-tests/models/Call-test.ts @@ -358,12 +358,12 @@ describe("JitsiCall", () => { new CustomEvent("widgetapirequest", { detail: {} }), ); await waitFor(() => { - expect(callback).toHaveBeenNthCalledWith(1, ConnectionState.Disconnected, ConnectionState.Connected), - expect(callback).toHaveBeenNthCalledWith( - 2, - ConnectionState.WidgetLoading, - ConnectionState.Disconnected, - ); + expect(callback).toHaveBeenNthCalledWith(1, ConnectionState.Disconnected, ConnectionState.Connected); + expect(callback).toHaveBeenNthCalledWith( + 2, + ConnectionState.WidgetLoading, + ConnectionState.Disconnected, + ); expect(callback).toHaveBeenNthCalledWith(3, ConnectionState.Connecting, ConnectionState.WidgetLoading); }); // in video rooms we expect the call to immediately reconnect diff --git a/test/unit-tests/stores/BreadcrumbsStore-test.ts b/test/unit-tests/stores/BreadcrumbsStore-test.ts index 60c042f6a9d..0b6b302ac4e 100644 --- a/test/unit-tests/stores/BreadcrumbsStore-test.ts +++ b/test/unit-tests/stores/BreadcrumbsStore-test.ts @@ -49,7 +49,7 @@ describe("BreadcrumbsStore", () => { it("passes through the dynamic room precessors flag", () => { mocked(client.getVisibleRooms).mockReturnValue(fakeRooms(25)); - store.meetsRoomRequirement; + expect(store.meetsRoomRequirement).toBeTruthy(); expect(client.getVisibleRooms).toHaveBeenCalledWith(true); }); }); @@ -57,7 +57,7 @@ describe("BreadcrumbsStore", () => { describe("And the feature_dynamic_room_predecessors is not enabled", () => { it("passes through the dynamic room precessors flag", () => { mocked(client.getVisibleRooms).mockReturnValue(fakeRooms(25)); - store.meetsRoomRequirement; + expect(store.meetsRoomRequirement).toBeTruthy(); expect(client.getVisibleRooms).toHaveBeenCalledWith(false); }); }); diff --git a/test/unit-tests/stores/OwnProfileStore-test.ts b/test/unit-tests/stores/OwnProfileStore-test.ts index c379cf2d61b..290df8113d5 100644 --- a/test/unit-tests/stores/OwnProfileStore-test.ts +++ b/test/unit-tests/stores/OwnProfileStore-test.ts @@ -70,7 +70,7 @@ describe("OwnProfileStore", () => { ); try { await ownProfileStore.start(); - } catch (ignore) {} + } catch {} expect(onUpdate).not.toHaveBeenCalled(); expect(ownProfileStore.displayName).toBe(client.getSafeUserId()); diff --git a/test/unit-tests/stores/RoomViewStore-test.ts b/test/unit-tests/stores/RoomViewStore-test.ts index 08dd61e245f..7d397397dc9 100644 --- a/test/unit-tests/stores/RoomViewStore-test.ts +++ b/test/unit-tests/stores/RoomViewStore-test.ts @@ -465,7 +465,7 @@ describe("RoomViewStore", function () { try { expect(setRoomVisible.mock.calls[i][0]).toEqual(v[0]); expect(setRoomVisible.mock.calls[i][1]).toEqual(v[1]); - } catch (err) { + } catch { throw new Error(`i=${i} got ${setRoomVisible.mock.calls[i]} want ${v}`); } }); diff --git a/test/unit-tests/stores/room-list/RoomListStore-test.ts b/test/unit-tests/stores/room-list/RoomListStore-test.ts index 24b00930f66..e8aad47a7b6 100644 --- a/test/unit-tests/stores/room-list/RoomListStore-test.ts +++ b/test/unit-tests/stores/room-list/RoomListStore-test.ts @@ -353,7 +353,6 @@ describe("RoomListStore", () => { const videoRoomKnock = "!videoRoomKnock_server"; const rooms: Room[] = []; - RoomListStore.instance; mkRoom(client, videoRoomPrivate, rooms); mkRoom(client, videoRoomPublic, rooms); mkRoom(client, videoRoomKnock, rooms); diff --git a/test/unit-tests/stores/room-list/filters/SpaceFilterCondition-test.ts b/test/unit-tests/stores/room-list/filters/SpaceFilterCondition-test.ts index 323f30705cf..09ea9791986 100644 --- a/test/unit-tests/stores/room-list/filters/SpaceFilterCondition-test.ts +++ b/test/unit-tests/stores/room-list/filters/SpaceFilterCondition-test.ts @@ -17,7 +17,7 @@ import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; jest.mock("../../../../../src/settings/SettingsStore"); jest.mock("../../../../../src/stores/spaces/SpaceStore", () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports const EventEmitter = require("events"); class MockSpaceStore extends EventEmitter { isRoomInSpace = jest.fn(); diff --git a/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx b/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx index ddb8a6f7b8a..c7df2a0e6e0 100644 --- a/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx +++ b/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx @@ -11,7 +11,6 @@ import { render, RenderResult, screen } from "jest-matrix-react"; import userEvent from "@testing-library/user-event"; import { mocked, Mocked } from "jest-mock"; import { IMyDevice, MatrixClient } from "matrix-js-sdk/src/matrix"; -import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; import { CryptoApi, DeviceVerificationStatus } from "matrix-js-sdk/src/crypto-api"; import dis from "../../../src/dispatcher/dispatcher"; @@ -25,7 +24,6 @@ describe("UnverifiedSessionToast", () => { const otherDevice: IMyDevice = { device_id: "ABC123", }; - const otherDeviceInfo = new DeviceInfo(otherDevice.device_id); let client: Mocked; let renderResult: RenderResult; @@ -40,13 +38,6 @@ describe("UnverifiedSessionToast", () => { throw new Error(`Unknown device ${deviceId}`); }); - client.getStoredDevice.mockImplementation((userId: string, deviceId: string) => { - if (deviceId === otherDevice.device_id) { - return otherDeviceInfo; - } - - return null; - }); client.getCrypto.mockReturnValue({ getDeviceVerificationStatus: jest .fn() diff --git a/test/unit-tests/utils/MegolmExportEncryption-test.ts b/test/unit-tests/utils/MegolmExportEncryption-test.ts index 46f193d1b9d..416f5f9bedf 100644 --- a/test/unit-tests/utils/MegolmExportEncryption-test.ts +++ b/test/unit-tests/utils/MegolmExportEncryption-test.ts @@ -74,6 +74,7 @@ describe("MegolmExportEncryption", function () { subtle: webCrypto.subtle, }, }); + // eslint-disable-next-line @typescript-eslint/no-require-imports MegolmExportEncryption = require("../../../src/utils/MegolmExportEncryption"); }); diff --git a/test/unit-tests/utils/SessionLock-test.ts b/test/unit-tests/utils/SessionLock-test.ts index 5c20fc1b241..9bb5c05a6bf 100644 --- a/test/unit-tests/utils/SessionLock-test.ts +++ b/test/unit-tests/utils/SessionLock-test.ts @@ -218,7 +218,9 @@ describe("SessionLock", () => { const window2 = createWindow(); // import the dependencies of getSessionLock into the new context + // eslint-disable-next-line @typescript-eslint/no-require-imports window2._uuid = require("uuid"); + // eslint-disable-next-line @typescript-eslint/no-require-imports window2._logger = require("matrix-js-sdk/src/logger"); window2.SESSION_LOCK_CONSTANTS = SESSION_LOCK_CONSTANTS; diff --git a/test/unit-tests/utils/Singleflight-test.ts b/test/unit-tests/utils/Singleflight-test.ts index 30d6525b16b..7da5c8d3512 100644 --- a/test/unit-tests/utils/Singleflight-test.ts +++ b/test/unit-tests/utils/Singleflight-test.ts @@ -14,7 +14,7 @@ describe("Singleflight", () => { }); it("should throw for bad context variables", () => { - const permutations: [Object | null, string | null][] = [ + const permutations: [object | null, string | null][] = [ [null, null], [{}, null], [null, "test"], diff --git a/test/unit-tests/utils/local-room-test.ts b/test/unit-tests/utils/local-room-test.ts index 1621f137e3e..2789bf65a3c 100644 --- a/test/unit-tests/utils/local-room-test.ts +++ b/test/unit-tests/utils/local-room-test.ts @@ -76,7 +76,7 @@ describe("local-room", () => { it("should resolve the promise after invoking the callback", async () => { localRoom.afterCreateCallbacks.forEach((callback) => { - callback(localRoom.actualRoomId); + callback(localRoom.actualRoomId!); }); await prom; }); diff --git a/test/unit-tests/vector/platform/ElectronPlatform-test.ts b/test/unit-tests/vector/platform/ElectronPlatform-test.ts index 9430ad006cb..f6c2008de8e 100644 --- a/test/unit-tests/vector/platform/ElectronPlatform-test.ts +++ b/test/unit-tests/vector/platform/ElectronPlatform-test.ts @@ -47,7 +47,9 @@ describe("ElectronPlatform", () => { setupLanguageMock(); }); - const getElectronEventHandlerCall = (eventType: string): [type: string, handler: Function] | undefined => + const getElectronEventHandlerCall = ( + eventType: string, + ): [type: string, handler: (...args: any) => void] | undefined => mockElectron.on.mock.calls.find(([type]) => type === eventType); it("flushes rageshake before quitting", () => { diff --git a/test/unit-tests/voice-broadcast/models/VoiceBroadcastPlayback-test.tsx b/test/unit-tests/voice-broadcast/models/VoiceBroadcastPlayback-test.tsx index 665d23aab16..c9671892710 100644 --- a/test/unit-tests/voice-broadcast/models/VoiceBroadcastPlayback-test.tsx +++ b/test/unit-tests/voice-broadcast/models/VoiceBroadcastPlayback-test.tsx @@ -162,7 +162,11 @@ describe("VoiceBroadcastPlayback", () => { jest.spyOn(playback, "removeAllListeners"); jest.spyOn(playback, "destroy"); playback.on(VoiceBroadcastPlaybackEvent.StateChanged, onStateChanged); - fakeTimers ? await flushPromisesWithFakeTimers() : await flushPromises(); + if (fakeTimers) { + await flushPromisesWithFakeTimers(); + } else { + await flushPromises(); + } return playback; }; diff --git a/test/unit-tests/voice-broadcast/models/VoiceBroadcastRecording-test.ts b/test/unit-tests/voice-broadcast/models/VoiceBroadcastRecording-test.ts index eabb7ab874b..4f6bd8f47be 100644 --- a/test/unit-tests/voice-broadcast/models/VoiceBroadcastRecording-test.ts +++ b/test/unit-tests/voice-broadcast/models/VoiceBroadcastRecording-test.ts @@ -453,7 +453,7 @@ describe("VoiceBroadcastRecording", () => { describe.each([ ["pause", async () => voiceBroadcastRecording.pause()], ["toggle", async () => voiceBroadcastRecording.toggle()], - ])("and calling %s", (_case: string, action: Function) => { + ])("and calling %s", (_case: string, action: () => Promise) => { beforeEach(async () => { await action(); }); @@ -480,7 +480,7 @@ describe("VoiceBroadcastRecording", () => { describe.each([ ["pause", async () => voiceBroadcastRecording.pause()], ["toggle", async () => voiceBroadcastRecording.toggle()], - ])("and calling %s", (_case: string, action: Function) => { + ])("and calling %s", (_case: string, action: () => Promise) => { beforeEach(async () => { await action(); }); @@ -590,7 +590,7 @@ describe("VoiceBroadcastRecording", () => { describe.each([ ["resume", async () => voiceBroadcastRecording.resume()], ["toggle", async () => voiceBroadcastRecording.toggle()], - ])("and calling %s", (_case: string, action: Function) => { + ])("and calling %s", (_case: string, action: () => Promise) => { beforeEach(async () => { await action(); }); diff --git a/variants/openDesk/README.md b/variants/openDesk/README.md deleted file mode 100644 index f2aaf121c46..00000000000 --- a/variants/openDesk/README.md +++ /dev/null @@ -1 +0,0 @@ -https://gitlab.opencode.de/bmi/souveraener_arbeitsplatz diff --git a/variants/openDesk/build_config.yaml b/variants/openDesk/build_config.yaml deleted file mode 100644 index 558e0878f0c..00000000000 --- a/variants/openDesk/build_config.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-FileCopyrightText: 2023 Bundesministerium des Innern und für Heimat, PG ZenDiS "Projektgruppe für Aufbau ZenDiS" -# SPDX-License-Identifier: Apache-2.0 ---- -# The modules to install. See ./docs/modules.md for more information on -# what modules are. -# -# The values of this are provided to `yarn add` for inclusion. -modules: - - "@nordeck/element-web-guest-module@1.0.0" - - "@nordeck/element-web-opendesk-module@0.4.0" - - "@nordeck/element-web-widget-lifecycle-module@1.0.1" - - "@nordeck/element-web-widget-toggles-module@0.1.0" diff --git a/variants/openDesk/customisations.json b/variants/openDesk/customisations.json deleted file mode 100644 index a10751dacd1..00000000000 --- a/variants/openDesk/customisations.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "src/customisations/ComponentVisibility.ts": "node_modules/@nordeck/element-web-guest-module/customisations/ComponentVisibility.ts" -} diff --git a/variants/openDesk/customisations.json.license b/variants/openDesk/customisations.json.license deleted file mode 100644 index 23975ea6bdf..00000000000 --- a/variants/openDesk/customisations.json.license +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2023 Bundesministerium des Innern und für Heimat, PG ZenDiS "Projektgruppe für Aufbau ZenDiS" -# SPDX-License-Identifier: Apache-2.0 diff --git a/yarn.lock b/yarn.lock index 15af723869b..cc2c38eadc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2512,10 +2512,10 @@ "@sentry/types" "8.34.0" "@sentry/utils" "8.34.0" -"@sentry/babel-plugin-component-annotate@2.22.4": - version "2.22.4" - resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.4.tgz#c5adef7201a799c971cdccc5ba11c97d4609b1a2" - integrity sha512-hbSq067KwmeKIEkmyzkTNJbmbtx2KRqvpiy9Q/DynI5Z46Nko/ppvgIfyFXK9DelwvEPOqZic4WXTIhO4iv3DA== +"@sentry/babel-plugin-component-annotate@2.22.5": + version "2.22.5" + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.5.tgz#494978f4dfd741006368f74fefee2d1858a9c3af" + integrity sha512-+93qwB9vTX1nj4hD8AMWowXZsZVkvmP9OwTqSh5d4kOeiJ+dZftUk4+FKeKkAX9lvY2reyHV8Gms5mo67c27RQ== "@sentry/browser@^8.0.0": version "8.34.0" @@ -2530,59 +2530,59 @@ "@sentry/types" "8.34.0" "@sentry/utils" "8.34.0" -"@sentry/bundler-plugin-core@2.22.4": - version "2.22.4" - resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.4.tgz#e2c4efc713436b5a38dbbc4be510769c1c548cca" - integrity sha512-25NiyV3v6mdqOXlpzbbJnq0FHdAu1uTEDr+DU8CzNLjIXlq2Sr2CFZ/mhRcR6daM8OAretJdQ34lu0yHUVeE4Q== +"@sentry/bundler-plugin-core@2.22.5": + version "2.22.5" + resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.5.tgz#ca92e8145921fc5d4498bfd18168cad2c3376659" + integrity sha512-nfvTthV0aNM9/MwgnCi1WjAlCtau1I4kw6+oZIDOwJRDqGNziz517mYRXSsvCUebtGxDZtPcF7hSEBMSHjpncA== dependencies: "@babel/core" "^7.18.5" - "@sentry/babel-plugin-component-annotate" "2.22.4" - "@sentry/cli" "^2.33.1" + "@sentry/babel-plugin-component-annotate" "2.22.5" + "@sentry/cli" "^2.36.1" dotenv "^16.3.1" find-up "^5.0.0" glob "^9.3.2" magic-string "0.30.8" unplugin "1.0.1" -"@sentry/cli-darwin@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.36.1.tgz#786adf6984dbe3c6fb7dac51b625c314117b807d" - integrity sha512-JOHQjVD8Kqxm1jUKioAP5ohLOITf+Dh6+DBz4gQjCNdotsvNW5m63TKROwq2oB811p+Jzv5304ujmN4cAqW1Ww== - -"@sentry/cli-linux-arm64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.36.1.tgz#ff449d7e7e715166257998c02cf635ca02acbadd" - integrity sha512-R//3ZEkbzvoStr3IA7nxBZNiBYyxOljOqAhgiTnejXHmnuwDzM3TBA2n5vKPE/kBFxboEBEw0UTzTIRb1T0bgw== - -"@sentry/cli-linux-arm@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.36.1.tgz#1ae5d335a1b4cd217a34c2bd6c6f5e0670136eb3" - integrity sha512-gvEOKN0fWL2AVqUBKHNXPRZfJNvKTs8kQhS8cQqahZGgZHiPCI4BqW45cKMq+ZTt1UUbLmt6khx5Dz7wi+0i5A== - -"@sentry/cli-linux-i686@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.36.1.tgz#112b9e26357e918cbbba918114ec8cdab07cdf60" - integrity sha512-R7sW5Vk/HacVy2YgQoQB+PwccvFYf2CZVPSFSFm2z7MEfNe77UYHWUq+sjJ4vxWG6HDWGVmaX0fjxyDkE01JRA== - -"@sentry/cli-linux-x64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.36.1.tgz#c3e5bdb0c9a4bb44c83927c62a3cd7e006709bf7" - integrity sha512-UMr3ik8ksA7zQfbzsfwCb+ztenLnaeAbX94Gp+bzANZwPfi/vVHf2bLyqsBs4OyVt9SPlN1bbM/RTGfMjZ3JOw== - -"@sentry/cli-win32-i686@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.36.1.tgz#819573320e885e1dbf59b0a01d3bd370c84c1708" - integrity sha512-CflvhnvxPEs5GWQuuDtYSLqPrBaPbcSJFlBuUIb+8WNzRxvVfjgw1qzfZmkQqABqiy/YEsEekllOoMFZAvCcVA== - -"@sentry/cli-win32-x64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.36.1.tgz#80779b4bffb4e2e32944eae72c60e6f40151b4dc" - integrity sha512-wWqht2xghcK3TGnooHZSzA3WSjdtno/xFjZLvWmw38rblGwgKMxLZnlxV6uDyS+OJ6CbfDTlCRay/0TIqA0N8g== - -"@sentry/cli@^2.33.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.36.1.tgz#a9146b798cb6d2f782a7a48d74633ddcd88dc8d3" - integrity sha512-gzK5uQKDWKhyH5udoB5+oaUNrS//urWyaXgKvHKz4gFfl744HuKY9dpLPP2nMnf0zLGmGM6xJnMXLqILq0mtxw== +"@sentry/cli-darwin@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.37.0.tgz#9c890c68abf30ceaad27826212a0963b125b8bbf" + integrity sha512-CsusyMvO0eCPSN7H+sKHXS1pf637PWbS4rZak/7giz/z31/6qiXmeMlcL3f9lLZKtFPJmXVFO9uprn1wbBVF8A== + +"@sentry/cli-linux-arm64@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.37.0.tgz#2070155bade6d72d6b706807c6f365c65f9b82ea" + integrity sha512-2vzUWHLZ3Ct5gpcIlfd/2Qsha+y9M8LXvbZE26VxzYrIkRoLAWcnClBv8m4XsHLMURYvz3J9QSZHMZHSO7kAzw== + +"@sentry/cli-linux-arm@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.37.0.tgz#a08c2133e8e2566074fd6fe4f68e9ffd0c85664a" + integrity sha512-Dz0qH4Yt+gGUgoVsqVt72oDj4VQynRF1QB1/Sr8g76Vbi+WxWZmUh0iFwivYVwWxdQGu/OQrE0tx946HToCRyA== + +"@sentry/cli-linux-i686@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.37.0.tgz#53fff0e7f232b656b0ee3413b66006ee724a4abf" + integrity sha512-MHRLGs4t/CQE1pG+mZBQixyWL6xDZfNalCjO8GMcTTbZFm44S3XRHfYJZNVCgdtnUP7b6OHGcu1v3SWE10LcwQ== + +"@sentry/cli-linux-x64@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.37.0.tgz#2fbaf51ef3884bd6561c987f01ac98f544457150" + integrity sha512-k76ClefKZaDNJZU/H3mGeR8uAzAGPzDRG/A7grzKfBeyhP3JW09L7Nz9IQcSjCK+xr399qLhM2HFCaPWQ6dlMw== + +"@sentry/cli-win32-i686@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.37.0.tgz#fa195664da27ce8c40fdb6db1bf1d125cdf587d9" + integrity sha512-FFyi5RNYQQkEg4GkP2f3BJcgQn0F4fjFDMiWkjCkftNPXQG+HFUEtrGsWr6mnHPdFouwbYg3tEPUWNxAoypvTw== + +"@sentry/cli-win32-x64@2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.37.0.tgz#84fa4d070b8a4a115c46ab38f42d29580143fd26" + integrity sha512-nSMj4OcfQmyL+Tu/jWCJwhKCXFsCZW1MUk6wjjQlRt9SDLfgeapaMlK1ZvT1eZv5ZH6bj3qJfefwj4U8160uOA== + +"@sentry/cli@^2.36.1": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.37.0.tgz#dd01e933cf1caed7d7b6abab5a96044fe1c9c7a1" + integrity sha512-fM3V4gZRJR/s8lafc3O07hhOYRnvkySdPkvL/0e0XW0r+xRwqIAgQ5ECbsZO16A5weUiXVSf03ztDL1FcmbJCQ== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" @@ -2590,13 +2590,13 @@ proxy-from-env "^1.1.0" which "^2.0.2" optionalDependencies: - "@sentry/cli-darwin" "2.36.1" - "@sentry/cli-linux-arm" "2.36.1" - "@sentry/cli-linux-arm64" "2.36.1" - "@sentry/cli-linux-i686" "2.36.1" - "@sentry/cli-linux-x64" "2.36.1" - "@sentry/cli-win32-i686" "2.36.1" - "@sentry/cli-win32-x64" "2.36.1" + "@sentry/cli-darwin" "2.37.0" + "@sentry/cli-linux-arm" "2.37.0" + "@sentry/cli-linux-arm64" "2.37.0" + "@sentry/cli-linux-i686" "2.37.0" + "@sentry/cli-linux-x64" "2.37.0" + "@sentry/cli-win32-i686" "2.37.0" + "@sentry/cli-win32-x64" "2.37.0" "@sentry/core@8.34.0": version "8.34.0" @@ -2619,11 +2619,11 @@ "@sentry/types" "8.34.0" "@sentry/webpack-plugin@^2.7.1": - version "2.22.4" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-2.22.4.tgz#0102e83c77a6a4415344e7141f4aebc586d625da" - integrity sha512-Y7+RBrXBZlEuvoC0SbuClHZ8VC0nM0wZXroFuY/157EfUFtWr0J8f3b8+mzNshDGaCWV/UzFn6092M/BlAXCQA== + version "2.22.5" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-2.22.5.tgz#aafb3e526954b72759bae38bb34edecf55e68142" + integrity sha512-D8irs8H0IuLZbCS0Te5zsYGu9sABmMJTfCCkRkf7fV8S0BQZQmxnQGf9cVxcTj07RWAgnhhUtsRQzkK7MLuIwg== dependencies: - "@sentry/bundler-plugin-core" "2.22.4" + "@sentry/bundler-plugin-core" "2.22.5" unplugin "1.0.1" uuid "^9.0.0" @@ -2656,6 +2656,17 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@stylistic/eslint-plugin@^2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-2.9.0.tgz#5ab3326303915e020ddaf39154290e2800a84bcd" + integrity sha512-OrDyFAYjBT61122MIY1a3SfEgy3YCMgt2vL4eoPmvTwDBwyQhAXurxNQznlRD/jESNfYWfID8Ej+31LljvF7Xg== + dependencies: + "@typescript-eslint/utils" "^8.8.0" + eslint-visitor-keys "^4.1.0" + espree "^10.2.0" + estraverse "^5.3.0" + picomatch "^4.0.2" + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -2964,9 +2975,9 @@ integrity sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg== "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/events@^3.0.0": version "3.0.3" @@ -3186,9 +3197,9 @@ "@types/node" "*" "@types/node@*": - version "22.5.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" - integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== dependencies: undici-types "~6.19.2" @@ -3393,40 +3404,32 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^7.0.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" - integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== +"@typescript-eslint/eslint-plugin@^8.0.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz#bf0b25305b0bf014b4b194a6919103d7ac2a7907" + integrity sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/type-utils" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager" "8.9.0" + "@typescript-eslint/type-utils" "8.9.0" + "@typescript-eslint/utils" "8.9.0" + "@typescript-eslint/visitor-keys" "8.9.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^7.0.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" - integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== +"@typescript-eslint/parser@^8.0.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.9.0.tgz#0cecda6def8aef95d7c7098359c0fda5a362d6ad" + integrity sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ== dependencies: - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager" "8.9.0" + "@typescript-eslint/types" "8.9.0" + "@typescript-eslint/typescript-estree" "8.9.0" + "@typescript-eslint/visitor-keys" "8.9.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" - integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - "@typescript-eslint/scope-manager@8.9.0": version "8.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz#c98fef0c4a82a484e6a1eb610a55b154d14d46f3" @@ -3435,40 +3438,21 @@ "@typescript-eslint/types" "8.9.0" "@typescript-eslint/visitor-keys" "8.9.0" -"@typescript-eslint/type-utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" - integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== +"@typescript-eslint/type-utils@8.9.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz#aa86da3e4555fe7c8b42ab75e13561c4b5a8dfeb" + integrity sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q== dependencies: - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/typescript-estree" "8.9.0" + "@typescript-eslint/utils" "8.9.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== - "@typescript-eslint/types@8.9.0": version "8.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.9.0.tgz#b733af07fb340b32e962c6c63b1062aec2dc0fe6" integrity sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ== -"@typescript-eslint/typescript-estree@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - "@typescript-eslint/typescript-estree@8.9.0": version "8.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz#1714f167e9063062dc0df49c1d25afcbc7a96199" @@ -3483,17 +3467,7 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" - integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - -"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": +"@typescript-eslint/utils@8.9.0", "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.8.0": version "8.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.9.0.tgz#748bbe3ea5bee526d9786d9405cf1b0df081c299" integrity sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ== @@ -3503,14 +3477,6 @@ "@typescript-eslint/types" "8.9.0" "@typescript-eslint/typescript-estree" "8.9.0" -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== - dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" - "@typescript-eslint/visitor-keys@8.9.0": version "8.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz#5f11f4d9db913f37da42776893ffe0dd1ae78f78" @@ -3524,15 +3490,15 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vector-im/compound-design-tokens@1.8.0", "@vector-im/compound-design-tokens@^1.8.0": +"@vector-im/compound-design-tokens@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-1.8.0.tgz#bc844cb6b9842c1eb8e5c42f5cedcaf51a49b86f" integrity sha512-PtQMG7kDzwtjw/fLKD63uWP5rJ8cgWc/aXarfEzxYUf9ceWxBajnYOBI2jDqtE3WIUe9uTVBzNEvmOBG/VIgTA== -"@vector-im/compound-web@7.0.0", "@vector-im/compound-web@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-7.0.0.tgz#2e31711ad6407a667b08ebf67c54f643902d47eb" - integrity sha512-ctK+SQdGyaPeylxC2rVePkVfQZK1ftjWc9XbzYoIbZyu4mihgjHgLhd1i02QsNGIAvpxMDxqHjVD8SsrOB2/0g== +"@vector-im/compound-web@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-7.1.0.tgz#d1e2ef9bd7e08e8ac165aabcc40bca528cb5e80d" + integrity sha512-b2q5lSemKnWCA0rHTWyfw5I+ZsQzAJCTL6Zya79vArptaQBxLksjAubErsOG80uRqwAiNUZUx+13eaxKXZI1Sw== dependencies: "@floating-ui/react" "^0.26.24" "@radix-ui/react-context-menu" "^2.2.1" @@ -3753,11 +3719,16 @@ acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.11.0, acorn@^8.12.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.11.0, acorn@^8.12.0, acorn@^8.4.1, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: + version "8.13.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" + integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -4462,9 +4433,9 @@ chokidar@^3.5.3, chokidar@^3.6.0: fsevents "~2.3.2" chokidar@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.0.tgz#4d603963e5dd762dc5c7bb1cb5664e53a3002225" - integrity sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== dependencies: readdirp "^4.0.1" @@ -4646,14 +4617,13 @@ commondir@^1.0.1: integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== commonmark@^0.31.0: - version "0.31.0" - resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.31.0.tgz#4ac57c61f0d7f5ef82d79447a972c61226ef5abc" - integrity sha512-nuDsQ34gjmgAqjyIz6mbRWBW/XPE9wsBempAMBk2V/AA88ekztjTM46oi07J6c6Y/2Y8TdYCZi9L0pIBt/oMZw== + version "0.31.2" + resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.31.2.tgz#9d8d5439c82c9a235154d858a53e1a7965d573a5" + integrity sha512-2fRLTyb9r/2835k5cwcAwOj0DEc44FARnMp5veGsJ+mEAZdi52sNopLu07ZyElQUz058H43whzlERDIaaSw4rg== dependencies: entities "~3.0.1" mdurl "~1.0.1" - minimist "~1.2.5" - string.prototype.repeat "^1.0.0" + minimist "~1.2.8" compressible@~2.0.16: version "2.0.18" @@ -5285,9 +5255,9 @@ detect-node@^2.0.4: integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== diff-dom@^5.0.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/diff-dom/-/diff-dom-5.1.3.tgz#1a00ac023bdc9b7a6de702a51fd6566a34b8d9a4" - integrity sha512-cIQQSQywwn98yIEt1B7BhRRRH+M3tDEbJeV+j7NY0nSM4o3LdP7D3r/kRZDzT2tINX5r9Dpzvk7+RkeSMhzjhA== + version "5.1.4" + resolved "https://registry.yarnpkg.com/diff-dom/-/diff-dom-5.1.4.tgz#20d0f6e39558f59dae0e2943b69360fc15e371cb" + integrity sha512-TSEaVdVGictY1KHg7VpVw2nuM02YKC9C8/qBkGiCnkiAybVbu1zQTMj2/dnVLRO7Z62UsqzHGpXweiOj5/jaZg== diff-match-patch@^1.0.5: version "1.0.5" @@ -5647,9 +5617,9 @@ es-get-iterator@^1.1.3: stop-iteration-iterator "^1.0.0" es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" + integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -5658,12 +5628,12 @@ es-iterator-helpers@^1.0.19: es-set-tostringtag "^2.0.3" function-bind "^1.1.2" get-intrinsic "^1.2.4" - globalthis "^1.0.3" + globalthis "^1.0.4" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" internal-slot "^1.0.7" - iterator.prototype "^1.1.2" + iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: @@ -5829,10 +5799,10 @@ eslint-plugin-jsx-a11y@^6.5.1: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.0" -eslint-plugin-matrix-org@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-matrix-org/-/eslint-plugin-matrix-org-1.2.1.tgz#76d1505daa93fb99ba4156008b9b32f57682c9b1" - integrity sha512-A3cDjhG7RHwfCS8o3bOip8hSCsxtmgk2ahvqE5v/Ic2kPEZxixY6w8zLj7hFGsrRmPSEpLWqkVLt8uvQBapiQA== +eslint-plugin-matrix-org@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-matrix-org/-/eslint-plugin-matrix-org-2.0.2.tgz#95b86b0f16704ab19740f7c3c62eae69e20365e6" + integrity sha512-cQy5Rjeq6uyu1mLXlPZwEJdyM0NmclrnEz68y792FSuuxzMyJNNYLGDQ5CkYW8H+PrD825HUFZ34pNXnjMOzOw== eslint-plugin-react-hooks@^4.3.0: version "4.6.2" @@ -5840,9 +5810,9 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.28.0: - version "7.36.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz#f1dabbb11f3d4ebe8b0cf4e54aff4aee81144ee5" - integrity sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA== + version "7.37.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" + integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -5943,6 +5913,11 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== +eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + eslint@8.57.1: version "8.57.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" @@ -5996,6 +5971,15 @@ espree@^10.0.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.0.0" +espree@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.1.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -6329,10 +6313,10 @@ file@^0.2.2: resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" integrity sha512-gwabMtChzdnpDJdPEpz8Vr/PX0pU85KailuPV71Zw/un5yJVKvzukhB3qf6O3lnTwIe5CxlMYLh3jOK3w5xrLA== -filesize@10.1.4: - version "10.1.4" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.4.tgz#184f256063a201f08b6e6b3cc47d21b60f5b8d89" - integrity sha512-ryBwPIIeErmxgPnm6cbESAzXjuEFubs+yKYLBZvg3CaiNcmkJChoOGcBSrZ6IwkMwPABwPpVXE6IlNdGJJrvEg== +filesize@10.1.6: + version "10.1.6" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.6.tgz#31194da825ac58689c0bce3948f33ce83aabd361" + integrity sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w== fill-range@^7.1.1: version "7.1.1" @@ -6595,9 +6579,9 @@ get-symbol-description@^1.0.2: get-intrinsic "^1.2.4" github-markdown-css@^5.5.1: - version "5.6.1" - resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-5.6.1.tgz#8ca3d5c3d93d79ea429fddafea091347ab374f78" - integrity sha512-DItLFgHd+s7HQmk63YN4/TdvLeRqk1QP7pPKTTPrDTYoI5x7f/luJWSOZxesmuxBI2srHp8RDyoZd+9WF+WK8Q== + version "5.7.0" + resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-5.7.0.tgz#40fa19a8b9826a22874f305c40a5260d4d57e90a" + integrity sha512-GoYhaqELL4YUjz4tZ00PQ4JzFQkMfrBVuEeRB8W74HoikHWNiaGqSgynpwJEc+xom5uf04qoD/tUSS6ziZltaQ== gl-matrix@^3.4.3: version "3.4.3" @@ -6695,7 +6679,7 @@ globals@^15.9.0: resolved "https://registry.yarnpkg.com/globals/-/globals-15.11.0.tgz#b96ed4c6998540c6fb824b24b5499216d2438d6e" integrity sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw== -globalthis@^1.0.3: +globalthis@^1.0.3, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -7497,10 +7481,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== dependencies: define-properties "^1.2.1" get-intrinsic "^1.2.1" @@ -8723,7 +8707,7 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8, minimist@~1.2.5: +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8, minimist@~1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -8990,10 +8974,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -oidc-client-ts@3.0.1, oidc-client-ts@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-3.0.1.tgz#be264fb87c89f74f73863646431c32cd06f5ceb7" - integrity sha512-xX8unZNtmtw3sOz4FPSqDhkLFnxCDsdo2qhFEH2opgWnF/iXMFoYdBQzkwCxAZVgt3FT3DnuBY3k80EZHT0RYg== +oidc-client-ts@3.1.0, oidc-client-ts@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-3.1.0.tgz#28d3254951a1c64cc9780042c61492a71b2240dd" + integrity sha512-IDopEXjiwjkmJLYZo6BTlvwOtnlSniWZkKZoXforC/oLZHC9wkIxd25Kwtmo5yKFMMVcsp3JY6bhcNJqdYk8+g== dependencies: jwt-decode "^4.0.0" @@ -10220,7 +10204,7 @@ raw-loader@^4.0.2: loader-utils "^2.0.0" schema-utils "^3.0.0" -re-resizable@^6.9.0: +re-resizable@6.9.17: version "6.9.17" resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.17.tgz#78e4349934ff24a8fcb4b6b5a43ff9ed5f319d2a" integrity sha512-OBqd1BwVXpEJJn/yYROG+CbeqIDBWIp6wathlpB0kzZWWZIY1gPTsgK2yJEui5hOvkCdC2mcexF2V3DZVfLq2g== @@ -10267,9 +10251,9 @@ react-error-boundary@^3.1.0: "@babel/runtime" "^7.12.5" react-focus-lock@^2.5.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.12.1.tgz#0eaefd5fc34de8998967043d902e426352393349" - integrity sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw== + version "2.13.2" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.13.2.tgz#e1addac2f8b9550bc0581f3c416755ba0f81f5ef" + integrity sha512-T/7bsofxYqnod2xadvuwjGKHOoL5GH7/EIPI5UyEvaU/c2CcphvGI371opFtuY/SYdbMsNiuF4HsHQ50nA/TKQ== dependencies: "@babel/runtime" "^7.0.0" focus-lock "^1.3.5" @@ -10400,9 +10384,9 @@ readable-stream@^3.0.6: util-deprecate "^1.0.1" readdirp@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6" - integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== readdirp@~3.6.0: version "3.6.0" @@ -10480,7 +10464,7 @@ regexp-tree@^0.1.27: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== @@ -10490,6 +10474,16 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +regexp.prototype.flags@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + regexpu-core@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" @@ -10712,10 +10706,10 @@ sanitize-filename@^1.6.3: dependencies: truncate-utf8-bytes "^1.0.0" -sanitize-html@2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.13.0.tgz#71aedcdb777897985a4ea1877bf4f895a1170dae" - integrity sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA== +sanitize-html@2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.13.1.tgz#b4639b0a09574ab62b1b353cb99b1b87af742834" + integrity sha512-ZXtKq89oue4RP7abL9wp/9URJcqQNABB5GGJ2acW1sdO8JTVl92f4ygD7Yc9Ze09VAZhnt2zegeU0tbNsdcLYg== dependencies: deepmerge "^4.2.2" escape-string-regexp "^4.0.0" @@ -11506,9 +11500,9 @@ terser@^5.10.0: source-map-support "~0.5.20" terser@^5.26.0: - version "5.31.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" - integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== + version "5.35.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.35.0.tgz#38e29d3f4fd09dacfa3fcd5d381086d0816ba943" + integrity sha512-TmYbQnzVfrx3RQsPoItoPplymixIAtp2R2xlpyVBYmFmvI34IzLhCLj8SimRb/kZXlq4t1gA+vbcTqLQ3+5Q5g== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -11694,20 +11688,20 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.0, tslib@^2.6.1, tslib@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" + integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: +tslib@^2.1.0, tslib@^2.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== -tslib@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" - integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== +tslib@^2.6.1, tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -12193,9 +12187,9 @@ webpack-virtual-modules@^0.5.0: integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== webpack@^5.89.0: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== dependencies: "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" @@ -12447,7 +12441,12 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.3.3, yaml@~2.5.0: +yaml@^2.3.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3" + integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ== + +yaml@~2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==