diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1b4dc9ffb8..1355d305b5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,7 +35,7 @@ jobs: fail-fast: false matrix: # Run multiple instances in parallel to speed up the tests - runner: [1, 2] + runner: [1, 2, 3] steps: - name: Checkout code uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 @@ -61,24 +61,20 @@ jobs: path: /tmp/jest_cache key: ${{ hashFiles('**/pnpm-lock.yaml') }} - - name: Get number of CPU cores - id: cpu-cores - uses: SimenB/github-actions-cpu-cores@97330871fe1b7d3529392ea000e3d2c4b357e403 # v3 - - name: Run tests working-directory: apps/web run: | pnpm test \ --coverage=$ENABLE_COVERAGE \ --ci \ - --max-workers $MAX_WORKERS \ + --maxWorkers="50%" \ --shard "$SHARD" \ --cacheDirectory /tmp/jest_cache env: # tell jest to use coloured output FORCE_COLOR: true - MAX_WORKERS: ${{ steps.cpu-cores.outputs.count }} SHARD: ${{ format('{0}/{1}', matrix.runner, strategy.job-total) }} + NODE_OPTIONS: "--max_old_space_size=8192" - name: Move coverage files into place if: env.ENABLE_COVERAGE == 'true' diff --git a/apps/web/.eslintrc.cjs b/apps/web/.eslintrc.cjs index a5cc00f80b..c8265edfd5 100644 --- a/apps/web/.eslintrc.cjs +++ b/apps/web/.eslintrc.cjs @@ -232,7 +232,7 @@ module.exports = { }, }, { - files: ["test/**/*.{ts,tsx}", "playwright/**/*.ts"], + files: ["src/**/*.test.{ts,tsx}", "test/**/*.{ts,tsx}", "playwright/**/*.ts"], extends: ["plugin:matrix-org/jest"], rules: { // We don't need super strict typing in test utilities diff --git a/apps/web/jest.config.ts b/apps/web/jest.config.ts index 68bdeb4902..c3b3499c6c 100644 --- a/apps/web/jest.config.ts +++ b/apps/web/jest.config.ts @@ -52,16 +52,19 @@ const config: Config = { ], collectCoverageFrom: [ "/src/**/*.{js,ts,tsx}", - "/packages/**/*.{js,ts,tsx}", // getSessionLock is piped into a different JS context via stringification, and the coverage functionality is // not available in that contest. So, turn off coverage instrumentation for it. "!/src/utils/SessionLock.ts", // Coverage chokes on type definition files "!/src/**/*.d.ts", + // Ignore vitest tests + "!/src/**/*.test.{ts,tsx}", + "!/src/test/**", ], coverageReporters: ["text-summary", ["lcov", { projectRoot: "../../" }]], prettierPath: null, moduleDirectories: ["node_modules", "test/test-utils"], + workerIdleMemoryLimit: "512MB", }; // if we're running under GHA, enable relevant reporters diff --git a/apps/web/package.json b/apps/web/package.json index c39bc7edbd..74703df039 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -30,6 +30,7 @@ "lint:types": "nx lint:types", "lint:style": "stylelint \"res/css/**/*.pcss\"", "test": "nx test:unit", + "test:vitest": "nx test:vitest", "test:playwright": "nx test:playwright --", "test:playwright:open": "nx test:playwright -- --ui", "test:playwright:screenshots": "nx test:playwright:screenshots --", @@ -129,6 +130,7 @@ "@element-hq/element-call-embedded": "0.20.1", "@element-hq/element-web-playwright-common": "workspace:*", "@fetch-mock/jest": "^0.2.20", + "@fetch-mock/vitest": "^0.2.18", "@jest/globals": "^30.2.0", "@peculiar/webcrypto": "^1.4.3", "@playwright/test": "catalog:", @@ -190,6 +192,7 @@ "express": "^5.0.0", "fake-indexeddb": "^6.0.0", "file-loader": "^6.0.0", + "happy-dom": "^20.10.2", "html-webpack-plugin": "^5.5.3", "identity-obj-proxy": "^3.0.0", "jest": "^30.0.0", @@ -226,6 +229,7 @@ "testcontainers": "^12.0.0", "typescript": "catalog:", "util": "^0.12.5", + "vitest": "catalog:", "web-streams-polyfill": "^4.0.0", "webpack": "^5.89.0", "webpack-bundle-analyzer": "^5.0.0", diff --git a/apps/web/project.json b/apps/web/project.json index abb5fc4757..812dfec740 100644 --- a/apps/web/project.json +++ b/apps/web/project.json @@ -46,11 +46,20 @@ }, "dependsOn": ["^build", "^build:playwright"] }, + "test:unit:prepare": { + "executor": "nx:noop", + "dependsOn": ["^build"] + }, "test:unit": { // We avoid the jest executor because it doesn't seem to give any benefit, and it mangles the summary of failing tests. "command": "jest", "options": { "cwd": "apps/web" }, - "dependsOn": ["^build"] + "dependsOn": ["test:unit:prepare"] + }, + "test:vitest": { + "command": "vitest run", + "options": { "cwd": "apps/web" }, + "dependsOn": ["test:unit:prepare"] }, "test:playwright": { "command": "playwright test", diff --git a/apps/web/test/unit-tests/UserActivity-test.ts b/apps/web/src/UserActivity.test.ts similarity index 75% rename from apps/web/test/unit-tests/UserActivity-test.ts rename to apps/web/src/UserActivity.test.ts index 0c3fd1ca49..d4cd566bec 100644 --- a/apps/web/test/unit-tests/UserActivity-test.ts +++ b/apps/web/src/UserActivity.test.ts @@ -5,9 +5,12 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import EventEmitter from "events"; +// @vitest-environment happy-dom -import UserActivity from "../../src/UserActivity"; +import { vi, describe, it, expect, beforeEach, afterEach } from "vitest"; +import EventEmitter from "node:events"; + +import UserActivity from "./UserActivity"; class FakeDomEventEmitter extends EventEmitter { addEventListener(what: string, l: (...args: any[]) => void) { @@ -29,7 +32,7 @@ describe("UserActivity", function () { fakeDocument = new FakeDomEventEmitter(); userActivity = new UserActivity(fakeWindow as unknown as Window, fakeDocument as unknown as Document); userActivity.start(); - jest.useFakeTimers(); + vi.useFakeTimers(); }); afterEach(function () { @@ -49,7 +52,7 @@ describe("UserActivity", function () { }); it("should not consider user active after activity if no window focus", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(false); + fakeDocument.hasFocus = vi.fn().mockReturnValue(false); userActivity.onUserActivity({ type: "event" } as Event); expect(userActivity.userActiveNow()).toBe(false); @@ -57,62 +60,62 @@ describe("UserActivity", function () { }); it("should consider user active shortly after activity", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(true); + fakeDocument.hasFocus = vi.fn().mockReturnValue(true); userActivity.onUserActivity({ type: "event" } as Event); expect(userActivity.userActiveNow()).toBe(true); expect(userActivity.userActiveRecently()).toBe(true); - jest.advanceTimersByTime(200); + vi.advanceTimersByTime(200); expect(userActivity.userActiveNow()).toBe(true); expect(userActivity.userActiveRecently()).toBe(true); }); it("should consider user not active after 10s of no activity", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(true); + fakeDocument.hasFocus = vi.fn().mockReturnValue(true); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(10000); + vi.advanceTimersByTime(10000); expect(userActivity.userActiveNow()).toBe(false); }); it("should consider user passive after 10s of no activity", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(true); + fakeDocument.hasFocus = vi.fn().mockReturnValue(true); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(10000); + vi.advanceTimersByTime(10000); expect(userActivity.userActiveRecently()).toBe(true); }); it("should not consider user passive after 10s if window un-focused", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(true); + fakeDocument.hasFocus = vi.fn().mockReturnValue(true); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(10000); + vi.advanceTimersByTime(10000); - fakeDocument.hasFocus = jest.fn().mockReturnValue(false); + fakeDocument.hasFocus = vi.fn().mockReturnValue(false); fakeWindow.emit("blur", {}); expect(userActivity.userActiveRecently()).toBe(false); }); it("should not consider user passive after 3 mins", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(true); + fakeDocument.hasFocus = vi.fn().mockReturnValue(true); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(3 * 60 * 1000); + vi.advanceTimersByTime(3 * 60 * 1000); expect(userActivity.userActiveRecently()).toBe(false); }); it("should extend timer on activity", function () { - fakeDocument.hasFocus = jest.fn().mockReturnValue(true); + fakeDocument.hasFocus = vi.fn().mockReturnValue(true); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(1 * 60 * 1000); + vi.advanceTimersByTime(1 * 60 * 1000); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(1 * 60 * 1000); + vi.advanceTimersByTime(1 * 60 * 1000); userActivity.onUserActivity({ type: "event" } as Event); - jest.advanceTimersByTime(1 * 60 * 1000); + vi.advanceTimersByTime(1 * 60 * 1000); expect(userActivity.userActiveRecently()).toBe(true); }); diff --git a/apps/web/test/unit-tests/WorkerManager-test.ts b/apps/web/src/WorkerManager.test.ts similarity index 92% rename from apps/web/test/unit-tests/WorkerManager-test.ts rename to apps/web/src/WorkerManager.test.ts index f8d85fcda4..5fe9d9c0f7 100644 --- a/apps/web/test/unit-tests/WorkerManager-test.ts +++ b/apps/web/src/WorkerManager.test.ts @@ -6,11 +6,13 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { WorkerManager } from "../../src/WorkerManager"; +import { vi, describe, it, expect } from "vitest"; + +import { WorkerManager } from "./WorkerManager"; describe("WorkerManager", () => { it("should generate consecutive sequence numbers for each call", () => { - const postMessage = jest.fn(); + const postMessage = vi.fn(); const manager = new WorkerManager({ postMessage } as unknown as Worker); manager.call({ data: "One" }); @@ -27,7 +29,7 @@ describe("WorkerManager", () => { }); it("should support resolving out of order", async () => { - const postMessage = jest.fn(); + const postMessage = vi.fn(); const worker = { postMessage } as unknown as Worker; const manager = new WorkerManager(worker); diff --git a/apps/web/test/unit-tests/email-test.ts b/apps/web/src/email.test.ts similarity index 88% rename from apps/web/test/unit-tests/email-test.ts rename to apps/web/src/email.test.ts index f02566d271..e2cc58129e 100644 --- a/apps/web/test/unit-tests/email-test.ts +++ b/apps/web/src/email.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { looksValid } from "../../src/email"; +import { describe, it, expect } from "vitest"; + +import { looksValid } from "./email"; describe("looksValid", () => { it.each([ diff --git a/apps/web/src/test/setupTests.ts b/apps/web/src/test/setupTests.ts new file mode 100644 index 0000000000..566eba93fc --- /dev/null +++ b/apps/web/src/test/setupTests.ts @@ -0,0 +1,18 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { beforeEach } from "vitest"; +import fetchMock, { manageFetchMockGlobally } from "@fetch-mock/vitest"; + +manageFetchMockGlobally(); + +beforeEach(() => { + // set up fetch API mock + fetchMock.hardReset(); + fetchMock.catch(404); + fetchMock.mockGlobal(); +}); diff --git a/apps/web/test/unit-tests/utils/AnimationUtils-test.ts b/apps/web/src/utils/AnimationUtils.test.ts similarity index 89% rename from apps/web/test/unit-tests/utils/AnimationUtils-test.ts rename to apps/web/src/utils/AnimationUtils.test.ts index 196285973a..ef8979667c 100644 --- a/apps/web/test/unit-tests/utils/AnimationUtils-test.ts +++ b/apps/web/src/utils/AnimationUtils.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { lerp } from "../../../src/utils/AnimationUtils"; +import { describe, it, expect } from "vitest"; + +import { lerp } from "./AnimationUtils"; describe("lerp", () => { it("correctly interpolates", () => { diff --git a/apps/web/test/unit-tests/utils/FixedRollingArray-test.ts b/apps/web/src/utils/FixedRollingArray.test.ts similarity index 94% rename from apps/web/test/unit-tests/utils/FixedRollingArray-test.ts rename to apps/web/src/utils/FixedRollingArray.test.ts index 51b4748a82..ecface8c79 100644 --- a/apps/web/test/unit-tests/utils/FixedRollingArray-test.ts +++ b/apps/web/src/utils/FixedRollingArray.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { FixedRollingArray } from "../../../src/utils/FixedRollingArray"; +import { describe, it, expect } from "vitest"; + +import { FixedRollingArray } from "./FixedRollingArray"; describe("FixedRollingArray", () => { it("should seed the array with the given value", () => { diff --git a/apps/web/test/unit-tests/Image-test.ts b/apps/web/src/utils/Image.test.ts similarity index 71% rename from apps/web/test/unit-tests/Image-test.ts rename to apps/web/src/utils/Image.test.ts index be3c243e1c..1c8464db83 100644 --- a/apps/web/test/unit-tests/Image-test.ts +++ b/apps/web/src/utils/Image.test.ts @@ -6,10 +6,13 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import fs from "fs"; -import path from "path"; +import { describe, it, expect } from "vitest"; +import fs from "node:fs"; +import path from "node:path"; -import { blobIsAnimated, mayBeAnimated } from "../../src/utils/Image"; +import { blobIsAnimated, mayBeAnimated } from "./Image"; + +const imagesDir = path.resolve(__dirname, "../../test/unit-tests/images"); describe("Image", () => { describe("mayBeAnimated", () => { @@ -32,28 +35,28 @@ describe("Image", () => { describe("blobIsAnimated", () => { it("Animated GIF", async () => { - const img = new Blob([fs.readFileSync(path.resolve(__dirname, "images", "animated-logo.gif")).slice()], { + const img = new Blob([fs.readFileSync(path.resolve(imagesDir, "animated-logo.gif")).slice()], { type: "image/gif", }); expect(await blobIsAnimated(img)).toBeTruthy(); }); it("Static GIF", async () => { - const img = new Blob([fs.readFileSync(path.resolve(__dirname, "images", "static-logo.gif")).slice()], { + const img = new Blob([fs.readFileSync(path.resolve(imagesDir, "static-logo.gif")).slice()], { type: "image/gif", }); expect(await blobIsAnimated(img)).toBeFalsy(); }); it("Animated WEBP", async () => { - const img = new Blob([fs.readFileSync(path.resolve(__dirname, "images", "animated-logo.webp")).slice()], { + const img = new Blob([fs.readFileSync(path.resolve(imagesDir, "animated-logo.webp")).slice()], { type: "image/webp", }); expect(await blobIsAnimated(img)).toBeTruthy(); }); it("Static WEBP", async () => { - const img = new Blob([fs.readFileSync(path.resolve(__dirname, "images", "static-logo.webp")).slice()], { + const img = new Blob([fs.readFileSync(path.resolve(imagesDir, "static-logo.webp")).slice()], { type: "image/webp", }); expect(await blobIsAnimated(img)).toBeFalsy(); @@ -61,14 +64,14 @@ describe("Image", () => { it("Static WEBP in extended file format", async () => { const img = new Blob( - [fs.readFileSync(path.resolve(__dirname, "images", "static-logo-extended-file-format.webp")).slice()], + [fs.readFileSync(path.resolve(imagesDir, "static-logo-extended-file-format.webp")).slice()], { type: "image/webp" }, ); expect(await blobIsAnimated(img)).toBeFalsy(); }); it("Animated PNG", async () => { - const img = new Blob([fs.readFileSync(path.resolve(__dirname, "images", "animated-logo.apng")).slice()]); + const img = new Blob([fs.readFileSync(path.resolve(imagesDir, "animated-logo.apng")).slice()]); const pngBlob = img.slice(0, img.size, "image/png"); const apngBlob = img.slice(0, img.size, "image/apng"); expect(await blobIsAnimated(pngBlob)).toBeTruthy(); @@ -76,7 +79,7 @@ describe("Image", () => { }); it("Static PNG", async () => { - const img = new Blob([fs.readFileSync(path.resolve(__dirname, "images", "static-logo.png")).slice()]); + const img = new Blob([fs.readFileSync(path.resolve(imagesDir, "static-logo.png")).slice()]); const pngBlob = img.slice(0, img.size, "image/png"); const apngBlob = img.slice(0, img.size, "image/apng"); expect(await blobIsAnimated(pngBlob)).toBeFalsy(); diff --git a/apps/web/test/unit-tests/utils/LruCache-test.ts b/apps/web/src/utils/LruCache.test.ts similarity index 96% rename from apps/web/test/unit-tests/utils/LruCache-test.ts rename to apps/web/src/utils/LruCache.test.ts index 3090c22ace..155c38a9df 100644 --- a/apps/web/test/unit-tests/utils/LruCache-test.ts +++ b/apps/web/src/utils/LruCache.test.ts @@ -6,21 +6,18 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import { vi, describe, it, expect, beforeEach } from "vitest"; import { logger } from "matrix-js-sdk/src/logger"; -import { LruCache } from "../../../src/utils/LruCache"; +import { LruCache } from "./LruCache"; describe("LruCache", () => { it("when creating a cache with negative capacity it should raise an error", () => { - expect(() => { - new LruCache(-23); - }).toThrow("Cache capacity must be at least 1"); + expect(() => new LruCache(-23)).toThrow("Cache capacity must be at least 1"); }); it("when creating a cache with 0 capacity it should raise an error", () => { - expect(() => { - new LruCache(0); - }).toThrow("Cache capacity must be at least 1"); + expect(() => new LruCache(0)).toThrow("Cache capacity must be at least 1"); }); describe("when there is a cache with a capacity of 3", () => { @@ -72,7 +69,7 @@ describe("LruCache", () => { }); it("when an error occurs while setting an item the cache should be cleard", () => { - jest.spyOn(logger, "warn"); + vi.spyOn(logger, "warn"); const err = new Error("Something weng wrong :("); // @ts-ignore diff --git a/apps/web/test/unit-tests/PreferredRoomVersions-test.ts b/apps/web/src/utils/PreferredRoomVersions.test.ts similarity index 96% rename from apps/web/test/unit-tests/PreferredRoomVersions-test.ts rename to apps/web/src/utils/PreferredRoomVersions.test.ts index 17d457632d..a01d45897c 100644 --- a/apps/web/test/unit-tests/PreferredRoomVersions-test.ts +++ b/apps/web/src/utils/PreferredRoomVersions.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { doesRoomVersionSupport, PreferredRoomVersions } from "../../src/utils/PreferredRoomVersions"; +import { describe, it, expect } from "vitest"; + +import { doesRoomVersionSupport, PreferredRoomVersions } from "./PreferredRoomVersions"; describe("doesRoomVersionSupport", () => { it("should detect unstable as unsupported", () => { diff --git a/apps/web/test/unit-tests/utils/SnakedObject-test.ts b/apps/web/src/utils/SnakedObject.test.ts similarity index 95% rename from apps/web/test/unit-tests/utils/SnakedObject-test.ts rename to apps/web/src/utils/SnakedObject.test.ts index d0195aef39..ad649ddba2 100644 --- a/apps/web/test/unit-tests/utils/SnakedObject-test.ts +++ b/apps/web/src/utils/SnakedObject.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { SnakedObject, snakeToCamel } from "../../../src/utils/SnakedObject"; +import { describe, it, expect } from "vitest"; + +import { SnakedObject, snakeToCamel } from "./SnakedObject"; describe("snakeToCamel", () => { it("should convert snake_case to camelCase in simple scenarios", () => { diff --git a/apps/web/test/unit-tests/utils/UrlUtils-test.ts b/apps/web/src/utils/UrlUtils.test.ts similarity index 89% rename from apps/web/test/unit-tests/utils/UrlUtils-test.ts rename to apps/web/src/utils/UrlUtils.test.ts index 649b7ab7cf..fb95435e57 100644 --- a/apps/web/test/unit-tests/utils/UrlUtils-test.ts +++ b/apps/web/src/utils/UrlUtils.test.ts @@ -6,7 +6,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { abbreviateUrl, parseUrl, unabbreviateUrl } from "../../../src/utils/UrlUtils"; +// @vitest-environment happy-dom + +import { describe, it, expect } from "vitest"; + +import { abbreviateUrl, parseUrl, unabbreviateUrl } from "./UrlUtils"; describe("abbreviateUrl", () => { it("should return empty string if passed falsey", () => { diff --git a/apps/web/test/unit-tests/utils/arrays-test.ts b/apps/web/src/utils/arrays.test.ts similarity index 93% rename from apps/web/test/unit-tests/utils/arrays-test.ts rename to apps/web/src/utils/arrays.test.ts index 93cf56d3b9..e4f331433f 100644 --- a/apps/web/test/unit-tests/utils/arrays-test.ts +++ b/apps/web/src/utils/arrays.test.ts @@ -6,6 +6,8 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import { vi, describe, it, expect } from "vitest"; + import { arrayDiff, arrayFastClone, @@ -25,7 +27,7 @@ import { asyncSome, asyncSomeParallel, asyncFilter, -} from "../../../src/utils/arrays"; +} from "./arrays"; type TestParams = { input: number[]; output: number[] }; type TestCase = [string, TestParams]; @@ -412,11 +414,11 @@ describe("arrays", () => { describe("asyncEvery", () => { it("when called with an empty array, it should return true", async () => { - expect(await asyncEvery([], jest.fn().mockResolvedValue(true))).toBe(true); + expect(await asyncEvery([], vi.fn().mockResolvedValue(true))).toBe(true); }); it("when called with some items and the predicate resolves to true for all of them, it should return true", async () => { - const predicate = jest.fn().mockResolvedValue(true); + const predicate = vi.fn().mockResolvedValue(true); expect(await asyncEvery([1, 2, 3], predicate)).toBe(true); expect(predicate).toHaveBeenCalledTimes(3); expect(predicate).toHaveBeenCalledWith(1); @@ -425,14 +427,14 @@ describe("arrays", () => { }); it("when called with some items and the predicate resolves to false for all of them, it should return false", async () => { - const predicate = jest.fn().mockResolvedValue(false); + const predicate = vi.fn().mockResolvedValue(false); expect(await asyncEvery([1, 2, 3], predicate)).toBe(false); expect(predicate).toHaveBeenCalledTimes(1); expect(predicate).toHaveBeenCalledWith(1); }); it("when called with some items and the predicate resolves to false for one of them, it should return false", async () => { - const predicate = jest.fn().mockResolvedValueOnce(true).mockResolvedValueOnce(false); + const predicate = vi.fn().mockResolvedValueOnce(true).mockResolvedValueOnce(false); expect(await asyncEvery([1, 2, 3], predicate)).toBe(false); expect(predicate).toHaveBeenCalledTimes(2); expect(predicate).toHaveBeenCalledWith(1); @@ -442,11 +444,11 @@ describe("arrays", () => { describe("asyncSome", () => { it("when called with an empty array, it should return false", async () => { - expect(await asyncSome([], jest.fn().mockResolvedValue(true))).toBe(false); + expect(await asyncSome([], vi.fn().mockResolvedValue(true))).toBe(false); }); it("when called with some items and the predicate resolves to false for all of them, it should return false", async () => { - const predicate = jest.fn().mockResolvedValue(false); + const predicate = vi.fn().mockResolvedValue(false); expect(await asyncSome([1, 2, 3], predicate)).toBe(false); expect(predicate).toHaveBeenCalledTimes(3); expect(predicate).toHaveBeenCalledWith(1); @@ -455,7 +457,7 @@ describe("arrays", () => { }); it("when called with some items and the predicate resolves to true, it should short-circuit and return true", async () => { - const predicate = jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true); + const predicate = vi.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true); expect(await asyncSome([1, 2, 3], predicate)).toBe(true); expect(predicate).toHaveBeenCalledTimes(2); expect(predicate).toHaveBeenCalledWith(1); @@ -465,30 +467,30 @@ describe("arrays", () => { describe("asyncSomeParallel", () => { it("when called with an empty array, it should return false", async () => { - expect(await asyncSomeParallel([], jest.fn().mockResolvedValue(true))).toBe(false); + expect(await asyncSomeParallel([], vi.fn().mockResolvedValue(true))).toBe(false); }); it("when all the predicates return false", async () => { - expect(await asyncSomeParallel([1, 2, 3], jest.fn().mockResolvedValue(false))).toBe(false); + expect(await asyncSomeParallel([1, 2, 3], vi.fn().mockResolvedValue(false))).toBe(false); }); it("when all the predicates return true", async () => { - expect(await asyncSomeParallel([1, 2, 3], jest.fn().mockResolvedValue(true))).toBe(true); + expect(await asyncSomeParallel([1, 2, 3], vi.fn().mockResolvedValue(true))).toBe(true); }); it("when one of the predicate return true", async () => { - const predicate = jest.fn().mockImplementation((value) => Promise.resolve(value === 2)); + const predicate = vi.fn().mockImplementation((value) => Promise.resolve(value === 2)); expect(await asyncSomeParallel([1, 2, 3], predicate)).toBe(true); }); }); describe("asyncFilter", () => { it("when called with an empty array, it should return an empty array", async () => { - expect(await asyncFilter([], jest.fn().mockResolvedValue(true))).toEqual([]); + expect(await asyncFilter([], vi.fn().mockResolvedValue(true))).toEqual([]); }); it("should filter the content", async () => { - const predicate = jest.fn().mockImplementation((value) => Promise.resolve(value === 2)); + const predicate = vi.fn().mockImplementation((value) => Promise.resolve(value === 2)); expect(await asyncFilter([1, 2, 3], predicate)).toEqual([2]); }); }); diff --git a/apps/web/test/unit-tests/utils/colour-test.ts b/apps/web/src/utils/colour.test.ts similarity index 86% rename from apps/web/test/unit-tests/utils/colour-test.ts rename to apps/web/src/utils/colour.test.ts index 7ba966e25e..cbdac2916d 100644 --- a/apps/web/test/unit-tests/utils/colour-test.ts +++ b/apps/web/src/utils/colour.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { textToHtmlRainbow } from "../../../src/utils/colour"; +import { describe, it, expect } from "vitest"; + +import { textToHtmlRainbow } from "./colour"; describe("textToHtmlRainbow", () => { it("correctly transform text to html without splitting the emoji in two", () => { diff --git a/apps/web/test/unit-tests/utils/connection-test.ts b/apps/web/src/utils/connection.test.ts similarity index 87% rename from apps/web/test/unit-tests/utils/connection-test.ts rename to apps/web/src/utils/connection.test.ts index 1df67070b3..44068b68a6 100644 --- a/apps/web/test/unit-tests/utils/connection-test.ts +++ b/apps/web/src/utils/connection.test.ts @@ -6,16 +6,17 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import { vi, describe, it, expect, beforeEach, type Mock } from "vitest"; import { type ClientEvent, type ClientEventHandlerMap, SyncState } from "matrix-js-sdk/src/matrix"; -import { createReconnectedListener } from "../../../src/utils/connection"; +import { createReconnectedListener } from "./connection"; describe("createReconnectedListener", () => { let reconnectedListener: ClientEventHandlerMap[ClientEvent.Sync]; - let onReconnect: jest.Mock; + let onReconnect: Mock; beforeEach(() => { - onReconnect = jest.fn(); + onReconnect = vi.fn(); reconnectedListener = createReconnectedListener(onReconnect); }); diff --git a/apps/web/test/unit-tests/utils/enums-test.ts b/apps/web/src/utils/enums.test.ts similarity index 94% rename from apps/web/test/unit-tests/utils/enums-test.ts rename to apps/web/src/utils/enums.test.ts index b431e2de3e..81c496f807 100644 --- a/apps/web/test/unit-tests/utils/enums-test.ts +++ b/apps/web/src/utils/enums.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { getEnumValues, isEnumValue } from "../../../src/utils/enums"; +import { describe, it, expect } from "vitest"; + +import { getEnumValues, isEnumValue } from "./enums"; enum TestStringEnum { First = "__first__", diff --git a/apps/web/test/unit-tests/utils/iterables-test.ts b/apps/web/src/utils/iterables.test.ts similarity index 95% rename from apps/web/test/unit-tests/utils/iterables-test.ts rename to apps/web/src/utils/iterables.test.ts index 963f6efd82..f047dc73dd 100644 --- a/apps/web/test/unit-tests/utils/iterables-test.ts +++ b/apps/web/src/utils/iterables.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { iterableDiff, iterableIntersection } from "../../../src/utils/iterables"; +import { describe, it, expect } from "vitest"; + +import { iterableDiff, iterableIntersection } from "./iterables"; describe("iterables", () => { describe("iterableIntersection", () => { diff --git a/apps/web/test/unit-tests/utils/keepIfSame-test.ts b/apps/web/src/utils/keepIfSame.test.ts similarity index 88% rename from apps/web/test/unit-tests/utils/keepIfSame-test.ts rename to apps/web/src/utils/keepIfSame.test.ts index b4ea3393b5..f47d4ae01c 100644 --- a/apps/web/test/unit-tests/utils/keepIfSame-test.ts +++ b/apps/web/src/utils/keepIfSame.test.ts @@ -5,7 +5,9 @@ * Please see LICENSE files in the repository root for full details. */ -import { keepIfSame } from "../../../src/utils/keepIfSame"; +import { describe, it, expect } from "vitest"; + +import { keepIfSame } from "./keepIfSame"; describe("keepIfSame", () => { it("returns the next value if the current and next values are not deeply equal", () => { diff --git a/apps/web/test/unit-tests/utils/objects-test.ts b/apps/web/src/utils/objects.test.ts similarity index 99% rename from apps/web/test/unit-tests/utils/objects-test.ts rename to apps/web/src/utils/objects.test.ts index 48d5ca84fe..662fe7580c 100644 --- a/apps/web/test/unit-tests/utils/objects-test.ts +++ b/apps/web/src/utils/objects.test.ts @@ -6,6 +6,8 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import { describe, it, expect } from "vitest"; + import { objectClone, objectDiff, @@ -14,7 +16,7 @@ import { objectKeyChanges, objectShallowClone, objectWithOnly, -} from "../../../src/utils/objects"; +} from "./objects"; describe("objects", () => { describe("objectExcluding", () => { diff --git a/apps/web/test/unit-tests/utils/oidc/persistOidcSettings-test.ts b/apps/web/src/utils/oidc/persistOidcSettings.test.ts similarity index 93% rename from apps/web/test/unit-tests/utils/oidc/persistOidcSettings-test.ts rename to apps/web/src/utils/oidc/persistOidcSettings.test.ts index 86695b4c26..a35b5a575c 100644 --- a/apps/web/test/unit-tests/utils/oidc/persistOidcSettings-test.ts +++ b/apps/web/src/utils/oidc/persistOidcSettings.test.ts @@ -6,9 +6,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +// @vitest-environment happy-dom + +import { vi, describe, it, expect, beforeEach } from "vitest"; import { type IdTokenClaims } from "oidc-client-ts"; import { decodeIdToken } from "matrix-js-sdk/src/matrix"; -import { mocked } from "jest-mock"; import { getStoredOidcClientId, @@ -16,13 +18,13 @@ import { getStoredOidcIdTokenClaims, getStoredOidcTokenIssuer, persistOidcAuthenticatedSettings, -} from "../../../../src/utils/oidc/persistOidcSettings"; +} from "./persistOidcSettings"; -jest.mock("matrix-js-sdk/src/matrix"); +vi.mock("matrix-js-sdk/src/matrix"); describe("persist OIDC settings", () => { - jest.spyOn(Storage.prototype, "getItem"); - jest.spyOn(Storage.prototype, "setItem"); + vi.spyOn(localStorage, "getItem"); + vi.spyOn(localStorage, "setItem"); beforeEach(() => { localStorage.clear(); @@ -101,7 +103,7 @@ describe("persist OIDC settings", () => { it("should return claims extracted from id_token in localStorage", () => { localStorage.setItem("mx_oidc_id_token", idToken); - mocked(decodeIdToken).mockReturnValue(idTokenClaims); + vi.mocked(decodeIdToken).mockReturnValue(idTokenClaims); expect(getStoredOidcIdTokenClaims()).toEqual(idTokenClaims); expect(decodeIdToken).toHaveBeenCalledWith(idToken); expect(localStorage.getItem).toHaveBeenCalledWith("mx_oidc_id_token_claims"); diff --git a/apps/web/test/unit-tests/utils/oidc/urls-test.ts b/apps/web/src/utils/oidc/urls.test.ts similarity index 95% rename from apps/web/test/unit-tests/utils/oidc/urls-test.ts rename to apps/web/src/utils/oidc/urls.test.ts index 072202d0b6..b344622261 100644 --- a/apps/web/test/unit-tests/utils/oidc/urls-test.ts +++ b/apps/web/src/utils/oidc/urls.test.ts @@ -5,7 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import { getManageDeviceUrl } from "../../../../src/utils/oidc/urls"; +import { describe, it, expect } from "vitest"; + +import { getManageDeviceUrl } from "./urls"; describe("OIDC urls", () => { const accountManagementEndpoint = "https://auth.com/manage"; diff --git a/apps/web/test/unit-tests/utils/promise-test.ts b/apps/web/src/utils/promise.test.ts similarity index 89% rename from apps/web/test/unit-tests/utils/promise-test.ts rename to apps/web/src/utils/promise.test.ts index 5761c8f881..5004591484 100644 --- a/apps/web/test/unit-tests/utils/promise-test.ts +++ b/apps/web/src/utils/promise.test.ts @@ -5,11 +5,13 @@ * Please see LICENSE files in the repository root for full details. */ -import { batch } from "../../../src/utils/promise.ts"; +import { vi, describe, it, expect, afterEach } from "vitest"; + +import { batch } from "./promise.ts"; describe("promise.ts", () => { describe("batch", () => { - afterEach(() => jest.useRealTimers()); + afterEach(() => vi.useRealTimers()); it("should batch promises into groups of a given size", async () => { const promises = [() => Promise.resolve(1), () => Promise.resolve(2), () => Promise.resolve(3)]; @@ -19,7 +21,7 @@ describe("promise.ts", () => { }); it("should wait for the current batch to finish to request the next one", async () => { - jest.useFakeTimers(); + vi.useFakeTimers(); let promise1Called = false; const promise1 = () => @@ -49,7 +51,7 @@ describe("promise.ts", () => { expect(promise2Called).toBe(true); expect(promise3Called).toBe(false); - jest.advanceTimersByTime(11); + vi.advanceTimersByTime(11); expect(await batchPromise).toEqual([1, 2, 3]); }); }); diff --git a/apps/web/test/unit-tests/utils/sets-test.ts b/apps/web/src/utils/sets.test.ts similarity index 94% rename from apps/web/test/unit-tests/utils/sets-test.ts rename to apps/web/src/utils/sets.test.ts index 20889aa611..632d5c2a91 100644 --- a/apps/web/test/unit-tests/utils/sets-test.ts +++ b/apps/web/src/utils/sets.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { setHasDiff } from "../../../src/utils/sets"; +import { describe, it, expect } from "vitest"; + +import { setHasDiff } from "./sets"; describe("sets", () => { describe("setHasDiff", () => { diff --git a/apps/web/test/unit-tests/utils/stringOrderField-test.ts b/apps/web/src/utils/stringOrderField.test.ts similarity index 99% rename from apps/web/test/unit-tests/utils/stringOrderField-test.ts rename to apps/web/src/utils/stringOrderField.test.ts index e5c5c5f050..e42d5ef6ef 100644 --- a/apps/web/test/unit-tests/utils/stringOrderField-test.ts +++ b/apps/web/src/utils/stringOrderField.test.ts @@ -6,10 +6,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import { describe, it, expect } from "vitest"; import { sortBy } from "lodash"; import { averageBetweenStrings, DEFAULT_ALPHABET } from "matrix-js-sdk/src/utils"; -import { midPointsBetweenStrings, reorderLexicographically } from "../../../src/utils/stringOrderField"; +import { midPointsBetweenStrings, reorderLexicographically } from "./stringOrderField"; const moveLexicographicallyTest = ( orders: Array, diff --git a/apps/web/test/unit-tests/utils/validate/numberInRange-test.ts b/apps/web/src/utils/validate/numberInRange.test.ts similarity index 92% rename from apps/web/test/unit-tests/utils/validate/numberInRange-test.ts rename to apps/web/src/utils/validate/numberInRange.test.ts index d62045ac68..5acbf91b28 100644 --- a/apps/web/test/unit-tests/utils/validate/numberInRange-test.ts +++ b/apps/web/src/utils/validate/numberInRange.test.ts @@ -6,7 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { validateNumberInRange } from "../../../../src/utils/validate"; +import { describe, it, expect } from "vitest"; + +import { validateNumberInRange } from "./numberInRange"; describe("validateNumberInRange", () => { const min = 1; diff --git a/apps/web/test/unit-tests/vector/getconfig-test.ts b/apps/web/src/vector/getconfig.test.ts similarity index 92% rename from apps/web/test/unit-tests/vector/getconfig-test.ts rename to apps/web/src/vector/getconfig.test.ts index 725a4d328b..b555c497e3 100644 --- a/apps/web/test/unit-tests/vector/getconfig-test.ts +++ b/apps/web/src/vector/getconfig.test.ts @@ -6,9 +6,12 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import fetchMock from "@fetch-mock/jest"; +// @vitest-environment happy-dom -import { getVectorConfig } from "../../../src/vector/getconfig"; +import { vi, describe, it, expect, beforeEach, afterAll } from "vitest"; +import fetchMock from "@fetch-mock/vitest"; + +import { getVectorConfig } from "./getconfig"; describe("getVectorConfig()", () => { const elementDomain = "app.element.io"; @@ -27,13 +30,13 @@ describe("getVectorConfig()", () => { }); // stable value for cachebuster - jest.spyOn(Date, "now").mockReturnValue(now); - jest.clearAllMocks(); + vi.spyOn(Date, "now").mockReturnValue(now); + vi.clearAllMocks(); fetchMock.removeRoutes(); }); afterAll(() => { - jest.spyOn(Date, "now").mockRestore(); + vi.spyOn(Date, "now").mockRestore(); }); it("requests specific config for document domain", async () => { diff --git a/apps/web/test/unit-tests/vector/routing-test.ts b/apps/web/src/vector/routing.test.ts similarity index 86% rename from apps/web/test/unit-tests/vector/routing-test.ts rename to apps/web/src/vector/routing.test.ts index a9a078f760..809dba582f 100644 --- a/apps/web/test/unit-tests/vector/routing-test.ts +++ b/apps/web/src/vector/routing.test.ts @@ -6,16 +6,20 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { getInitialScreenAfterLogin, init, onNewScreen } from "../../../src/vector/routing"; -import type MatrixChat from "../../../src/components/structures/MatrixChat.tsx"; +// @vitest-environment happy-dom + +import { vi, describe, it, expect, beforeEach, afterAll } from "vitest"; + +import { getInitialScreenAfterLogin, init, onNewScreen } from "./routing"; +import type MatrixChat from "../components/structures/MatrixChat.tsx"; describe("onNewScreen", () => { it("should replace history if stripping via fields", () => { Object.defineProperty(window, "location", { value: { hash: "#/room/!room:server?via=abc", - replace: jest.fn(), - assign: jest.fn(), + replace: vi.fn(), + assign: vi.fn(), }, writable: true, }); @@ -28,8 +32,8 @@ describe("onNewScreen", () => { Object.defineProperty(window, "location", { value: { hash: "#/room/!room1:server?via=abc", - replace: jest.fn(), - assign: jest.fn(), + replace: vi.fn(), + assign: vi.fn(), }, writable: true, }); @@ -41,8 +45,8 @@ describe("onNewScreen", () => { describe("getInitialScreenAfterLogin", () => { beforeEach(() => { - jest.spyOn(sessionStorage.__proto__, "getItem").mockClear().mockReturnValue(null); - jest.spyOn(sessionStorage.__proto__, "setItem").mockClear(); + vi.spyOn(sessionStorage, "getItem").mockClear().mockReturnValue(null); + vi.spyOn(sessionStorage, "setItem").mockClear(); }); const makeMockLocation = (hash = "") => { @@ -65,7 +69,7 @@ describe("getInitialScreenAfterLogin", () => { const screen = { screen: "/room/!test", }; - jest.spyOn(sessionStorage.__proto__, "getItem").mockReturnValue(JSON.stringify(screen)); + vi.spyOn(sessionStorage, "getItem").mockReturnValue(JSON.stringify(screen)); expect(getInitialScreenAfterLogin(makeMockLocation())).toEqual(screen); }); }); @@ -111,7 +115,7 @@ describe("init", () => { }); window.matrixChat = { - showScreen: jest.fn(), + showScreen: vi.fn(), } as unknown as MatrixChat; init(); diff --git a/apps/web/test/unit-tests/vector/url_utils-test.ts b/apps/web/src/vector/url_utils.test.ts similarity index 96% rename from apps/web/test/unit-tests/vector/url_utils-test.ts rename to apps/web/src/vector/url_utils.test.ts index ad2c0e0390..54c3182962 100644 --- a/apps/web/test/unit-tests/vector/url_utils-test.ts +++ b/apps/web/src/vector/url_utils.test.ts @@ -5,7 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { parseAppUrl, parseQsFromFragment, searchParamsToQueryDict } from "../../../src/vector/url_utils"; +import { describe, it, expect } from "vitest"; + +import { parseAppUrl, parseQsFromFragment, searchParamsToQueryDict } from "./url_utils"; // @ts-ignore const location: Location = { diff --git a/apps/web/vitest.config.ts b/apps/web/vitest.config.ts new file mode 100644 index 0000000000..2a14fc4f39 --- /dev/null +++ b/apps/web/vitest.config.ts @@ -0,0 +1,18 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { defineProject } from "vitest/config"; + +export default defineProject({ + test: { + include: ["src/**/*.test.{ts,tsx}"], + environment: "node", + pool: "threads", + globals: false, + setupFiles: ["src/test/setupTests.ts"], + }, +}); diff --git a/package.json b/package.json index 3d482dbcd0..e8f0ab0418 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", - "test:unit": "vitest run", + "test:unit": "nx run-many -t test:unit:prepare -p && vitest run", "coverage:diff": "diff-cover --config-file diff-cover.toml apps/web/coverage/lcov.info packages/shared-components/coverage/lcov.info coverage/lcov.info" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23a2d7de36..858e496f73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -266,7 +266,7 @@ overrides: caniuse-lite: 1.0.30001793 markdown-it: 14.1.1 matrix-widget-api: ^1.17.0 - '@types/node': 22.13.14 + '@types/node': ts6.0 config-file-ts: 0.2.8-rc1 node-abi: 4.31.0 '@types/pg-pool': 2.0.7 @@ -316,8 +316,8 @@ importers: specifier: 'catalog:' version: 1.60.0 '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) @@ -326,7 +326,7 @@ importers: version: 3.14.0 eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(44bbcad1ae54594f49299136728d057f) + version: 3.0.0(37d4c1111a1f2e6c3a25c6fdfc46057c) husky: specifier: ^9.0.0 version: 9.1.7 @@ -356,13 +356,13 @@ importers: version: 6.0.3 vitepress: specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.50.0)(@types/node@22.13.14)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3) + version: 1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.3)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3) vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.15.0)(vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@22.13.14)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3)) + version: 2.0.17(mermaid@11.15.0)(vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.3)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) yaml: specifier: 2.8.4 version: 2.8.4 @@ -425,8 +425,8 @@ importers: specifier: ^1.2.1 version: 1.2.5 '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@types/pacote': specifier: ^11.1.1 version: 11.1.8 @@ -471,7 +471,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(44bbcad1ae54594f49299136728d057f) + version: 3.0.0(37d4c1111a1f2e6c3a25c6fdfc46057c) eslint-plugin-n: specifier: ^17.12.0 version: 17.24.0(eslint@8.57.1)(typescript@6.0.3) @@ -507,7 +507,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) apps/web: dependencies: @@ -778,7 +778,10 @@ importers: version: link:../../packages/playwright-common '@fetch-mock/jest': specifier: ^0.2.20 - version: 0.2.20(@jest/globals@30.4.1)(jest@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0)) + version: 0.2.20(@jest/globals@30.4.1)(jest@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0)) + '@fetch-mock/vitest': + specifier: ^0.2.18 + version: 0.2.18(vitest@4.1.8) '@jest/globals': specifier: ^30.2.0 version: 30.4.1 @@ -849,8 +852,8 @@ importers: specifier: ^3.5.3 version: 3.5.6 '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@types/pako': specifier: ^2.0.0 version: 2.0.4 @@ -934,13 +937,13 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1) eslint-plugin-jest: specifier: ^29.0.0 - version: 29.15.2(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(jest@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0))(typescript@6.0.3) + version: 29.15.2(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(jest@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0))(typescript@6.0.3) eslint-plugin-jsx-a11y: specifier: ^6.5.1 version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(44bbcad1ae54594f49299136728d057f) + version: 3.0.0(37d4c1111a1f2e6c3a25c6fdfc46057c) eslint-plugin-react: specifier: ^7.28.0 version: 7.37.5(eslint@8.57.1) @@ -962,6 +965,9 @@ importers: file-loader: specifier: ^6.0.0 version: 6.2.0(webpack@5.107.1) + happy-dom: + specifier: ^20.10.2 + version: 20.10.2 html-webpack-plugin: specifier: ^5.5.3 version: 5.6.7(webpack@5.107.1) @@ -970,7 +976,7 @@ importers: version: 3.0.0 jest: specifier: ^30.0.0 - version: 30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0) + version: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) jest-canvas-mock: specifier: ^2.5.2 version: 2.5.2 @@ -1070,6 +1076,9 @@ importers: util: specifier: ^0.12.5 version: 0.12.5 + vitest: + specifier: 'catalog:' + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) web-streams-polyfill: specifier: ^4.0.0 version: 4.3.0 @@ -1114,7 +1123,7 @@ importers: version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(44bbcad1ae54594f49299136728d057f) + version: 3.0.0(37d4c1111a1f2e6c3a25c6fdfc46057c) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@8.57.1) @@ -1153,8 +1162,8 @@ importers: specifier: workspace:* version: link:../../packages/module-api '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@types/react': specifier: ^19.2.10 version: 19.2.14 @@ -1163,7 +1172,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.2(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 6.0.2(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) matrix-web-i18n: specifier: ^3.6.0 version: 3.6.0 @@ -1178,13 +1187,13 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + version: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) vite-plugin-svgr: specifier: 'catalog:' - version: 5.2.0(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 5.2.0(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) modules/restricted-guests: dependencies: @@ -1208,14 +1217,14 @@ importers: specifier: workspace:* version: link:../../packages/module-api '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@types/react': specifier: ^19.2.10 version: 19.2.14 '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.2(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 6.0.2(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) react: specifier: 'catalog:' version: 19.2.7 @@ -1227,10 +1236,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + version: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) modules/widget-lifecycle: dependencies: @@ -1242,17 +1251,17 @@ importers: specifier: workspace:* version: link:../../packages/module-api '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + version: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) modules/widget-toggles: dependencies: @@ -1288,17 +1297,17 @@ importers: specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@types/react': specifier: ^19.2.10 version: 19.2.14 '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.2(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 6.0.2(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + version: 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) react: specifier: 'catalog:' version: 19.2.7 @@ -1307,16 +1316,16 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + version: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) vite-plugin-svgr: specifier: 'catalog:' - version: 5.2.0(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 5.2.0(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) packages/module-api: dependencies: @@ -1332,10 +1341,10 @@ importers: version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.7) '@microsoft/api-extractor': specifier: ^7.49.1 - version: 7.58.7(@types/node@22.13.14) + version: 7.58.7(@types/node@25.9.3) '@types/node': - specifier: 22.13.14 - version: 22.13.14 + specifier: ts6.0 + version: 25.9.3 '@types/react': specifier: ^19.2.10 version: 19.2.14 @@ -1359,13 +1368,13 @@ importers: version: 6.0.3 unplugin-dts: specifier: 'catalog:' - version: 1.0.1(@microsoft/api-extractor@7.58.7(@types/node@22.13.14))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 1.0.1(@microsoft/api-extractor@7.58.7(@types/node@25.9.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) vite: specifier: 'catalog:' - version: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + version: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) packages/playwright-common: dependencies: @@ -1496,7 +1505,7 @@ importers: version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.7) '@microsoft/api-extractor': specifier: ^7.56.0 - version: 7.58.7(@types/node@22.13.14) + version: 7.58.7(@types/node@25.9.3) '@playwright/test': specifier: 'catalog:' version: 1.60.0 @@ -1505,10 +1514,10 @@ importers: version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@storybook/addon-designs': specifier: ^11.0.1 - version: 11.1.3(@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)))(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + version: 11.1.3(@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)))(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@storybook/addon-docs': specifier: ^10.0.7 - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) '@storybook/addon-vitest': specifier: ^10.1.11 version: 10.4.2(@vitest/browser-playwright@4.1.8)(@vitest/browser@4.1.8)(@vitest/runner@4.1.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vitest@4.1.8) @@ -1517,7 +1526,7 @@ importers: version: 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@storybook/react-vite': specifier: ^10.0.7 - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) '@stylistic/eslint-plugin': specifier: ^5.7.0 version: 5.10.0(eslint@8.57.1) @@ -1553,7 +1562,7 @@ importers: version: 9.4.1(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(@vector-im/compound-design-tokens@10.2.1(@types/react@19.2.14)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + version: 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) eslint: specifier: '8' version: 8.57.1 @@ -1574,7 +1583,7 @@ importers: version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(44bbcad1ae54594f49299136728d057f) + version: 3.0.0(37d4c1111a1f2e6c3a25c6fdfc46057c) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@8.57.1) @@ -1613,16 +1622,16 @@ importers: version: 6.0.3 unplugin-dts: specifier: 'catalog:' - version: 1.0.1(@microsoft/api-extractor@7.58.7(@types/node@22.13.14))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + version: 1.0.1(@microsoft/api-extractor@7.58.7(@types/node@25.9.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) vite: specifier: 'catalog:' - version: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + version: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) vite-plugin-node-polyfills: specifier: ^0.28.0 - version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) packages: @@ -5197,7 +5206,7 @@ packages: '@rushstack/node-core-library@5.23.1': resolution: {integrity: sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==} peerDependencies: - '@types/node': 22.13.14 + '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true @@ -5205,7 +5214,7 @@ packages: '@rushstack/problem-matcher@0.2.1': resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} peerDependencies: - '@types/node': 22.13.14 + '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true @@ -5216,7 +5225,7 @@ packages: '@rushstack/terminal@0.24.0': resolution: {integrity: sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==} peerDependencies: - '@types/node': 22.13.14 + '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true @@ -6000,8 +6009,8 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@22.13.14': - resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} + '@types/node@25.9.3': + resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -6145,6 +6154,9 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -7276,6 +7288,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-image-size@0.6.4: + resolution: {integrity: sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==} + engines: {node: '>=4.0'} + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -9231,6 +9247,10 @@ packages: engines: {node: '>=0.4.7'} hasBin: true + happy-dom@20.10.2: + resolution: {integrity: sha512-5p9Sxis3eowDJKqx90QCsgbNA02XXqJ59NOHvD4V6cxp+rP4d/xOyVx7uY3hS8hiUbY1VeiFH8lbJ81AyuDVLQ==} + engines: {node: '>=20.0.0'} + harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} @@ -9885,7 +9905,7 @@ packages: resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@types/node': 22.13.14 + '@types/node': '*' esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: @@ -13267,8 +13287,8 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} undici@6.25.0: resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} @@ -13496,7 +13516,7 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': 22.13.14 + '@types/node': ^18.0.0 || >=20.0.0 less: '*' lightningcss: ^1.21.0 sass: '*' @@ -13527,7 +13547,7 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': 22.13.14 + '@types/node': ^20.19.0 || >=22.12.0 '@vitejs/devtools': ^0.1.18 esbuild: 0.27.4 jiti: '>=1.21.0' @@ -13603,7 +13623,7 @@ packages: peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 - '@types/node': 22.13.14 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 '@vitest/browser-playwright': 4.1.8 '@vitest/browser-preview': 4.1.8 '@vitest/browser-webdriverio': 4.1.8 @@ -13785,6 +13805,10 @@ packages: engines: {node: '>=18'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -15743,16 +15767,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@fetch-mock/jest@0.2.20(@jest/globals@30.4.1)(jest@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0))': + '@fetch-mock/jest@0.2.20(@jest/globals@30.4.1)(jest@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0))': dependencies: '@jest/globals': 30.4.1 fetch-mock: 12.6.0 - jest: 30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0) + jest: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) '@fetch-mock/vitest@0.2.18(vitest@4.1.8)': dependencies: fetch-mock: 12.6.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) '@figspec/components@2.1.0': {} @@ -15900,7 +15924,7 @@ snapshots: '@jest/console@30.4.1': dependencies: '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 chalk: 4.1.2 jest-message-util: 30.4.1 jest-util: 30.4.1 @@ -15914,7 +15938,7 @@ snapshots: '@jest/test-result': 30.4.1 '@jest/transform': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 @@ -15922,7 +15946,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 jest-changed-files: 30.4.1 - jest-config: 30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0) + jest-config: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) jest-haste-map: 30.4.1 jest-message-util: 30.4.1 jest-regex-util: 30.4.0 @@ -15952,7 +15976,7 @@ snapshots: '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 '@types/jsdom': 21.1.7 - '@types/node': 22.13.14 + '@types/node': 25.9.3 jest-mock: 30.4.1 jest-util: 30.4.1 jsdom: 26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f) @@ -15961,7 +15985,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 jest-mock: 30.4.1 '@jest/expect-utils@30.4.1': @@ -15979,7 +16003,7 @@ snapshots: dependencies: '@jest/types': 30.4.1 '@sinonjs/fake-timers': 15.4.0 - '@types/node': 22.13.14 + '@types/node': 25.9.3 jest-message-util: 30.4.1 jest-mock: 30.4.1 jest-util: 30.4.1 @@ -15997,7 +16021,7 @@ snapshots: '@jest/pattern@30.4.0': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 jest-regex-util: 30.4.0 '@jest/reporters@30.4.1': @@ -16008,7 +16032,7 @@ snapshots: '@jest/transform': 30.4.1 '@jest/types': 30.4.1 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.13.14 + '@types/node': 25.9.3 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -16084,15 +16108,15 @@ snapshots: '@jest/schemas': 30.4.1 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@6.0.3) - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) optionalDependencies: typescript: 6.0.3 @@ -16370,23 +16394,23 @@ snapshots: dependencies: '@chevrotain/types': 11.1.2 - '@microsoft/api-extractor-model@7.33.8(@types/node@22.13.14)': + '@microsoft/api-extractor-model@7.33.8(@types/node@25.9.3)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@22.13.14) + '@rushstack/node-core-library': 5.23.1(@types/node@25.9.3) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.58.7(@types/node@22.13.14)': + '@microsoft/api-extractor@7.58.7(@types/node@25.9.3)': dependencies: - '@microsoft/api-extractor-model': 7.33.8(@types/node@22.13.14) + '@microsoft/api-extractor-model': 7.33.8(@types/node@25.9.3) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@22.13.14) + '@rushstack/node-core-library': 5.23.1(@types/node@25.9.3) '@rushstack/rig-package': 0.7.3 - '@rushstack/terminal': 0.24.0(@types/node@22.13.14) - '@rushstack/ts-command-line': 5.3.9(@types/node@22.13.14) + '@rushstack/terminal': 0.24.0(@types/node@25.9.3) + '@rushstack/ts-command-line': 5.3.9(@types/node@25.9.3) diff: 8.0.4 minimatch: 10.2.3 resolve: 1.22.12 @@ -17825,7 +17849,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.23.1(@types/node@22.13.14)': + '@rushstack/node-core-library@5.23.1(@types/node@25.9.3)': dependencies: ajv: 8.18.0 ajv-draft-04: 1.0.0(ajv@8.18.0) @@ -17836,28 +17860,28 @@ snapshots: resolve: 1.22.12 semver: 7.7.4 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 - '@rushstack/problem-matcher@0.2.1(@types/node@22.13.14)': + '@rushstack/problem-matcher@0.2.1(@types/node@25.9.3)': optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@rushstack/rig-package@0.7.3': dependencies: jju: 1.4.0 resolve: 1.22.12 - '@rushstack/terminal@0.24.0(@types/node@22.13.14)': + '@rushstack/terminal@0.24.0(@types/node@25.9.3)': dependencies: - '@rushstack/node-core-library': 5.23.1(@types/node@22.13.14) - '@rushstack/problem-matcher': 0.2.1(@types/node@22.13.14) + '@rushstack/node-core-library': 5.23.1(@types/node@25.9.3) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.9.3) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 - '@rushstack/ts-command-line@5.3.9(@types/node@22.13.14)': + '@rushstack/ts-command-line@5.3.9(@types/node@25.9.3)': dependencies: - '@rushstack/terminal': 0.24.0(@types/node@22.13.14) + '@rushstack/terminal': 0.24.0(@types/node@25.9.3) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -18165,21 +18189,21 @@ snapshots: axe-core: 4.12.1 storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@storybook/addon-designs@11.1.3(@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)))(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + '@storybook/addon-designs@11.1.3(@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)))(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': dependencies: '@figspec/react': 2.0.1(@types/react@19.2.14)(react@19.2.7) storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) optionalDependencies: - '@storybook/addon-docs': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + '@storybook/addon-docs': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': + '@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.7) - '@storybook/csf-plugin': 10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + '@storybook/csf-plugin': 10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) react: 19.2.7 @@ -18201,33 +18225,33 @@ snapshots: '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) optionalDependencies: - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) - '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) '@vitest/runner': 4.1.8 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': + '@storybook/builder-vite@10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: - '@storybook/csf-plugin': 10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + '@storybook/csf-plugin': 10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) ts-dedent: 2.3.0 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': + '@storybook/csf-plugin@10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) unplugin: 2.3.11 optionalDependencies: esbuild: 0.27.4 rollup: 4.60.1 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) webpack: 5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15) '@storybook/global@5.0.0': {} @@ -18246,11 +18270,11 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@storybook/react-vite@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': + '@storybook/react-vite@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.27.4)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) '@rollup/pluginutils': 5.4.0(rollup@4.60.1) - '@storybook/builder-vite': 10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) + '@storybook/builder-vite': 10.4.2(esbuild@0.27.4)(rollup@4.60.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)) '@storybook/react': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3) empathic: 2.0.1 magic-string: 0.30.21 @@ -18260,7 +18284,7 @@ snapshots: resolve: 1.22.12 storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) tsconfig-paths: 4.2.0 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -18482,17 +18506,17 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -18505,11 +18529,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/counterpart@0.18.4': {} @@ -18642,13 +18666,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/ssh2': 1.15.5 '@types/dockerode@4.0.1': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/ssh2': 1.15.5 '@types/doctrine@0.0.9': {} @@ -18663,14 +18687,14 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -18692,7 +18716,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/geojson@7946.0.16': {} @@ -18715,7 +18739,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/istanbul-lib-coverage@2.0.6': {} @@ -18736,7 +18760,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -18748,7 +18772,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/linkify-it@5.0.0': {} @@ -18781,16 +18805,16 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 form-data: 4.0.5 - '@types/node@22.13.14': + '@types/node@25.9.3': dependencies: - undici-types: 6.20.0 + undici-types: 7.24.6 '@types/normalize-package-data@2.4.4': {} @@ -18798,7 +18822,7 @@ snapshots: '@types/npm-registry-fetch@8.0.9': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/node-fetch': 2.6.13 '@types/npm-package-arg': 6.1.4 '@types/npmlog': 7.0.0 @@ -18806,11 +18830,11 @@ snapshots: '@types/npmlog@7.0.0': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/pacote@11.1.8': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/npm-registry-fetch': 8.0.9 '@types/npmlog': 7.0.0 '@types/ssri': 7.1.5 @@ -18825,7 +18849,7 @@ snapshots: '@types/pg@8.15.6': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 pg-protocol: 1.13.0 pg-types: 2.2.0 @@ -18839,7 +18863,7 @@ snapshots: '@types/qrcode@1.5.6': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/qs@6.15.1': {} @@ -18872,7 +18896,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/retry@0.12.2': {} @@ -18889,11 +18913,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/send@1.2.1': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/serve-index@1.9.4': dependencies: @@ -18902,34 +18926,34 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/ssh2-streams@0.1.13': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/ssh2-streams': 0.1.13 '@types/ssh2@1.15.5': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/ssri@7.1.5': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/stack-utils@2.0.3': {} @@ -18941,7 +18965,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/tough-cookie@4.0.5': {} @@ -18954,9 +18978,11 @@ snapshots: '@types/web-bluetooth@0.0.21': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.18.1': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@types/yargs-parser@21.0.3': {} @@ -18966,7 +18992,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 optional: true '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3)': @@ -19258,39 +19284,39 @@ snapshots: dependencies: react: 19.2.7 - '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))': + '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@22.13.14)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0))(vue@3.5.31(typescript@6.0.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@25.9.3)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0))(vue@3.5.31(typescript@6.0.3))': dependencies: - vite: 5.4.21(@types/node@22.13.14)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0) + vite: 5.4.21(@types/node@25.9.3)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0) vue: 3.5.31(typescript@6.0.3) - '@vitest/browser-playwright@4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8)': + '@vitest/browser-playwright@4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8)': dependencies: - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8)': + '@vitest/browser@4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) '@vitest/utils': 4.1.8 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -19310,9 +19336,9 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) optionalDependencies: - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) '@vitest/expect@3.2.4': dependencies: @@ -19331,13 +19357,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))': + '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) '@vitest/pretty-format@3.2.4': dependencies: @@ -20331,6 +20357,10 @@ snapshots: buffer-from@1.1.2: {} + buffer-image-size@0.6.4: + dependencies: + '@types/node': 25.9.3 + buffer-xor@1.0.3: {} buffer@5.7.1: @@ -21539,7 +21569,7 @@ snapshots: electron@42.3.3: dependencies: '@electron/get': 5.0.0 - '@types/node': 22.13.14 + '@types/node': 25.9.3 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -21837,13 +21867,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@29.15.2(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(jest@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0))(typescript@6.0.3): + eslint-plugin-jest@29.15.2(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(jest@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0))(typescript@6.0.3): dependencies: '@typescript-eslint/utils': 8.61.0(eslint@8.57.1)(typescript@6.0.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) - jest: 30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0) + jest: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -21867,7 +21897,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-matrix-org@3.0.0(44bbcad1ae54594f49299136728d057f): + eslint-plugin-matrix-org@3.0.0(37d4c1111a1f2e6c3a25c6fdfc46057c): dependencies: '@babel/core': 7.29.7 '@babel/eslint-parser': 7.28.6(@babel/core@7.29.7)(eslint@8.57.1) @@ -21880,7 +21910,7 @@ snapshots: eslint-config-prettier: 10.1.8(eslint@8.57.1) eslint-plugin-deprecate: 0.9.0(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1) - eslint-plugin-jest: 29.15.2(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(jest@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0))(typescript@6.0.3) + eslint-plugin-jest: 29.15.2(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(jest@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0))(typescript@6.0.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 7.1.1(eslint@8.57.1) @@ -22643,6 +22673,19 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 + happy-dom@20.10.2: + dependencies: + '@types/node': 25.9.3 + '@types/whatwg-mimetype': 3.0.2 + '@types/ws': 8.18.1 + buffer-image-size: 0.6.4 + entities: 7.0.1 + whatwg-mimetype: 3.0.0 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + harmony-reflect@1.6.2: {} has-bigints@1.1.0: {} @@ -23282,7 +23325,7 @@ snapshots: '@jest/expect': 30.4.1 '@jest/test-result': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2(babel-plugin-macros@3.1.0) @@ -23302,7 +23345,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0): + jest-cli@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 30.4.2(babel-plugin-macros@3.1.0) '@jest/test-result': 30.4.1 @@ -23310,7 +23353,7 @@ snapshots: chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0) + jest-config: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) jest-util: 30.4.1 jest-validate: 30.4.1 yargs: 17.7.2 @@ -23321,7 +23364,7 @@ snapshots: - supports-color - ts-node - jest-config@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0): + jest-config@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 @@ -23347,7 +23390,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -23386,7 +23429,7 @@ snapshots: '@jest/environment': 30.4.1 '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 jest-mock: 30.4.1 jest-util: 30.4.1 jest-validate: 30.4.1 @@ -23398,7 +23441,7 @@ snapshots: jest-haste-map@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -23438,7 +23481,7 @@ snapshots: jest-mock@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 jest-util: 30.4.1 jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): @@ -23474,7 +23517,7 @@ snapshots: '@jest/test-result': 30.4.1 '@jest/transform': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -23503,7 +23546,7 @@ snapshots: '@jest/test-result': 30.4.1 '@jest/transform': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -23550,7 +23593,7 @@ snapshots: jest-util@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -23569,7 +23612,7 @@ snapshots: dependencies: '@jest/test-result': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -23578,24 +23621,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.4.1: dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 '@ungap/structured-clone': 1.3.1 jest-util: 30.4.1 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0): + jest@30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 30.4.2(babel-plugin-macros@3.1.0) '@jest/types': 30.4.1 import-local: 3.2.0 - jest-cli: 30.4.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0) + jest-cli: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -25127,7 +25170,7 @@ snapshots: png-to-ico@3.0.1: dependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 minimist: 1.2.8 pngjs: 7.0.0 @@ -25715,7 +25758,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.1 - '@types/node': 22.13.14 + '@types/node': 25.9.3 long: 5.3.2 protocol-buffers-schema@3.6.1: {} @@ -26740,14 +26783,14 @@ snapshots: '@repobuddy/test': 1.0.1 '@storybook/addon-vitest': 10.4.2(@vitest/browser-playwright@4.1.8)(@vitest/browser@4.1.8)(@vitest/runner@4.1.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vitest@4.1.8) '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) glob: 13.0.6 is-ci: 4.1.0 memoize: 11.0.0 pathe: 2.0.3 storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) type-plus: 8.0.0-beta.8(typescript@6.0.3) - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) vitest-plugin-vis: 5.1.1(@vitest/browser-playwright@4.1.8)(@vitest/browser@4.1.8)(babel-plugin-macros@3.1.0)(typescript@6.0.3)(vitest@4.1.8) transitivePeerDependencies: - '@vitest/browser-playwright' @@ -27508,7 +27551,7 @@ snapshots: underscore@1.13.8: {} - undici-types@6.20.0: {} + undici-types@7.24.6: {} undici@6.25.0: {} @@ -27562,7 +27605,7 @@ snapshots: unpipe@1.0.0: {} - unplugin-dts@1.0.1(@microsoft/api-extractor@7.58.7(@types/node@22.13.14))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)): + unplugin-dts@1.0.1(@microsoft/api-extractor@7.58.7(@types/node@25.9.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(webpack@5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: '@rollup/pluginutils': 5.4.0(rollup@4.60.1) '@volar/typescript': 2.4.28 @@ -27574,11 +27617,11 @@ snapshots: typescript: 6.0.3 unplugin: 2.3.11 optionalDependencies: - '@microsoft/api-extractor': 7.58.7(@types/node@22.13.14) + '@microsoft/api-extractor': 7.58.7(@types/node@25.9.3) esbuild: 0.27.4 rolldown: 1.0.3 rollup: 4.60.1 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) webpack: 5.107.1(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.15) transitivePeerDependencies: - supports-color @@ -27727,38 +27770,38 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-node-polyfills@0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)): + vite-plugin-node-polyfills@0.28.0(rollup@4.60.1)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.60.1) node-stdlib-browser: 1.3.1 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) transitivePeerDependencies: - rollup - vite-plugin-svgr@5.2.0(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)): + vite-plugin-svgr@5.2.0(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)): dependencies: '@rollup/pluginutils': 5.4.0(rollup@4.60.1) '@svgr/core': 8.1.0(typescript@6.0.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@6.0.3)) - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) transitivePeerDependencies: - rollup - supports-color - typescript - vite@5.4.21(@types/node@22.13.14)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0): + vite@5.4.21(@types/node@25.9.3)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0): dependencies: esbuild: 0.27.4 postcss: 8.5.15 rollup: 4.60.1 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 fsevents: 2.3.3 lightningcss: 1.32.0 sugarss: 5.0.1(postcss@8.5.15) terser: 5.48.0 - vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4): + vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -27766,7 +27809,7 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 25.9.3 esbuild: 0.27.4 fsevents: 2.3.3 jiti: 2.7.0 @@ -27774,14 +27817,14 @@ snapshots: terser: 5.48.0 yaml: 2.8.4 - vitepress-plugin-mermaid@2.0.17(mermaid@11.15.0)(vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@22.13.14)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3)): + vitepress-plugin-mermaid@2.0.17(mermaid@11.15.0)(vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.3)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3)): dependencies: mermaid: 11.15.0 - vitepress: 1.6.4(@algolia/client-search@5.50.0)(@types/node@22.13.14)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3) + vitepress: 1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.3)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3) optionalDependencies: '@mermaid-js/mermaid-mindmap': 9.3.0 - vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@22.13.14)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3): + vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.3)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(typescript@6.0.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(search-insights@2.17.3) @@ -27790,7 +27833,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.13.14)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0))(vue@3.5.31(typescript@6.0.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@25.9.3)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0))(vue@3.5.31(typescript@6.0.3)) '@vue/devtools-api': 7.7.9 '@vue/shared': 3.5.31 '@vueuse/core': 12.8.2(typescript@6.0.3) @@ -27799,7 +27842,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 2.5.0 - vite: 5.4.21(@types/node@22.13.14)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0) + vite: 5.4.21(@types/node@25.9.3)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0) vue: 3.5.31(typescript@6.0.3) optionalDependencies: postcss: 8.5.15 @@ -27832,7 +27875,7 @@ snapshots: vitest-plugin-vis@5.1.1(@vitest/browser-playwright@4.1.8)(@vitest/browser@4.1.8)(babel-plugin-macros@3.1.0)(typescript@6.0.3)(vitest@4.1.8): dependencies: - '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) dedent: 1.7.2(babel-plugin-macros@3.1.0) glob: 13.0.6 is-ci: 4.1.0 @@ -27843,17 +27886,17 @@ snapshots: rimraf: 6.1.3 ssim.js: 3.5.0 type-plus: 8.0.0-beta.8(typescript@6.0.3) - vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + vitest: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) optionalDependencies: - '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) transitivePeerDependencies: - babel-plugin-macros - typescript - vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@22.13.14)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)): + vitest@4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(happy-dom@20.10.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) + '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -27870,13 +27913,14 @@ snapshots: tinyexec: 1.2.2 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 22.13.14 - '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@22.13.14)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) + '@types/node': 25.9.3 + '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.8) '@vitest/coverage-v8': 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + happy-dom: 20.10.2 jsdom: 26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f) transitivePeerDependencies: - msw @@ -28151,6 +28195,8 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} whatwg-url@14.2.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e86b53511a..13eae73cca 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -117,7 +117,7 @@ overrides: caniuse-lite: 1.0.30001793 markdown-it: 14.1.1 matrix-widget-api: "^1.17.0" - "@types/node": 22.13.14 + "@types/node": ts6.0 config-file-ts: 0.2.8-rc1 node-abi: 4.31.0 "@types/pg-pool": 2.0.7 @@ -139,3 +139,4 @@ minimumReleaseAgeExclude: - "@matrix-org/*" - "@vector-im/*" - "@element-hq/*" + - "@types/node@25.9.3" diff --git a/vitest.config.ts b/vitest.config.ts index f9737b4680..804a7ab368 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -55,7 +55,9 @@ export default defineConfig({ include: ["{apps,modules,packages}/*/src/**/*.{cts,ts,tsx}"], exclude: [ // Exclude test files - "**/*.{stories,test}.tsx", + "**/*.{stories,test}.{ts,tsx}", + // Exclude test utilities + "**/src/test/**", // Exclude type definition files "**/*.d.ts", ],